@myrmidon/cadmus-part-codicology-decorations 1.0.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/esm2020/lib/cadmus-part-codicology-decorations.module.mjs +4 -4
  2. package/esm2020/lib/cod-decoration/cod-decoration.component.mjs +7 -7
  3. package/esm2020/lib/cod-decoration-artist/cod-decoration-artist.component.mjs +7 -7
  4. package/esm2020/lib/cod-decoration-artist-style/cod-decoration-artist-style.component.mjs +7 -7
  5. package/esm2020/lib/cod-decoration-element/cod-decoration-element.component.mjs +36 -32
  6. package/esm2020/lib/cod-decorations-part/cod-decorations-part.component.mjs +67 -73
  7. package/esm2020/lib/cod-decorations-part-feature/cod-decorations-part-feature.component.mjs +17 -19
  8. package/esm2020/lib/text-or-entry-selector/text-or-entry-selector.component.mjs +5 -5
  9. package/fesm2015/myrmidon-cadmus-part-codicology-decorations.mjs +138 -187
  10. package/fesm2015/myrmidon-cadmus-part-codicology-decorations.mjs.map +1 -1
  11. package/fesm2020/myrmidon-cadmus-part-codicology-decorations.mjs +138 -187
  12. package/fesm2020/myrmidon-cadmus-part-codicology-decorations.mjs.map +1 -1
  13. package/lib/cod-decoration/cod-decoration.component.d.ts +1 -1
  14. package/lib/cod-decoration-artist/cod-decoration-artist.component.d.ts +1 -1
  15. package/lib/cod-decoration-artist-style/cod-decoration-artist-style.component.d.ts +1 -1
  16. package/lib/cod-decoration-element/cod-decoration-element.component.d.ts +24 -4
  17. package/lib/cod-decorations-part/cod-decorations-part.component.d.ts +7 -6
  18. package/lib/cod-decorations-part-feature/cod-decorations-part-feature.component.d.ts +5 -6
  19. package/lib/text-or-entry-selector/text-or-entry-selector.component.d.ts +1 -1
  20. package/package.json +4 -4
  21. package/esm2020/lib/cod-decorations-part-feature/edit-cod-decorations-part.query.mjs +0 -16
  22. package/esm2020/lib/cod-decorations-part-feature/edit-cod-decorations-part.service.mjs +0 -18
  23. package/esm2020/lib/cod-decorations-part-feature/edit-cod-decorations-part.store.mjs +0 -27
  24. package/lib/cod-decorations-part-feature/edit-cod-decorations-part.query.d.ts +0 -8
  25. package/lib/cod-decorations-part-feature/edit-cod-decorations-part.service.d.ts +0 -9
  26. package/lib/cod-decorations-part-feature/edit-cod-decorations-part.store.d.ts +0 -10
@@ -35,8 +35,8 @@ import { CadmusRefsAssertedIdsModule } from '@myrmidon/cadmus-refs-asserted-ids'
35
35
  import * as i0 from "@angular/core";
36
36
  export class CadmusPartCodicologyDecorationsModule {
37
37
  }
38
- CadmusPartCodicologyDecorationsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
39
- CadmusPartCodicologyDecorationsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.1.1", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, declarations: [CodDecorationElementComponent,
38
+ CadmusPartCodicologyDecorationsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
39
+ CadmusPartCodicologyDecorationsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.1", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, declarations: [CodDecorationElementComponent,
40
40
  TextOrEntrySelectorComponent,
41
41
  CodDecorationArtistStyleComponent,
42
42
  CodDecorationArtistComponent,
@@ -79,7 +79,7 @@ CadmusPartCodicologyDecorationsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVers
79
79
  CodDecorationComponent,
80
80
  CodDecorationsPartComponent,
81
81
  CodDecorationsPartFeatureComponent] });
82
- CadmusPartCodicologyDecorationsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, imports: [CommonModule,
82
+ CadmusPartCodicologyDecorationsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, imports: [CommonModule,
83
83
  FormsModule,
84
84
  ReactiveFormsModule,
85
85
  // material
@@ -110,7 +110,7 @@ CadmusPartCodicologyDecorationsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVers
110
110
  CadmusUiFlagsPickerModule,
111
111
  CadmusCodLocationModule,
112
112
  CadmusCodicologyUiModule] });
113
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, decorators: [{
113
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: CadmusPartCodicologyDecorationsModule, decorators: [{
114
114
  type: NgModule,
115
115
  args: [{
116
116
  declarations: [
@@ -8,8 +8,8 @@ import * as i3 from "@angular/common";
8
8
  import * as i4 from "@angular/material/button";
9
9
  import * as i5 from "@angular/material/expansion";
10
10
  import * as i6 from "@angular/material/icon";
11
- import * as i7 from "@angular/material/form-field";
12
- import * as i8 from "@angular/material/input";
11
+ import * as i7 from "@angular/material/input";
12
+ import * as i8 from "@angular/material/form-field";
13
13
  import * as i9 from "@angular/material/tabs";
14
14
  import * as i10 from "@angular/material/tooltip";
15
15
  import * as i11 from "@myrmidon/cadmus-refs-asserted-chronotope";
@@ -330,11 +330,11 @@ export class CodDecorationComponent {
330
330
  this.decorationChange.emit(this.getDecoration());
331
331
  }
332
332
  }
333
- CodDecorationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CodDecorationComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component });
334
- CodDecorationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.1", type: CodDecorationComponent, selector: "cadmus-cod-decoration", inputs: { decoration: "decoration", decElemFlagEntries: "decElemFlagEntries", decFlagEntries: "decFlagEntries", decElemTypeEntries: "decElemTypeEntries", decTypeHiddenEntries: "decTypeHiddenEntries", decElemColorEntries: "decElemColorEntries", decElemGildingEntries: "decElemGildingEntries", decElemTechEntries: "decElemTechEntries", decElemPosEntries: "decElemPosEntries", decElemToolEntries: "decElemToolEntries", decElemTypolEntries: "decElemTypolEntries", imgTypeEntries: "imgTypeEntries", artTypeEntries: "artTypeEntries", artStyleEntries: "artStyleEntries", ctTagEntries: "ctTagEntries", assTagEntries: "assTagEntries", refTypeEntries: "refTypeEntries", refTagEntries: "refTagEntries", idTagEntries: "idTagEntries", idScopeEntries: "idScopeEntries" }, outputs: { decorationChange: "decorationChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group [(selectedIndex)]=\"tabIndex\">\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div>\r\n <!-- id -->\r\n <mat-form-field>\r\n <input matInput [formControl]=\"eid\" placeholder=\"ID\" />\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.required && (eid.dirty || eid.touched)\"\r\n >EID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.maxLength && (eid.dirty || eid.touched)\"\r\n >EID too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- name -->\r\n <mat-form-field>\r\n <input matInput [formControl]=\"name\" placeholder=\"name\" />\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >name required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.maxLength && (name.dirty || name.touched)\"\r\n >name too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- flags -->\r\n <fieldset>\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onSelectedIdsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- note -->\r\n <mat-form-field class=\"long-text\">\r\n <textarea\r\n rows=\"3\"\r\n matInput\r\n [formControl]=\"note\"\r\n placeholder=\"note\"\r\n ></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- chronotopes -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #24a524\"\r\n >hourglass_empty</mat-icon\r\n >\r\n chronotopes</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-asserted-chronotope-set\r\n [tagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [chronotopes]=\"initialChronotopes\"\r\n (chronotopesChange)=\"onChronotopesChange($event)\"\r\n ></cadmus-asserted-chronotope-set>\r\n </mat-expansion-panel>\r\n\r\n <!-- references -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #bb3d6c\"\r\n >library_books</mat-icon\r\n >\r\n references</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-refs-doc-references\r\n [tagEntries]=\"refTagEntries\"\r\n [typeEntries]=\"refTypeEntries\"\r\n [references]=\"initialReferences\"\r\n (referencesChange)=\"onReferencesChange($event)\"\r\n ></cadmus-refs-doc-references>\r\n </mat-expansion-panel>\r\n\r\n <!-- artists -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #ddcd41\"\r\n >palette</mat-icon\r\n >\r\n artists</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"addArtist()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> add artist\r\n </button>\r\n </div>\r\n <table *ngIf=\"artists?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>name</th>\r\n <th>EID</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let artist of artists?.value;\r\n let i = index;\r\n let first = first;\r\n let last = last\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit this artist\"\r\n (click)=\"editArtist(i)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this artist up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveArtistUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this artist down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveArtistDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete this artist\"\r\n (click)=\"removeArtist(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ artist.type | flatLookup: artTypeEntries:\"id\":\"value\" }}\r\n </td>\r\n <td>{{ artist.name }}</td>\r\n <td>{{ artist.eid }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <mat-expansion-panel\r\n [expanded]=\"editedArtist\"\r\n [disabled]=\"!editedArtist\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>artist {{ editedArtist?.name }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-cod-decoration-artist\r\n [ctTagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [artTypeEntries]=\"artTypeEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [artStyleEntries]=\"artStyleEntries\"\r\n [idTagEntries]=\"idTagEntries\"\r\n [idScopeEntries]=\"idScopeEntries\"\r\n [artist]=\"editedArtist\"\r\n (artistChange)=\"onArtistSave($event)\"\r\n (editorClose)=\"onArtistClose()\"\r\n ></cadmus-cod-decoration-artist>\r\n </mat-expansion-panel>\r\n </mat-expansion-panel>\r\n\r\n <!-- elements -->\r\n <h3>elements</h3>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"addElement()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> add element\r\n </button>\r\n </div>\r\n <table *ngIf=\"elements?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>key</th>\r\n <th>parent</th>\r\n <th>type</th>\r\n <th>subject</th>\r\n <th>extent</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let element of elements?.value;\r\n let i = index;\r\n let first = first;\r\n let last = last\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit this element\"\r\n (click)=\"editElement(i)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this element up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveElementUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this element down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveElementDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete this element\"\r\n (click)=\"removeElement(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ element.key }}</td>\r\n <td>{{ element.parentKey }}</td>\r\n <td>{{ element.type | flatLookup: decElemTypeEntries:\"id\":\"value\" }}</td>\r\n <td>{{ element.subject }}</td>\r\n <td>{{ element.ranges | codLocationRange }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </mat-tab>\r\n\r\n <!-- ELEMENT -->\r\n <mat-tab label=\"element\" *ngIf=\"editedElement\">\r\n <cadmus-cod-decoration-element\r\n [imgTypeEntries]=\"imgTypeEntries\"\r\n [decElemPosEntries]=\"decElemPosEntries\"\r\n [decElemFlagEntries]=\"decElemFlagEntries\"\r\n [decElemTechEntries]=\"decElemTechEntries\"\r\n [decElemToolEntries]=\"decElemToolEntries\"\r\n [decElemTypeEntries]=\"decElemTypeEntries\"\r\n [decElemColorEntries]=\"decElemColorEntries\"\r\n [decElemTypolEntries]=\"decElemTypolEntries\"\r\n [decTypeHiddenEntries]=\"decTypeHiddenEntries\"\r\n [decElemGildingEntries]=\"decElemGildingEntries\"\r\n [element]=\"editedElement\"\r\n [parentKeys]=\"parentKeys\"\r\n (elementChange)=\"onElementSave($event)\"\r\n (editorClose)=\"onElementClose()\"\r\n ></cadmus-cod-decoration-element>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <hr />\r\n <div>\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard decoration changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept decoration changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> decoration\r\n </button>\r\n </div>\r\n</form>\r\n", styles: ["th{text-align:left;font-weight:400;color:silver}.long-text{width:90%;max-width:800px}h3{margin-top:12px;background-color:#5db2fd;border-radius:6px;padding:0 6px;color:#fff}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "component", type: i9.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i11.AssertedChronotopeSetComponent, selector: "cadmus-asserted-chronotope-set", inputs: ["chronotopes", "tagEntries", "assTagEntries", "refTypeEntries", "refTagEntries"], outputs: ["chronotopesChange"] }, { kind: "component", type: i12.DocReferencesComponent, selector: "cadmus-refs-doc-references", inputs: ["references", "typeEntries", "tagEntries"], outputs: ["referencesChange"] }, { kind: "component", type: i13.FlagsPickerComponent, selector: "cadmus-ui-flags-picker", inputs: ["selectedIds", "flags", "numbering", "toolbar", "allowUserFlags"], outputs: ["selectedIdsChange", "flagsChange"] }, { kind: "component", type: i14.CodDecorationElementComponent, selector: "cadmus-cod-decoration-element", inputs: ["element", "parentKeys", "decElemTypeEntries", "decTypeHiddenEntries", "decElemFlagEntries", "decElemColorEntries", "decElemGildingEntries", "decElemTechEntries", "decElemPosEntries", "decElemToolEntries", "decElemTypolEntries", "imgTypeEntries"], outputs: ["elementChange", "editorClose"] }, { kind: "component", type: i15.CodDecorationArtistComponent, selector: "cadmus-cod-decoration-artist", inputs: ["artist", "artTypeEntries", "artStyleEntries", "ctTagEntries", "assTagEntries", "refTypeEntries", "refTagEntries", "idTagEntries", "idScopeEntries"], outputs: ["artistChange", "editorClose"] }, { kind: "pipe", type: i16.FlatLookupPipe, name: "flatLookup" }, { kind: "pipe", type: i17.CodLocationRangePipe, name: "codLocationRange" }] });
335
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CodDecorationComponent, decorators: [{
333
+ CodDecorationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: CodDecorationComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component });
334
+ CodDecorationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.1", type: CodDecorationComponent, selector: "cadmus-cod-decoration", inputs: { decoration: "decoration", decElemFlagEntries: "decElemFlagEntries", decFlagEntries: "decFlagEntries", decElemTypeEntries: "decElemTypeEntries", decTypeHiddenEntries: "decTypeHiddenEntries", decElemColorEntries: "decElemColorEntries", decElemGildingEntries: "decElemGildingEntries", decElemTechEntries: "decElemTechEntries", decElemPosEntries: "decElemPosEntries", decElemToolEntries: "decElemToolEntries", decElemTypolEntries: "decElemTypolEntries", imgTypeEntries: "imgTypeEntries", artTypeEntries: "artTypeEntries", artStyleEntries: "artStyleEntries", ctTagEntries: "ctTagEntries", assTagEntries: "assTagEntries", refTypeEntries: "refTypeEntries", refTagEntries: "refTagEntries", idTagEntries: "idTagEntries", idScopeEntries: "idScopeEntries" }, outputs: { decorationChange: "decorationChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group [(selectedIndex)]=\"tabIndex\">\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div>\r\n <!-- id -->\r\n <mat-form-field>\r\n <mat-label>ID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.required && (eid.dirty || eid.touched)\"\r\n >EID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.maxLength && (eid.dirty || eid.touched)\"\r\n >EID too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- name -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >name required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.maxLength && (name.dirty || name.touched)\"\r\n >name too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- flags -->\r\n <fieldset>\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onSelectedIdsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- note -->\r\n <br />\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"3\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- chronotopes -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #24a524\"\r\n >hourglass_empty</mat-icon\r\n >\r\n chronotopes</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-asserted-chronotope-set\r\n [tagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [chronotopes]=\"initialChronotopes\"\r\n (chronotopesChange)=\"onChronotopesChange($event)\"\r\n ></cadmus-asserted-chronotope-set>\r\n </mat-expansion-panel>\r\n\r\n <!-- references -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #bb3d6c\"\r\n >library_books</mat-icon\r\n >\r\n references</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-refs-doc-references\r\n [tagEntries]=\"refTagEntries\"\r\n [typeEntries]=\"refTypeEntries\"\r\n [references]=\"initialReferences\"\r\n (referencesChange)=\"onReferencesChange($event)\"\r\n ></cadmus-refs-doc-references>\r\n </mat-expansion-panel>\r\n\r\n <!-- artists -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #ddcd41\"\r\n >palette</mat-icon\r\n >\r\n artists</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Add artist\"\r\n (click)=\"addArtist()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n </div>\r\n <table *ngIf=\"artists?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>name</th>\r\n <th>EID</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let artist of artists?.value;\r\n let i = index;\r\n let first = first;\r\n let last = last\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit this artist\"\r\n (click)=\"editArtist(i)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this artist up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveArtistUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this artist down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveArtistDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete this artist\"\r\n (click)=\"removeArtist(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ artist.type | flatLookup: artTypeEntries:\"id\":\"value\" }}\r\n </td>\r\n <td>{{ artist.name }}</td>\r\n <td>{{ artist.eid }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <mat-expansion-panel\r\n [expanded]=\"editedArtist\"\r\n [disabled]=\"!editedArtist\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>artist {{ editedArtist?.name }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-cod-decoration-artist\r\n [ctTagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [artTypeEntries]=\"artTypeEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [artStyleEntries]=\"artStyleEntries\"\r\n [idTagEntries]=\"idTagEntries\"\r\n [idScopeEntries]=\"idScopeEntries\"\r\n [artist]=\"editedArtist\"\r\n (artistChange)=\"onArtistSave($event)\"\r\n (editorClose)=\"onArtistClose()\"\r\n ></cadmus-cod-decoration-artist>\r\n </mat-expansion-panel>\r\n </mat-expansion-panel>\r\n\r\n <!-- elements -->\r\n <h3>elements</h3>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Add element\"\r\n (click)=\"addElement()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n </div>\r\n <table *ngIf=\"elements?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>key</th>\r\n <th>parent</th>\r\n <th>type</th>\r\n <th>subject</th>\r\n <th>extent</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let element of elements?.value;\r\n let i = index;\r\n let first = first;\r\n let last = last\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit this element\"\r\n (click)=\"editElement(i)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this element up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveElementUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this element down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveElementDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete this element\"\r\n (click)=\"removeElement(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ element.key }}</td>\r\n <td>{{ element.parentKey }}</td>\r\n <td>\r\n {{ element.type | flatLookup: decElemTypeEntries:\"id\":\"value\" }}\r\n </td>\r\n <td>{{ element.subject }}</td>\r\n <td>{{ element.ranges | codLocationRange }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </mat-tab>\r\n\r\n <!-- ELEMENT -->\r\n <mat-tab label=\"element\" *ngIf=\"editedElement\">\r\n <cadmus-cod-decoration-element\r\n [imgTypeEntries]=\"imgTypeEntries\"\r\n [decElemPosEntries]=\"decElemPosEntries\"\r\n [decElemFlagEntries]=\"decElemFlagEntries\"\r\n [decElemTechEntries]=\"decElemTechEntries\"\r\n [decElemToolEntries]=\"decElemToolEntries\"\r\n [decElemTypeEntries]=\"decElemTypeEntries\"\r\n [decElemColorEntries]=\"decElemColorEntries\"\r\n [decElemTypolEntries]=\"decElemTypolEntries\"\r\n [decTypeHiddenEntries]=\"decTypeHiddenEntries\"\r\n [decElemGildingEntries]=\"decElemGildingEntries\"\r\n [element]=\"editedElement\"\r\n [parentKeys]=\"parentKeys\"\r\n (elementChange)=\"onElementSave($event)\"\r\n (editorClose)=\"onElementClose()\"\r\n ></cadmus-cod-decoration-element>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <hr />\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard decoration changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept decoration changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> decoration\r\n </button>\r\n <span style=\"margin-left: 8px\">decorations</span>\r\n </div>\r\n</form>\r\n", styles: ["th{text-align:left;font-weight:400;color:silver}.long-text{width:90%;max-width:800px}h3{margin-top:12px;background-color:#5db2fd;border-radius:6px;padding:0 6px;color:#fff}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.toolbar-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i9.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i9.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i11.AssertedChronotopeSetComponent, selector: "cadmus-asserted-chronotope-set", inputs: ["chronotopes", "tagEntries", "assTagEntries", "refTypeEntries", "refTagEntries"], outputs: ["chronotopesChange"] }, { kind: "component", type: i12.DocReferencesComponent, selector: "cadmus-refs-doc-references", inputs: ["references", "typeEntries", "tagEntries"], outputs: ["referencesChange"] }, { kind: "component", type: i13.FlagsPickerComponent, selector: "cadmus-ui-flags-picker", inputs: ["selectedIds", "flags", "numbering", "toolbar", "allowUserFlags"], outputs: ["selectedIdsChange", "flagsChange"] }, { kind: "component", type: i14.CodDecorationElementComponent, selector: "cadmus-cod-decoration-element", inputs: ["element", "parentKeys", "decElemTypeEntries", "decTypeHiddenEntries", "decElemFlagEntries", "decElemColorEntries", "decElemGildingEntries", "decElemTechEntries", "decElemPosEntries", "decElemToolEntries", "decElemTypolEntries", "imgTypeEntries"], outputs: ["elementChange", "editorClose"] }, { kind: "component", type: i15.CodDecorationArtistComponent, selector: "cadmus-cod-decoration-artist", inputs: ["artist", "artTypeEntries", "artStyleEntries", "ctTagEntries", "assTagEntries", "refTypeEntries", "refTagEntries", "idTagEntries", "idScopeEntries"], outputs: ["artistChange", "editorClose"] }, { kind: "pipe", type: i16.FlatLookupPipe, name: "flatLookup" }, { kind: "pipe", type: i17.CodLocationRangePipe, name: "codLocationRange" }] });
335
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: CodDecorationComponent, decorators: [{
336
336
  type: Component,
337
- args: [{ selector: 'cadmus-cod-decoration', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group [(selectedIndex)]=\"tabIndex\">\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div>\r\n <!-- id -->\r\n <mat-form-field>\r\n <input matInput [formControl]=\"eid\" placeholder=\"ID\" />\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.required && (eid.dirty || eid.touched)\"\r\n >EID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.maxLength && (eid.dirty || eid.touched)\"\r\n >EID too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- name -->\r\n <mat-form-field>\r\n <input matInput [formControl]=\"name\" placeholder=\"name\" />\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >name required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.maxLength && (name.dirty || name.touched)\"\r\n >name too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- flags -->\r\n <fieldset>\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onSelectedIdsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- note -->\r\n <mat-form-field class=\"long-text\">\r\n <textarea\r\n rows=\"3\"\r\n matInput\r\n [formControl]=\"note\"\r\n placeholder=\"note\"\r\n ></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- chronotopes -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #24a524\"\r\n >hourglass_empty</mat-icon\r\n >\r\n chronotopes</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-asserted-chronotope-set\r\n [tagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [chronotopes]=\"initialChronotopes\"\r\n (chronotopesChange)=\"onChronotopesChange($event)\"\r\n ></cadmus-asserted-chronotope-set>\r\n </mat-expansion-panel>\r\n\r\n <!-- references -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #bb3d6c\"\r\n >library_books</mat-icon\r\n >\r\n references</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-refs-doc-references\r\n [tagEntries]=\"refTagEntries\"\r\n [typeEntries]=\"refTypeEntries\"\r\n [references]=\"initialReferences\"\r\n (referencesChange)=\"onReferencesChange($event)\"\r\n ></cadmus-refs-doc-references>\r\n </mat-expansion-panel>\r\n\r\n <!-- artists -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #ddcd41\"\r\n >palette</mat-icon\r\n >\r\n artists</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"addArtist()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> add artist\r\n </button>\r\n </div>\r\n <table *ngIf=\"artists?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>name</th>\r\n <th>EID</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let artist of artists?.value;\r\n let i = index;\r\n let first = first;\r\n let last = last\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit this artist\"\r\n (click)=\"editArtist(i)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this artist up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveArtistUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this artist down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveArtistDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete this artist\"\r\n (click)=\"removeArtist(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ artist.type | flatLookup: artTypeEntries:\"id\":\"value\" }}\r\n </td>\r\n <td>{{ artist.name }}</td>\r\n <td>{{ artist.eid }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <mat-expansion-panel\r\n [expanded]=\"editedArtist\"\r\n [disabled]=\"!editedArtist\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>artist {{ editedArtist?.name }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-cod-decoration-artist\r\n [ctTagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [artTypeEntries]=\"artTypeEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [artStyleEntries]=\"artStyleEntries\"\r\n [idTagEntries]=\"idTagEntries\"\r\n [idScopeEntries]=\"idScopeEntries\"\r\n [artist]=\"editedArtist\"\r\n (artistChange)=\"onArtistSave($event)\"\r\n (editorClose)=\"onArtistClose()\"\r\n ></cadmus-cod-decoration-artist>\r\n </mat-expansion-panel>\r\n </mat-expansion-panel>\r\n\r\n <!-- elements -->\r\n <h3>elements</h3>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"addElement()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> add element\r\n </button>\r\n </div>\r\n <table *ngIf=\"elements?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>key</th>\r\n <th>parent</th>\r\n <th>type</th>\r\n <th>subject</th>\r\n <th>extent</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let element of elements?.value;\r\n let i = index;\r\n let first = first;\r\n let last = last\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit this element\"\r\n (click)=\"editElement(i)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this element up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveElementUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this element down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveElementDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete this element\"\r\n (click)=\"removeElement(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ element.key }}</td>\r\n <td>{{ element.parentKey }}</td>\r\n <td>{{ element.type | flatLookup: decElemTypeEntries:\"id\":\"value\" }}</td>\r\n <td>{{ element.subject }}</td>\r\n <td>{{ element.ranges | codLocationRange }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </mat-tab>\r\n\r\n <!-- ELEMENT -->\r\n <mat-tab label=\"element\" *ngIf=\"editedElement\">\r\n <cadmus-cod-decoration-element\r\n [imgTypeEntries]=\"imgTypeEntries\"\r\n [decElemPosEntries]=\"decElemPosEntries\"\r\n [decElemFlagEntries]=\"decElemFlagEntries\"\r\n [decElemTechEntries]=\"decElemTechEntries\"\r\n [decElemToolEntries]=\"decElemToolEntries\"\r\n [decElemTypeEntries]=\"decElemTypeEntries\"\r\n [decElemColorEntries]=\"decElemColorEntries\"\r\n [decElemTypolEntries]=\"decElemTypolEntries\"\r\n [decTypeHiddenEntries]=\"decTypeHiddenEntries\"\r\n [decElemGildingEntries]=\"decElemGildingEntries\"\r\n [element]=\"editedElement\"\r\n [parentKeys]=\"parentKeys\"\r\n (elementChange)=\"onElementSave($event)\"\r\n (editorClose)=\"onElementClose()\"\r\n ></cadmus-cod-decoration-element>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <hr />\r\n <div>\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard decoration changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept decoration changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> decoration\r\n </button>\r\n </div>\r\n</form>\r\n", styles: ["th{text-align:left;font-weight:400;color:silver}.long-text{width:90%;max-width:800px}h3{margin-top:12px;background-color:#5db2fd;border-radius:6px;padding:0 6px;color:#fff}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}\n"] }]
337
+ args: [{ selector: 'cadmus-cod-decoration', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group [(selectedIndex)]=\"tabIndex\">\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div>\r\n <!-- id -->\r\n <mat-form-field>\r\n <mat-label>ID</mat-label>\r\n <input matInput [formControl]=\"eid\" />\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.required && (eid.dirty || eid.touched)\"\r\n >EID required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(eid).errors?.maxLength && (eid.dirty || eid.touched)\"\r\n >EID too long</mat-error\r\n >\r\n </mat-form-field>\r\n &nbsp;\r\n <!-- name -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >name required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(name).errors?.maxLength && (name.dirty || name.touched)\"\r\n >name too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- flags -->\r\n <fieldset>\r\n <legend>features</legend>\r\n <cadmus-ui-flags-picker\r\n [flags]=\"availFlags\"\r\n [selectedIds]=\"initialFlags\"\r\n (selectedIdsChange)=\"onSelectedIdsChange($event)\"\r\n ></cadmus-ui-flags-picker>\r\n </fieldset>\r\n\r\n <!-- note -->\r\n <br />\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"3\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- chronotopes -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #24a524\"\r\n >hourglass_empty</mat-icon\r\n >\r\n chronotopes</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-asserted-chronotope-set\r\n [tagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [chronotopes]=\"initialChronotopes\"\r\n (chronotopesChange)=\"onChronotopesChange($event)\"\r\n ></cadmus-asserted-chronotope-set>\r\n </mat-expansion-panel>\r\n\r\n <!-- references -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #bb3d6c\"\r\n >library_books</mat-icon\r\n >\r\n references</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <cadmus-refs-doc-references\r\n [tagEntries]=\"refTagEntries\"\r\n [typeEntries]=\"refTypeEntries\"\r\n [references]=\"initialReferences\"\r\n (referencesChange)=\"onReferencesChange($event)\"\r\n ></cadmus-refs-doc-references>\r\n </mat-expansion-panel>\r\n\r\n <!-- artists -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n ><mat-icon style=\"margin-right: 8px; color: #ddcd41\"\r\n >palette</mat-icon\r\n >\r\n artists</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Add artist\"\r\n (click)=\"addArtist()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n </div>\r\n <table *ngIf=\"artists?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>name</th>\r\n <th>EID</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let artist of artists?.value;\r\n let i = index;\r\n let first = first;\r\n let last = last\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit this artist\"\r\n (click)=\"editArtist(i)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this artist up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveArtistUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this artist down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveArtistDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete this artist\"\r\n (click)=\"removeArtist(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ artist.type | flatLookup: artTypeEntries:\"id\":\"value\" }}\r\n </td>\r\n <td>{{ artist.name }}</td>\r\n <td>{{ artist.eid }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <mat-expansion-panel\r\n [expanded]=\"editedArtist\"\r\n [disabled]=\"!editedArtist\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>artist {{ editedArtist?.name }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <cadmus-cod-decoration-artist\r\n [ctTagEntries]=\"ctTagEntries\"\r\n [assTagEntries]=\"assTagEntries\"\r\n [refTagEntries]=\"refTagEntries\"\r\n [artTypeEntries]=\"artTypeEntries\"\r\n [refTypeEntries]=\"refTypeEntries\"\r\n [artStyleEntries]=\"artStyleEntries\"\r\n [idTagEntries]=\"idTagEntries\"\r\n [idScopeEntries]=\"idScopeEntries\"\r\n [artist]=\"editedArtist\"\r\n (artistChange)=\"onArtistSave($event)\"\r\n (editorClose)=\"onArtistClose()\"\r\n ></cadmus-cod-decoration-artist>\r\n </mat-expansion-panel>\r\n </mat-expansion-panel>\r\n\r\n <!-- elements -->\r\n <h3>elements</h3>\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Add element\"\r\n (click)=\"addElement()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n </div>\r\n <table *ngIf=\"elements?.value?.length\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>key</th>\r\n <th>parent</th>\r\n <th>type</th>\r\n <th>subject</th>\r\n <th>extent</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"\r\n let element of elements?.value;\r\n let i = index;\r\n let first = first;\r\n let last = last\r\n \"\r\n >\r\n <td>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit this element\"\r\n (click)=\"editElement(i)\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this element up\"\r\n [disabled]=\"first\"\r\n (click)=\"moveElementUp(i)\"\r\n >\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Move this element down\"\r\n [disabled]=\"last\"\r\n (click)=\"moveElementDown(i)\"\r\n >\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete this element\"\r\n (click)=\"removeElement(i)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ element.key }}</td>\r\n <td>{{ element.parentKey }}</td>\r\n <td>\r\n {{ element.type | flatLookup: decElemTypeEntries:\"id\":\"value\" }}\r\n </td>\r\n <td>{{ element.subject }}</td>\r\n <td>{{ element.ranges | codLocationRange }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </mat-tab>\r\n\r\n <!-- ELEMENT -->\r\n <mat-tab label=\"element\" *ngIf=\"editedElement\">\r\n <cadmus-cod-decoration-element\r\n [imgTypeEntries]=\"imgTypeEntries\"\r\n [decElemPosEntries]=\"decElemPosEntries\"\r\n [decElemFlagEntries]=\"decElemFlagEntries\"\r\n [decElemTechEntries]=\"decElemTechEntries\"\r\n [decElemToolEntries]=\"decElemToolEntries\"\r\n [decElemTypeEntries]=\"decElemTypeEntries\"\r\n [decElemColorEntries]=\"decElemColorEntries\"\r\n [decElemTypolEntries]=\"decElemTypolEntries\"\r\n [decTypeHiddenEntries]=\"decTypeHiddenEntries\"\r\n [decElemGildingEntries]=\"decElemGildingEntries\"\r\n [element]=\"editedElement\"\r\n [parentKeys]=\"parentKeys\"\r\n (elementChange)=\"onElementSave($event)\"\r\n (editorClose)=\"onElementClose()\"\r\n ></cadmus-cod-decoration-element>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <hr />\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard decoration changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept decoration changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon> decoration\r\n </button>\r\n <span style=\"margin-left: 8px\">decorations</span>\r\n </div>\r\n</form>\r\n", styles: ["th{text-align:left;font-weight:400;color:silver}.long-text{width:90%;max-width:800px}h3{margin-top:12px;background-color:#5db2fd;border-radius:6px;padding:0 6px;color:#fff}fieldset{border:1px solid silver;border-radius:6px;padding:6px 12px}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.toolbar-row *{flex:0 0 auto}\n"] }]
338
338
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.DialogService }]; }, propDecorators: { decoration: [{
339
339
  type: Input
340
340
  }], decElemFlagEntries: [{
@@ -380,4 +380,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImpor
380
380
  }], editorClose: [{
381
381
  type: Output
382
382
  }] } });
383
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kLWRlY29yYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXBhcnQtY29kaWNvbG9neS1kZWNvcmF0aW9ucy9zcmMvbGliL2NvZC1kZWNvcmF0aW9uL2NvZC1kZWNvcmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2NhZG11cy1wYXJ0LWNvZGljb2xvZ3ktZGVjb3JhdGlvbnMvc3JjL2xpYi9jb2QtZGVjb3JhdGlvbi9jb2QtZGVjb3JhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFJTCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQU94QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUTVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBTUgsTUFBTSxPQUFPLHNCQUFzQjtJQTJIakMsWUFBWSxXQUF3QixFQUFVLGNBQTZCO1FBQTdCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBUnBFLGtCQUFhLEdBQUc7WUFDckIsS0FBSyxFQUFFLFVBQVU7WUFDakIsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLElBQUk7WUFDZCwwREFBMEQ7WUFDMUQsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztRQUdBLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFB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LENBQUMsT0FBTyxFQUFFO1lBQ3JCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQzs7bUhBdlpVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLGs0QkNwRG5DLHFuV0FxVUE7MkZEalJhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSx1QkFBdUI7OEhBU3RCLFVBQVU7c0JBRHBCLEtBQUs7Z0JBV0Msa0JBQWtCO3NCQUR4QixLQUFLO2dCQUtLLGNBQWM7c0JBRHhCLEtBQUs7Z0JBa0JDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxvQkFBb0I7c0JBRDFCLEtBQUs7Z0JBSUMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQUlDLHFCQUFxQjtzQkFEM0IsS0FBSztnQkFJQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBSUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQUlDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBSUMsY0FBYztzQkFEcEIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxZQUFZO3NCQURsQixLQUFLO2dCQUlDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBSUMsZ0JBQWdCO3NCQUR0QixNQUFNO2dCQUdBLFdBQVc7c0JBRGpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0IHsgVGhlc2F1cnVzRW50cnkgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLWNvcmUnO1xyXG5pbXBvcnQgeyBBc3NlcnRlZENocm9ub3RvcGUgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtY2hyb25vdG9wZSc7XHJcbmltcG9ydCB7IERvY1JlZmVyZW5jZSB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtcmVmcy1kb2MtcmVmZXJlbmNlcyc7XHJcbmltcG9ydCB7IEZsYWcgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLXVpLWZsYWdzLXBpY2tlcic7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAbXlybWlkb24vbmctbWF0LXRvb2xzJztcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBDb2REZWNvcmF0aW9uLFxyXG4gIENvZERlY29yYXRpb25BcnRpc3QsXHJcbiAgQ29kRGVjb3JhdGlvbkVsZW1lbnQsXHJcbn0gZnJvbSAnLi4vY29kLWRlY29yYXRpb25zLXBhcnQnO1xyXG5cclxuLyoqXHJcbiAqIE1hbnVzY3JpcHQncyBkZWNvcmF0aW9uIGVkaXRvci5cclxuICogVGhpcyBjb21wb25lbnQgcmVxdWlyZXMgdGhlIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtdHlwZXMgdGhlc2F1cnVzLlxyXG4gKiBBY2NvcmRpbmcgdG8gdGhlIHR5cGUgc2VsZWN0ZWQsIGl0IGNoYW5nZXMgaXRzIFVJIGJ5OlxyXG4gKiAtIGZpbHRlcmluZyB0aGUgY29udGVudCBvZiBhbGwgdGhlIG90aGVyIHRoZXNhdXJpIChleGNlcHRcclxuICogY29kLWRlY29yYXRpb24tdHlwZS1oaWRkZW4sIHdoaWNoIGhhcyBhIHNwZWNpYWwgbWVhbmluZyksXHJcbiAqIHdoZW4gdGhleSBoYXZlIGEgaGllcmFyY2h5IChpLmUuIHRoZWlyIElEcyBjb250YWluIGEgZG90KS5cclxuICogU3VjaCB0eXBlLWRlcGVuZGVudCB0aGVzYXVyaSBoYXZlIHRoZWlyIGVudHJpZXMgSURzIHByZWZpeGVkXHJcbiAqIHdpdGggdGhlIHR5cGUgSUQgZm9sbG93ZWQgYnkgZG90LiBGb3IgaW5zdGFuY2UsIHR5cGUgXCJpbGxcIlxyXG4gKiBoYXMgc29tZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gYSB0eXBlLWRlcGVuZGVudCB0aGVzYXVydXNcclxuICogbGlrZSBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXR5cGVzLCBsaWtlIFwiaWxsLm1pbmlhdHVyZVwiLFxyXG4gKiBcImlsbC5kcmF3aW5nXCIsIGV0Yy5cclxuICogQWxzbywgaWYgdGhlIGZpbHRlcmVkIGNvbnRlbnQgb2YgYSB0aGVzYXVydXMgaGFwcGVucyB0byBoYXZlXHJcbiAqIGFuIGVudHJ5IElEIGVxdWFsIHRvIFwiLVwiIG9uY2UgdGhlIHR5cGUgcHJlZml4IGhhcyBiZWVuIHN0cmlwcGVkXHJcbiAqIG91dCwgdGhpcyBtZWFucyB0aGF0IGluIHRoaXMgY2FzZSB0aGUgY29ycmVzcG9uZGluZyBjb250cm9sXHJcbiAqIHNob3VsZCBiZSBhIGZyZWUgdGV4dCBib3ggcmF0aGVyIHRoYW4gYSBzZWxlY3Rvci5cclxuICogVGhpcyBhbnl3YXkgZG9lcyBub3QgYXBwbHkgdG8gdGhvc2UgY29udHJvbHMgYWxsb3dpbmcgbXVsdGlwbGVcclxuICogc2VsZWN0aW9ucywgbGlrZSBmbGFncyBvciBjb2xvcnMuXHJcbiAqIC0gaGlkaW5nIHNvbWUgY29udHJvbHMuIFdoZW4gYSB0eXBlIGlzIHNlbGVjdGVkLCB0aGUgdGhlc2F1cnVzXHJcbiAqIGNvZC1kZWNvcmF0aW9uLXR5cGUtaGlkZGVuIGlzIGxvb2tlZCB1cCB0byBmaW5kIGFuIGVudHJ5XHJcbiAqIHdpdGggSUQgZXF1YWwgdG8gdGhlIHNlbGVjdGVkIHR5cGUgSUQuIElmIGZvdW5kLCBpdCBpcyBhc3N1bWVkXHJcbiAqIHRoYXQgaXRzIHZhbHVlIGlzIGEgc3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgbmFtZXMgb2YgdGhvc2VcclxuICogY29udHJvbHMgd2hpY2ggc2hvdWxkIGJlIGhpZGRlbi5cclxuICogVGhpcyBsb2dpYyBpcyBlZmZlY3RpdmVseSBpbXBsZW1lbnRlZCBieVxyXG4gKiBDb2REZWNvcmF0aW9uRWxlbWVudENvbXBvbmVudC5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2FkbXVzLWNvZC1kZWNvcmF0aW9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29kLWRlY29yYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvZC1kZWNvcmF0aW9uLmNvbXBvbmVudC5jc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENvZERlY29yYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHByaXZhdGUgX2RlY29yYXRpb246IENvZERlY29yYXRpb24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZGVjRmxhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBkZWNvcmF0aW9uKCk6IENvZERlY29yYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RlY29yYXRpb247XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZGVjb3JhdGlvbih2YWx1ZTogQ29kRGVjb3JhdGlvbiB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZGVjb3JhdGlvbiA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtZmxhZ3NcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtRmxhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWZsYWdzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGRlY0ZsYWdFbnRyaWVzKCk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RlY0ZsYWdFbnRyaWVzO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRlY0ZsYWdFbnRyaWVzKHZhbHVlOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9kZWNGbGFnRW50cmllcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5hdmFpbEZsYWdzID0gdmFsdWU/Lmxlbmd0aFxyXG4gICAgICA/IHZhbHVlLm1hcCgoZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IGUuaWQsXHJcbiAgICAgICAgICAgIGxhYmVsOiBlLnZhbHVlLFxyXG4gICAgICAgICAgfSBhcyBGbGFnO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIDogW107XHJcbiAgfVxyXG5cclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXR5cGVzIChyZXF1aXJlZClcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtVHlwZUVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tdHlwZS1oaWRkZW5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNUeXBlSGlkZGVuRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LWNvbG9yc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY0VsZW1Db2xvckVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC1naWxkaW5nc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY0VsZW1HaWxkaW5nRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXRlY2huaXF1ZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtVGVjaEVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC1wb3NpdGlvbnNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtUG9zRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXRvb2xzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVjRWxlbVRvb2xFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtdHlwb2xvZ2llc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY0VsZW1UeXBvbEVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWltYWdlLXR5cGVzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaW1nVHlwZUVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tYXJ0aXN0LXR5cGVzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYXJ0VHlwZUVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tYXJ0aXN0LXN0eWxlLW5hbWVzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYXJ0U3R5bGVFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNocm9ub3RvcGUtdGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGN0VGFnRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBhc3NlcnRpb24tdGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGFzc1RhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gZG9jLXJlZmVyZW5jZS10eXBlc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHJlZlR5cGVFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGRvYy1yZWZlcmVuY2UtdGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHJlZlRhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gZXh0ZXJuYWwtaWQtdGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGlkVGFnRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBleHRlcm5hbC1pZC1zY29wZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpZFNjb3BlRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIGRlY29yYXRpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxDb2REZWNvcmF0aW9uPjtcclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgZWRpdG9yQ2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG5cclxuICBwdWJsaWMgZWlkOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgbmFtZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGZsYWdzOiBGb3JtQ29udHJvbDxzdHJpbmdbXT47XHJcbiAgcHVibGljIGNocm9ub3RvcGVzOiBGb3JtQ29udHJvbDxBc3NlcnRlZENocm9ub3RvcGVbXT47XHJcbiAgcHVibGljIGFydGlzdHM6IEZvcm1Db250cm9sPENvZERlY29yYXRpb25BcnRpc3RbXT47XHJcbiAgcHVibGljIG5vdGU6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyByZWZlcmVuY2VzOiBGb3JtQ29udHJvbDxEb2NSZWZlcmVuY2VbXT47XHJcbiAgcHVibGljIGVsZW1lbnRzOiBGb3JtQ29udHJvbDxDb2REZWNvcmF0aW9uRWxlbWVudFtdPjtcclxuICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBwdWJsaWMgaW5pdGlhbENocm9ub3RvcGVzOiBBc3NlcnRlZENocm9ub3RvcGVbXTtcclxuICBwdWJsaWMgaW5pdGlhbFJlZmVyZW5jZXM6IERvY1JlZmVyZW5jZVtdO1xyXG4gIHB1YmxpYyBpbml0aWFsRmxhZ3M6IHN0cmluZ1tdO1xyXG4gIHB1YmxpYyBhdmFpbEZsYWdzOiBGbGFnW107XHJcblxyXG4gIHB1YmxpYyBlZGl0ZWRFbGVtZW50SW5kZXg6IG51bWJlcjtcclxuICBwdWJsaWMgZWRpdGVkRWxlbWVudDogQ29kRGVjb3JhdGlvbkVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIHBhcmVudEtleXM6IHN0cmluZ1tdO1xyXG5cclxuICBwdWJsaWMgZWRpdGVkQXJ0aXN0SW5kZXg6IG51bWJlcjtcclxuICBwdWJsaWMgZWRpdGVkQXJ0aXN0PzogQ29kRGVjb3JhdGlvbkFydGlzdDtcclxuXHJcbiAgcHVibGljIHRhYkluZGV4OiBudW1iZXI7XHJcblxyXG4gIHB1YmxpYyBlZGl0b3JPcHRpb25zID0ge1xyXG4gICAgdGhlbWU6ICd2cy1saWdodCcsXHJcbiAgICBsYW5ndWFnZTogJ21hcmtkb3duJyxcclxuICAgIHdvcmRXcmFwOiAnb24nLFxyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F0dWxhcmVuL25neC1tb25hY28tZWRpdG9yL2lzc3Vlcy8xOVxyXG4gICAgYXV0b21hdGljTGF5b3V0OiB0cnVlLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBfZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSkge1xyXG4gICAgdGhpcy5lZGl0ZWRFbGVtZW50SW5kZXggPSAtMTtcclxuICAgIHRoaXMucGFyZW50S2V5cyA9IFtdO1xyXG4gICAgdGhpcy5lZGl0ZWRBcnRpc3RJbmRleCA9IC0xO1xyXG4gICAgdGhpcy50YWJJbmRleCA9IDA7XHJcbiAgICB0aGlzLmRlY29yYXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENvZERlY29yYXRpb24+KCk7XHJcbiAgICB0aGlzLmVkaXRvckNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICB0aGlzLmluaXRpYWxDaHJvbm90b3BlcyA9IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsUmVmZXJlbmNlcyA9IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsRmxhZ3MgPSBbXTtcclxuICAgIHRoaXMuYXZhaWxGbGFncyA9IFtdO1xyXG4gICAgLy8gZm9ybVxyXG4gICAgdGhpcy5laWQgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCkpO1xyXG4gICAgdGhpcy5uYW1lID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKSxcclxuICAgIF0pO1xyXG4gICAgdGhpcy5mbGFncyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmNocm9ub3RvcGVzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuYXJ0aXN0cyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLm5vdGUgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMDApKTtcclxuICAgIHRoaXMucmVmZXJlbmNlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZWlkOiB0aGlzLmVpZCxcclxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICBmbGFnczogdGhpcy5mbGFncyxcclxuICAgICAgY2hyb25vdG9wZXM6IHRoaXMuY2hyb25vdG9wZXMsXHJcbiAgICAgIGFydGlzdHM6IHRoaXMuYXJ0aXN0cyxcclxuICAgICAgbm90ZTogdGhpcy5ub3RlLFxyXG4gICAgICByZWZlcmVuY2VzOiB0aGlzLnJlZmVyZW5jZXMsXHJcbiAgICAgIGVsZW1lbnRzOiB0aGlzLmVsZW1lbnRzLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9kZWNvcmF0aW9uKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlRm9ybSh0aGlzLl9kZWNvcmF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybShkZWNvcmF0aW9uOiBDb2REZWNvcmF0aW9uIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICBpZiAoIWRlY29yYXRpb24pIHtcclxuICAgICAgdGhpcy5pbml0aWFsQ2hyb25vdG9wZXMgPSBbXTtcclxuICAgICAgdGhpcy5pbml0aWFsUmVmZXJlbmNlcyA9IFtdO1xyXG4gICAgICB0aGlzLmluaXRpYWxGbGFncyA9IFtdO1xyXG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5pdGlhbENocm9ub3RvcGVzID0gZGVjb3JhdGlvbi5jaHJvbm90b3BlcyB8fCBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFJlZmVyZW5jZXMgPSBkZWNvcmF0aW9uLnJlZmVyZW5jZXMgfHwgW107XHJcbiAgICB0aGlzLmluaXRpYWxGbGFncyA9IGRlY29yYXRpb24uZmxhZ3MgfHwgW107XHJcblxyXG4gICAgdGhpcy5laWQuc2V0VmFsdWUoZGVjb3JhdGlvbi5laWQgfHwgbnVsbCk7XHJcbiAgICB0aGlzLm5hbWUuc2V0VmFsdWUoZGVjb3JhdGlvbi5uYW1lKTtcclxuICAgIHRoaXMubm90ZS5zZXRWYWx1ZShkZWNvcmF0aW9uLm5vdGUgfHwgbnVsbCk7XHJcbiAgICB0aGlzLmFydGlzdHMuc2V0VmFsdWUoZGVjb3JhdGlvbi5hcnRpc3RzIHx8IFtdKTtcclxuICAgIHRoaXMuZWxlbWVudHMuc2V0VmFsdWUoZGVjb3JhdGlvbi5lbGVtZW50cyB8fCBbXSk7XHJcblxyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaHJvbm90b3Blc0NoYW5nZShjaHJvbm90b3BlczogQXNzZXJ0ZWRDaHJvbm90b3BlW10pOiB2b2lkIHtcclxuICAgIHRoaXMuY2hyb25vdG9wZXMuc2V0VmFsdWUoY2hyb25vdG9wZXMpO1xyXG4gICAgdGhpcy5jaHJvbm90b3Blcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmNocm9ub3RvcGVzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25SZWZlcmVuY2VzQ2hhbmdlKHJlZmVyZW5jZXM6IERvY1JlZmVyZW5jZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZmVyZW5jZXMuc2V0VmFsdWUocmVmZXJlbmNlcyk7XHJcbiAgICB0aGlzLnJlZmVyZW5jZXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5yZWZlcmVuY2VzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TZWxlY3RlZElkc0NoYW5nZShpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICB0aGlzLmZsYWdzLnNldFZhbHVlKGlkcyk7XHJcbiAgICB0aGlzLmZsYWdzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZmxhZ3MubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGVjb3JhdGlvbigpOiBDb2REZWNvcmF0aW9uIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGVpZDogdGhpcy5laWQudmFsdWU/LnRyaW0oKSxcclxuICAgICAgbmFtZTogdGhpcy5uYW1lLnZhbHVlPy50cmltKCkgfHwgJycsXHJcbiAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLnZhbHVlPy5sZW5ndGggPyB0aGlzLmZsYWdzLnZhbHVlIDogdW5kZWZpbmVkLFxyXG4gICAgICBjaHJvbm90b3BlczogdGhpcy5jaHJvbm90b3Blcy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLmNocm9ub3RvcGVzLnZhbHVlXHJcbiAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgIHJlZmVyZW5jZXM6IHRoaXMucmVmZXJlbmNlcy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLnJlZmVyZW5jZXMudmFsdWVcclxuICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgYXJ0aXN0czogdGhpcy5hcnRpc3RzLnZhbHVlPy5sZW5ndGggPyB0aGlzLmFydGlzdHMudmFsdWUgOiB1bmRlZmluZWQsXHJcbiAgICAgIG5vdGU6IHRoaXMubm90ZS52YWx1ZT8udHJpbSgpLFxyXG4gICAgICBlbGVtZW50czogdGhpcy5lbGVtZW50cy52YWx1ZT8ubGVuZ3RoID8gdGhpcy5lbGVtZW50cy52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gZWxlbWVudHNcclxuICBwdWJsaWMgYWRkRWxlbWVudCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVsZW1lbnQ6IENvZERlY29yYXRpb25FbGVtZW50ID0ge1xyXG4gICAgICB0eXBlOiB0aGlzLmRlY0VsZW1UeXBlRW50cmllcz8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLmRlY0VsZW1UeXBlRW50cmllc1swXS5pZFxyXG4gICAgICAgIDogJycsXHJcbiAgICAgIGZsYWdzOiBbXSxcclxuICAgICAgcmFuZ2VzOiBbXSxcclxuICAgIH07XHJcbiAgICB0aGlzLmVsZW1lbnRzLnNldFZhbHVlKFsuLi50aGlzLmVsZW1lbnRzLnZhbHVlLCBlbGVtZW50XSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWFya0FzRGlydHkoKTtcclxuICAgIHRoaXMuZWRpdEVsZW1lbnQodGhpcy5lbGVtZW50cy52YWx1ZS5sZW5ndGggLSAxKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0RWxlbWVudChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgIHRoaXMuZWRpdGVkRWxlbWVudEluZGV4ID0gLTE7XHJcbiAgICAgIHRoaXMudGFiSW5kZXggPSAwO1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnRJbmRleCA9IGluZGV4O1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRzLnZhbHVlW2luZGV4XTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50YWJJbmRleCA9IDE7XHJcbiAgICAgIH0sIDMwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBhcmVudEtleXMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMudmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnBhcmVudEtleXMgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGtleXM6IHN0cmluZ1tdID0gdGhpcy5lbGVtZW50cy52YWx1ZS5tYXAoXHJcbiAgICAgIChlOiBDb2REZWNvcmF0aW9uRWxlbWVudCkgPT4gZS5rZXkhXHJcbiAgICApO1xyXG4gICAgdGhpcy5wYXJlbnRLZXlzID0gWy4uLm5ldyBTZXQoa2V5cyldLnNvcnQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkVsZW1lbnRTYXZlKGl0ZW06IENvZERlY29yYXRpb25FbGVtZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnNldFZhbHVlKFxyXG4gICAgICB0aGlzLmVsZW1lbnRzLnZhbHVlLm1hcCgoeDogQ29kRGVjb3JhdGlvbkVsZW1lbnQsIGk6IG51bWJlcikgPT5cclxuICAgICAgICBpID09PSB0aGlzLmVkaXRlZEVsZW1lbnRJbmRleCA/IGl0ZW0gOiB4XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWFya0FzRGlydHkoKTtcclxuICAgIHRoaXMuZWRpdEVsZW1lbnQoLTEpO1xyXG4gICAgdGhpcy51cGRhdGVQYXJlbnRLZXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FbGVtZW50Q2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRFbGVtZW50KC0xKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RpYWxvZ1NlcnZpY2VcclxuICAgICAgLmNvbmZpcm0oJ0NvbmZpcm1hdGlvbicsICdEZWxldGUgZWxlbWVudD8nKVxyXG4gICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAuc3Vic2NyaWJlKCh5ZXMpID0+IHtcclxuICAgICAgICBpZiAoeWVzKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmVsZW1lbnRzLnZhbHVlXTtcclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICB0aGlzLmVsZW1lbnRzLnNldFZhbHVlKGl0ZW1zKTtcclxuICAgICAgICAgIHRoaXMuZWxlbWVudHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgdGhpcy5lbGVtZW50cy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW92ZUVsZW1lbnRVcChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmVsZW1lbnRzLnZhbHVlW2luZGV4XTtcclxuICAgIGNvbnN0IGl0ZW1zID0gWy4uLnRoaXMuZWxlbWVudHMudmFsdWVdO1xyXG4gICAgaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCAtIDEsIDAsIGl0ZW0pO1xyXG4gICAgdGhpcy5lbGVtZW50cy5zZXRWYWx1ZShpdGVtcyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3ZlRWxlbWVudERvd24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLmVsZW1lbnRzLnZhbHVlLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtID0gdGhpcy5lbGVtZW50cy52YWx1ZVtpbmRleF07XHJcbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmVsZW1lbnRzLnZhbHVlXTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICBpdGVtcy5zcGxpY2UoaW5kZXggKyAxLCAwLCBpdGVtKTtcclxuICAgIHRoaXMuZWxlbWVudHMuc2V0VmFsdWUoaXRlbXMpO1xyXG4gICAgdGhpcy5lbGVtZW50cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gYXJ0aXN0c1xyXG4gIHB1YmxpYyBhZGRBcnRpc3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCBhcnRpc3Q6IENvZERlY29yYXRpb25BcnRpc3QgPSB7XHJcbiAgICAgIHR5cGU6IHRoaXMuYXJ0VHlwZUVudHJpZXM/Lmxlbmd0aCA/IHRoaXMuYXJ0VHlwZUVudHJpZXNbMF0uaWQgOiAnJyxcclxuICAgICAgbmFtZTogJycsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5hcnRpc3RzLnNldFZhbHVlKFsuLi50aGlzLmFydGlzdHMudmFsdWUsIGFydGlzdF0pO1xyXG4gICAgdGhpcy5hcnRpc3RzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuYXJ0aXN0cy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy5lZGl0QXJ0aXN0KHRoaXMuYXJ0aXN0cy52YWx1ZS5sZW5ndGggLSAxKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0QXJ0aXN0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpbmRleCA8IDApIHtcclxuICAgICAgdGhpcy5lZGl0ZWRBcnRpc3RJbmRleCA9IC0xO1xyXG4gICAgICB0aGlzLmVkaXRlZEFydGlzdCA9IHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZWRpdGVkQXJ0aXN0SW5kZXggPSBpbmRleDtcclxuICAgICAgdGhpcy5lZGl0ZWRBcnRpc3QgPSB0aGlzLmFydGlzdHMudmFsdWVbaW5kZXhdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQXJ0aXN0U2F2ZShpdGVtOiBDb2REZWNvcmF0aW9uQXJ0aXN0KTogdm9pZCB7XHJcbiAgICB0aGlzLmFydGlzdHMuc2V0VmFsdWUoW1xyXG4gICAgICAuLi50aGlzLmFydGlzdHMudmFsdWUubWFwKCh4OiBDb2REZWNvcmF0aW9uQXJ0aXN0LCBpOiBudW1iZXIpID0+XHJcbiAgICAgICAgaSA9PT0gdGhpcy5lZGl0ZWRBcnRpc3RJbmRleCA/IGl0ZW0gOiB4XHJcbiAgICAgICksXHJcbiAgICBdKTtcclxuICAgIHRoaXMuYXJ0aXN0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmFydGlzdHMubWFya0FzRGlydHkoKTtcclxuICAgIHRoaXMuZWRpdEFydGlzdCgtMSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25BcnRpc3RDbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdEFydGlzdCgtMSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlQXJ0aXN0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RpYWxvZ1NlcnZpY2VcclxuICAgICAgLmNvbmZpcm0oJ0NvbmZpcm1hdGlvbicsICdEZWxldGUgYXJ0aXN0PycpXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHllcykgPT4ge1xyXG4gICAgICAgIGlmICh5ZXMpIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gWy4uLnRoaXMuYXJ0aXN0cy52YWx1ZV07XHJcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgdGhpcy5hcnRpc3RzLnNldFZhbHVlKGl0ZW1zKTtcclxuICAgICAgICAgIHRoaXMuYXJ0aXN0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICB0aGlzLmFydGlzdHMubWFya0FzRGlydHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdmVBcnRpc3RVcChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmFydGlzdHMudmFsdWVbaW5kZXhdO1xyXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5hcnRpc3RzLnZhbHVlXTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICBpdGVtcy5zcGxpY2UoaW5kZXggLSAxLCAwLCBpdGVtKTtcclxuICAgIHRoaXMuYXJ0aXN0cy5zZXRWYWx1ZShpdGVtcyk7XHJcbiAgICB0aGlzLmFydGlzdHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5hcnRpc3RzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW92ZUFydGlzdERvd24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLmFydGlzdHMudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmFydGlzdHMudmFsdWVbaW5kZXhdO1xyXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5hcnRpc3RzLnZhbHVlXTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICBpdGVtcy5zcGxpY2UoaW5kZXggKyAxLCAwLCBpdGVtKTtcclxuICAgIHRoaXMuYXJ0aXN0cy5zZXRWYWx1ZShpdGVtcyk7XHJcbiAgICB0aGlzLmFydGlzdHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5hcnRpc3RzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwdWJsaWMgY2FuY2VsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0b3JDbG9zZS5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmRlY29yYXRpb25DaGFuZ2UuZW1pdCh0aGlzLmdldERlY29yYXRpb24oKSk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChzdWJtaXQpPVwic2F2ZSgpXCI+XHJcbiAgPG1hdC10YWItZ3JvdXAgWyhzZWxlY3RlZEluZGV4KV09XCJ0YWJJbmRleFwiPlxyXG4gICAgPCEtLSBHRU5FUkFMIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJnZW5lcmFsXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPCEtLSBpZCAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImVpZFwiIHBsYWNlaG9sZGVyPVwiSURcIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkoZWlkKS5lcnJvcnM/LnJlcXVpcmVkICYmIChlaWQuZGlydHkgfHwgZWlkLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPkVJRCByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShlaWQpLmVycm9ycz8ubWF4TGVuZ3RoICYmIChlaWQuZGlydHkgfHwgZWlkLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPkVJRCB0b28gbG9uZzwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAmbmJzcDtcclxuICAgICAgICA8IS0tIG5hbWUgLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJuYW1lXCIgLz5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KG5hbWUpLmVycm9ycz8ucmVxdWlyZWQgJiYgKG5hbWUuZGlydHkgfHwgbmFtZS50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgID5uYW1lIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KG5hbWUpLmVycm9ycz8ubWF4TGVuZ3RoICYmIChuYW1lLmRpcnR5IHx8IG5hbWUudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+bmFtZSB0b28gbG9uZzwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIGZsYWdzIC0tPlxyXG4gICAgICA8ZmllbGRzZXQ+XHJcbiAgICAgICAgPGxlZ2VuZD5mZWF0dXJlczwvbGVnZW5kPlxyXG4gICAgICAgIDxjYWRtdXMtdWktZmxhZ3MtcGlja2VyXHJcbiAgICAgICAgICBbZmxhZ3NdPVwiYXZhaWxGbGFnc1wiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRJZHNdPVwiaW5pdGlhbEZsYWdzXCJcclxuICAgICAgICAgIChzZWxlY3RlZElkc0NoYW5nZSk9XCJvblNlbGVjdGVkSWRzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgID48L2NhZG11cy11aS1mbGFncy1waWNrZXI+XHJcbiAgICAgIDwvZmllbGRzZXQ+XHJcblxyXG4gICAgICA8IS0tIG5vdGUgLS0+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImxvbmctdGV4dFwiPlxyXG4gICAgICAgIDx0ZXh0YXJlYVxyXG4gICAgICAgICAgcm93cz1cIjNcIlxyXG4gICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJub3RlXCJcclxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwibm90ZVwiXHJcbiAgICAgICAgPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgKm5nSWY9XCIkYW55KG5vdGUpLmVycm9ycz8ubWF4TGVuZ3RoICYmIChub3RlLmRpcnR5IHx8IG5vdGUudG91Y2hlZClcIlxyXG4gICAgICAgICAgPm5vdGUgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICAgID5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgIDwhLS0gY2hyb25vdG9wZXMgLS0+XHJcbiAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGVcclxuICAgICAgICAgICAgPjxtYXQtaWNvbiBzdHlsZT1cIm1hcmdpbi1yaWdodDogOHB4OyBjb2xvcjogIzI0YTUyNFwiXHJcbiAgICAgICAgICAgICAgPmhvdXJnbGFzc19lbXB0eTwvbWF0LWljb25cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICBjaHJvbm90b3BlczwvbWF0LXBhbmVsLXRpdGxlXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8Y2FkbXVzLWFzc2VydGVkLWNocm9ub3RvcGUtc2V0XHJcbiAgICAgICAgICBbdGFnRW50cmllc109XCJjdFRhZ0VudHJpZXNcIlxyXG4gICAgICAgICAgW2Fzc1RhZ0VudHJpZXNdPVwiYXNzVGFnRW50cmllc1wiXHJcbiAgICAgICAgICBbcmVmVGFnRW50cmllc109XCJyZWZUYWdFbnRyaWVzXCJcclxuICAgICAgICAgIFtyZWZUeXBlRW50cmllc109XCJyZWZUeXBlRW50cmllc1wiXHJcbiAgICAgICAgICBbY2hyb25vdG9wZXNdPVwiaW5pdGlhbENocm9ub3RvcGVzXCJcclxuICAgICAgICAgIChjaHJvbm90b3Blc0NoYW5nZSk9XCJvbkNocm9ub3RvcGVzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgID48L2NhZG11cy1hc3NlcnRlZC1jaHJvbm90b3BlLXNldD5cclxuICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG5cclxuICAgICAgPCEtLSByZWZlcmVuY2VzIC0tPlxyXG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlXHJcbiAgICAgICAgICAgID48bWF0LWljb24gc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDsgY29sb3I6ICNiYjNkNmNcIlxyXG4gICAgICAgICAgICAgID5saWJyYXJ5X2Jvb2tzPC9tYXQtaWNvblxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHJlZmVyZW5jZXM8L21hdC1wYW5lbC10aXRsZVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgPGNhZG11cy1yZWZzLWRvYy1yZWZlcmVuY2VzXHJcbiAgICAgICAgICBbdGFnRW50cmllc109XCJyZWZUYWdFbnRyaWVzXCJcclxuICAgICAgICAgIFt0eXBlRW50cmllc109XCJyZWZUeXBlRW50cmllc1wiXHJcbiAgICAgICAgICBbcmVmZXJlbmNlc109XCJpbml0aWFsUmVmZXJlbmNlc1wiXHJcbiAgICAgICAgICAocmVmZXJlbmNlc0NoYW5nZSk9XCJvblJlZmVyZW5jZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY2FkbXVzLXJlZnMtZG9jLXJlZmVyZW5jZXM+XHJcbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuXHJcbiAgICAgIDwhLS0gYXJ0aXN0cyAtLT5cclxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgPG1hdC1wYW5lbC10aXRsZVxyXG4gICAgICAgICAgICA+PG1hdC1pY29uIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7IGNvbG9yOiAjZGRjZDQxXCJcclxuICAgICAgICAgICAgICA+cGFsZXR0ZTwvbWF0LWljb25cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICBhcnRpc3RzPC9tYXQtcGFuZWwtdGl0bGVcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFydGlzdCgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPiBhZGQgYXJ0aXN0XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8dGFibGUgKm5nSWY9XCJhcnRpc3RzPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgICA8dGg+dHlwZTwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoPm5hbWU8L3RoPlxyXG4gICAgICAgICAgICAgIDx0aD5FSUQ8L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPHRyXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwiXHJcbiAgICAgICAgICAgICAgICBsZXQgYXJ0aXN0IG9mIGFydGlzdHM/LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleDtcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9IGZpcnN0O1xyXG4gICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBsYXN0XHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRWRpdCB0aGlzIGFydGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0QXJ0aXN0KGkpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk1vdmUgdGhpcyBhcnRpc3QgdXBcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlyc3RcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUFydGlzdFVwKGkpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X3Vwd2FyZDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiTW92ZSB0aGlzIGFydGlzdCBkb3duXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxhc3RcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUFydGlzdERvd24oaSlcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkRlbGV0ZSB0aGlzIGFydGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVBcnRpc3QoaSlcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+cmVtb3ZlX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIHt7IGFydGlzdC50eXBlIHwgZmxhdExvb2t1cDogYXJ0VHlwZUVudHJpZXM6XCJpZFwiOlwidmFsdWVcIiB9fVxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPnt7IGFydGlzdC5uYW1lIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+e3sgYXJ0aXN0LmVpZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWxcclxuICAgICAgICAgIFtleHBhbmRlZF09XCJlZGl0ZWRBcnRpc3RcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFlZGl0ZWRBcnRpc3RcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5hcnRpc3Qge3sgZWRpdGVkQXJ0aXN0Py5uYW1lIH19PC9tYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgPGNhZG11cy1jb2QtZGVjb3JhdGlvbi1hcnRpc3RcclxuICAgICAgICAgICAgW2N0VGFnRW50cmllc109XCJjdFRhZ0VudHJpZXNcIlxyXG4gICAgICAgICAgICBbYXNzVGFnRW50cmllc109XCJhc3NUYWdFbnRyaWVzXCJcclxuICAgICAgICAgICAgW3JlZlRhZ0VudHJpZXNdPVwicmVmVGFnRW50cmllc1wiXHJcbiAgICAgICAgICAgIFthcnRUeXBlRW50cmllc109XCJhcnRUeXBlRW50cmllc1wiXHJcbiAgICAgICAgICAgIFtyZWZUeXBlRW50cmllc109XCJyZWZUeXBlRW50cmllc1wiXHJcbiAgICAgICAgICAgIFthcnRTdHlsZUVudHJpZXNdPVwiYXJ0U3R5bGVFbnRyaWVzXCJcclxuICAgICAgICAgICAgW2lkVGFnRW50cmllc109XCJpZFRhZ0VudHJpZXNcIlxyXG4gICAgICAgICAgICBbaWRTY29wZUVudHJpZXNdPVwiaWRTY29wZUVudHJpZXNcIlxyXG4gICAgICAgICAgICBbYXJ0aXN0XT1cImVkaXRlZEFydGlzdFwiXHJcbiAgICAgICAgICAgIChhcnRpc3RDaGFuZ2UpPVwib25BcnRpc3RTYXZlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoZWRpdG9yQ2xvc2UpPVwib25BcnRpc3RDbG9zZSgpXCJcclxuICAgICAgICAgID48L2NhZG11cy1jb2QtZGVjb3JhdGlvbi1hcnRpc3Q+XHJcbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcblxyXG4gICAgICA8IS0tIGVsZW1lbnRzIC0tPlxyXG4gICAgICA8aDM+ZWxlbWVudHM8L2gzPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImFkZEVsZW1lbnQoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPiBhZGQgZWxlbWVudFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPHRhYmxlICpuZ0lmPVwiZWxlbWVudHM/LnZhbHVlPy5sZW5ndGhcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICA8dGg+a2V5PC90aD5cclxuICAgICAgICAgICAgPHRoPnBhcmVudDwvdGg+XHJcbiAgICAgICAgICAgIDx0aD50eXBlPC90aD5cclxuICAgICAgICAgICAgPHRoPnN1YmplY3Q8L3RoPlxyXG4gICAgICAgICAgICA8dGg+ZXh0ZW50PC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHJcclxuICAgICAgICAgICAgKm5nRm9yPVwiXHJcbiAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgb2YgZWxlbWVudHM/LnZhbHVlO1xyXG4gICAgICAgICAgICAgIGxldCBpID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gZmlyc3Q7XHJcbiAgICAgICAgICAgICAgbGV0IGxhc3QgPSBsYXN0XHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJFZGl0IHRoaXMgZWxlbWVudFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdEVsZW1lbnQoaSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk1vdmUgdGhpcyBlbGVtZW50IHVwXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaXJzdFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUVsZW1lbnRVcChpKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X3Vwd2FyZDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJNb3ZlIHRoaXMgZWxlbWVudCBkb3duXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsYXN0XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlRWxlbWVudERvd24oaSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd19kb3dud2FyZDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRGVsZXRlIHRoaXMgZWxlbWVudFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChpKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPnJlbW92ZV9jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgZWxlbWVudC5rZXkgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgZWxlbWVudC5wYXJlbnRLZXkgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgZWxlbWVudC50eXBlIHwgZmxhdExvb2t1cDogZGVjRWxlbVR5cGVFbnRyaWVzOlwiaWRcIjpcInZhbHVlXCIgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgZWxlbWVudC5zdWJqZWN0IH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IGVsZW1lbnQucmFuZ2VzIHwgY29kTG9jYXRpb25SYW5nZSB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSBFTEVNRU5UIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJlbGVtZW50XCIgKm5nSWY9XCJlZGl0ZWRFbGVtZW50XCI+XHJcbiAgICAgIDxjYWRtdXMtY29kLWRlY29yYXRpb24tZWxlbWVudFxyXG4gICAgICAgIFtpbWdUeXBlRW50cmllc109XCJpbWdUeXBlRW50cmllc1wiXHJcbiAgICAgICAgW2RlY0VsZW1Qb3NFbnRyaWVzXT1cImRlY0VsZW1Qb3NFbnRyaWVzXCJcclxuICAgICAgICBbZGVjRWxlbUZsYWdFbnRyaWVzXT1cImRlY0VsZW1GbGFnRW50cmllc1wiXHJcbiAgICAgICAgW2RlY0VsZW1UZWNoRW50cmllc109XCJkZWNFbGVtVGVjaEVudHJpZXNcIlxyXG4gICAgICAgIFtkZWNFbGVtVG9vbEVudHJpZXNdPVwiZGVjRWxlbVRvb2xFbnRyaWVzXCJcclxuICAgICAgICBbZGVjRWxlbVR5cGVFbnRyaWVzXT1cImRlY0VsZW1UeXBlRW50cmllc1wiXHJcbiAgICAgICAgW2RlY0VsZW1Db2xvckVudHJpZXNdPVwiZGVjRWxlbUNvbG9yRW50cmllc1wiXHJcbiAgICAgICAgW2RlY0VsZW1UeXBvbEVudHJpZXNdPVwiZGVjRWxlbVR5cG9sRW50cmllc1wiXHJcbiAgICAgICAgW2RlY1R5cGVIaWRkZW5FbnRyaWVzXT1cImRlY1R5cGVIaWRkZW5FbnRyaWVzXCJcclxuICAgICAgICBbZGVjRWxlbUdpbGRpbmdFbnRyaWVzXT1cImRlY0VsZW1HaWxkaW5nRW50cmllc1wiXHJcbiAgICAgICAgW2VsZW1lbnRdPVwiZWRpdGVkRWxlbWVudFwiXHJcbiAgICAgICAgW3BhcmVudEtleXNdPVwicGFyZW50S2V5c1wiXHJcbiAgICAgICAgKGVsZW1lbnRDaGFuZ2UpPVwib25FbGVtZW50U2F2ZSgkZXZlbnQpXCJcclxuICAgICAgICAoZWRpdG9yQ2xvc2UpPVwib25FbGVtZW50Q2xvc2UoKVwiXHJcbiAgICAgID48L2NhZG11cy1jb2QtZGVjb3JhdGlvbi1lbGVtZW50PlxyXG4gICAgPC9tYXQtdGFiPlxyXG4gIDwvbWF0LXRhYi1ncm91cD5cclxuXHJcbiAgPCEtLSBidXR0b25zIC0tPlxyXG4gIDxociAvPlxyXG4gIDxkaXY+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjb2xvcj1cIndhcm5cIlxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgbWF0VG9vbHRpcD1cIkRpc2NhcmQgZGVjb3JhdGlvbiBjaGFuZ2VzXCJcclxuICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwic3VibWl0XCJcclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJBY2NlcHQgZGVjb3JhdGlvbiBjaGFuZ2VzXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZCB8fCBmb3JtLnByaXN0aW5lXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+IGRlY29yYXRpb25cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcbiJdfQ==
383
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kLWRlY29yYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXBhcnQtY29kaWNvbG9neS1kZWNvcmF0aW9ucy9zcmMvbGliL2NvZC1kZWNvcmF0aW9uL2NvZC1kZWNvcmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2NhZG11cy1wYXJ0LWNvZGljb2xvZ3ktZGVjb3JhdGlvbnMvc3JjL2xpYi9jb2QtZGVjb3JhdGlvbi9jb2QtZGVjb3JhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFJTCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQU94QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUTVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBTUgsTUFBTSxPQUFPLHNCQUFzQjtJQTJIakMsWUFBWSxXQUF3QixFQUFVLGNBQTZCO1FBQTdCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBUnBFLGtCQUFhLEdBQUc7WUFDckIsS0FBSyxFQUFFLFVBQVU7WUFDakIsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLElBQUk7WUFDZCwwREFBMEQ7WUFDMUQsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztRQUdBLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFB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LENBQUMsT0FBTyxFQUFFO1lBQ3JCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQzs7bUhBdlpVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLGs0QkNwRG5DLDR5V0F5VUE7MkZEclJhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSx1QkFBdUI7OEhBU3RCLFVBQVU7c0JBRHBCLEtBQUs7Z0JBV0Msa0JBQWtCO3NCQUR4QixLQUFLO2dCQUtLLGNBQWM7c0JBRHhCLEtBQUs7Z0JBa0JDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxvQkFBb0I7c0JBRDFCLEtBQUs7Z0JBSUMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQUlDLHFCQUFxQjtzQkFEM0IsS0FBSztnQkFJQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBSUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQUlDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBSUMsY0FBYztzQkFEcEIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxZQUFZO3NCQURsQixLQUFLO2dCQUlDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBSUMsZ0JBQWdCO3NCQUR0QixNQUFNO2dCQUdBLFdBQVc7c0JBRGpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0IHsgVGhlc2F1cnVzRW50cnkgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLWNvcmUnO1xyXG5pbXBvcnQgeyBBc3NlcnRlZENocm9ub3RvcGUgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtY2hyb25vdG9wZSc7XHJcbmltcG9ydCB7IERvY1JlZmVyZW5jZSB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtcmVmcy1kb2MtcmVmZXJlbmNlcyc7XHJcbmltcG9ydCB7IEZsYWcgfSBmcm9tICdAbXlybWlkb24vY2FkbXVzLXVpLWZsYWdzLXBpY2tlcic7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAbXlybWlkb24vbmctbWF0LXRvb2xzJztcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBDb2REZWNvcmF0aW9uLFxyXG4gIENvZERlY29yYXRpb25BcnRpc3QsXHJcbiAgQ29kRGVjb3JhdGlvbkVsZW1lbnQsXHJcbn0gZnJvbSAnLi4vY29kLWRlY29yYXRpb25zLXBhcnQnO1xyXG5cclxuLyoqXHJcbiAqIE1hbnVzY3JpcHQncyBkZWNvcmF0aW9uIGVkaXRvci5cclxuICogVGhpcyBjb21wb25lbnQgcmVxdWlyZXMgdGhlIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtdHlwZXMgdGhlc2F1cnVzLlxyXG4gKiBBY2NvcmRpbmcgdG8gdGhlIHR5cGUgc2VsZWN0ZWQsIGl0IGNoYW5nZXMgaXRzIFVJIGJ5OlxyXG4gKiAtIGZpbHRlcmluZyB0aGUgY29udGVudCBvZiBhbGwgdGhlIG90aGVyIHRoZXNhdXJpIChleGNlcHRcclxuICogY29kLWRlY29yYXRpb24tdHlwZS1oaWRkZW4sIHdoaWNoIGhhcyBhIHNwZWNpYWwgbWVhbmluZyksXHJcbiAqIHdoZW4gdGhleSBoYXZlIGEgaGllcmFyY2h5IChpLmUuIHRoZWlyIElEcyBjb250YWluIGEgZG90KS5cclxuICogU3VjaCB0eXBlLWRlcGVuZGVudCB0aGVzYXVyaSBoYXZlIHRoZWlyIGVudHJpZXMgSURzIHByZWZpeGVkXHJcbiAqIHdpdGggdGhlIHR5cGUgSUQgZm9sbG93ZWQgYnkgZG90LiBGb3IgaW5zdGFuY2UsIHR5cGUgXCJpbGxcIlxyXG4gKiBoYXMgc29tZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gYSB0eXBlLWRlcGVuZGVudCB0aGVzYXVydXNcclxuICogbGlrZSBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXR5cGVzLCBsaWtlIFwiaWxsLm1pbmlhdHVyZVwiLFxyXG4gKiBcImlsbC5kcmF3aW5nXCIsIGV0Yy5cclxuICogQWxzbywgaWYgdGhlIGZpbHRlcmVkIGNvbnRlbnQgb2YgYSB0aGVzYXVydXMgaGFwcGVucyB0byBoYXZlXHJcbiAqIGFuIGVudHJ5IElEIGVxdWFsIHRvIFwiLVwiIG9uY2UgdGhlIHR5cGUgcHJlZml4IGhhcyBiZWVuIHN0cmlwcGVkXHJcbiAqIG91dCwgdGhpcyBtZWFucyB0aGF0IGluIHRoaXMgY2FzZSB0aGUgY29ycmVzcG9uZGluZyBjb250cm9sXHJcbiAqIHNob3VsZCBiZSBhIGZyZWUgdGV4dCBib3ggcmF0aGVyIHRoYW4gYSBzZWxlY3Rvci5cclxuICogVGhpcyBhbnl3YXkgZG9lcyBub3QgYXBwbHkgdG8gdGhvc2UgY29udHJvbHMgYWxsb3dpbmcgbXVsdGlwbGVcclxuICogc2VsZWN0aW9ucywgbGlrZSBmbGFncyBvciBjb2xvcnMuXHJcbiAqIC0gaGlkaW5nIHNvbWUgY29udHJvbHMuIFdoZW4gYSB0eXBlIGlzIHNlbGVjdGVkLCB0aGUgdGhlc2F1cnVzXHJcbiAqIGNvZC1kZWNvcmF0aW9uLXR5cGUtaGlkZGVuIGlzIGxvb2tlZCB1cCB0byBmaW5kIGFuIGVudHJ5XHJcbiAqIHdpdGggSUQgZXF1YWwgdG8gdGhlIHNlbGVjdGVkIHR5cGUgSUQuIElmIGZvdW5kLCBpdCBpcyBhc3N1bWVkXHJcbiAqIHRoYXQgaXRzIHZhbHVlIGlzIGEgc3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgbmFtZXMgb2YgdGhvc2VcclxuICogY29udHJvbHMgd2hpY2ggc2hvdWxkIGJlIGhpZGRlbi5cclxuICogVGhpcyBsb2dpYyBpcyBlZmZlY3RpdmVseSBpbXBsZW1lbnRlZCBieVxyXG4gKiBDb2REZWNvcmF0aW9uRWxlbWVudENvbXBvbmVudC5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2FkbXVzLWNvZC1kZWNvcmF0aW9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29kLWRlY29yYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvZC1kZWNvcmF0aW9uLmNvbXBvbmVudC5jc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENvZERlY29yYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHByaXZhdGUgX2RlY29yYXRpb246IENvZERlY29yYXRpb24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZGVjRmxhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBkZWNvcmF0aW9uKCk6IENvZERlY29yYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RlY29yYXRpb247XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZGVjb3JhdGlvbih2YWx1ZTogQ29kRGVjb3JhdGlvbiB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZGVjb3JhdGlvbiA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtZmxhZ3NcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtRmxhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWZsYWdzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGRlY0ZsYWdFbnRyaWVzKCk6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RlY0ZsYWdFbnRyaWVzO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGRlY0ZsYWdFbnRyaWVzKHZhbHVlOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9kZWNGbGFnRW50cmllcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5hdmFpbEZsYWdzID0gdmFsdWU/Lmxlbmd0aFxyXG4gICAgICA/IHZhbHVlLm1hcCgoZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IGUuaWQsXHJcbiAgICAgICAgICAgIGxhYmVsOiBlLnZhbHVlLFxyXG4gICAgICAgICAgfSBhcyBGbGFnO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIDogW107XHJcbiAgfVxyXG5cclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXR5cGVzIChyZXF1aXJlZClcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtVHlwZUVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tdHlwZS1oaWRkZW5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNUeXBlSGlkZGVuRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LWNvbG9yc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY0VsZW1Db2xvckVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC1naWxkaW5nc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY0VsZW1HaWxkaW5nRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXRlY2huaXF1ZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtVGVjaEVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tZWxlbWVudC1wb3NpdGlvbnNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWNFbGVtUG9zRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBjb2QtZGVjb3JhdGlvbi1lbGVtZW50LXRvb2xzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVjRWxlbVRvb2xFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNvZC1kZWNvcmF0aW9uLWVsZW1lbnQtdHlwb2xvZ2llc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlY0VsZW1UeXBvbEVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWltYWdlLXR5cGVzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaW1nVHlwZUVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tYXJ0aXN0LXR5cGVzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYXJ0VHlwZUVudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gY29kLWRlY29yYXRpb24tYXJ0aXN0LXN0eWxlLW5hbWVzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYXJ0U3R5bGVFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGNocm9ub3RvcGUtdGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGN0VGFnRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBhc3NlcnRpb24tdGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGFzc1RhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gZG9jLXJlZmVyZW5jZS10eXBlc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHJlZlR5cGVFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGRvYy1yZWZlcmVuY2UtdGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHJlZlRhZ0VudHJpZXM6IFRoZXNhdXJ1c0VudHJ5W10gfCB1bmRlZmluZWQ7XHJcbiAgLy8gZXh0ZXJuYWwtaWQtdGFnc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGlkVGFnRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuICAvLyBleHRlcm5hbC1pZC1zY29wZXNcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpZFNjb3BlRW50cmllczogVGhlc2F1cnVzRW50cnlbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIGRlY29yYXRpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxDb2REZWNvcmF0aW9uPjtcclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgZWRpdG9yQ2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG5cclxuICBwdWJsaWMgZWlkOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgbmFtZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGZsYWdzOiBGb3JtQ29udHJvbDxzdHJpbmdbXT47XHJcbiAgcHVibGljIGNocm9ub3RvcGVzOiBGb3JtQ29udHJvbDxBc3NlcnRlZENocm9ub3RvcGVbXT47XHJcbiAgcHVibGljIGFydGlzdHM6IEZvcm1Db250cm9sPENvZERlY29yYXRpb25BcnRpc3RbXT47XHJcbiAgcHVibGljIG5vdGU6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyByZWZlcmVuY2VzOiBGb3JtQ29udHJvbDxEb2NSZWZlcmVuY2VbXT47XHJcbiAgcHVibGljIGVsZW1lbnRzOiBGb3JtQ29udHJvbDxDb2REZWNvcmF0aW9uRWxlbWVudFtdPjtcclxuICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBwdWJsaWMgaW5pdGlhbENocm9ub3RvcGVzOiBBc3NlcnRlZENocm9ub3RvcGVbXTtcclxuICBwdWJsaWMgaW5pdGlhbFJlZmVyZW5jZXM6IERvY1JlZmVyZW5jZVtdO1xyXG4gIHB1YmxpYyBpbml0aWFsRmxhZ3M6IHN0cmluZ1tdO1xyXG4gIHB1YmxpYyBhdmFpbEZsYWdzOiBGbGFnW107XHJcblxyXG4gIHB1YmxpYyBlZGl0ZWRFbGVtZW50SW5kZXg6IG51bWJlcjtcclxuICBwdWJsaWMgZWRpdGVkRWxlbWVudDogQ29kRGVjb3JhdGlvbkVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIHBhcmVudEtleXM6IHN0cmluZ1tdO1xyXG5cclxuICBwdWJsaWMgZWRpdGVkQXJ0aXN0SW5kZXg6IG51bWJlcjtcclxuICBwdWJsaWMgZWRpdGVkQXJ0aXN0PzogQ29kRGVjb3JhdGlvbkFydGlzdDtcclxuXHJcbiAgcHVibGljIHRhYkluZGV4OiBudW1iZXI7XHJcblxyXG4gIHB1YmxpYyBlZGl0b3JPcHRpb25zID0ge1xyXG4gICAgdGhlbWU6ICd2cy1saWdodCcsXHJcbiAgICBsYW5ndWFnZTogJ21hcmtkb3duJyxcclxuICAgIHdvcmRXcmFwOiAnb24nLFxyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F0dWxhcmVuL25neC1tb25hY28tZWRpdG9yL2lzc3Vlcy8xOVxyXG4gICAgYXV0b21hdGljTGF5b3V0OiB0cnVlLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBfZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSkge1xyXG4gICAgdGhpcy5lZGl0ZWRFbGVtZW50SW5kZXggPSAtMTtcclxuICAgIHRoaXMucGFyZW50S2V5cyA9IFtdO1xyXG4gICAgdGhpcy5lZGl0ZWRBcnRpc3RJbmRleCA9IC0xO1xyXG4gICAgdGhpcy50YWJJbmRleCA9IDA7XHJcbiAgICB0aGlzLmRlY29yYXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENvZERlY29yYXRpb24+KCk7XHJcbiAgICB0aGlzLmVkaXRvckNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICB0aGlzLmluaXRpYWxDaHJvbm90b3BlcyA9IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsUmVmZXJlbmNlcyA9IFtdO1xyXG4gICAgdGhpcy5pbml0aWFsRmxhZ3MgPSBbXTtcclxuICAgIHRoaXMuYXZhaWxGbGFncyA9IFtdO1xyXG4gICAgLy8gZm9ybVxyXG4gICAgdGhpcy5laWQgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCkpO1xyXG4gICAgdGhpcy5uYW1lID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKSxcclxuICAgIF0pO1xyXG4gICAgdGhpcy5mbGFncyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmNocm9ub3RvcGVzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuYXJ0aXN0cyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLm5vdGUgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMDApKTtcclxuICAgIHRoaXMucmVmZXJlbmNlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZWlkOiB0aGlzLmVpZCxcclxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICBmbGFnczogdGhpcy5mbGFncyxcclxuICAgICAgY2hyb25vdG9wZXM6IHRoaXMuY2hyb25vdG9wZXMsXHJcbiAgICAgIGFydGlzdHM6IHRoaXMuYXJ0aXN0cyxcclxuICAgICAgbm90ZTogdGhpcy5ub3RlLFxyXG4gICAgICByZWZlcmVuY2VzOiB0aGlzLnJlZmVyZW5jZXMsXHJcbiAgICAgIGVsZW1lbnRzOiB0aGlzLmVsZW1lbnRzLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9kZWNvcmF0aW9uKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlRm9ybSh0aGlzLl9kZWNvcmF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybShkZWNvcmF0aW9uOiBDb2REZWNvcmF0aW9uIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICBpZiAoIWRlY29yYXRpb24pIHtcclxuICAgICAgdGhpcy5pbml0aWFsQ2hyb25vdG9wZXMgPSBbXTtcclxuICAgICAgdGhpcy5pbml0aWFsUmVmZXJlbmNlcyA9IFtdO1xyXG4gICAgICB0aGlzLmluaXRpYWxGbGFncyA9IFtdO1xyXG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5pdGlhbENocm9ub3RvcGVzID0gZGVjb3JhdGlvbi5jaHJvbm90b3BlcyB8fCBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFJlZmVyZW5jZXMgPSBkZWNvcmF0aW9uLnJlZmVyZW5jZXMgfHwgW107XHJcbiAgICB0aGlzLmluaXRpYWxGbGFncyA9IGRlY29yYXRpb24uZmxhZ3MgfHwgW107XHJcblxyXG4gICAgdGhpcy5laWQuc2V0VmFsdWUoZGVjb3JhdGlvbi5laWQgfHwgbnVsbCk7XHJcbiAgICB0aGlzLm5hbWUuc2V0VmFsdWUoZGVjb3JhdGlvbi5uYW1lKTtcclxuICAgIHRoaXMubm90ZS5zZXRWYWx1ZShkZWNvcmF0aW9uLm5vdGUgfHwgbnVsbCk7XHJcbiAgICB0aGlzLmFydGlzdHMuc2V0VmFsdWUoZGVjb3JhdGlvbi5hcnRpc3RzIHx8IFtdKTtcclxuICAgIHRoaXMuZWxlbWVudHMuc2V0VmFsdWUoZGVjb3JhdGlvbi5lbGVtZW50cyB8fCBbXSk7XHJcblxyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaHJvbm90b3Blc0NoYW5nZShjaHJvbm90b3BlczogQXNzZXJ0ZWRDaHJvbm90b3BlW10pOiB2b2lkIHtcclxuICAgIHRoaXMuY2hyb25vdG9wZXMuc2V0VmFsdWUoY2hyb25vdG9wZXMpO1xyXG4gICAgdGhpcy5jaHJvbm90b3Blcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmNocm9ub3RvcGVzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25SZWZlcmVuY2VzQ2hhbmdlKHJlZmVyZW5jZXM6IERvY1JlZmVyZW5jZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZmVyZW5jZXMuc2V0VmFsdWUocmVmZXJlbmNlcyk7XHJcbiAgICB0aGlzLnJlZmVyZW5jZXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5yZWZlcmVuY2VzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TZWxlY3RlZElkc0NoYW5nZShpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICB0aGlzLmZsYWdzLnNldFZhbHVlKGlkcyk7XHJcbiAgICB0aGlzLmZsYWdzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZmxhZ3MubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGVjb3JhdGlvbigpOiBDb2REZWNvcmF0aW9uIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGVpZDogdGhpcy5laWQudmFsdWU/LnRyaW0oKSxcclxuICAgICAgbmFtZTogdGhpcy5uYW1lLnZhbHVlPy50cmltKCkgfHwgJycsXHJcbiAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLnZhbHVlPy5sZW5ndGggPyB0aGlzLmZsYWdzLnZhbHVlIDogdW5kZWZpbmVkLFxyXG4gICAgICBjaHJvbm90b3BlczogdGhpcy5jaHJvbm90b3Blcy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLmNocm9ub3RvcGVzLnZhbHVlXHJcbiAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgIHJlZmVyZW5jZXM6IHRoaXMucmVmZXJlbmNlcy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLnJlZmVyZW5jZXMudmFsdWVcclxuICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgYXJ0aXN0czogdGhpcy5hcnRpc3RzLnZhbHVlPy5sZW5ndGggPyB0aGlzLmFydGlzdHMudmFsdWUgOiB1bmRlZmluZWQsXHJcbiAgICAgIG5vdGU6IHRoaXMubm90ZS52YWx1ZT8udHJpbSgpLFxyXG4gICAgICBlbGVtZW50czogdGhpcy5lbGVtZW50cy52YWx1ZT8ubGVuZ3RoID8gdGhpcy5lbGVtZW50cy52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gZWxlbWVudHNcclxuICBwdWJsaWMgYWRkRWxlbWVudCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVsZW1lbnQ6IENvZERlY29yYXRpb25FbGVtZW50ID0ge1xyXG4gICAgICB0eXBlOiB0aGlzLmRlY0VsZW1UeXBlRW50cmllcz8ubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLmRlY0VsZW1UeXBlRW50cmllc1swXS5pZFxyXG4gICAgICAgIDogJycsXHJcbiAgICAgIGZsYWdzOiBbXSxcclxuICAgICAgcmFuZ2VzOiBbXSxcclxuICAgIH07XHJcbiAgICB0aGlzLmVsZW1lbnRzLnNldFZhbHVlKFsuLi50aGlzLmVsZW1lbnRzLnZhbHVlLCBlbGVtZW50XSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWFya0FzRGlydHkoKTtcclxuICAgIHRoaXMuZWRpdEVsZW1lbnQodGhpcy5lbGVtZW50cy52YWx1ZS5sZW5ndGggLSAxKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0RWxlbWVudChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgIHRoaXMuZWRpdGVkRWxlbWVudEluZGV4ID0gLTE7XHJcbiAgICAgIHRoaXMudGFiSW5kZXggPSAwO1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnRJbmRleCA9IGluZGV4O1xyXG4gICAgICB0aGlzLmVkaXRlZEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRzLnZhbHVlW2luZGV4XTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50YWJJbmRleCA9IDE7XHJcbiAgICAgIH0sIDMwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBhcmVudEtleXMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMudmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnBhcmVudEtleXMgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGtleXM6IHN0cmluZ1tdID0gdGhpcy5lbGVtZW50cy52YWx1ZS5tYXAoXHJcbiAgICAgIChlOiBDb2REZWNvcmF0aW9uRWxlbWVudCkgPT4gZS5rZXkhXHJcbiAgICApO1xyXG4gICAgdGhpcy5wYXJlbnRLZXlzID0gWy4uLm5ldyBTZXQoa2V5cyldLnNvcnQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkVsZW1lbnRTYXZlKGl0ZW06IENvZERlY29yYXRpb25FbGVtZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnNldFZhbHVlKFxyXG4gICAgICB0aGlzLmVsZW1lbnRzLnZhbHVlLm1hcCgoeDogQ29kRGVjb3JhdGlvbkVsZW1lbnQsIGk6IG51bWJlcikgPT5cclxuICAgICAgICBpID09PSB0aGlzLmVkaXRlZEVsZW1lbnRJbmRleCA/IGl0ZW0gOiB4XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWFya0FzRGlydHkoKTtcclxuICAgIHRoaXMuZWRpdEVsZW1lbnQoLTEpO1xyXG4gICAgdGhpcy51cGRhdGVQYXJlbnRLZXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FbGVtZW50Q2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRFbGVtZW50KC0xKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RpYWxvZ1NlcnZpY2VcclxuICAgICAgLmNvbmZpcm0oJ0NvbmZpcm1hdGlvbicsICdEZWxldGUgZWxlbWVudD8nKVxyXG4gICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAuc3Vic2NyaWJlKCh5ZXMpID0+IHtcclxuICAgICAgICBpZiAoeWVzKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmVsZW1lbnRzLnZhbHVlXTtcclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICB0aGlzLmVsZW1lbnRzLnNldFZhbHVlKGl0ZW1zKTtcclxuICAgICAgICAgIHRoaXMuZWxlbWVudHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgdGhpcy5lbGVtZW50cy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW92ZUVsZW1lbnRVcChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmVsZW1lbnRzLnZhbHVlW2luZGV4XTtcclxuICAgIGNvbnN0IGl0ZW1zID0gWy4uLnRoaXMuZWxlbWVudHMudmFsdWVdO1xyXG4gICAgaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCAtIDEsIDAsIGl0ZW0pO1xyXG4gICAgdGhpcy5lbGVtZW50cy5zZXRWYWx1ZShpdGVtcyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3ZlRWxlbWVudERvd24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLmVsZW1lbnRzLnZhbHVlLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtID0gdGhpcy5lbGVtZW50cy52YWx1ZVtpbmRleF07XHJcbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmVsZW1lbnRzLnZhbHVlXTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICBpdGVtcy5zcGxpY2UoaW5kZXggKyAxLCAwLCBpdGVtKTtcclxuICAgIHRoaXMuZWxlbWVudHMuc2V0VmFsdWUoaXRlbXMpO1xyXG4gICAgdGhpcy5lbGVtZW50cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gYXJ0aXN0c1xyXG4gIHB1YmxpYyBhZGRBcnRpc3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCBhcnRpc3Q6IENvZERlY29yYXRpb25BcnRpc3QgPSB7XHJcbiAgICAgIHR5cGU6IHRoaXMuYXJ0VHlwZUVudHJpZXM/Lmxlbmd0aCA/IHRoaXMuYXJ0VHlwZUVudHJpZXNbMF0uaWQgOiAnJyxcclxuICAgICAgbmFtZTogJycsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5hcnRpc3RzLnNldFZhbHVlKFsuLi50aGlzLmFydGlzdHMudmFsdWUsIGFydGlzdF0pO1xyXG4gICAgdGhpcy5hcnRpc3RzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuYXJ0aXN0cy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy5lZGl0QXJ0aXN0KHRoaXMuYXJ0aXN0cy52YWx1ZS5sZW5ndGggLSAxKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0QXJ0aXN0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpbmRleCA8IDApIHtcclxuICAgICAgdGhpcy5lZGl0ZWRBcnRpc3RJbmRleCA9IC0xO1xyXG4gICAgICB0aGlzLmVkaXRlZEFydGlzdCA9IHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZWRpdGVkQXJ0aXN0SW5kZXggPSBpbmRleDtcclxuICAgICAgdGhpcy5lZGl0ZWRBcnRpc3QgPSB0aGlzLmFydGlzdHMudmFsdWVbaW5kZXhdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQXJ0aXN0U2F2ZShpdGVtOiBDb2REZWNvcmF0aW9uQXJ0aXN0KTogdm9pZCB7XHJcbiAgICB0aGlzLmFydGlzdHMuc2V0VmFsdWUoW1xyXG4gICAgICAuLi50aGlzLmFydGlzdHMudmFsdWUubWFwKCh4OiBDb2REZWNvcmF0aW9uQXJ0aXN0LCBpOiBudW1iZXIpID0+XHJcbiAgICAgICAgaSA9PT0gdGhpcy5lZGl0ZWRBcnRpc3RJbmRleCA/IGl0ZW0gOiB4XHJcbiAgICAgICksXHJcbiAgICBdKTtcclxuICAgIHRoaXMuYXJ0aXN0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmFydGlzdHMubWFya0FzRGlydHkoKTtcclxuICAgIHRoaXMuZWRpdEFydGlzdCgtMSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25BcnRpc3RDbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdEFydGlzdCgtMSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlQXJ0aXN0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RpYWxvZ1NlcnZpY2VcclxuICAgICAgLmNvbmZpcm0oJ0NvbmZpcm1hdGlvbicsICdEZWxldGUgYXJ0aXN0PycpXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHllcykgPT4ge1xyXG4gICAgICAgIGlmICh5ZXMpIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gWy4uLnRoaXMuYXJ0aXN0cy52YWx1ZV07XHJcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgdGhpcy5hcnRpc3RzLnNldFZhbHVlKGl0ZW1zKTtcclxuICAgICAgICAgIHRoaXMuYXJ0aXN0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICB0aGlzLmFydGlzdHMubWFya0FzRGlydHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdmVBcnRpc3RVcChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmFydGlzdHMudmFsdWVbaW5kZXhdO1xyXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5hcnRpc3RzLnZhbHVlXTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICBpdGVtcy5zcGxpY2UoaW5kZXggLSAxLCAwLCBpdGVtKTtcclxuICAgIHRoaXMuYXJ0aXN0cy5zZXRWYWx1ZShpdGVtcyk7XHJcbiAgICB0aGlzLmFydGlzdHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5hcnRpc3RzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW92ZUFydGlzdERvd24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLmFydGlzdHMudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmFydGlzdHMudmFsdWVbaW5kZXhdO1xyXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5hcnRpc3RzLnZhbHVlXTtcclxuICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICBpdGVtcy5zcGxpY2UoaW5kZXggKyAxLCAwLCBpdGVtKTtcclxuICAgIHRoaXMuYXJ0aXN0cy5zZXRWYWx1ZShpdGVtcyk7XHJcbiAgICB0aGlzLmFydGlzdHMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5hcnRpc3RzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwdWJsaWMgY2FuY2VsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0b3JDbG9zZS5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmRlY29yYXRpb25DaGFuZ2UuZW1pdCh0aGlzLmdldERlY29yYXRpb24oKSk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChzdWJtaXQpPVwic2F2ZSgpXCI+XHJcbiAgPG1hdC10YWItZ3JvdXAgWyhzZWxlY3RlZEluZGV4KV09XCJ0YWJJbmRleFwiPlxyXG4gICAgPCEtLSBHRU5FUkFMIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJnZW5lcmFsXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPCEtLSBpZCAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPklEPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImVpZFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShlaWQpLmVycm9ycz8ucmVxdWlyZWQgJiYgKGVpZC5kaXJ0eSB8fCBlaWQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+RUlEIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KGVpZCkuZXJyb3JzPy5tYXhMZW5ndGggJiYgKGVpZC5kaXJ0eSB8fCBlaWQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+RUlEIHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICZuYnNwO1xyXG4gICAgICAgIDwhLS0gbmFtZSAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPm5hbWU8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwibmFtZVwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShuYW1lKS5lcnJvcnM/LnJlcXVpcmVkICYmIChuYW1lLmRpcnR5IHx8IG5hbWUudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+bmFtZSByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShuYW1lKS5lcnJvcnM/Lm1heExlbmd0aCAmJiAobmFtZS5kaXJ0eSB8fCBuYW1lLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPm5hbWUgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBmbGFncyAtLT5cclxuICAgICAgPGZpZWxkc2V0PlxyXG4gICAgICAgIDxsZWdlbmQ+ZmVhdHVyZXM8L2xlZ2VuZD5cclxuICAgICAgICA8Y2FkbXVzLXVpLWZsYWdzLXBpY2tlclxyXG4gICAgICAgICAgW2ZsYWdzXT1cImF2YWlsRmxhZ3NcIlxyXG4gICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImluaXRpYWxGbGFnc1wiXHJcbiAgICAgICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25TZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICA+PC9jYWRtdXMtdWktZmxhZ3MtcGlja2VyPlxyXG4gICAgICA8L2ZpZWxkc2V0PlxyXG5cclxuICAgICAgPCEtLSBub3RlIC0tPlxyXG4gICAgICA8YnIgLz5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibG9uZy10ZXh0XCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5ub3RlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPHRleHRhcmVhIHJvd3M9XCIzXCIgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cIm5vdGVcIj48L3RleHRhcmVhPlxyXG4gICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICpuZ0lmPVwiJGFueShub3RlKS5lcnJvcnM/Lm1heExlbmd0aCAmJiAobm90ZS5kaXJ0eSB8fCBub3RlLnRvdWNoZWQpXCJcclxuICAgICAgICAgID5ub3RlIHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgICA+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICA8IS0tIGNocm9ub3RvcGVzIC0tPlxyXG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlXHJcbiAgICAgICAgICAgID48bWF0LWljb24gc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDsgY29sb3I6ICMyNGE1MjRcIlxyXG4gICAgICAgICAgICAgID5ob3VyZ2xhc3NfZW1wdHk8L21hdC1pY29uXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgY2hyb25vdG9wZXM8L21hdC1wYW5lbC10aXRsZVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgPGNhZG11cy1hc3NlcnRlZC1jaHJvbm90b3BlLXNldFxyXG4gICAgICAgICAgW3RhZ0VudHJpZXNdPVwiY3RUYWdFbnRyaWVzXCJcclxuICAgICAgICAgIFthc3NUYWdFbnRyaWVzXT1cImFzc1RhZ0VudHJpZXNcIlxyXG4gICAgICAgICAgW3JlZlRhZ0VudHJpZXNdPVwicmVmVGFnRW50cmllc1wiXHJcbiAgICAgICAgICBbcmVmVHlwZUVudHJpZXNdPVwicmVmVHlwZUVudHJpZXNcIlxyXG4gICAgICAgICAgW2Nocm9ub3RvcGVzXT1cImluaXRpYWxDaHJvbm90b3Blc1wiXHJcbiAgICAgICAgICAoY2hyb25vdG9wZXNDaGFuZ2UpPVwib25DaHJvbm90b3Blc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICA+PC9jYWRtdXMtYXNzZXJ0ZWQtY2hyb25vdG9wZS1zZXQ+XHJcbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuXHJcbiAgICAgIDwhLS0gcmVmZXJlbmNlcyAtLT5cclxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgPG1hdC1wYW5lbC10aXRsZVxyXG4gICAgICAgICAgICA+PG1hdC1pY29uIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7IGNvbG9yOiAjYmIzZDZjXCJcclxuICAgICAgICAgICAgICA+bGlicmFyeV9ib29rczwvbWF0LWljb25cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICByZWZlcmVuY2VzPC9tYXQtcGFuZWwtdGl0bGVcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgIDxjYWRtdXMtcmVmcy1kb2MtcmVmZXJlbmNlc1xyXG4gICAgICAgICAgW3RhZ0VudHJpZXNdPVwicmVmVGFnRW50cmllc1wiXHJcbiAgICAgICAgICBbdHlwZUVudHJpZXNdPVwicmVmVHlwZUVudHJpZXNcIlxyXG4gICAgICAgICAgW3JlZmVyZW5jZXNdPVwiaW5pdGlhbFJlZmVyZW5jZXNcIlxyXG4gICAgICAgICAgKHJlZmVyZW5jZXNDaGFuZ2UpPVwib25SZWZlcmVuY2VzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgID48L2NhZG11cy1yZWZzLWRvYy1yZWZlcmVuY2VzPlxyXG4gICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcblxyXG4gICAgICA8IS0tIGFydGlzdHMgLS0+XHJcbiAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGVcclxuICAgICAgICAgICAgPjxtYXQtaWNvbiBzdHlsZT1cIm1hcmdpbi1yaWdodDogOHB4OyBjb2xvcjogI2RkY2Q0MVwiXHJcbiAgICAgICAgICAgICAgPnBhbGV0dGU8L21hdC1pY29uXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgYXJ0aXN0czwvbWF0LXBhbmVsLXRpdGxlXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBZGQgYXJ0aXN0XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFydGlzdCgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHRhYmxlICpuZ0lmPVwiYXJ0aXN0cz8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoPnR5cGU8L3RoPlxyXG4gICAgICAgICAgICAgIDx0aD5uYW1lPC90aD5cclxuICAgICAgICAgICAgICA8dGg+RUlEPC90aD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDx0clxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cIlxyXG4gICAgICAgICAgICAgICAgbGV0IGFydGlzdCBvZiBhcnRpc3RzPy52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSBmaXJzdDtcclxuICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gbGFzdFxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkVkaXQgdGhpcyBhcnRpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdEFydGlzdChpKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJNb3ZlIHRoaXMgYXJ0aXN0IHVwXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpcnN0XCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVBcnRpc3RVcChpKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd191cHdhcmQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk1vdmUgdGhpcyBhcnRpc3QgZG93blwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsYXN0XCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVBcnRpc3REb3duKGkpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEZWxldGUgdGhpcyBhcnRpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQXJ0aXN0KGkpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnJlbW92ZV9jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICB7eyBhcnRpc3QudHlwZSB8IGZsYXRMb29rdXA6IGFydFR5cGVFbnRyaWVzOlwiaWRcIjpcInZhbHVlXCIgfX1cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD57eyBhcnRpc3QubmFtZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPnt7IGFydGlzdC5laWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsXHJcbiAgICAgICAgICBbZXhwYW5kZWRdPVwiZWRpdGVkQXJ0aXN0XCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGVkQXJ0aXN0XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+YXJ0aXN0IHt7IGVkaXRlZEFydGlzdD8ubmFtZSB9fTwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgIDxjYWRtdXMtY29kLWRlY29yYXRpb24tYXJ0aXN0XHJcbiAgICAgICAgICAgIFtjdFRhZ0VudHJpZXNdPVwiY3RUYWdFbnRyaWVzXCJcclxuICAgICAgICAgICAgW2Fzc1RhZ0VudHJpZXNdPVwiYXNzVGFnRW50cmllc1wiXHJcbiAgICAgICAgICAgIFtyZWZUYWdFbnRyaWVzXT1cInJlZlRhZ0VudHJpZXNcIlxyXG4gICAgICAgICAgICBbYXJ0VHlwZUVudHJpZXNdPVwiYXJ0VHlwZUVudHJpZXNcIlxyXG4gICAgICAgICAgICBbcmVmVHlwZUVudHJpZXNdPVwicmVmVHlwZUVudHJpZXNcIlxyXG4gICAgICAgICAgICBbYXJ0U3R5bGVFbnRyaWVzXT1cImFydFN0eWxlRW50cmllc1wiXHJcbiAgICAgICAgICAgIFtpZFRhZ0VudHJpZXNdPVwiaWRUYWdFbnRyaWVzXCJcclxuICAgICAgICAgICAgW2lkU2NvcGVFbnRyaWVzXT1cImlkU2NvcGVFbnRyaWVzXCJcclxuICAgICAgICAgICAgW2FydGlzdF09XCJlZGl0ZWRBcnRpc3RcIlxyXG4gICAgICAgICAgICAoYXJ0aXN0Q2hhbmdlKT1cIm9uQXJ0aXN0U2F2ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGVkaXRvckNsb3NlKT1cIm9uQXJ0aXN0Q2xvc2UoKVwiXHJcbiAgICAgICAgICA+PC9jYWRtdXMtY29kLWRlY29yYXRpb24tYXJ0aXN0PlxyXG4gICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG5cclxuICAgICAgPCEtLSBlbGVtZW50cyAtLT5cclxuICAgICAgPGgzPmVsZW1lbnRzPC9oMz5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJBZGQgZWxlbWVudFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkRWxlbWVudCgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWljb24+YWRkX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8dGFibGUgKm5nSWY9XCJlbGVtZW50cz8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5rZXk8L3RoPlxyXG4gICAgICAgICAgICA8dGg+cGFyZW50PC90aD5cclxuICAgICAgICAgICAgPHRoPnR5cGU8L3RoPlxyXG4gICAgICAgICAgICA8dGg+c3ViamVjdDwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5leHRlbnQ8L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0clxyXG4gICAgICAgICAgICAqbmdGb3I9XCJcclxuICAgICAgICAgICAgICBsZXQgZWxlbWVudCBvZiBlbGVtZW50cz8udmFsdWU7XHJcbiAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleDtcclxuICAgICAgICAgICAgICBsZXQgZmlyc3QgPSBmaXJzdDtcclxuICAgICAgICAgICAgICBsZXQgbGFzdCA9IGxhc3RcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkVkaXQgdGhpcyBlbGVtZW50XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0RWxlbWVudChpKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiTW92ZSB0aGlzIGVsZW1lbnQgdXBcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpcnN0XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlRWxlbWVudFVwKGkpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfdXB3YXJkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk1vdmUgdGhpcyBlbGVtZW50IGRvd25cIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxhc3RcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVFbGVtZW50RG93bihpKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEZWxldGUgdGhpcyBlbGVtZW50XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGkpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+cmVtb3ZlX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBlbGVtZW50LmtleSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBlbGVtZW50LnBhcmVudEtleSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICB7eyBlbGVtZW50LnR5cGUgfCBmbGF0TG9va3VwOiBkZWNFbGVtVHlwZUVudHJpZXM6XCJpZFwiOlwidmFsdWVcIiB9fVxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgZWxlbWVudC5zdWJqZWN0IH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IGVsZW1lbnQucmFuZ2VzIHwgY29kTG9jYXRpb25SYW5nZSB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSBFTEVNRU5UIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJlbGVtZW50XCIgKm5nSWY9XCJlZGl0ZWRFbGVtZW50XCI+XHJcbiAgICAgIDxjYWRtdXMtY29kLWRlY29yYXRpb24tZWxlbWVudFxyXG4gICAgICAgIFtpbWdUeXBlRW50cmllc109XCJpbWdUeXBlRW50cmllc1wiXHJcbiAgICAgICAgW2RlY0VsZW1Qb3NFbnRyaWVzXT1cImRlY0VsZW1Qb3NFbnRyaWVzXCJcclxuICAgICAgICBbZGVjRWxlbUZsYWdFbnRyaWVzXT1cImRlY0VsZW1GbGFnRW50cmllc1wiXHJcbiAgICAgICAgW2RlY0VsZW1UZWNoRW50cmllc109XCJkZWNFbGVtVGVjaEVudHJpZXNcIlxyXG4gICAgICAgIFtkZWNFbGVtVG9vbEVudHJpZXNdPVwiZGVjRWxlbVRvb2xFbnRyaWVzXCJcclxuICAgICAgICBbZGVjRWxlbVR5cGVFbnRyaWVzXT1cImRlY0VsZW1UeXBlRW50cmllc1wiXHJcbiAgICAgICAgW2RlY0VsZW1Db2xvckVudHJpZXNdPVwiZGVjRWxlbUNvbG9yRW50cmllc1wiXHJcbiAgICAgICAgW2RlY0VsZW1UeXBvbEVudHJpZXNdPVwiZGVjRWxlbVR5cG9sRW50cmllc1wiXHJcbiAgICAgICAgW2RlY1R5cGVIaWRkZW5FbnRyaWVzXT1cImRlY1R5cGVIaWRkZW5FbnRyaWVzXCJcclxuICAgICAgICBbZGVjRWxlbUdpbGRpbmdFbnRyaWVzXT1cImRlY0VsZW1HaWxkaW5nRW50cmllc1wiXHJcbiAgICAgICAgW2VsZW1lbnRdPVwiZWRpdGVkRWxlbWVudFwiXHJcbiAgICAgICAgW3BhcmVudEtleXNdPVwicGFyZW50S2V5c1wiXHJcbiAgICAgICAgKGVsZW1lbnRDaGFuZ2UpPVwib25FbGVtZW50U2F2ZSgkZXZlbnQpXCJcclxuICAgICAgICAoZWRpdG9yQ2xvc2UpPVwib25FbGVtZW50Q2xvc2UoKVwiXHJcbiAgICAgID48L2NhZG11cy1jb2QtZGVjb3JhdGlvbi1lbGVtZW50PlxyXG4gICAgPC9tYXQtdGFiPlxyXG4gIDwvbWF0LXRhYi1ncm91cD5cclxuXHJcbiAgPCEtLSBidXR0b25zIC0tPlxyXG4gIDxociAvPlxyXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJvd1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJEaXNjYXJkIGRlY29yYXRpb24gY2hhbmdlc1wiXHJcbiAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiQWNjZXB0IGRlY29yYXRpb24gY2hhbmdlc1wiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWQgfHwgZm9ybS5wcmlzdGluZVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj5jaGVja19jaXJjbGU8L21hdC1pY29uPiBkZWNvcmF0aW9uXHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDhweFwiPmRlY29yYXRpb25zPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcbiJdfQ==