@net7/boilerplate-muruca 5.3.5 → 5.4.1

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.
@@ -3,11 +3,12 @@ import { AbstractLayout } from '@net7/boilerplate-common';
3
3
  import { MrResourceLayoutConfig as config } from './resource-layout.config';
4
4
  import { MrImageViewerEH } from '../../event-handlers/image-viewer.eh';
5
5
  import { MrTextViewerEH } from '../../event-handlers/text-viewer.eh';
6
+ import { MrParallelTextViewerEH } from '../../event-handlers/parallel-text-viewer.eh';
6
7
  import { MrImageViewerToolsEH } from '../../event-handlers/image-viewer-tools.eh';
7
8
  import { MrCollectionEH } from '../../event-handlers/collection.eh';
8
9
  import { MrImageViewerOverlayDetailsEH } from '../../event-handlers/image-viewer-overlay-details.eh';
9
10
  import { MrButtonEH, MrMetadataDynamicEH } from '../../event-handlers';
10
- import { MrBreadcrumbsDS, MrButtonDS, MrCollectionDS, MrImageViewerDS, MrImageViewerToolsDS, MrInfoBoxDS, MrInnerTitleDS, MrItemPreviewDS, MrMetadataDS, MrTextViewerDS, MrResourceTabsDS, MrImageViewerOverlayDetailsDS, MrMetadataDynamicDS, MrImageViewerIiifDS, } from '../../data-sources';
11
+ import { MrBreadcrumbsDS, MrButtonDS, MrCollectionDS, MrImageViewerDS, MrImageViewerToolsDS, MrInfoBoxDS, MrInnerTitleDS, MrItemPreviewDS, MrMetadataDS, MrTextViewerDS, MrParallelTextViewerDS, MrResourceTabsDS, MrImageViewerOverlayDetailsDS, MrMetadataDynamicDS, MrImageViewerIiifDS, } from '../../data-sources';
11
12
  import { MrMapDS } from '../../data-sources/map.ds';
12
13
  import * as i0 from "@angular/core";
13
14
  import * as i1 from "@net7/boilerplate-common";
@@ -35,6 +36,7 @@ const DATASOURCE_MAP = {
35
36
  'viewer-tools': MrImageViewerToolsDS,
36
37
  'viewer-overlay-details': MrImageViewerOverlayDetailsDS,
37
38
  'text-viewer': MrTextViewerDS,
39
+ 'parallel-text-viewer': MrParallelTextViewerDS,
38
40
  'metadata-dynamic': MrMetadataDynamicDS,
39
41
  'viewer-iiif': MrImageViewerIiifDS,
40
42
  };
@@ -43,6 +45,7 @@ const EVENTHANDLER_MAP = {
43
45
  'viewer-tools': MrImageViewerToolsEH,
44
46
  'viewer-overlay-details': MrImageViewerOverlayDetailsEH,
45
47
  'text-viewer': MrTextViewerEH,
48
+ 'parallel-text-viewer': MrParallelTextViewerEH,
46
49
  collection: MrCollectionEH,
47
50
  'metadata-dynamic': MrMetadataDynamicEH,
48
51
  button: MrButtonEH,
@@ -142,10 +145,10 @@ export class MrResourceLayoutComponent extends AbstractLayout {
142
145
  }
143
146
  }
144
147
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MrResourceLayoutComponent, deps: [{ token: i1.LayoutsConfigurationService }, { token: i2.ActivatedRoute }, { token: i1.ConfigurationService }, { token: i1.CommunicationService }, { token: i1.MainStateService }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i3.MrLayoutStateService }, { token: i4.MrResourceModalService }, { token: i5.MrLocaleService }], target: i0.ɵɵFactoryTarget.Component }); }
145
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MrResourceLayoutComponent, selector: "mr-resource-layout", usesInheritance: true, ngImport: i0, template: "<div class=\"mr-resource mr-layout\" \n *ngIf=\"lb.dataSource && lb.dataSource.pageConfig\"\n [ngClass]=\"{\n 'is-loading': ( layoutState.get$('content') | async ) == 'LOADING',\n 'is-error': ( layoutState.get$('content') | async ) == 'ERROR'\n }\">\n <!-- RESOURCE LAYOUT CONTENT -->\n <ng-container [ngSwitch]=\"layoutState.get$('content') | async\">\n <!-- loading -->\n <ng-container *ngSwitchCase=\"'LOADING'\">\n <div class=\"mr-layout__loader\">\n <n7-loader></n7-loader>\n </div>\n </ng-container>\n\n <!-- error -->\n <ng-container *ngSwitchCase=\"'ERROR'\">\n <div class=\"mr-layout__error\">\n <h2>{{ lb.dataSource.errorTitle }}</h2>\n <p>{{ lb.dataSource.errorDescription }}</p>\n </div>\n </ng-container>\n\n <!-- success -->\n <ng-container *ngSwitchCase=\"'SUCCESS'\">\n <ng-container *ngIf=\"lb.dataSource.pageConfig.sections as sections\">\n <!-- Pass the list of blocks to render to the block template -->\n <div class=\"mr-resource__top\">\n <ng-container *ngTemplateOutlet=\"blocks; context: { $implicit: sections.top }\"></ng-container>\n </div>\n <div class=\"mr-resource__content mr-side-margin\">\n <ng-container *ngTemplateOutlet=\"blocks; context: { $implicit: sections.content }\"></ng-container>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-container>\n</div>\n\n<ng-template #blocks let-list>\n <ng-container *ngFor=\"let section of list\">\n <section *ngIf=\"lb.widgets[section.id].ds.out$ | async\"\n class=\"{{ 'mr-resource__section mr-resource__' + section.type }}\">\n <ng-container [ngSwitch]=\"section.type\">\n\n <!-- TABS -->\n <ng-container *ngSwitchCase=\"'tabs'\">\n <ng-container *ngFor=\"let tab of lb.widgets[section.id].ds.out$ | async\">\n <n7-anchor-wrapper [data]=\"tab.anchor\" [classes]=\"tab.classes\" *ngIf=\"!tab.hideTab\">\n <span class=\"mr-resource__tabs-item\">{{ tab.label }}</span>\n </n7-anchor-wrapper>\n </ng-container>\n </ng-container>\n\n <!-- INNER TITLE -->\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"mr-resource__title-content mr-side-margin\">\n <n7-inner-title \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-inner-title>\n </div>\n </ng-container>\n\n <!-- CUSTOM BUTTON -->\n <ng-container *ngSwitchCase=\"'button'\">\n <div class=\"mr-resource__button\">\n <n7-button \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-button>\n </div>\n </ng-container>\n \n <!-- IMAGE VIEWER IIIF -->\n <ng-container *ngSwitchCase=\"'viewer-iiif'\">\n <n7-mirador\n (contextmenu)=\"lb.dataSource.hasContextMenu()\"\n [data]=\"lb.widgets[section.id].ds.out$ | async\">\n </n7-mirador>\n </ng-container>\n \n <!-- IMAGE VIEWER -->\n <ng-container *ngSwitchCase=\"'viewer'\">\n\n <n7-image-viewer \n [data]=\"lb.widgets[section.id].ds.out$ | async\" \n [emit]=\"lb.widgets[section.id].emit\">\n </n7-image-viewer>\n <!-- IMAGE VIEWER TOOLS -->\n <n7-image-viewer-tools *ngIf=\"section.tools\" \n [data]=\"lb.widgets[section.id + '-tools'].ds.out$ | async\" \n [emit]=\"lb.widgets[section.id + '-tools'].emit\">\n </n7-image-viewer-tools>\n <!-- IMAGE VIEWER OVERLAY DETAILS -->\n <div *ngIf=\"lb.widgets[section.id + '-overlay-details'].ds.out$ | async as viewerDetailsData\" \n class=\"mr-resource__viewer-overlay-details\">\n <div class=\"mr-resource__viewer-overlay-details__close\">\n <a class=\"mr-resource__viewer-overlay-details__close-link\" \n (click)=\"lb.eventHandler.emitOuter('overlaycloseclick')\">\n <span class=\"n7-icon-close\"></span>\n </a>\n </div>\n <n7-item-preview \n [data]=\"viewerDetailsData\" \n [emit]=\"lb.widgets[section.id + '-overlay-details'].emit\">\n </n7-item-preview>\n </div>\n\n </ng-container>\n \n <!-- METADATA VIEWER -->\n <ng-container *ngSwitchCase=\"'metadata'\">\n \n <div class=\"mr-content-block mr-content-block-metadata\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <mr-read-more [data]=\"section.readmore\">\n <ng-container *ngIf=\" section?.options?.readmore || section?.options?.groupReadmore;\n else wihoutReadmore\">\n <mr-metadata-readmore\n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </mr-metadata-readmore>\n </ng-container>\n <ng-template #wihoutReadmore>\n <n7-metadata-viewer\n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-metadata-viewer>\n </ng-template>\n </mr-read-more>\n </div>\n </div>\n \n </ng-container>\n \n <!-- METADATA DYNAMIC -->\n <ng-container *ngSwitchCase=\"'metadata-dynamic'\">\n <mr-metadata-dynamic \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </mr-metadata-dynamic> \n </ng-container>\n \n <!-- COLLECTION -->\n <ng-container *ngSwitchCase=\"'collection'\">\n <ng-container *ngIf=\"lb.widgets[section.id].ds.out$ | async as collection$\">\n <div *ngIf=\"collection$.items?.length > 0\" class=\"mr-content-block mr-content-block-collection\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content {{ section.grid ? 'n7-grid-' + section.grid : '' }}\">\n <n7-item-preview *ngFor=\"let item of collection$?.items\"\n [data]=\"item\" [emit]=\"lb.widgets[section.id].emit\">\n </n7-item-preview>\n </div>\n </div>\n </ng-container>\n </ng-container>\n \n <!-- ITEM PREVIEW -->\n <ng-container *ngSwitchCase=\"'preview'\">\n <div class=\"mr-content-block mr-content-block-item-preview\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <n7-item-preview [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\"> \n </n7-item-preview>\n </div>\n </div>\n </ng-container>\n \n <!-- TEXT VIEWER -->\n <ng-container *ngSwitchCase=\"'text-viewer'\">\n <div class=\"mr-content-block mr-content-block-text-viewer\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <n7-text-viewer [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\">\n </n7-text-viewer>\n </div>\n </div>\n \n </ng-container>\n\n <!-- MAP -->\n <ng-container *ngSwitchCase=\"'map'\">\n <div class=\"mr-content-block mr-content-block-map\">\n <div class=\"mr-content-block__content\">\n <n7-map [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\"></n7-map>\n </div>\n </div>\n </ng-container>\n \n <!-- INFO BOX -->\n <ng-container *ngSwitchCase=\"'info-box'\">\n <div class=\"mr-content-block mr-content-block-info-box\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <div class=\"info-box__mock\">info-box</div> \n </div>\n </div>\n </ng-container>\n \n <!-- BREADCRUMBS -->\n <ng-container *ngSwitchCase=\"'breadcrumbs'\">\n <n7-breadcrumbs [data]=\"lb.widgets[section.id].ds.out$ | async\">\n </n7-breadcrumbs>\n </ng-container>\n\n </ng-container>\n </section>\n </ng-container>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i7.AnchorWrapperComponent, selector: "n7-anchor-wrapper", inputs: ["data", "classes"], outputs: ["clicked"] }, { kind: "component", type: i7.BreadcrumbsComponent, selector: "n7-breadcrumbs", inputs: ["data", "emit"] }, { kind: "component", type: i7.ButtonComponent, selector: "n7-button", inputs: ["data", "emit"] }, { kind: "component", type: i7.ImageViewerComponent, selector: "n7-image-viewer", inputs: ["data", "emit"] }, { kind: "component", type: i7.ImageViewerToolsComponent, selector: "n7-image-viewer-tools", inputs: ["data", "emit"] }, { kind: "component", type: i7.InnerTitleComponent, selector: "n7-inner-title", inputs: ["data", "emit"] }, { kind: "component", type: i7.ItemPreviewComponent, selector: "n7-item-preview", inputs: ["data", "emit"] }, { kind: "component", type: i7.LoaderComponent, selector: "n7-loader", inputs: ["data"] }, { kind: "component", type: i7.MapComponent, selector: "n7-map", inputs: ["data", "emit"] }, { kind: "component", type: i7.MetadataViewerComponent, selector: "n7-metadata-viewer", inputs: ["data", "emit"] }, { kind: "component", type: i7.MiradorComponent, selector: "n7-mirador", inputs: ["data"] }, { kind: "component", type: i7.TextViewerComponent, selector: "n7-text-viewer", inputs: ["data", "emit"] }, { kind: "component", type: i8.MrMetadataReadmoreComponent, selector: "mr-metadata-readmore", inputs: ["data", "emit"] }, { kind: "component", type: i9.ReadMoreComponent, selector: "mr-read-more", inputs: ["data"] }, { kind: "component", type: i10.MrMetadataDynamicComponent, selector: "mr-metadata-dynamic", inputs: ["data", "emit"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }] }); }
148
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MrResourceLayoutComponent, selector: "mr-resource-layout", usesInheritance: true, ngImport: i0, template: "<div class=\"mr-resource mr-layout\" \n *ngIf=\"lb.dataSource && lb.dataSource.pageConfig\"\n [ngClass]=\"{\n 'is-loading': ( layoutState.get$('content') | async ) == 'LOADING',\n 'is-error': ( layoutState.get$('content') | async ) == 'ERROR'\n }\">\n <!-- RESOURCE LAYOUT CONTENT -->\n <ng-container [ngSwitch]=\"layoutState.get$('content') | async\">\n <!-- loading -->\n <ng-container *ngSwitchCase=\"'LOADING'\">\n <div class=\"mr-layout__loader\">\n <n7-loader></n7-loader>\n </div>\n </ng-container>\n\n <!-- error -->\n <ng-container *ngSwitchCase=\"'ERROR'\">\n <div class=\"mr-layout__error\">\n <h2>{{ lb.dataSource.errorTitle }}</h2>\n <p>{{ lb.dataSource.errorDescription }}</p>\n </div>\n </ng-container>\n\n <!-- success -->\n <ng-container *ngSwitchCase=\"'SUCCESS'\">\n <ng-container *ngIf=\"lb.dataSource.pageConfig.sections as sections\">\n <!-- Pass the list of blocks to render to the block template -->\n <div class=\"mr-resource__top\">\n <ng-container *ngTemplateOutlet=\"blocks; context: { $implicit: sections.top }\"></ng-container>\n </div>\n <div class=\"mr-resource__content mr-side-margin\">\n <ng-container *ngTemplateOutlet=\"blocks; context: { $implicit: sections.content }\"></ng-container>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-container>\n</div>\n\n<ng-template #blocks let-list>\n <ng-container *ngFor=\"let section of list\">\n <section *ngIf=\"lb.widgets[section.id].ds.out$ | async\"\n class=\"{{ 'mr-resource__section mr-resource__' + section.type }}\">\n <ng-container [ngSwitch]=\"section.type\">\n\n <!-- TABS -->\n <ng-container *ngSwitchCase=\"'tabs'\">\n <ng-container *ngFor=\"let tab of lb.widgets[section.id].ds.out$ | async\">\n <n7-anchor-wrapper [data]=\"tab.anchor\" [classes]=\"tab.classes\" *ngIf=\"!tab.hideTab\">\n <span class=\"mr-resource__tabs-item\">{{ tab.label }}</span>\n </n7-anchor-wrapper>\n </ng-container>\n </ng-container>\n\n <!-- INNER TITLE -->\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"mr-resource__title-content mr-side-margin\">\n <n7-inner-title \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-inner-title>\n </div>\n </ng-container>\n\n <!-- CUSTOM BUTTON -->\n <ng-container *ngSwitchCase=\"'button'\">\n <div class=\"mr-resource__button\">\n <n7-button \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-button>\n </div>\n </ng-container>\n \n <!-- IMAGE VIEWER IIIF -->\n <ng-container *ngSwitchCase=\"'viewer-iiif'\">\n <n7-mirador\n (contextmenu)=\"lb.dataSource.hasContextMenu()\"\n [data]=\"lb.widgets[section.id].ds.out$ | async\">\n </n7-mirador>\n </ng-container>\n \n <!-- IMAGE VIEWER -->\n <ng-container *ngSwitchCase=\"'viewer'\">\n\n <n7-image-viewer \n [data]=\"lb.widgets[section.id].ds.out$ | async\" \n [emit]=\"lb.widgets[section.id].emit\">\n </n7-image-viewer>\n <!-- IMAGE VIEWER TOOLS -->\n <n7-image-viewer-tools *ngIf=\"section.tools\" \n [data]=\"lb.widgets[section.id + '-tools'].ds.out$ | async\" \n [emit]=\"lb.widgets[section.id + '-tools'].emit\">\n </n7-image-viewer-tools>\n <!-- IMAGE VIEWER OVERLAY DETAILS -->\n <div *ngIf=\"lb.widgets[section.id + '-overlay-details'].ds.out$ | async as viewerDetailsData\" \n class=\"mr-resource__viewer-overlay-details\">\n <div class=\"mr-resource__viewer-overlay-details__close\">\n <a class=\"mr-resource__viewer-overlay-details__close-link\" \n (click)=\"lb.eventHandler.emitOuter('overlaycloseclick')\">\n <span class=\"n7-icon-close\"></span>\n </a>\n </div>\n <n7-item-preview \n [data]=\"viewerDetailsData\" \n [emit]=\"lb.widgets[section.id + '-overlay-details'].emit\">\n </n7-item-preview>\n </div>\n\n </ng-container>\n \n <!-- METADATA VIEWER -->\n <ng-container *ngSwitchCase=\"'metadata'\">\n \n <div class=\"mr-content-block mr-content-block-metadata\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <mr-read-more [data]=\"section.readmore\">\n <ng-container *ngIf=\" section?.options?.readmore || section?.options?.groupReadmore;\n else wihoutReadmore\">\n <mr-metadata-readmore\n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </mr-metadata-readmore>\n </ng-container>\n <ng-template #wihoutReadmore>\n <n7-metadata-viewer\n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-metadata-viewer>\n </ng-template>\n </mr-read-more>\n </div>\n </div>\n \n </ng-container>\n \n <!-- METADATA DYNAMIC -->\n <ng-container *ngSwitchCase=\"'metadata-dynamic'\">\n <mr-metadata-dynamic \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </mr-metadata-dynamic> \n </ng-container>\n \n <!-- COLLECTION -->\n <ng-container *ngSwitchCase=\"'collection'\">\n <ng-container *ngIf=\"lb.widgets[section.id].ds.out$ | async as collection$\">\n <div *ngIf=\"collection$.items?.length > 0\" class=\"mr-content-block mr-content-block-collection\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content {{ section.grid ? 'n7-grid-' + section.grid : '' }}\">\n <n7-item-preview *ngFor=\"let item of collection$?.items\"\n [data]=\"item\" [emit]=\"lb.widgets[section.id].emit\">\n </n7-item-preview>\n </div>\n </div>\n </ng-container>\n </ng-container>\n \n <!-- ITEM PREVIEW -->\n <ng-container *ngSwitchCase=\"'preview'\">\n <div class=\"mr-content-block mr-content-block-item-preview\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <n7-item-preview [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\"> \n </n7-item-preview>\n </div>\n </div>\n </ng-container>\n \n <!-- TEXT VIEWER -->\n <ng-container *ngSwitchCase=\"'text-viewer'\">\n <div class=\"mr-content-block mr-content-block-text-viewer\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <n7-text-viewer [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\">\n </n7-text-viewer>\n </div>\n </div>\n </ng-container>\n\n <!-- PARALLEL TEXT VIEWER -->\n <ng-container *ngSwitchCase=\"'parallel-text-viewer'\">\n <div class=\"mr-content-block mr-content-block-text-viewer mr-content-block-parallel-text-viewer\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <n7-parallel-text-viewer [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\">\n </n7-parallel-text-viewer>\n </div>\n </div>\n </ng-container>\n\n <!-- MAP -->\n <ng-container *ngSwitchCase=\"'map'\">\n <div class=\"mr-content-block mr-content-block-map\">\n <div class=\"mr-content-block__content\">\n <n7-map [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\"></n7-map>\n </div>\n </div>\n </ng-container>\n \n <!-- INFO BOX -->\n <ng-container *ngSwitchCase=\"'info-box'\">\n <div class=\"mr-content-block mr-content-block-info-box\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <div class=\"info-box__mock\">info-box</div> \n </div>\n </div>\n </ng-container>\n \n <!-- BREADCRUMBS -->\n <ng-container *ngSwitchCase=\"'breadcrumbs'\">\n <n7-breadcrumbs [data]=\"lb.widgets[section.id].ds.out$ | async\">\n </n7-breadcrumbs>\n </ng-container>\n\n </ng-container>\n </section>\n </ng-container>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i7.AnchorWrapperComponent, selector: "n7-anchor-wrapper", inputs: ["data", "classes"], outputs: ["clicked"] }, { kind: "component", type: i7.BreadcrumbsComponent, selector: "n7-breadcrumbs", inputs: ["data", "emit"] }, { kind: "component", type: i7.ButtonComponent, selector: "n7-button", inputs: ["data", "emit"] }, { kind: "component", type: i7.ImageViewerComponent, selector: "n7-image-viewer", inputs: ["data", "emit"] }, { kind: "component", type: i7.ImageViewerToolsComponent, selector: "n7-image-viewer-tools", inputs: ["data", "emit"] }, { kind: "component", type: i7.InnerTitleComponent, selector: "n7-inner-title", inputs: ["data", "emit"] }, { kind: "component", type: i7.ItemPreviewComponent, selector: "n7-item-preview", inputs: ["data", "emit"] }, { kind: "component", type: i7.LoaderComponent, selector: "n7-loader", inputs: ["data"] }, { kind: "component", type: i7.MapComponent, selector: "n7-map", inputs: ["data", "emit"] }, { kind: "component", type: i7.MetadataViewerComponent, selector: "n7-metadata-viewer", inputs: ["data", "emit"] }, { kind: "component", type: i7.MiradorComponent, selector: "n7-mirador", inputs: ["data"] }, { kind: "component", type: i7.TextViewerComponent, selector: "n7-text-viewer", inputs: ["data", "emit"] }, { kind: "component", type: i7.ParallelTextViewerComponent, selector: "n7-parallel-text-viewer", inputs: ["data", "emit"] }, { kind: "component", type: i8.MrMetadataReadmoreComponent, selector: "mr-metadata-readmore", inputs: ["data", "emit"] }, { kind: "component", type: i9.ReadMoreComponent, selector: "mr-read-more", inputs: ["data"] }, { kind: "component", type: i10.MrMetadataDynamicComponent, selector: "mr-metadata-dynamic", inputs: ["data", "emit"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }] }); }
146
149
  }
147
150
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MrResourceLayoutComponent, decorators: [{
148
151
  type: Component,
149
- args: [{ selector: 'mr-resource-layout', template: "<div class=\"mr-resource mr-layout\" \n *ngIf=\"lb.dataSource && lb.dataSource.pageConfig\"\n [ngClass]=\"{\n 'is-loading': ( layoutState.get$('content') | async ) == 'LOADING',\n 'is-error': ( layoutState.get$('content') | async ) == 'ERROR'\n }\">\n <!-- RESOURCE LAYOUT CONTENT -->\n <ng-container [ngSwitch]=\"layoutState.get$('content') | async\">\n <!-- loading -->\n <ng-container *ngSwitchCase=\"'LOADING'\">\n <div class=\"mr-layout__loader\">\n <n7-loader></n7-loader>\n </div>\n </ng-container>\n\n <!-- error -->\n <ng-container *ngSwitchCase=\"'ERROR'\">\n <div class=\"mr-layout__error\">\n <h2>{{ lb.dataSource.errorTitle }}</h2>\n <p>{{ lb.dataSource.errorDescription }}</p>\n </div>\n </ng-container>\n\n <!-- success -->\n <ng-container *ngSwitchCase=\"'SUCCESS'\">\n <ng-container *ngIf=\"lb.dataSource.pageConfig.sections as sections\">\n <!-- Pass the list of blocks to render to the block template -->\n <div class=\"mr-resource__top\">\n <ng-container *ngTemplateOutlet=\"blocks; context: { $implicit: sections.top }\"></ng-container>\n </div>\n <div class=\"mr-resource__content mr-side-margin\">\n <ng-container *ngTemplateOutlet=\"blocks; context: { $implicit: sections.content }\"></ng-container>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-container>\n</div>\n\n<ng-template #blocks let-list>\n <ng-container *ngFor=\"let section of list\">\n <section *ngIf=\"lb.widgets[section.id].ds.out$ | async\"\n class=\"{{ 'mr-resource__section mr-resource__' + section.type }}\">\n <ng-container [ngSwitch]=\"section.type\">\n\n <!-- TABS -->\n <ng-container *ngSwitchCase=\"'tabs'\">\n <ng-container *ngFor=\"let tab of lb.widgets[section.id].ds.out$ | async\">\n <n7-anchor-wrapper [data]=\"tab.anchor\" [classes]=\"tab.classes\" *ngIf=\"!tab.hideTab\">\n <span class=\"mr-resource__tabs-item\">{{ tab.label }}</span>\n </n7-anchor-wrapper>\n </ng-container>\n </ng-container>\n\n <!-- INNER TITLE -->\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"mr-resource__title-content mr-side-margin\">\n <n7-inner-title \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-inner-title>\n </div>\n </ng-container>\n\n <!-- CUSTOM BUTTON -->\n <ng-container *ngSwitchCase=\"'button'\">\n <div class=\"mr-resource__button\">\n <n7-button \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-button>\n </div>\n </ng-container>\n \n <!-- IMAGE VIEWER IIIF -->\n <ng-container *ngSwitchCase=\"'viewer-iiif'\">\n <n7-mirador\n (contextmenu)=\"lb.dataSource.hasContextMenu()\"\n [data]=\"lb.widgets[section.id].ds.out$ | async\">\n </n7-mirador>\n </ng-container>\n \n <!-- IMAGE VIEWER -->\n <ng-container *ngSwitchCase=\"'viewer'\">\n\n <n7-image-viewer \n [data]=\"lb.widgets[section.id].ds.out$ | async\" \n [emit]=\"lb.widgets[section.id].emit\">\n </n7-image-viewer>\n <!-- IMAGE VIEWER TOOLS -->\n <n7-image-viewer-tools *ngIf=\"section.tools\" \n [data]=\"lb.widgets[section.id + '-tools'].ds.out$ | async\" \n [emit]=\"lb.widgets[section.id + '-tools'].emit\">\n </n7-image-viewer-tools>\n <!-- IMAGE VIEWER OVERLAY DETAILS -->\n <div *ngIf=\"lb.widgets[section.id + '-overlay-details'].ds.out$ | async as viewerDetailsData\" \n class=\"mr-resource__viewer-overlay-details\">\n <div class=\"mr-resource__viewer-overlay-details__close\">\n <a class=\"mr-resource__viewer-overlay-details__close-link\" \n (click)=\"lb.eventHandler.emitOuter('overlaycloseclick')\">\n <span class=\"n7-icon-close\"></span>\n </a>\n </div>\n <n7-item-preview \n [data]=\"viewerDetailsData\" \n [emit]=\"lb.widgets[section.id + '-overlay-details'].emit\">\n </n7-item-preview>\n </div>\n\n </ng-container>\n \n <!-- METADATA VIEWER -->\n <ng-container *ngSwitchCase=\"'metadata'\">\n \n <div class=\"mr-content-block mr-content-block-metadata\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <mr-read-more [data]=\"section.readmore\">\n <ng-container *ngIf=\" section?.options?.readmore || section?.options?.groupReadmore;\n else wihoutReadmore\">\n <mr-metadata-readmore\n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </mr-metadata-readmore>\n </ng-container>\n <ng-template #wihoutReadmore>\n <n7-metadata-viewer\n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-metadata-viewer>\n </ng-template>\n </mr-read-more>\n </div>\n </div>\n \n </ng-container>\n \n <!-- METADATA DYNAMIC -->\n <ng-container *ngSwitchCase=\"'metadata-dynamic'\">\n <mr-metadata-dynamic \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </mr-metadata-dynamic> \n </ng-container>\n \n <!-- COLLECTION -->\n <ng-container *ngSwitchCase=\"'collection'\">\n <ng-container *ngIf=\"lb.widgets[section.id].ds.out$ | async as collection$\">\n <div *ngIf=\"collection$.items?.length > 0\" class=\"mr-content-block mr-content-block-collection\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content {{ section.grid ? 'n7-grid-' + section.grid : '' }}\">\n <n7-item-preview *ngFor=\"let item of collection$?.items\"\n [data]=\"item\" [emit]=\"lb.widgets[section.id].emit\">\n </n7-item-preview>\n </div>\n </div>\n </ng-container>\n </ng-container>\n \n <!-- ITEM PREVIEW -->\n <ng-container *ngSwitchCase=\"'preview'\">\n <div class=\"mr-content-block mr-content-block-item-preview\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <n7-item-preview [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\"> \n </n7-item-preview>\n </div>\n </div>\n </ng-container>\n \n <!-- TEXT VIEWER -->\n <ng-container *ngSwitchCase=\"'text-viewer'\">\n <div class=\"mr-content-block mr-content-block-text-viewer\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <n7-text-viewer [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\">\n </n7-text-viewer>\n </div>\n </div>\n \n </ng-container>\n\n <!-- MAP -->\n <ng-container *ngSwitchCase=\"'map'\">\n <div class=\"mr-content-block mr-content-block-map\">\n <div class=\"mr-content-block__content\">\n <n7-map [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\"></n7-map>\n </div>\n </div>\n </ng-container>\n \n <!-- INFO BOX -->\n <ng-container *ngSwitchCase=\"'info-box'\">\n <div class=\"mr-content-block mr-content-block-info-box\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <div class=\"info-box__mock\">info-box</div> \n </div>\n </div>\n </ng-container>\n \n <!-- BREADCRUMBS -->\n <ng-container *ngSwitchCase=\"'breadcrumbs'\">\n <n7-breadcrumbs [data]=\"lb.widgets[section.id].ds.out$ | async\">\n </n7-breadcrumbs>\n </ng-container>\n\n </ng-container>\n </section>\n </ng-container>\n</ng-template>\n" }]
152
+ args: [{ selector: 'mr-resource-layout', template: "<div class=\"mr-resource mr-layout\" \n *ngIf=\"lb.dataSource && lb.dataSource.pageConfig\"\n [ngClass]=\"{\n 'is-loading': ( layoutState.get$('content') | async ) == 'LOADING',\n 'is-error': ( layoutState.get$('content') | async ) == 'ERROR'\n }\">\n <!-- RESOURCE LAYOUT CONTENT -->\n <ng-container [ngSwitch]=\"layoutState.get$('content') | async\">\n <!-- loading -->\n <ng-container *ngSwitchCase=\"'LOADING'\">\n <div class=\"mr-layout__loader\">\n <n7-loader></n7-loader>\n </div>\n </ng-container>\n\n <!-- error -->\n <ng-container *ngSwitchCase=\"'ERROR'\">\n <div class=\"mr-layout__error\">\n <h2>{{ lb.dataSource.errorTitle }}</h2>\n <p>{{ lb.dataSource.errorDescription }}</p>\n </div>\n </ng-container>\n\n <!-- success -->\n <ng-container *ngSwitchCase=\"'SUCCESS'\">\n <ng-container *ngIf=\"lb.dataSource.pageConfig.sections as sections\">\n <!-- Pass the list of blocks to render to the block template -->\n <div class=\"mr-resource__top\">\n <ng-container *ngTemplateOutlet=\"blocks; context: { $implicit: sections.top }\"></ng-container>\n </div>\n <div class=\"mr-resource__content mr-side-margin\">\n <ng-container *ngTemplateOutlet=\"blocks; context: { $implicit: sections.content }\"></ng-container>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-container>\n</div>\n\n<ng-template #blocks let-list>\n <ng-container *ngFor=\"let section of list\">\n <section *ngIf=\"lb.widgets[section.id].ds.out$ | async\"\n class=\"{{ 'mr-resource__section mr-resource__' + section.type }}\">\n <ng-container [ngSwitch]=\"section.type\">\n\n <!-- TABS -->\n <ng-container *ngSwitchCase=\"'tabs'\">\n <ng-container *ngFor=\"let tab of lb.widgets[section.id].ds.out$ | async\">\n <n7-anchor-wrapper [data]=\"tab.anchor\" [classes]=\"tab.classes\" *ngIf=\"!tab.hideTab\">\n <span class=\"mr-resource__tabs-item\">{{ tab.label }}</span>\n </n7-anchor-wrapper>\n </ng-container>\n </ng-container>\n\n <!-- INNER TITLE -->\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"mr-resource__title-content mr-side-margin\">\n <n7-inner-title \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-inner-title>\n </div>\n </ng-container>\n\n <!-- CUSTOM BUTTON -->\n <ng-container *ngSwitchCase=\"'button'\">\n <div class=\"mr-resource__button\">\n <n7-button \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-button>\n </div>\n </ng-container>\n \n <!-- IMAGE VIEWER IIIF -->\n <ng-container *ngSwitchCase=\"'viewer-iiif'\">\n <n7-mirador\n (contextmenu)=\"lb.dataSource.hasContextMenu()\"\n [data]=\"lb.widgets[section.id].ds.out$ | async\">\n </n7-mirador>\n </ng-container>\n \n <!-- IMAGE VIEWER -->\n <ng-container *ngSwitchCase=\"'viewer'\">\n\n <n7-image-viewer \n [data]=\"lb.widgets[section.id].ds.out$ | async\" \n [emit]=\"lb.widgets[section.id].emit\">\n </n7-image-viewer>\n <!-- IMAGE VIEWER TOOLS -->\n <n7-image-viewer-tools *ngIf=\"section.tools\" \n [data]=\"lb.widgets[section.id + '-tools'].ds.out$ | async\" \n [emit]=\"lb.widgets[section.id + '-tools'].emit\">\n </n7-image-viewer-tools>\n <!-- IMAGE VIEWER OVERLAY DETAILS -->\n <div *ngIf=\"lb.widgets[section.id + '-overlay-details'].ds.out$ | async as viewerDetailsData\" \n class=\"mr-resource__viewer-overlay-details\">\n <div class=\"mr-resource__viewer-overlay-details__close\">\n <a class=\"mr-resource__viewer-overlay-details__close-link\" \n (click)=\"lb.eventHandler.emitOuter('overlaycloseclick')\">\n <span class=\"n7-icon-close\"></span>\n </a>\n </div>\n <n7-item-preview \n [data]=\"viewerDetailsData\" \n [emit]=\"lb.widgets[section.id + '-overlay-details'].emit\">\n </n7-item-preview>\n </div>\n\n </ng-container>\n \n <!-- METADATA VIEWER -->\n <ng-container *ngSwitchCase=\"'metadata'\">\n \n <div class=\"mr-content-block mr-content-block-metadata\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <mr-read-more [data]=\"section.readmore\">\n <ng-container *ngIf=\" section?.options?.readmore || section?.options?.groupReadmore;\n else wihoutReadmore\">\n <mr-metadata-readmore\n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </mr-metadata-readmore>\n </ng-container>\n <ng-template #wihoutReadmore>\n <n7-metadata-viewer\n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </n7-metadata-viewer>\n </ng-template>\n </mr-read-more>\n </div>\n </div>\n \n </ng-container>\n \n <!-- METADATA DYNAMIC -->\n <ng-container *ngSwitchCase=\"'metadata-dynamic'\">\n <mr-metadata-dynamic \n [data]=\"lb.widgets[section.id].ds.out$ | async\"\n [emit]=\"lb.widgets[section.id].emit\">\n </mr-metadata-dynamic> \n </ng-container>\n \n <!-- COLLECTION -->\n <ng-container *ngSwitchCase=\"'collection'\">\n <ng-container *ngIf=\"lb.widgets[section.id].ds.out$ | async as collection$\">\n <div *ngIf=\"collection$.items?.length > 0\" class=\"mr-content-block mr-content-block-collection\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content {{ section.grid ? 'n7-grid-' + section.grid : '' }}\">\n <n7-item-preview *ngFor=\"let item of collection$?.items\"\n [data]=\"item\" [emit]=\"lb.widgets[section.id].emit\">\n </n7-item-preview>\n </div>\n </div>\n </ng-container>\n </ng-container>\n \n <!-- ITEM PREVIEW -->\n <ng-container *ngSwitchCase=\"'preview'\">\n <div class=\"mr-content-block mr-content-block-item-preview\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <n7-item-preview [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\"> \n </n7-item-preview>\n </div>\n </div>\n </ng-container>\n \n <!-- TEXT VIEWER -->\n <ng-container *ngSwitchCase=\"'text-viewer'\">\n <div class=\"mr-content-block mr-content-block-text-viewer\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <n7-text-viewer [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\">\n </n7-text-viewer>\n </div>\n </div>\n </ng-container>\n\n <!-- PARALLEL TEXT VIEWER -->\n <ng-container *ngSwitchCase=\"'parallel-text-viewer'\">\n <div class=\"mr-content-block mr-content-block-text-viewer mr-content-block-parallel-text-viewer\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <n7-parallel-text-viewer [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\">\n </n7-parallel-text-viewer>\n </div>\n </div>\n </ng-container>\n\n <!-- MAP -->\n <ng-container *ngSwitchCase=\"'map'\">\n <div class=\"mr-content-block mr-content-block-map\">\n <div class=\"mr-content-block__content\">\n <n7-map [data]=\"lb.widgets[section.id].ds.out$ | async\" [emit]=\"lb.widgets[section.id].emit\"></n7-map>\n </div>\n </div>\n </ng-container>\n \n <!-- INFO BOX -->\n <ng-container *ngSwitchCase=\"'info-box'\">\n <div class=\"mr-content-block mr-content-block-info-box\">\n <h3 *ngIf=\"section.title\" class=\"mr-content-block__title\">\n {{ section.title }}\n </h3>\n <div class=\"mr-content-block__content\">\n <div class=\"info-box__mock\">info-box</div> \n </div>\n </div>\n </ng-container>\n \n <!-- BREADCRUMBS -->\n <ng-container *ngSwitchCase=\"'breadcrumbs'\">\n <n7-breadcrumbs [data]=\"lb.widgets[section.id].ds.out$ | async\">\n </n7-breadcrumbs>\n </ng-container>\n\n </ng-container>\n </section>\n </ng-container>\n</ng-template>\n" }]
150
153
  }], ctorParameters: () => [{ type: i1.LayoutsConfigurationService }, { type: i2.ActivatedRoute }, { type: i1.ConfigurationService }, { type: i1.CommunicationService }, { type: i1.MainStateService }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.MrLayoutStateService }, { type: i4.MrResourceModalService }, { type: i5.MrLocaleService }] });
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbjctYm9pbGVycGxhdGUtbXVydWNhL3NyYy9saWIvbGF5b3V0cy9yZXNvdXJjZS1sYXlvdXQvcmVzb3VyY2UtbGF5b3V0LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbjctYm9pbGVycGxhdGUtbXVydWNhL3NyYy9saWIvbGF5b3V0cy9yZXNvdXJjZS1sYXlvdXQvcmVzb3VyY2UtbGF5b3V0Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsY0FBYyxFQUtmLE1BQU0sMEJBQTBCLENBQUM7QUFHbEMsT0FBTyxFQUFFLHNCQUFzQixJQUFJLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixXQUFXLEVBQ1gsY0FBYyxFQUNkLGVBQWUsRUFDZixZQUFZLEVBQ1osY0FBYyxFQUNkLGdCQUFnQixFQUNoQiw2QkFBNkIsRUFDN0IsbUJBQW1CLEVBQ25CLG1CQUFtQixHQUNwQixNQUFNLG9CQUFvQixDQUFDO0FB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Q0gsQ0FBQzsrR0F6R1UseUJBQXlCO21HQUF6Qix5QkFBeUIsaUZDekV0Qyw4N1ZBNk5BOzs0RkRwSmEseUJBQXlCO2tCQUpyQyxTQUFTOytCQUNFLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgRGF0YSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEFic3RyYWN0TGF5b3V0LFxuICBDb21tdW5pY2F0aW9uU2VydmljZSxcbiAgTGF5b3V0c0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgTWFpblN0YXRlU2VydmljZVxufSBmcm9tICdAbmV0Ny9ib2lsZXJwbGF0ZS1jb21tb24nO1xuaW1wb3J0IHsgTXJMYXlvdXRTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYXlvdXQtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBNclJlc291cmNlTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzb3VyY2UtbW9kYWwuc2VydmljZSc7XG5pbXBvcnQgeyBNclJlc291cmNlTGF5b3V0Q29uZmlnIGFzIGNvbmZpZyB9IGZyb20gJy4vcmVzb3VyY2UtbGF5b3V0LmNvbmZpZyc7XG5pbXBvcnQgeyBNckltYWdlVmlld2VyRUggfSBmcm9tICcuLi8uLi9ldmVudC1oYW5kbGVycy9pbWFnZS12aWV3ZXIuZWgnO1xuaW1wb3J0IHsgTXJUZXh0Vmlld2VyRUggfSBmcm9tICcuLi8uLi9ldmVudC1oYW5kbGVycy90ZXh0LXZpZXdlci5laCc7XG5pbXBvcnQgeyBNckltYWdlVmlld2VyVG9vbHNFSCB9IGZyb20gJy4uLy4uL2V2ZW50LWhhbmRsZXJzL2ltYWdlLXZpZXdlci10b29scy5laCc7XG5pbXBvcnQgeyBNckNvbGxlY3Rpb25FSCB9IGZyb20gJy4uLy4uL2V2ZW50LWhhbmRsZXJzL2NvbGxlY3Rpb24uZWgnO1xuaW1wb3J0IHsgTXJJbWFnZVZpZXdlck92ZXJsYXlEZXRhaWxzRUggfSBmcm9tICcuLi8uLi9ldmVudC1oYW5kbGVycy9pbWFnZS12aWV3ZXItb3ZlcmxheS1kZXRhaWxzLmVoJztcbmltcG9ydCB7IE1yQnV0dG9uRUgsIE1yTWV0YWRhdGFEeW5hbWljRUggfSBmcm9tICcuLi8uLi9ldmVudC1oYW5kbGVycyc7XG5pbXBvcnQge1xuICBNckJyZWFkY3J1bWJzRFMsXG4gIE1yQnV0dG9uRFMsXG4gIE1yQ29sbGVjdGlvbkRTLFxuICBNckltYWdlVmlld2VyRFMsXG4gIE1ySW1hZ2VWaWV3ZXJUb29sc0RTLFxuICBNckluZm9Cb3hEUyxcbiAgTXJJbm5lclRpdGxlRFMsXG4gIE1ySXRlbVByZXZpZXdEUyxcbiAgTXJNZXRhZGF0YURTLFxuICBNclRleHRWaWV3ZXJEUyxcbiAgTXJSZXNvdXJjZVRhYnNEUyxcbiAgTXJJbWFnZVZpZXdlck92ZXJsYXlEZXRhaWxzRFMsXG4gIE1yTWV0YWRhdGFEeW5hbWljRFMsXG4gIE1ySW1hZ2VWaWV3ZXJJaWlmRFMsXG59IGZyb20gJy4uLy4uL2RhdGEtc291cmNlcyc7XG5pbXBvcnQgeyBNck1hcERTIH0gZnJvbSAnLi4vLi4vZGF0YS1zb3VyY2VzL21hcC5kcyc7XG5pbXBvcnQgeyBNckxvY2FsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2NhbGUuc2VydmljZSc7XG5cbmNvbnN0IERBVEFTT1VSQ0VfTUFQID0ge1xuICBicmVhZGNydW1iczogTXJCcmVhZGNydW1ic0RTLFxuICBidXR0b246IE1yQnV0dG9uRFMsXG4gIGNvbGxlY3Rpb246IE1yQ29sbGVjdGlvbkRTLFxuICBpbmZvOiBNckluZm9Cb3hEUyxcbiAgbWFwOiBNck1hcERTLFxuICBtZXRhZGF0YTogTXJNZXRhZGF0YURTLFxuICBwcmV2aWV3OiBNckl0ZW1QcmV2aWV3RFMsXG4gIHRhYnM6IE1yUmVzb3VyY2VUYWJzRFMsXG4gIHRleHQ6IE1yVGV4dFZpZXdlckRTLFxuICB0aXRsZTogTXJJbm5lclRpdGxlRFMsXG4gIHZpZXdlcjogTXJJbWFnZVZpZXdlckRTLFxuICAndmlld2VyLXRvb2xzJzogTXJJbWFnZVZpZXdlclRvb2xzRFMsXG4gICd2aWV3ZXItb3ZlcmxheS1kZXRhaWxzJzogTXJJbWFnZVZpZXdlck92ZXJsYXlEZXRhaWxzRFMsXG4gICd0ZXh0LXZpZXdlcic6IE1yVGV4dFZpZXdlckRTLFxuICAnbWV0YWRhdGEtZHluYW1pYyc6IE1yTWV0YWRhdGFEeW5hbWljRFMsXG4gICd2aWV3ZXItaWlpZic6IE1ySW1hZ2VWaWV3ZXJJaWlmRFMsXG59O1xuXG5jb25zdCBFVkVOVEhBTkRMRVJfTUFQID0ge1xuICB2aWV3ZXI6IE1ySW1hZ2VWaWV3ZXJFSCxcbiAgJ3ZpZXdlci10b29scyc6IE1ySW1hZ2VWaWV3ZXJUb29sc0VILFxuICAndmlld2VyLW92ZXJsYXktZGV0YWlscyc6IE1ySW1hZ2VWaWV3ZXJPdmVybGF5RGV0YWlsc0VILFxuICAndGV4dC12aWV3ZXInOiBNclRleHRWaWV3ZXJFSCxcbiAgY29sbGVjdGlvbjogTXJDb2xsZWN0aW9uRUgsXG4gICdtZXRhZGF0YS1keW5hbWljJzogTXJNZXRhZGF0YUR5bmFtaWNFSCxcbiAgYnV0dG9uOiBNckJ1dHRvbkVILFxuICAvLyBtYXA6IE1yTWFwRUhcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21yLXJlc291cmNlLWxheW91dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXNvdXJjZS1sYXlvdXQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIE1yUmVzb3VyY2VMYXlvdXRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdExheW91dCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LFxuQWZ0ZXJWaWV3SW5pdCB7XG4gIHByaXZhdGUgcm91dGVyRGF0YTogRGF0YTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBsYXlvdXRzQ29uZmlndXJhdGlvbjogTGF5b3V0c0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb21tdW5pY2F0aW9uOiBDb21tdW5pY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG1haW5TdGF0ZTogTWFpblN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHB1YmxpYyBsYXlvdXRTdGF0ZTogTXJMYXlvdXRTdGF0ZVNlcnZpY2UsXG4gICAgcHVibGljIG1vZGFsU2VydmljZTogTXJSZXNvdXJjZU1vZGFsU2VydmljZSxcbiAgICBwdWJsaWMgbG9jYWxlU2VydmljZTogTXJMb2NhbGVTZXJ2aWNlLFxuICApIHtcbiAgICBzdXBlcihsYXlvdXRzQ29uZmlndXJhdGlvbi5nZXQoJ01yUmVzb3VyY2VMYXlvdXRDb25maWcnKSB8fCBjb25maWcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRQYXlsb2FkKCkge1xuICAgIHJldHVybiB7XG4gICAgICByb3V0ZXJEYXRhOiB0aGlzLnJvdXRlckRhdGEsXG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICBjb21tdW5pY2F0aW9uOiB0aGlzLmNvbW11bmljYXRpb24sXG4gICAgICBtYWluU3RhdGU6IHRoaXMubWFpblN0YXRlLFxuICAgICAgbGF5b3V0U3RhdGU6IHRoaXMubGF5b3V0U3RhdGUsXG4gICAgICBtb2RhbFNlcnZpY2U6IHRoaXMubW9kYWxTZXJ2aWNlLFxuICAgICAgbG9jYWxlU2VydmljZTogdGhpcy5sb2NhbGVTZXJ2aWNlLFxuICAgICAgb3B0aW9uczogdGhpcy5jb25maWcub3B0aW9ucyB8fCB7fSxcbiAgICAgIHJvdXRlOiB0aGlzLnJvdXRlLFxuICAgICAgcm91dGVyOiB0aGlzLnJvdXRlclxuICAgIH07XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLmRhdGEuc3Vic2NyaWJlKChyb3V0ZXJEYXRhKSA9PiB7XG4gICAgICB0aGlzLmxheW91dFN0YXRlLmFkZCgnY29udGVudCcpO1xuICAgICAgdGhpcy5yb3V0ZXJEYXRhID0gcm91dGVyRGF0YTtcbiAgICAgIHRoaXMubG9hZFdpZGdldHMoKTtcbiAgICAgIHRoaXMub25Jbml0KCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29uc3QgeyBjb25maWdJZCB9ID0gdGhpcy5yb3V0ZXJEYXRhO1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0KGNvbmZpZ0lkKS5wYWdlTG9hZCB8fCAxMDAwO1xuXG4gICAgLy8gSWYgYSBmcmFnbWVudCAoI2lkKSBpcyBwcmVzZW50IGluIHRoZSB1cmwsIHRoZSBwYWdlIHNjcm9sbCB0byB0aGF0IGZyYWdtZW50XG4gICAgdGhpcy5yb3V0ZS5mcmFnbWVudC5zdWJzY3JpYmUoKGZyYWdtZW50KSA9PiB7XG4gICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZyYWdtZW50KTtcbiAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5vbkRlc3Ryb3koKTtcbiAgfVxuXG4gIGxvYWRXaWRnZXRzKCkge1xuICAgIGNvbnN0IHsgY29uZmlnSWQgfSA9IHRoaXMucm91dGVyRGF0YTtcbiAgICBjb25zdCB7IHRvcCwgY29udGVudCB9ID0gdGhpcy5jb25maWd1cmF0aW9uLmdldChjb25maWdJZCkuc2VjdGlvbnM7XG4gICAgY29uc3Qgc2VjdGlvbnMgPSB0b3AuY29uY2F0KGNvbnRlbnQpO1xuICAgIHRoaXMud2lkZ2V0cyA9IFtdO1xuICAgIGlmIChzZWN0aW9ucykge1xuICAgICAgc2VjdGlvbnMuZm9yRWFjaCgoe1xuICAgICAgICBpZCwgdHlwZSwgb3B0aW9ucywgdG9vbHNcbiAgICAgIH0pID0+IHtcbiAgICAgICAgY29uc3Qgd2lkZ2V0T3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHdpZGdldE9wdGlvbnMubG9jYWxlU2VydmljZSA9IHRoaXMubG9jYWxlU2VydmljZTtcbiAgICAgICAgLy8gQWRkIHJvdXRlIHRvIG1ldGFkYXRhLWR5bmFtaWMgb3B0aW9uc1xuICAgICAgICBpZiAodHlwZSA9PT0gJ21ldGFkYXRhLWR5bmFtaWMnKSB7XG4gICAgICAgICAgb3B0aW9ucy5yb3V0ZSA9IHRoaXMucm91dGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53aWRnZXRzLnB1c2goe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIG9wdGlvbnM6IHdpZGdldE9wdGlvbnMsXG4gICAgICAgICAgZGF0YVNvdXJjZTogREFUQVNPVVJDRV9NQVBbdHlwZV0sXG4gICAgICAgICAgZXZlbnRIYW5kbGVyOiBFVkVOVEhBTkRMRVJfTUFQW3R5cGVdXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpbWFnZSB2aWV3ZXIgb3ZlcmxheSBkZXRhaWxzXG4gICAgICAgIGlmICh0eXBlID09PSAndmlld2VyJykge1xuICAgICAgICAgIHRoaXMud2lkZ2V0cy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBgJHtpZH0tb3ZlcmxheS1kZXRhaWxzYCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHdpZGdldE9wdGlvbnMsXG4gICAgICAgICAgICBkYXRhU291cmNlOiBEQVRBU09VUkNFX01BUFtgJHt0eXBlfS1vdmVybGF5LWRldGFpbHNgXSxcbiAgICAgICAgICAgIGV2ZW50SGFuZGxlcjogRVZFTlRIQU5ETEVSX01BUFtgJHt0eXBlfS1vdmVybGF5LWRldGFpbHNgXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGltYWdlIHZpZXdlciB0b29sc1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3ZpZXdlcicgJiYgdG9vbHMpIHtcbiAgICAgICAgICB0aGlzLndpZGdldHMucHVzaCh7XG4gICAgICAgICAgICBpZDogYCR7aWR9LXRvb2xzYCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHdpZGdldE9wdGlvbnMsXG4gICAgICAgICAgICBkYXRhU291cmNlOiBEQVRBU09VUkNFX01BUFtgJHt0eXBlfS10b29sc2BdLFxuICAgICAgICAgICAgZXZlbnRIYW5kbGVyOiBFVkVOVEhBTkRMRVJfTUFQW2Ake3R5cGV9LXRvb2xzYF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibXItcmVzb3VyY2UgbXItbGF5b3V0XCIgXG4gICAgICpuZ0lmPVwibGIuZGF0YVNvdXJjZSAmJiBsYi5kYXRhU291cmNlLnBhZ2VDb25maWdcIlxuICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdpcy1sb2FkaW5nJzogKCBsYXlvdXRTdGF0ZS5nZXQkKCdjb250ZW50JykgfCBhc3luYyApID09ICdMT0FESU5HJyxcbiAgICAgICAgJ2lzLWVycm9yJzogKCBsYXlvdXRTdGF0ZS5nZXQkKCdjb250ZW50JykgfCBhc3luYyApID09ICdFUlJPUidcbiAgICAgIH1cIj5cbiAgICA8IS0tIFJFU09VUkNFIExBWU9VVCBDT05URU5UIC0tPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImxheW91dFN0YXRlLmdldCQoJ2NvbnRlbnQnKSB8IGFzeW5jXCI+XG4gICAgICAgIDwhLS0gbG9hZGluZyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0xPQURJTkcnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItbGF5b3V0X19sb2FkZXJcIj5cbiAgICAgICAgICAgICAgICA8bjctbG9hZGVyPjwvbjctbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gZXJyb3IgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidFUlJPUidcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1sYXlvdXRfX2Vycm9yXCI+XG4gICAgICAgICAgICAgICAgPGgyPnt7IGxiLmRhdGFTb3VyY2UuZXJyb3JUaXRsZSB9fTwvaDI+XG4gICAgICAgICAgICAgICAgPHA+e3sgbGIuZGF0YVNvdXJjZS5lcnJvckRlc2NyaXB0aW9uIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gc3VjY2VzcyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1NVQ0NFU1MnXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGIuZGF0YVNvdXJjZS5wYWdlQ29uZmlnLnNlY3Rpb25zIGFzIHNlY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBQYXNzIHRoZSBsaXN0IG9mIGJsb2NrcyB0byByZW5kZXIgdG8gdGhlIGJsb2NrIHRlbXBsYXRlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1yZXNvdXJjZV9fdG9wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJibG9ja3M7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBzZWN0aW9ucy50b3AgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1yZXNvdXJjZV9fY29udGVudCBtci1zaWRlLW1hcmdpblwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxvY2tzOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogc2VjdGlvbnMuY29udGVudCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2Jsb2NrcyBsZXQtbGlzdD5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIGxpc3RcIj5cbiAgICAgICAgPHNlY3Rpb24gKm5nSWY9XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiXG4gICAgICAgIGNsYXNzPVwie3sgJ21yLXJlc291cmNlX19zZWN0aW9uIG1yLXJlc291cmNlX18nICsgc2VjdGlvbi50eXBlIH19XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzZWN0aW9uLnR5cGVcIj5cblxuICAgICAgICAgICAgICAgIDwhLS0gVEFCUyAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGFicydcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGFiIG9mIGxiLndpZGdldHNbc2VjdGlvbi5pZF0uZHMub3V0JCB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bjctYW5jaG9yLXdyYXBwZXIgW2RhdGFdPVwidGFiLmFuY2hvclwiIFtjbGFzc2VzXT1cInRhYi5jbGFzc2VzXCIgKm5nSWY9XCIhdGFiLmhpZGVUYWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1yLXJlc291cmNlX190YWJzLWl0ZW1cIj57eyB0YWIubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L243LWFuY2hvci13cmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gSU5ORVIgVElUTEUgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RpdGxlJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItcmVzb3VyY2VfX3RpdGxlLWNvbnRlbnQgbXItc2lkZS1tYXJnaW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuNy1pbm5lci10aXRsZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VtaXRdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5lbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L243LWlubmVyLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQ1VTVE9NIEJVVFRPTiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYnV0dG9uJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItcmVzb3VyY2VfX2J1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG43LWJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VtaXRdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5lbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L243LWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgXG4gICAgICAgICAgICAgICAgPCEtLSBJTUFHRSBWSUVXRVIgSUlJRiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndmlld2VyLWlpaWYnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuNy1taXJhZG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAoY29udGV4dG1lbnUpPVwibGIuZGF0YVNvdXJjZS5oYXNDb250ZXh0TWVudSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZHMub3V0JCB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbjctbWlyYWRvcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICAgICAgICAgICAgICA8IS0tIElNQUdFIFZJRVdFUiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndmlld2VyJ1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bjctaW1hZ2Utdmlld2VyIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZHMub3V0JCB8IGFzeW5jXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VtaXRdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5lbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L243LWltYWdlLXZpZXdlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSU1BR0UgVklFV0VSIFRPT0xTIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG43LWltYWdlLXZpZXdlci10b29scyAqbmdJZj1cInNlY3Rpb24udG9vbHNcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWQgKyAnLXRvb2xzJ10uZHMub3V0JCB8IGFzeW5jXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VtaXRdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkICsgJy10b29scyddLmVtaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbjctaW1hZ2Utdmlld2VyLXRvb2xzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJTUFHRSBWSUVXRVIgT1ZFUkxBWSBERVRBSUxTIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxiLndpZGdldHNbc2VjdGlvbi5pZCArICctb3ZlcmxheS1kZXRhaWxzJ10uZHMub3V0JCB8IGFzeW5jIGFzIHZpZXdlckRldGFpbHNEYXRhXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtci1yZXNvdXJjZV9fdmlld2VyLW92ZXJsYXktZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1yZXNvdXJjZV9fdmlld2VyLW92ZXJsYXktZGV0YWlsc19fY2xvc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJtci1yZXNvdXJjZV9fdmlld2VyLW92ZXJsYXktZGV0YWlsc19fY2xvc2UtbGlua1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImxiLmV2ZW50SGFuZGxlci5lbWl0T3V0ZXIoJ292ZXJsYXljbG9zZWNsaWNrJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibjctaWNvbi1jbG9zZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuNy1pdGVtLXByZXZpZXcgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInZpZXdlckRldGFpbHNEYXRhXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbWl0XT1cImxiLndpZGdldHNbc2VjdGlvbi5pZCArICctb3ZlcmxheS1kZXRhaWxzJ10uZW1pdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbjctaXRlbS1wcmV2aWV3PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICAgICAgICAgICAgICA8IS0tIE1FVEFEQVRBIFZJRVdFUiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbWV0YWRhdGEnXCI+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItY29udGVudC1ibG9jayBtci1jb250ZW50LWJsb2NrLW1ldGFkYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgKm5nSWY9XCJzZWN0aW9uLnRpdGxlXCIgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrX190aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlY3Rpb24udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItY29udGVudC1ibG9ja19fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtci1yZWFkLW1vcmUgW2RhdGFdPVwic2VjdGlvbi5yZWFkbW9yZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIHNlY3Rpb24/Lm9wdGlvbnM/LnJlYWRtb3JlIHx8IHNlY3Rpb24/Lm9wdGlvbnM/Lmdyb3VwUmVhZG1vcmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugd2lob3V0UmVhZG1vcmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtci1tZXRhZGF0YS1yZWFkbW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZHMub3V0JCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW1pdF09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmVtaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbXItbWV0YWRhdGEtcmVhZG1vcmU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3dpaG91dFJlYWRtb3JlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG43LW1ldGFkYXRhLXZpZXdlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZHMub3V0JCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW1pdF09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmVtaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbjctbWV0YWRhdGEtdmlld2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbXItcmVhZC1tb3JlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDwhLS0gTUVUQURBVEEgRFlOQU1JQyAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbWV0YWRhdGEtZHluYW1pYydcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1yLW1ldGFkYXRhLWR5bmFtaWMgXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZHMub3V0JCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgW2VtaXRdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5lbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbXItbWV0YWRhdGEtZHluYW1pYz4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgICAgICAgICAgICAgIDwhLS0gQ09MTEVDVElPTiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY29sbGVjdGlvbidcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZHMub3V0JCB8IGFzeW5jIGFzIGNvbGxlY3Rpb24kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sbGVjdGlvbiQuaXRlbXM/Lmxlbmd0aCA+IDBcIiBjbGFzcz1cIm1yLWNvbnRlbnQtYmxvY2sgbXItY29udGVudC1ibG9jay1jb2xsZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzICpuZ0lmPVwic2VjdGlvbi50aXRsZVwiIGNsYXNzPVwibXItY29udGVudC1ibG9ja19fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2VjdGlvbi50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLWNvbnRlbnQtYmxvY2tfX2NvbnRlbnQge3sgc2VjdGlvbi5ncmlkID8gJ243LWdyaWQtJyArIHNlY3Rpb24uZ3JpZCA6ICcnIH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuNy1pdGVtLXByZXZpZXcgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29sbGVjdGlvbiQ/Lml0ZW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIml0ZW1cIiBbZW1pdF09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmVtaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uNy1pdGVtLXByZXZpZXc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgXG4gICAgICAgICAgICAgICAgPCEtLSBJVEVNIFBSRVZJRVcgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3ByZXZpZXcnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrIG1yLWNvbnRlbnQtYmxvY2staXRlbS1wcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgKm5nSWY9XCJzZWN0aW9uLnRpdGxlXCIgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrX190aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlY3Rpb24udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItY29udGVudC1ibG9ja19fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuNy1pdGVtLXByZXZpZXcgW2RhdGFdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5kcy5vdXQkIHwgYXN5bmNcIiBbZW1pdF09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmVtaXRcIj4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbjctaXRlbS1wcmV2aWV3PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgICAgICAgICAgICAgIDwhLS0gVEVYVCBWSUVXRVIgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQtdmlld2VyJ1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLWNvbnRlbnQtYmxvY2sgbXItY29udGVudC1ibG9jay10ZXh0LXZpZXdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzICpuZ0lmPVwic2VjdGlvbi50aXRsZVwiIGNsYXNzPVwibXItY29udGVudC1ibG9ja19fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzZWN0aW9uLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLWNvbnRlbnQtYmxvY2tfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG43LXRleHQtdmlld2VyIFtkYXRhXT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZHMub3V0JCB8IGFzeW5jXCIgW2VtaXRdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5lbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbjctdGV4dC12aWV3ZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gTUFQIC0tPlxuICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtYXAnXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItY29udGVudC1ibG9jayBtci1jb250ZW50LWJsb2NrLW1hcFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItY29udGVudC1ibG9ja19fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG43LW1hcCBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiIFtlbWl0XT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZW1pdFwiPjwvbjctbWFwPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgICAgICAgICAgICAgIDwhLS0gSU5GTyBCT1ggLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2luZm8tYm94J1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItY29udGVudC1ibG9jayBtci1jb250ZW50LWJsb2NrLWluZm8tYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgKm5nSWY9XCJzZWN0aW9uLnRpdGxlXCIgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrX190aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlY3Rpb24udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItY29udGVudC1ibG9ja19fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWJveF9fbW9ja1wiPmluZm8tYm94PC9kaXY+ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgICAgICAgICAgICAgIDwhLS0gQlJFQURDUlVNQlMgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2JyZWFkY3J1bWJzJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bjctYnJlYWRjcnVtYnMgW2RhdGFdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5kcy5vdXQkIHwgYXN5bmNcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9uNy1icmVhZGNydW1icz5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbjctYm9pbGVycGxhdGUtbXVydWNhL3NyYy9saWIvbGF5b3V0cy9yZXNvdXJjZS1sYXlvdXQvcmVzb3VyY2UtbGF5b3V0LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbjctYm9pbGVycGxhdGUtbXVydWNhL3NyYy9saWIvbGF5b3V0cy9yZXNvdXJjZS1sYXlvdXQvcmVzb3VyY2UtbGF5b3V0Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsY0FBYyxFQUtmLE1BQU0sMEJBQTBCLENBQUM7QUFHbEMsT0FBTyxFQUFFLHNCQUFzQixJQUFJLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixXQUFXLEVBQ1gsY0FBYyxFQUNkLGVBQWUsRUFDZixZQUFZLEVBQ1osY0FBYyxFQUNkLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIs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QkFDM0MsWUFBWSxFQUFFLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUM7cUJBQ2hELENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQzsrR0F6R1UseUJBQXlCO21HQUF6Qix5QkFBeUIsaUZDN0V0QyxpcVhBeU9BOzs0RkQ1SmEseUJBQXlCO2tCQUpyQyxTQUFTOytCQUNFLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgRGF0YSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEFic3RyYWN0TGF5b3V0LFxuICBDb21tdW5pY2F0aW9uU2VydmljZSxcbiAgTGF5b3V0c0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgTWFpblN0YXRlU2VydmljZVxufSBmcm9tICdAbmV0Ny9ib2lsZXJwbGF0ZS1jb21tb24nO1xuaW1wb3J0IHsgTXJMYXlvdXRTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYXlvdXQtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBNclJlc291cmNlTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzb3VyY2UtbW9kYWwuc2VydmljZSc7XG5pbXBvcnQgeyBNclJlc291cmNlTGF5b3V0Q29uZmlnIGFzIGNvbmZpZyB9IGZyb20gJy4vcmVzb3VyY2UtbGF5b3V0LmNvbmZpZyc7XG5pbXBvcnQgeyBNckltYWdlVmlld2VyRUggfSBmcm9tICcuLi8uLi9ldmVudC1oYW5kbGVycy9pbWFnZS12aWV3ZXIuZWgnO1xuaW1wb3J0IHsgTXJUZXh0Vmlld2VyRUggfSBmcm9tICcuLi8uLi9ldmVudC1oYW5kbGVycy90ZXh0LXZpZXdlci5laCc7XG5pbXBvcnQgeyBNclBhcmFsbGVsVGV4dFZpZXdlckVIIH0gZnJvbSAnLi4vLi4vZXZlbnQtaGFuZGxlcnMvcGFyYWxsZWwtdGV4dC12aWV3ZXIuZWgnO1xuaW1wb3J0IHsgTXJJbWFnZVZpZXdlclRvb2xzRUggfSBmcm9tICcuLi8uLi9ldmVudC1oYW5kbGVycy9pbWFnZS12aWV3ZXItdG9vbHMuZWgnO1xuaW1wb3J0IHsgTXJDb2xsZWN0aW9uRUggfSBmcm9tICcuLi8uLi9ldmVudC1oYW5kbGVycy9jb2xsZWN0aW9uLmVoJztcbmltcG9ydCB7IE1ySW1hZ2VWaWV3ZXJPdmVybGF5RGV0YWlsc0VIIH0gZnJvbSAnLi4vLi4vZXZlbnQtaGFuZGxlcnMvaW1hZ2Utdmlld2VyLW92ZXJsYXktZGV0YWlscy5laCc7XG5pbXBvcnQgeyBNckJ1dHRvbkVILCBNck1ldGFkYXRhRHluYW1pY0VIIH0gZnJvbSAnLi4vLi4vZXZlbnQtaGFuZGxlcnMnO1xuaW1wb3J0IHtcbiAgTXJCcmVhZGNydW1ic0RTLFxuICBNckJ1dHRvbkRTLFxuICBNckNvbGxlY3Rpb25EUyxcbiAgTXJJbWFnZVZpZXdlckRTLFxuICBNckltYWdlVmlld2VyVG9vbHNEUyxcbiAgTXJJbmZvQm94RFMsXG4gIE1ySW5uZXJUaXRsZURTLFxuICBNckl0ZW1QcmV2aWV3RFMsXG4gIE1yTWV0YWRhdGFEUyxcbiAgTXJUZXh0Vmlld2VyRFMsXG4gIE1yUGFyYWxsZWxUZXh0Vmlld2VyRFMsXG4gIE1yUmVzb3VyY2VUYWJzRFMsXG4gIE1ySW1hZ2VWaWV3ZXJPdmVybGF5RGV0YWlsc0RTLFxuICBNck1ldGFkYXRhRHluYW1pY0RTLFxuICBNckltYWdlVmlld2VySWlpZkRTLFxufSBmcm9tICcuLi8uLi9kYXRhLXNvdXJjZXMnO1xuaW1wb3J0IHsgTXJNYXBEUyB9IGZyb20gJy4uLy4uL2RhdGEtc291cmNlcy9tYXAuZHMnO1xuaW1wb3J0IHsgTXJMb2NhbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbG9jYWxlLnNlcnZpY2UnO1xuXG5jb25zdCBEQVRBU09VUkNFX01BUCA9IHtcbiAgYnJlYWRjcnVtYnM6IE1yQnJlYWRjcnVtYnNEUyxcbiAgYnV0dG9uOiBNckJ1dHRvbkRTLFxuICBjb2xsZWN0aW9uOiBNckNvbGxlY3Rpb25EUyxcbiAgaW5mbzogTXJJbmZvQm94RFMsXG4gIG1hcDogTXJNYXBEUyxcbiAgbWV0YWRhdGE6IE1yTWV0YWRhdGFEUyxcbiAgcHJldmlldzogTXJJdGVtUHJldmlld0RTLFxuICB0YWJzOiBNclJlc291cmNlVGFic0RTLFxuICB0ZXh0OiBNclRleHRWaWV3ZXJEUyxcbiAgdGl0bGU6IE1ySW5uZXJUaXRsZURTLFxuICB2aWV3ZXI6IE1ySW1hZ2VWaWV3ZXJEUyxcbiAgJ3ZpZXdlci10b29scyc6IE1ySW1hZ2VWaWV3ZXJUb29sc0RTLFxuICAndmlld2VyLW92ZXJsYXktZGV0YWlscyc6IE1ySW1hZ2VWaWV3ZXJPdmVybGF5RGV0YWlsc0RTLFxuICAndGV4dC12aWV3ZXInOiBNclRleHRWaWV3ZXJEUyxcbiAgJ3BhcmFsbGVsLXRleHQtdmlld2VyJzogTXJQYXJhbGxlbFRleHRWaWV3ZXJEUyxcbiAgJ21ldGFkYXRhLWR5bmFtaWMnOiBNck1ldGFkYXRhRHluYW1pY0RTLFxuICAndmlld2VyLWlpaWYnOiBNckltYWdlVmlld2VySWlpZkRTLFxufTtcblxuY29uc3QgRVZFTlRIQU5ETEVSX01BUCA9IHtcbiAgdmlld2VyOiBNckltYWdlVmlld2VyRUgsXG4gICd2aWV3ZXItdG9vbHMnOiBNckltYWdlVmlld2VyVG9vbHNFSCxcbiAgJ3ZpZXdlci1vdmVybGF5LWRldGFpbHMnOiBNckltYWdlVmlld2VyT3ZlcmxheURldGFpbHNFSCxcbiAgJ3RleHQtdmlld2VyJzogTXJUZXh0Vmlld2VyRUgsXG4gICdwYXJhbGxlbC10ZXh0LXZpZXdlcic6IE1yUGFyYWxsZWxUZXh0Vmlld2VyRUgsXG4gIGNvbGxlY3Rpb246IE1yQ29sbGVjdGlvbkVILFxuICAnbWV0YWRhdGEtZHluYW1pYyc6IE1yTWV0YWRhdGFEeW5hbWljRUgsXG4gIGJ1dHRvbjogTXJCdXR0b25FSCxcbiAgLy8gbWFwOiBNck1hcEVIXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtci1yZXNvdXJjZS1sYXlvdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVzb3VyY2UtbGF5b3V0Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBNclJlc291cmNlTGF5b3V0Q29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RMYXlvdXQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSxcbkFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIHJvdXRlckRhdGE6IERhdGE7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbGF5b3V0c0NvbmZpZ3VyYXRpb246IExheW91dHNDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgY29tbXVuaWNhdGlvbjogQ29tbXVuaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYWluU3RhdGU6IE1haW5TdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgbGF5b3V0U3RhdGU6IE1yTGF5b3V0U3RhdGVTZXJ2aWNlLFxuICAgIHB1YmxpYyBtb2RhbFNlcnZpY2U6IE1yUmVzb3VyY2VNb2RhbFNlcnZpY2UsXG4gICAgcHVibGljIGxvY2FsZVNlcnZpY2U6IE1yTG9jYWxlU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIobGF5b3V0c0NvbmZpZ3VyYXRpb24uZ2V0KCdNclJlc291cmNlTGF5b3V0Q29uZmlnJykgfHwgY29uZmlnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0UGF5bG9hZCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcm91dGVyRGF0YTogdGhpcy5yb3V0ZXJEYXRhLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29tbXVuaWNhdGlvbjogdGhpcy5jb21tdW5pY2F0aW9uLFxuICAgICAgbWFpblN0YXRlOiB0aGlzLm1haW5TdGF0ZSxcbiAgICAgIGxheW91dFN0YXRlOiB0aGlzLmxheW91dFN0YXRlLFxuICAgICAgbW9kYWxTZXJ2aWNlOiB0aGlzLm1vZGFsU2VydmljZSxcbiAgICAgIGxvY2FsZVNlcnZpY2U6IHRoaXMubG9jYWxlU2VydmljZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuY29uZmlnLm9wdGlvbnMgfHwge30sXG4gICAgICByb3V0ZTogdGhpcy5yb3V0ZSxcbiAgICAgIHJvdXRlcjogdGhpcy5yb3V0ZXJcbiAgICB9O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5kYXRhLnN1YnNjcmliZSgocm91dGVyRGF0YSkgPT4ge1xuICAgICAgdGhpcy5sYXlvdXRTdGF0ZS5hZGQoJ2NvbnRlbnQnKTtcbiAgICAgIHRoaXMucm91dGVyRGF0YSA9IHJvdXRlckRhdGE7XG4gICAgICB0aGlzLmxvYWRXaWRnZXRzKCk7XG4gICAgICB0aGlzLm9uSW5pdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGNvbnN0IHsgY29uZmlnSWQgfSA9IHRoaXMucm91dGVyRGF0YTtcbiAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5jb25maWd1cmF0aW9uLmdldChjb25maWdJZCkucGFnZUxvYWQgfHwgMTAwMDtcblxuICAgIC8vIElmIGEgZnJhZ21lbnQgKCNpZCkgaXMgcHJlc2VudCBpbiB0aGUgdXJsLCB0aGUgcGFnZSBzY3JvbGwgdG8gdGhhdCBmcmFnbWVudFxuICAgIHRoaXMucm91dGUuZnJhZ21lbnQuc3Vic2NyaWJlKChmcmFnbWVudCkgPT4ge1xuICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmcmFnbWVudCk7XG4gICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMub25EZXN0cm95KCk7XG4gIH1cblxuICBsb2FkV2lkZ2V0cygpIHtcbiAgICBjb25zdCB7IGNvbmZpZ0lkIH0gPSB0aGlzLnJvdXRlckRhdGE7XG4gICAgY29uc3QgeyB0b3AsIGNvbnRlbnQgfSA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXQoY29uZmlnSWQpLnNlY3Rpb25zO1xuICAgIGNvbnN0IHNlY3Rpb25zID0gdG9wLmNvbmNhdChjb250ZW50KTtcbiAgICB0aGlzLndpZGdldHMgPSBbXTtcbiAgICBpZiAoc2VjdGlvbnMpIHtcbiAgICAgIHNlY3Rpb25zLmZvckVhY2goKHtcbiAgICAgICAgaWQsIHR5cGUsIG9wdGlvbnMsIHRvb2xzXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHdpZGdldE9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB3aWRnZXRPcHRpb25zLmxvY2FsZVNlcnZpY2UgPSB0aGlzLmxvY2FsZVNlcnZpY2U7XG4gICAgICAgIC8vIEFkZCByb3V0ZSB0byBtZXRhZGF0YS1keW5hbWljIG9wdGlvbnNcbiAgICAgICAgaWYgKHR5cGUgPT09ICdtZXRhZGF0YS1keW5hbWljJykge1xuICAgICAgICAgIG9wdGlvbnMucm91dGUgPSB0aGlzLnJvdXRlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2lkZ2V0cy5wdXNoKHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBvcHRpb25zOiB3aWRnZXRPcHRpb25zLFxuICAgICAgICAgIGRhdGFTb3VyY2U6IERBVEFTT1VSQ0VfTUFQW3R5cGVdLFxuICAgICAgICAgIGV2ZW50SGFuZGxlcjogRVZFTlRIQU5ETEVSX01BUFt0eXBlXVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gaW1hZ2Ugdmlld2VyIG92ZXJsYXkgZGV0YWlsc1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3ZpZXdlcicpIHtcbiAgICAgICAgICB0aGlzLndpZGdldHMucHVzaCh7XG4gICAgICAgICAgICBpZDogYCR7aWR9LW92ZXJsYXktZGV0YWlsc2AsXG4gICAgICAgICAgICBvcHRpb25zOiB3aWRnZXRPcHRpb25zLFxuICAgICAgICAgICAgZGF0YVNvdXJjZTogREFUQVNPVVJDRV9NQVBbYCR7dHlwZX0tb3ZlcmxheS1kZXRhaWxzYF0sXG4gICAgICAgICAgICBldmVudEhhbmRsZXI6IEVWRU5USEFORExFUl9NQVBbYCR7dHlwZX0tb3ZlcmxheS1kZXRhaWxzYF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbWFnZSB2aWV3ZXIgdG9vbHNcbiAgICAgICAgaWYgKHR5cGUgPT09ICd2aWV3ZXInICYmIHRvb2xzKSB7XG4gICAgICAgICAgdGhpcy53aWRnZXRzLnB1c2goe1xuICAgICAgICAgICAgaWQ6IGAke2lkfS10b29sc2AsXG4gICAgICAgICAgICBvcHRpb25zOiB3aWRnZXRPcHRpb25zLFxuICAgICAgICAgICAgZGF0YVNvdXJjZTogREFUQVNPVVJDRV9NQVBbYCR7dHlwZX0tdG9vbHNgXSxcbiAgICAgICAgICAgIGV2ZW50SGFuZGxlcjogRVZFTlRIQU5ETEVSX01BUFtgJHt0eXBlfS10b29sc2BdXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1yLXJlc291cmNlIG1yLWxheW91dFwiIFxuICAgICAqbmdJZj1cImxiLmRhdGFTb3VyY2UgJiYgbGIuZGF0YVNvdXJjZS5wYWdlQ29uZmlnXCJcbiAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnaXMtbG9hZGluZyc6ICggbGF5b3V0U3RhdGUuZ2V0JCgnY29udGVudCcpIHwgYXN5bmMgKSA9PSAnTE9BRElORycsXG4gICAgICAgICdpcy1lcnJvcic6ICggbGF5b3V0U3RhdGUuZ2V0JCgnY29udGVudCcpIHwgYXN5bmMgKSA9PSAnRVJST1InXG4gICAgICB9XCI+XG4gICAgPCEtLSBSRVNPVVJDRSBMQVlPVVQgQ09OVEVOVCAtLT5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJsYXlvdXRTdGF0ZS5nZXQkKCdjb250ZW50JykgfCBhc3luY1wiPlxuICAgICAgICA8IS0tIGxvYWRpbmcgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidMT0FESU5HJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLWxheW91dF9fbG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgPG43LWxvYWRlcj48L243LWxvYWRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIGVycm9yIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInRVJST1InXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItbGF5b3V0X19lcnJvclwiPlxuICAgICAgICAgICAgICAgIDxoMj57eyBsYi5kYXRhU291cmNlLmVycm9yVGl0bGUgfX08L2gyPlxuICAgICAgICAgICAgICAgIDxwPnt7IGxiLmRhdGFTb3VyY2UuZXJyb3JEZXNjcmlwdGlvbiB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIHN1Y2Nlc3MgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidTVUNDRVNTJ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxiLmRhdGFTb3VyY2UucGFnZUNvbmZpZy5zZWN0aW9ucyBhcyBzZWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDwhLS0gUGFzcyB0aGUgbGlzdCBvZiBibG9ja3MgdG8gcmVuZGVyIHRvIHRoZSBibG9jayB0ZW1wbGF0ZSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItcmVzb3VyY2VfX3RvcFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxvY2tzOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogc2VjdGlvbnMudG9wIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItcmVzb3VyY2VfX2NvbnRlbnQgbXItc2lkZS1tYXJnaW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsb2NrczsgY29udGV4dDogeyAkaW1wbGljaXQ6IHNlY3Rpb25zLmNvbnRlbnQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNibG9ja3MgbGV0LWxpc3Q+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBsaXN0XCI+XG4gICAgICAgIDxzZWN0aW9uICpuZ0lmPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5kcy5vdXQkIHwgYXN5bmNcIlxuICAgICAgICBjbGFzcz1cInt7ICdtci1yZXNvdXJjZV9fc2VjdGlvbiBtci1yZXNvdXJjZV9fJyArIHNlY3Rpb24udHlwZSB9fVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwic2VjdGlvbi50eXBlXCI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFRBQlMgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RhYnMnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRhYiBvZiBsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG43LWFuY2hvci13cmFwcGVyIFtkYXRhXT1cInRhYi5hbmNob3JcIiBbY2xhc3Nlc109XCJ0YWIuY2xhc3Nlc1wiICpuZ0lmPVwiIXRhYi5oaWRlVGFiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtci1yZXNvdXJjZV9fdGFicy1pdGVtXCI+e3sgdGFiLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uNy1hbmNob3Itd3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIElOTkVSIFRJVExFIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0aXRsZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLXJlc291cmNlX190aXRsZS1jb250ZW50IG1yLXNpZGUtbWFyZ2luXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bjctaW5uZXItdGl0bGUgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5kcy5vdXQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbWl0XT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZW1pdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uNy1pbm5lci10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIENVU1RPTSBCVVRUT04gLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2J1dHRvbidcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLXJlc291cmNlX19idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuNy1idXR0b24gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5kcy5vdXQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbWl0XT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZW1pdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uNy1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgICAgICAgICAgICAgIDwhLS0gSU1BR0UgVklFV0VSIElJSUYgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3ZpZXdlci1paWlmJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bjctbWlyYWRvclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRleHRtZW51KT1cImxiLmRhdGFTb3VyY2UuaGFzQ29udGV4dE1lbnUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgICAgICA8L243LW1pcmFkb3I+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgXG4gICAgICAgICAgICAgICAgPCEtLSBJTUFHRSBWSUVXRVIgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3ZpZXdlcidcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG43LWltYWdlLXZpZXdlciBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbWl0XT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZW1pdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uNy1pbWFnZS12aWV3ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElNQUdFIFZJRVdFUiBUT09MUyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuNy1pbWFnZS12aWV3ZXItdG9vbHMgKm5nSWY9XCJzZWN0aW9uLnRvb2xzXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkICsgJy10b29scyddLmRzLm91dCQgfCBhc3luY1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbWl0XT1cImxiLndpZGdldHNbc2VjdGlvbi5pZCArICctdG9vbHMnXS5lbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L243LWltYWdlLXZpZXdlci10b29scz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSU1BR0UgVklFV0VSIE9WRVJMQVkgREVUQUlMUyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsYi53aWRnZXRzW3NlY3Rpb24uaWQgKyAnLW92ZXJsYXktZGV0YWlscyddLmRzLm91dCQgfCBhc3luYyBhcyB2aWV3ZXJEZXRhaWxzRGF0YVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXItcmVzb3VyY2VfX3ZpZXdlci1vdmVybGF5LWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItcmVzb3VyY2VfX3ZpZXdlci1vdmVybGF5LWRldGFpbHNfX2Nsb3NlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibXItcmVzb3VyY2VfX3ZpZXdlci1vdmVybGF5LWRldGFpbHNfX2Nsb3NlLWxpbmtcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJsYi5ldmVudEhhbmRsZXIuZW1pdE91dGVyKCdvdmVybGF5Y2xvc2VjbGljaycpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm43LWljb24tY2xvc2VcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bjctaXRlbS1wcmV2aWV3IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJ2aWV3ZXJEZXRhaWxzRGF0YVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW1pdF09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWQgKyAnLW92ZXJsYXktZGV0YWlscyddLmVtaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L243LWl0ZW0tcHJldmlldz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgXG4gICAgICAgICAgICAgICAgPCEtLSBNRVRBREFUQSBWSUVXRVIgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ21ldGFkYXRhJ1wiPlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLWNvbnRlbnQtYmxvY2sgbXItY29udGVudC1ibG9jay1tZXRhZGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzICpuZ0lmPVwic2VjdGlvbi50aXRsZVwiIGNsYXNzPVwibXItY29udGVudC1ibG9ja19fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzZWN0aW9uLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLWNvbnRlbnQtYmxvY2tfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bXItcmVhZC1tb3JlIFtkYXRhXT1cInNlY3Rpb24ucmVhZG1vcmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiBzZWN0aW9uPy5vcHRpb25zPy5yZWFkbW9yZSB8fCBzZWN0aW9uPy5vcHRpb25zPy5ncm91cFJlYWRtb3JlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHdpaG91dFJlYWRtb3JlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bXItbWV0YWRhdGEtcmVhZG1vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VtaXRdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5lbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21yLW1ldGFkYXRhLXJlYWRtb3JlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN3aWhvdXRSZWFkbW9yZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuNy1tZXRhZGF0YS12aWV3ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VtaXRdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5lbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L243LW1ldGFkYXRhLXZpZXdlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21yLXJlYWQtbW9yZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8IS0tIE1FVEFEQVRBIERZTkFNSUMgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ21ldGFkYXRhLWR5bmFtaWMnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtci1tZXRhZGF0YS1keW5hbWljIFxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgIFtlbWl0XT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZW1pdFwiPlxuICAgICAgICAgICAgICAgICAgICA8L21yLW1ldGFkYXRhLWR5bmFtaWM+ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICAgICAgICAgICAgICA8IS0tIENPTExFQ1RJT04gLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NvbGxlY3Rpb24nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luYyBhcyBjb2xsZWN0aW9uJFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbGxlY3Rpb24kLml0ZW1zPy5sZW5ndGggPiAwXCIgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrIG1yLWNvbnRlbnQtYmxvY2stY29sbGVjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyAqbmdJZj1cInNlY3Rpb24udGl0bGVcIiBjbGFzcz1cIm1yLWNvbnRlbnQtYmxvY2tfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlY3Rpb24udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrX19jb250ZW50IHt7IHNlY3Rpb24uZ3JpZCA/ICduNy1ncmlkLScgKyBzZWN0aW9uLmdyaWQgOiAnJyB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bjctaXRlbS1wcmV2aWV3ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbGxlY3Rpb24kPy5pdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJpdGVtXCIgW2VtaXRdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5lbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbjctaXRlbS1wcmV2aWV3PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgICAgICAgICAgICAgIDwhLS0gSVRFTSBQUkVWSUVXIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwcmV2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItY29udGVudC1ibG9jayBtci1jb250ZW50LWJsb2NrLWl0ZW0tcHJldmlld1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzICpuZ0lmPVwic2VjdGlvbi50aXRsZVwiIGNsYXNzPVwibXItY29udGVudC1ibG9ja19fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzZWN0aW9uLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLWNvbnRlbnQtYmxvY2tfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bjctaXRlbS1wcmV2aWV3IFtkYXRhXT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZHMub3V0JCB8IGFzeW5jXCIgW2VtaXRdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5lbWl0XCI+ICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L243LWl0ZW0tcHJldmlldz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICAgICAgICAgICAgICA8IS0tIFRFWFQgVklFV0VSIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0LXZpZXdlcidcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrIG1yLWNvbnRlbnQtYmxvY2stdGV4dC12aWV3ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyAqbmdJZj1cInNlY3Rpb24udGl0bGVcIiBjbGFzcz1cIm1yLWNvbnRlbnQtYmxvY2tfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2VjdGlvbi50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrX19jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuNy10ZXh0LXZpZXdlciBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiIFtlbWl0XT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZW1pdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L243LXRleHQtdmlld2VyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBQQVJBTExFTCBURVhUIFZJRVdFUiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGFyYWxsZWwtdGV4dC12aWV3ZXInXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItY29udGVudC1ibG9jayBtci1jb250ZW50LWJsb2NrLXRleHQtdmlld2VyIG1yLWNvbnRlbnQtYmxvY2stcGFyYWxsZWwtdGV4dC12aWV3ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyAqbmdJZj1cInNlY3Rpb24udGl0bGVcIiBjbGFzcz1cIm1yLWNvbnRlbnQtYmxvY2tfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2VjdGlvbi50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrX19jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuNy1wYXJhbGxlbC10ZXh0LXZpZXdlciBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiIFtlbWl0XT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZW1pdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L243LXBhcmFsbGVsLXRleHQtdmlld2VyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBNQVAgLS0+XG4gICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ21hcCdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrIG1yLWNvbnRlbnQtYmxvY2stbWFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrX19jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bjctbWFwIFtkYXRhXT1cImxiLndpZGdldHNbc2VjdGlvbi5pZF0uZHMub3V0JCB8IGFzeW5jXCIgW2VtaXRdPVwibGIud2lkZ2V0c1tzZWN0aW9uLmlkXS5lbWl0XCI+PC9uNy1tYXA+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgXG4gICAgICAgICAgICAgICAgPCEtLSBJTkZPIEJPWCAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5mby1ib3gnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrIG1yLWNvbnRlbnQtYmxvY2staW5mby1ib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyAqbmdJZj1cInNlY3Rpb24udGl0bGVcIiBjbGFzcz1cIm1yLWNvbnRlbnQtYmxvY2tfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2VjdGlvbi50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1jb250ZW50LWJsb2NrX19jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm8tYm94X19tb2NrXCI+aW5mby1ib3g8L2Rpdj4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgXG4gICAgICAgICAgICAgICAgPCEtLSBCUkVBRENSVU1CUyAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYnJlYWRjcnVtYnMnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuNy1icmVhZGNydW1icyBbZGF0YV09XCJsYi53aWRnZXRzW3NlY3Rpb24uaWRdLmRzLm91dCQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgICAgICA8L243LWJyZWFkY3J1bWJzPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==