@sumaris-net/ngx-components 18.26.0 → 18.26.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/src/app/core/icon/icon-selector.modal.mjs +5 -4
- package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +13 -3
- package/fesm2022/sumaris-net.ngx-components.mjs +14 -4
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +6 -0
- package/src/assets/manifest.json +1 -1
|
@@ -124,6 +124,14 @@ export class AppImageGalleryComponent {
|
|
|
124
124
|
get isSlideshowVisible() {
|
|
125
125
|
return this._slideshowVisible;
|
|
126
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Whether the inline slideshow overlay is currently shown over the gallery grid. Only meaningful for
|
|
129
|
+
* `slideshowMode === 'inline'`: in 'modal' mode, the grid behind the (fully opaque) modal must stay
|
|
130
|
+
* untouched, otherwise toggling it in/out of view causes a layout jump when the modal is dismissed.
|
|
131
|
+
*/
|
|
132
|
+
get isInlineSlideshowOpen() {
|
|
133
|
+
return this.slideshowMode === 'inline' && this._slideshowVisible;
|
|
134
|
+
}
|
|
127
135
|
zoomModal;
|
|
128
136
|
titlePopover;
|
|
129
137
|
onBeforeDeleteRows = createPromiseEventEmitter();
|
|
@@ -322,6 +330,7 @@ export class AppImageGalleryComponent {
|
|
|
322
330
|
await this.zoomModal.present();
|
|
323
331
|
await this.zoomModal.onDidDismiss();
|
|
324
332
|
this._slideshowVisible = false;
|
|
333
|
+
this.markForCheck();
|
|
325
334
|
}
|
|
326
335
|
}
|
|
327
336
|
async closeSlideshow(role) {
|
|
@@ -333,6 +342,7 @@ export class AppImageGalleryComponent {
|
|
|
333
342
|
else {
|
|
334
343
|
const promise = this.zoomModal.dismiss(null, role ?? 'cancel');
|
|
335
344
|
this._slideshowVisible = false;
|
|
345
|
+
this.markForCheck();
|
|
336
346
|
return promise;
|
|
337
347
|
}
|
|
338
348
|
}
|
|
@@ -389,11 +399,11 @@ export class AppImageGalleryComponent {
|
|
|
389
399
|
this.cd.markForCheck();
|
|
390
400
|
}
|
|
391
401
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppImageGalleryComponent, deps: [{ token: i1.ImageService }, { token: i2.Platform }, { token: i2.AlertController }, { token: i3.TranslateService }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
392
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AppImageGalleryComponent, selector: "app-image-gallery", inputs: { cardColor: "cardColor", debug: ["debug", "debug", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], readOnly: ["readOnly", "readOnly", booleanAttribute], mobile: ["mobile", "mobile", booleanAttribute], mode: "mode", confirmBeforeDelete: "confirmBeforeDelete", showToolbar: ["showToolbar", "showToolbar", booleanAttribute], showFabButton: ["showFabButton", "showFabButton", booleanAttribute], showTitle: ["showTitle", "showTitle", booleanAttribute], showAddToolbarButton: ["showAddToolbarButton", "showAddToolbarButton", booleanAttribute], showAddTextButton: ["showAddTextButton", "showAddTextButton", booleanAttribute], showAddCardButton: ["showAddCardButton", "showAddCardButton", booleanAttribute], showCardToolbar: ["showCardToolbar", "showCardToolbar", booleanAttribute], addButtonColor: "addButtonColor", addButtonText: "addButtonText", cardTemplate: "cardTemplate", imageSizes: "imageSizes", imageSizeQueryParam: "imageSizeQueryParam", enableMouseZoom: ["enableMouseZoom", "enableMouseZoom", booleanAttribute], wheelZoomStep: "wheelZoomStep", maxZoomRatio: "maxZoomRatio", enableRotate: ["enableRotate", "enableRotate", booleanAttribute], enableCrop: ["enableCrop", "enableCrop", booleanAttribute], editionFormat: "editionFormat", editionQuality: "editionQuality", slideshowMode: "slideshowMode", inlineZoomHeight: "inlineZoomHeight", enableSlideshowLoop: ["enableSlideshowLoop", "enableSlideshowLoop", booleanAttribute], canFetchMore: ["canFetchMore", "canFetchMore", booleanAttribute], dataSource: "dataSource" }, outputs: { onBeforeDeleteRows: "onBeforeDeleteRows", onAfterAddRows: "onAfterAddRows", onAfterEditRow: "onAfterEditRow", onAfterEditImage: "onAfterEditImage", click: "click", previousSlide: "previousSlide", nextSlide: "nextSlide", fetchMore: "fetchMore" }, viewQueries: [{ propertyName: "zoomModal", first: true, predicate: ["zoomModal"], descendants: true }, { propertyName: "titlePopover", first: true, predicate: ["titlePopover"], descendants: true }], ngImport: i0, template: "<ion-toolbar color=\"light\" class=\"gallery-toolbar\" *ngIf=\"showToolbar && !_slideshowVisible\">\n <ng-content select=\"ion-buttons[slot=start]\"></ng-content>\n\n <!-- Add -->\n @if (!readOnly && showAddToolbarButton && enabled) {\n <button\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n\n <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\" [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n</ion-toolbar>\n\n<div\n class=\"gallery-container ion-padding-bottom {{ mode }}\"\n [class.inline-zoom-active]=\"_slideshowVisible\"\n [style.--inline-zoom-height]=\"inlineZoomHeight\"\n>\n <div *ngIf=\"mobile && zoomActive\" class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n\n <ion-grid class=\"ion-no-padding\" [class.cdk-visually-hidden]=\"_slideshowVisible\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; index as index; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n @if (cardTemplate) {\n <ng-container\n *ngTemplateOutlet=\"cardTemplate; context: { $implicit: row, mode: mode, image: image }\"\n ></ng-container>\n } @else {\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickRow($event, row)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n @if (image.url) {\n <ion-img [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <ion-img [src]=\"image.dataUrl\" />\n }\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n @if (showTitle && image.title) {\n <ion-toolbar color=\"transparent\" class=\"title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n }\n\n <!-- action toolbar shown when hover image -->\n @if (!readOnly && !mobile && showCardToolbar) {\n <ion-toolbar #cardToolbar color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n @if (showTitle) {\n <button\n mat-button\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"focusCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n <span *ngIf=\"row.currentData.title | isNotNilOrBlank; else editLabel\" translate>\n IMAGE.GALLERY.BTN_EDIT_TITLE\n </span>\n <ng-template #editLabel>\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n </ng-template>\n </mat-label>\n </button>\n }\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button\n mat-icon-button\n slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n }\n </ion-card>\n }\n </ion-col>\n\n <!-- add button -->\n @if ((showAddTextButton || showAddCardButton) && !readOnly) {\n <ion-col [size]=\"_colSize\" @fadeInAnimation>\n @if (showAddTextButton) {\n <ion-button (click)=\"add($event)\" [disabled]=\"disabled\" [color]=\"addButtonColor\">\n <mat-label>{{ addButtonText | translate }}</mat-label>\n <ion-icon slot=\"end\" name=\"camera\"></ion-icon>\n </ion-button>\n } @else if (showAddCardButton) {\n <ion-card\n class=\"image-card-button\"\n color=\"light\"\n (click)=\"add($event)\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? (addButtonText | translate) : ''\"\n [matTooltip]=\"showTooltip ? (addButtonText | translate) : ''\"\n tappable\n >\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n }\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n <!-- Inline slideshow: shown as an overlay directly within the gallery, instead of a full-screen modal.\n The rest of the page (outside the gallery) stays fully visible and usable, unlike the modal's backdrop. -->\n @if (slideshowMode === 'inline' && _slideshowVisible) {\n <app-image-gallery-slideshow\n class=\"inline-overlay\"\n @fadeInOutAnimation\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n [canFetchMore]=\"canFetchMore\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n }\n</div>\n\n<!-- FAB button: add -->\n<ion-fab\n slot=\"fixed\"\n vertical=\"bottom\"\n horizontal=\"end\"\n *ngIf=\"showFabButton && !readOnly\"\n [class.cdk-visually-hidden]=\"disabled\"\n @fadeInOutAnimation\n>\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n\n<!-- Zoom modal -->\n@if (slideshowMode === 'modal') {\n <ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <app-image-gallery-slideshow\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n [loop]=\"enableSlideshowLoop\"\n [canFetchMore]=\"canFetchMore\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"zoomModal.dismiss()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n </ng-template>\n </ion-modal>\n}\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n </mat-form-field>\n </form>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n >\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px;--image-margin-safe-area: var(--image-margin-inline, 0px) * 2 - 3px;--segment-max-width: 150px}ion-toolbar{position:sticky;top:0}ion-toolbar ion-segment{max-width:var(--segment-max-width)}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%;max-height:var(--img-max-height, calc(100% - var(--image-margin-safe-area, 0px)))}.image-card .card-thumbnail>ion-img{min-height:100%;height:100%;object-fit:cover;object-position:center;transition:scale .2s ease-in-out;scale:var(--img-scale)}.image-card .card-thumbnail>ion-img img{max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0, 0, 0, .45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-safe-area, 0px));max-height:max(min(30vh,200px),var(--img-max-height, 0px));transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.gallery-container{position:relative}.gallery-container.inline-zoom-active{min-height:var(--inline-zoom-height, 60vh)}.inline-overlay{position:absolute;inset:0;z-index:20;background:#000}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i2.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i2.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonSegment, selector: "ion-segment", inputs: ["color", "disabled", "mode", "scrollable", "selectOnFocus", "swipeGesture", "value"] }, { kind: "component", type: i2.IonSegmentButton, selector: "ion-segment-button", inputs: ["disabled", "layout", "mode", "type", "value"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "component", type: i2.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i2.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { 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.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i10.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i13.RxFor, selector: "[rxFor][rxForOf]", inputs: ["rxForOf", "rxForTemplate", "rxForStrategy", "rxForParent", "rxForPatchZone", "rxForTrackBy", "rxForRenderCallback"] }, { kind: "component", type: i14.AppImageGallerySlideshowComponent, selector: "app-image-gallery-slideshow", inputs: ["rows", "selectedIndex", "mobile", "readOnly", "disabled", "debug", "enableMouseZoom", "wheelZoomStep", "maxZoomRatio", "enableRotate", "enableCrop", "editionFormat", "editionQuality", "imageSizeQueryParam", "modalImageSize", "enableLoop", "canFetchMore"], outputs: ["deleteRequested", "closeRequested", "afterEditImage", "afterEditRow", "previousSlide", "nextSlide", "fetchMore"] }, { kind: "pipe", type: i15.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i16.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: i17.AppendQueryParamsPipePipe, name: "appendQueryParams" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
402
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AppImageGalleryComponent, selector: "app-image-gallery", inputs: { cardColor: "cardColor", debug: ["debug", "debug", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], readOnly: ["readOnly", "readOnly", booleanAttribute], mobile: ["mobile", "mobile", booleanAttribute], mode: "mode", confirmBeforeDelete: "confirmBeforeDelete", showToolbar: ["showToolbar", "showToolbar", booleanAttribute], showFabButton: ["showFabButton", "showFabButton", booleanAttribute], showTitle: ["showTitle", "showTitle", booleanAttribute], showAddToolbarButton: ["showAddToolbarButton", "showAddToolbarButton", booleanAttribute], showAddTextButton: ["showAddTextButton", "showAddTextButton", booleanAttribute], showAddCardButton: ["showAddCardButton", "showAddCardButton", booleanAttribute], showCardToolbar: ["showCardToolbar", "showCardToolbar", booleanAttribute], addButtonColor: "addButtonColor", addButtonText: "addButtonText", cardTemplate: "cardTemplate", imageSizes: "imageSizes", imageSizeQueryParam: "imageSizeQueryParam", enableMouseZoom: ["enableMouseZoom", "enableMouseZoom", booleanAttribute], wheelZoomStep: "wheelZoomStep", maxZoomRatio: "maxZoomRatio", enableRotate: ["enableRotate", "enableRotate", booleanAttribute], enableCrop: ["enableCrop", "enableCrop", booleanAttribute], editionFormat: "editionFormat", editionQuality: "editionQuality", slideshowMode: "slideshowMode", inlineZoomHeight: "inlineZoomHeight", enableSlideshowLoop: ["enableSlideshowLoop", "enableSlideshowLoop", booleanAttribute], canFetchMore: ["canFetchMore", "canFetchMore", booleanAttribute], dataSource: "dataSource" }, outputs: { onBeforeDeleteRows: "onBeforeDeleteRows", onAfterAddRows: "onAfterAddRows", onAfterEditRow: "onAfterEditRow", onAfterEditImage: "onAfterEditImage", click: "click", previousSlide: "previousSlide", nextSlide: "nextSlide", fetchMore: "fetchMore" }, viewQueries: [{ propertyName: "zoomModal", first: true, predicate: ["zoomModal"], descendants: true }, { propertyName: "titlePopover", first: true, predicate: ["titlePopover"], descendants: true }], ngImport: i0, template: "@if (showToolbar && !isInlineSlideshowOpen) {\n <ion-toolbar color=\"light\" class=\"gallery-toolbar\">\n <ng-content select=\"ion-buttons[slot=start]\"></ng-content>\n\n <!-- Add -->\n @if (!readOnly && showAddToolbarButton && enabled) {\n <button\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n\n <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\" [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n </ion-toolbar>\n}\n\n<div\n class=\"gallery-container ion-padding-bottom {{ mode }}\"\n [class.inline-zoom-active]=\"isInlineSlideshowOpen\"\n [style.--inline-zoom-height]=\"inlineZoomHeight\"\n>\n @if (mobile && zoomActive) {\n <div class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n }\n\n <ion-grid class=\"ion-no-padding\" [class.cdk-visually-hidden]=\"isInlineSlideshowOpen\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n @if (cardTemplate) {\n <ng-container\n *ngTemplateOutlet=\"cardTemplate; context: { $implicit: row, mode: mode, image: image }\"\n ></ng-container>\n } @else {\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickRow($event, row)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n @if (image.url) {\n <ion-img [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <ion-img [src]=\"image.dataUrl\" />\n }\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n @if (showTitle && image.title) {\n <ion-toolbar color=\"transparent\" class=\"title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n }\n\n <!-- action toolbar shown when hover image -->\n @if (!readOnly && !mobile && showCardToolbar) {\n <ion-toolbar #cardToolbar color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n @if (showTitle) {\n <button\n mat-button\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"focusCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n @if (row.currentData.title | isNotNilOrBlank) {\n <span translate>IMAGE.GALLERY.BTN_EDIT_TITLE</span>\n } @else {\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n }\n </mat-label>\n </button>\n }\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button\n mat-icon-button\n slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n }\n </ion-card>\n }\n </ion-col>\n\n <!-- add button -->\n @if ((showAddTextButton || showAddCardButton) && !readOnly) {\n <ion-col [size]=\"_colSize\" @fadeInAnimation>\n @if (showAddTextButton) {\n <ion-button (click)=\"add($event)\" [disabled]=\"disabled\" [color]=\"addButtonColor\">\n <mat-label>{{ addButtonText | translate }}</mat-label>\n <ion-icon slot=\"end\" name=\"camera\"></ion-icon>\n </ion-button>\n } @else if (showAddCardButton) {\n <ion-card\n class=\"image-card-button\"\n color=\"light\"\n (click)=\"add($event)\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? (addButtonText | translate) : ''\"\n [matTooltip]=\"showTooltip ? (addButtonText | translate) : ''\"\n tappable\n >\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n }\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n <!-- Inline slideshow: shown as an overlay directly within the gallery, instead of a full-screen modal.\n The rest of the page (outside the gallery) stays fully visible and usable, unlike the modal's backdrop. -->\n @if (isInlineSlideshowOpen) {\n <app-image-gallery-slideshow\n class=\"inline-overlay\"\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n [canFetchMore]=\"canFetchMore\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n }\n</div>\n\n<!-- FAB button: add -->\n@if (showFabButton && !readOnly) {\n <ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" [class.cdk-visually-hidden]=\"disabled\" @fadeInOutAnimation>\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px\"></ion-icon>\n </ion-fab-button>\n </ion-fab>\n}\n\n<!-- Zoom modal -->\n@if (slideshowMode === 'modal') {\n <ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <app-image-gallery-slideshow\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n [loop]=\"enableSlideshowLoop\"\n [canFetchMore]=\"canFetchMore\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"zoomModal.dismiss()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n </ng-template>\n </ion-modal>\n}\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n </mat-form-field>\n </form>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n >\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px;--image-margin-safe-area: var(--image-margin-inline, 0px) * 2 - 3px;--segment-max-width: 150px}ion-toolbar{position:sticky;top:0}ion-toolbar ion-segment{max-width:var(--segment-max-width)}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%;max-height:var(--img-max-height, calc(100% - var(--image-margin-safe-area, 0px)))}.image-card .card-thumbnail>ion-img{min-height:100%;height:100%;object-fit:cover;object-position:center;transition:scale .2s ease-in-out;scale:var(--img-scale)}.image-card .card-thumbnail>ion-img img{max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0, 0, 0, .45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-safe-area, 0px));max-height:max(min(30vh,200px),var(--img-max-height, 0px));transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.gallery-container{position:relative}.gallery-container.inline-zoom-active{min-height:var(--inline-zoom-height, 60vh)}.inline-overlay{position:absolute;inset:0;z-index:20;background:#000}\n"], dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i2.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i2.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonSegment, selector: "ion-segment", inputs: ["color", "disabled", "mode", "scrollable", "selectOnFocus", "swipeGesture", "value"] }, { kind: "component", type: i2.IonSegmentButton, selector: "ion-segment-button", inputs: ["disabled", "layout", "mode", "type", "value"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "component", type: i2.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i2.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { 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.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i10.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i13.RxFor, selector: "[rxFor][rxForOf]", inputs: ["rxForOf", "rxForTemplate", "rxForStrategy", "rxForParent", "rxForPatchZone", "rxForTrackBy", "rxForRenderCallback"] }, { kind: "component", type: i14.AppImageGallerySlideshowComponent, selector: "app-image-gallery-slideshow", inputs: ["rows", "selectedIndex", "mobile", "readOnly", "disabled", "debug", "enableMouseZoom", "wheelZoomStep", "maxZoomRatio", "enableRotate", "enableCrop", "editionFormat", "editionQuality", "imageSizeQueryParam", "modalImageSize", "enableLoop", "canFetchMore"], outputs: ["deleteRequested", "closeRequested", "afterEditImage", "afterEditRow", "previousSlide", "nextSlide", "fetchMore"] }, { kind: "pipe", type: i15.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i16.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: i17.AppendQueryParamsPipePipe, name: "appendQueryParams" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
393
403
|
}
|
|
394
404
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppImageGalleryComponent, decorators: [{
|
|
395
405
|
type: Component,
|
|
396
|
-
args: [{ selector: 'app-image-gallery', animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-toolbar color=\"light\" class=\"gallery-toolbar\" *ngIf=\"showToolbar && !_slideshowVisible\">\n <ng-content select=\"ion-buttons[slot=start]\"></ng-content>\n\n <!-- Add -->\n @if (!readOnly && showAddToolbarButton && enabled) {\n <button\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n\n <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\" [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n</ion-toolbar>\n\n<div\n class=\"gallery-container ion-padding-bottom {{ mode }}\"\n [class.inline-zoom-active]=\"_slideshowVisible\"\n [style.--inline-zoom-height]=\"inlineZoomHeight\"\n>\n <div *ngIf=\"mobile && zoomActive\" class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n\n <ion-grid class=\"ion-no-padding\" [class.cdk-visually-hidden]=\"_slideshowVisible\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; index as index; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n @if (cardTemplate) {\n <ng-container\n *ngTemplateOutlet=\"cardTemplate; context: { $implicit: row, mode: mode, image: image }\"\n ></ng-container>\n } @else {\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickRow($event, row)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n @if (image.url) {\n <ion-img [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <ion-img [src]=\"image.dataUrl\" />\n }\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n @if (showTitle && image.title) {\n <ion-toolbar color=\"transparent\" class=\"title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n }\n\n <!-- action toolbar shown when hover image -->\n @if (!readOnly && !mobile && showCardToolbar) {\n <ion-toolbar #cardToolbar color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n @if (showTitle) {\n <button\n mat-button\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"focusCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n <span *ngIf=\"row.currentData.title | isNotNilOrBlank; else editLabel\" translate>\n IMAGE.GALLERY.BTN_EDIT_TITLE\n </span>\n <ng-template #editLabel>\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n </ng-template>\n </mat-label>\n </button>\n }\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button\n mat-icon-button\n slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n }\n </ion-card>\n }\n </ion-col>\n\n <!-- add button -->\n @if ((showAddTextButton || showAddCardButton) && !readOnly) {\n <ion-col [size]=\"_colSize\" @fadeInAnimation>\n @if (showAddTextButton) {\n <ion-button (click)=\"add($event)\" [disabled]=\"disabled\" [color]=\"addButtonColor\">\n <mat-label>{{ addButtonText | translate }}</mat-label>\n <ion-icon slot=\"end\" name=\"camera\"></ion-icon>\n </ion-button>\n } @else if (showAddCardButton) {\n <ion-card\n class=\"image-card-button\"\n color=\"light\"\n (click)=\"add($event)\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? (addButtonText | translate) : ''\"\n [matTooltip]=\"showTooltip ? (addButtonText | translate) : ''\"\n tappable\n >\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n }\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n <!-- Inline slideshow: shown as an overlay directly within the gallery, instead of a full-screen modal.\n The rest of the page (outside the gallery) stays fully visible and usable, unlike the modal's backdrop. -->\n @if (slideshowMode === 'inline' && _slideshowVisible) {\n <app-image-gallery-slideshow\n class=\"inline-overlay\"\n @fadeInOutAnimation\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n [canFetchMore]=\"canFetchMore\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n }\n</div>\n\n<!-- FAB button: add -->\n<ion-fab\n slot=\"fixed\"\n vertical=\"bottom\"\n horizontal=\"end\"\n *ngIf=\"showFabButton && !readOnly\"\n [class.cdk-visually-hidden]=\"disabled\"\n @fadeInOutAnimation\n>\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n\n<!-- Zoom modal -->\n@if (slideshowMode === 'modal') {\n <ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <app-image-gallery-slideshow\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n [loop]=\"enableSlideshowLoop\"\n [canFetchMore]=\"canFetchMore\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"zoomModal.dismiss()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n </ng-template>\n </ion-modal>\n}\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n </mat-form-field>\n </form>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n >\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px;--image-margin-safe-area: var(--image-margin-inline, 0px) * 2 - 3px;--segment-max-width: 150px}ion-toolbar{position:sticky;top:0}ion-toolbar ion-segment{max-width:var(--segment-max-width)}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%;max-height:var(--img-max-height, calc(100% - var(--image-margin-safe-area, 0px)))}.image-card .card-thumbnail>ion-img{min-height:100%;height:100%;object-fit:cover;object-position:center;transition:scale .2s ease-in-out;scale:var(--img-scale)}.image-card .card-thumbnail>ion-img img{max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0, 0, 0, .45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-safe-area, 0px));max-height:max(min(30vh,200px),var(--img-max-height, 0px));transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.gallery-container{position:relative}.gallery-container.inline-zoom-active{min-height:var(--inline-zoom-height, 60vh)}.inline-overlay{position:absolute;inset:0;z-index:20;background:#000}\n"] }]
|
|
406
|
+
args: [{ selector: 'app-image-gallery', animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showToolbar && !isInlineSlideshowOpen) {\n <ion-toolbar color=\"light\" class=\"gallery-toolbar\">\n <ng-content select=\"ion-buttons[slot=start]\"></ng-content>\n\n <!-- Add -->\n @if (!readOnly && showAddToolbarButton && enabled) {\n <button\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n\n <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\" [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n </ion-toolbar>\n}\n\n<div\n class=\"gallery-container ion-padding-bottom {{ mode }}\"\n [class.inline-zoom-active]=\"isInlineSlideshowOpen\"\n [style.--inline-zoom-height]=\"inlineZoomHeight\"\n>\n @if (mobile && zoomActive) {\n <div class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n }\n\n <ion-grid class=\"ion-no-padding\" [class.cdk-visually-hidden]=\"isInlineSlideshowOpen\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n @if (cardTemplate) {\n <ng-container\n *ngTemplateOutlet=\"cardTemplate; context: { $implicit: row, mode: mode, image: image }\"\n ></ng-container>\n } @else {\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickRow($event, row)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n @if (image.url) {\n <ion-img [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <ion-img [src]=\"image.dataUrl\" />\n }\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n @if (showTitle && image.title) {\n <ion-toolbar color=\"transparent\" class=\"title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n }\n\n <!-- action toolbar shown when hover image -->\n @if (!readOnly && !mobile && showCardToolbar) {\n <ion-toolbar #cardToolbar color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n @if (showTitle) {\n <button\n mat-button\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"focusCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n @if (row.currentData.title | isNotNilOrBlank) {\n <span translate>IMAGE.GALLERY.BTN_EDIT_TITLE</span>\n } @else {\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n }\n </mat-label>\n </button>\n }\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button\n mat-icon-button\n slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n }\n </ion-card>\n }\n </ion-col>\n\n <!-- add button -->\n @if ((showAddTextButton || showAddCardButton) && !readOnly) {\n <ion-col [size]=\"_colSize\" @fadeInAnimation>\n @if (showAddTextButton) {\n <ion-button (click)=\"add($event)\" [disabled]=\"disabled\" [color]=\"addButtonColor\">\n <mat-label>{{ addButtonText | translate }}</mat-label>\n <ion-icon slot=\"end\" name=\"camera\"></ion-icon>\n </ion-button>\n } @else if (showAddCardButton) {\n <ion-card\n class=\"image-card-button\"\n color=\"light\"\n (click)=\"add($event)\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? (addButtonText | translate) : ''\"\n [matTooltip]=\"showTooltip ? (addButtonText | translate) : ''\"\n tappable\n >\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n }\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n <!-- Inline slideshow: shown as an overlay directly within the gallery, instead of a full-screen modal.\n The rest of the page (outside the gallery) stays fully visible and usable, unlike the modal's backdrop. -->\n @if (isInlineSlideshowOpen) {\n <app-image-gallery-slideshow\n class=\"inline-overlay\"\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n [canFetchMore]=\"canFetchMore\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n }\n</div>\n\n<!-- FAB button: add -->\n@if (showFabButton && !readOnly) {\n <ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" [class.cdk-visually-hidden]=\"disabled\" @fadeInOutAnimation>\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px\"></ion-icon>\n </ion-fab-button>\n </ion-fab>\n}\n\n<!-- Zoom modal -->\n@if (slideshowMode === 'modal') {\n <ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <app-image-gallery-slideshow\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n [loop]=\"enableSlideshowLoop\"\n [canFetchMore]=\"canFetchMore\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"zoomModal.dismiss()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n </ng-template>\n </ion-modal>\n}\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n </mat-form-field>\n </form>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n >\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px;--image-margin-safe-area: var(--image-margin-inline, 0px) * 2 - 3px;--segment-max-width: 150px}ion-toolbar{position:sticky;top:0}ion-toolbar ion-segment{max-width:var(--segment-max-width)}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%;max-height:var(--img-max-height, calc(100% - var(--image-margin-safe-area, 0px)))}.image-card .card-thumbnail>ion-img{min-height:100%;height:100%;object-fit:cover;object-position:center;transition:scale .2s ease-in-out;scale:var(--img-scale)}.image-card .card-thumbnail>ion-img img{max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0, 0, 0, .45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-safe-area, 0px));max-height:max(min(30vh,200px),var(--img-max-height, 0px));transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.gallery-container{position:relative}.gallery-container.inline-zoom-active{min-height:var(--inline-zoom-height, 60vh)}.inline-overlay{position:absolute;inset:0;z-index:20;background:#000}\n"] }]
|
|
397
407
|
}], ctorParameters: () => [{ type: i1.ImageService }, { type: i2.Platform }, { type: i2.AlertController }, { type: i3.TranslateService }, { type: i0.ChangeDetectorRef }, { type: i18.Environment, decorators: [{
|
|
398
408
|
type: Optional
|
|
399
409
|
}, {
|
|
@@ -500,4 +510,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
500
510
|
}], fetchMore: [{
|
|
501
511
|
type: Output
|
|
502
512
|
}] } });
|
|
503
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9pbWFnZS9nYWxsZXJ5L2ltYWdlLWdhbGxlcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGVBQWUsRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXhFLE9BQU8sRUFBQyxXQUFXLEVBQWMsTUFBTSw0Q0FBNEMsQ0FBQztBQUlwRixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBbUIsWUFBWSxFQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDbkYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHcEMsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFDLHlCQUF5QixFQUFFLGdCQUFnQixFQUFlLE1BQU0sY0FB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LGdCQUFnQixFQUFFO2dCQUVFLFVBQVU7c0JBQWpELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRTdCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFa0MsbUJBQW1CO3NCQUExRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQU1FLFlBQVk7c0JBQW5ELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRXpCLFVBQVU7c0JBQXRCLEtBQUs7Z0JBd0JrQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ0ssWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUVmLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLFNBQVM7c0JBQWxCLE1BQU07Z0JBS0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudENoZWNrZWQsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1RhYmxlRGF0YVNvdXJjZSwgVGFibGVFbGVtZW50fSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUnO1xuaW1wb3J0IHtFTlZJUk9OTUVOVCwgRW52aXJvbm1lbnR9IGZyb20gJy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQge0ltYWdlU2VydmljZX0gZnJvbSAnLi4vaW1hZ2Uuc2VydmljZSc7XG5pbXBvcnQge0ltYWdlLCBJbWFnZVNpemV9IGZyb20gJy4uL2ltYWdlLm1vZGVsJztcbmltcG9ydCB7QWxlcnRDb250cm9sbGVyLCBJb25Nb2RhbCwgSW9uUG9wb3ZlciwgUGxhdGZvcm19IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7aXNNb2JpbGV9IGZyb20gJy4uLy4uL3BsYXRmb3Jtcyc7XG5pbXBvcnQge2ZhZGVJbkFuaW1hdGlvbiwgZmFkZUluT3V0QW5pbWF0aW9ufSBmcm9tICcuLi8uLi9tYXRlcmlhbC9tYXRlcmlhbC5hbmltYXRpb25zJztcbmltcG9ydCB7aXNFbXB0eUFycmF5LCBpc05pbE9yQmxhbmssIHRvQm9vbGVhbn0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7Q29sbGVjdGlvblZpZXdlciwgaXNEYXRhU291cmNlLCBMaXN0UmFuZ2V9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtBbGVydHN9IGZyb20gJy4uLy4uL2FsZXJ0cyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtBcHBDb2xvcnN9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7Rm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtjcmVhdGVQcm9taXNlRXZlbnRFbWl0dGVyLCBlbWl0UHJvbWlzZUV2ZW50LCBQcm9taXNlRXZlbnR9IGZyb20gJy4uLy4uL2V2ZW50cyc7XG5pbXBvcnQge1ByZWRlZmluZWRDb2xvcnN9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7SW1hZ2VPcHRpb25zfSBmcm9tICdAY2FwYWNpdG9yL2NhbWVyYSc7XG5cbmltcG9ydCB7QVBQX1NIT1dfVE9PTFRJUH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7R2FsbGVyeU1vZGUsIEltYWdlRWRpdEV2ZW50LCBJbWFnZUVkaXRGb3JtYXQsIEltYWdlR2FsbGVyeVNsaWRlQ2hhbmdlRXZlbnR9IGZyb20gJy4vaW1hZ2UtZ2FsbGVyeS5tb2RlbCc7XG5cbmV4cG9ydCB0eXBlIEltYWdlR2FsbGVyeVNsaWRlc2hvd01vZGUgPSAnbW9kYWwnIHwgJ2lubGluZSc7XG5cbmNvbnN0IEltYWdlR2FsbGVyeU1vZGVDb2xTaXplID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG1vc2FpYzogNCxcbiAgbGlzdDogMTIsXG59KTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUdhbGxlcnlTaXplcyB7XG4gIG1vc2FpYzogSW1hZ2VTaXplIHwgc3RyaW5nO1xuICBsaXN0OiBJbWFnZVNpemUgfCBzdHJpbmc7XG4gIG1vZGFsOiBJbWFnZVNpemUgfCBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1pbWFnZS1nYWxsZXJ5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLWdhbGxlcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtmYWRlSW5BbmltYXRpb24sIGZhZGVJbk91dEFuaW1hdGlvbl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBJbWFnZUdhbGxlcnlDb21wb25lbnQ8VCBleHRlbmRzIEltYWdlPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb2xsZWN0aW9uVmlld2VyLCBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAgcHJvdGVjdGVkIF9kZXN0cm95U3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBfcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcm90ZWN0ZWQgX2RhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxUPjtcbiAgcHJvdGVjdGVkIF9kYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+KG51bGwpO1xuXG4gIHByb3RlY3RlZCBfY29sU2l6ZTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3NlbGVjdGVkUm93SW5kZXg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9wcmVzZW50aW5nRWxlbWVudDogRWxlbWVudCA9IG51bGw7XG4gIHByb3RlY3RlZCBfdGl0bGVGb3JtOiBGb3JtR3JvdXA7XG4gIHByb3RlY3RlZCBfdGl0bGVBdXRvZm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zbGlkZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcm90ZWN0ZWQgem9vbUFjdGl2ZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgem9vbVNjYWxlID0gMTtcbiAgLyoqIFdoZXRoZXIgdGhlIGlubGluZSBzbGlkZXNob3cgb3ZlcmxheSBpcyBjdXJyZW50bHkgc2hvd24gKG9ubHkgcmVsZXZhbnQgd2hlbiB6b29tUHJlc2VudGF0aW9uID09PSAnaW5saW5lJykuICovXG4gIHByb3RlY3RlZCBfc2xpZGVzaG93VmlzaWJsZSA9IGZhbHNlO1xuXG4gIHZpZXdDaGFuZ2U6IEJlaGF2aW9yU3ViamVjdDxMaXN0UmFuZ2U+O1xuXG4gIEBJbnB1dCgpIGNhcmRDb2xvcjogc3RyaW5nIHwgUHJlZGVmaW5lZENvbG9ycztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRlYnVnOiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZWFkT25seSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9iaWxlOiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KCkgbW9kZTogR2FsbGVyeU1vZGUgPSBudWxsO1xuICBASW5wdXQoKSBjb25maXJtQmVmb3JlRGVsZXRlID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dUb29sYmFyID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dGYWJCdXR0b246IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93VGl0bGUgPSB0cnVlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0FkZFRvb2xiYXJCdXR0b246IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93QWRkVGV4dEJ1dHRvbiA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0FkZENhcmRCdXR0b24gPSB0cnVlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0NhcmRUb29sYmFyID0gdHJ1ZTtcbiAgQElucHV0KCkgYWRkQnV0dG9uQ29sb3I6IEFwcENvbG9ycyA9ICd0ZXJ0aWFyeSc7XG4gIEBJbnB1dCgpIGFkZEJ1dHRvblRleHQ6IHN0cmluZyA9ICdDT01NT04uQlROX0FERCc7XG4gIEBJbnB1dCgpIGNhcmRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IFRhYmxlRWxlbWVudDxUPjsgaW1hZ2U6IFQ7IG1vZGU6IEdhbGxlcnlNb2RlIH0+O1xuICBASW5wdXQoKSBpbWFnZVNpemVzOiBJbWFnZUdhbGxlcnlTaXplcyA9IHtcbiAgICBtb3NhaWM6IDxJbWFnZVNpemU+J3NtYWxsJyxcbiAgICBsaXN0OiA8SW1hZ2VTaXplPidtZWRpdW0nLFxuICAgIG1vZGFsOiA8SW1hZ2VTaXplPidsYXJnZScsXG4gIH07XG4gIEBJbnB1dCgpIGltYWdlU2l6ZVF1ZXJ5UGFyYW0gPSAnc2l6ZSc7XG5cbiAgLyoqIEVuYWJsZSBtb3VzZS13aGVlbCB6b29tIGFuZCBtb3VzZS1kcmFnIHBhbiBpbiB0aGUgc2xpZGVzaG93IChkZWZhdWx0cyB0byB0cnVlIG9uIGRlc2t0b3ApLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZW5hYmxlTW91c2Vab29tOiBib29sZWFuID0gbnVsbDtcbiAgLyoqIFpvb20gc3RlcCBhcHBsaWVkIG9uIGVhY2ggbW91c2Utd2hlZWwgdGljayAoZGVmYXVsdCAwLjMpLiAqL1xuICBASW5wdXQoKSB3aGVlbFpvb21TdGVwID0gMC4zO1xuICAvKiogTWF4aW11bSB6b29tIHJhdGlvIHJlYWNoYWJsZSB2aWEgbW91c2Ugd2hlZWwgKGRlZmF1bHQgMykuICovXG4gIEBJbnB1dCgpIG1heFpvb21SYXRpbyA9IDM7XG4gIC8qKiBFbmFibGUgOTDCsCByb3RhdGlvbiBidXR0b25zIGluIHRoZSBzbGlkZXNob3cgKGRlZmF1bHRzIHRvIHRydWUpLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZW5hYmxlUm90YXRlOiBib29sZWFuID0gbnVsbDtcbiAgLyoqIEVuYWJsZSB0aGUgY3JvcCB0b29sIGluIHRoZSBzbGlkZXNob3cgKGRlZmF1bHRzIHRvIHRydWUpLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZW5hYmxlQ3JvcDogYm9vbGVhbiA9IG51bGw7XG4gIC8qKiBJbWFnZSBmb3JtYXQgdXNlZCB3aGVuIGVtaXR0aW5nIHRoZSBlZGl0ZWQgKGNyb3BwZWQvcm90YXRlZCkgaW1hZ2UuICovXG4gIEBJbnB1dCgpIGVkaXRpb25Gb3JtYXQ6IEltYWdlRWRpdEZvcm1hdCA9ICdwbmcnO1xuICAvKiogRXhwb3J0IHF1YWxpdHksIGFwcGxpZWQgb25seSB3aGVuIGVkaXRpb25Gb3JtYXQgaXMgJ2pwZWcnICgwIHRvIDEpLiAqL1xuICBASW5wdXQoKSBlZGl0aW9uUXVhbGl0eSA9IDAuOTI7XG4gIC8qKiBXaGVyZSB0byBzaG93IHRoZSBzbGlkZXNob3c6IGluIGEgZnVsbC1zY3JlZW4gbW9kYWwgKGRlZmF1bHQpLCBvciBpbmxpbmUsIGFzIGFuIG92ZXJsYXkgb3ZlciB0aGUgZ2FsbGVyeSBpdHNlbGYgKGRlc2t0b3Agb25seSkuICovXG4gIEBJbnB1dCgpIHNsaWRlc2hvd01vZGU6IEltYWdlR2FsbGVyeVNsaWRlc2hvd01vZGUgPSAnaW5saW5lJztcbiAgLyoqIEhlaWdodCBvZiB0aGUgaW5saW5lIHNsaWRlc2hvdyBvdmVybGF5IChDU1MgdmFsdWUsIGUuZy4gJzYwdmgnKS4gT25seSB1c2VkIHdoZW4gem9vbVByZXNlbnRhdGlvbiBpcyAnaW5saW5lJy4gKi9cbiAgQElucHV0KCkgaW5saW5lWm9vbUhlaWdodCA9ICcxMDAlJztcbiAgLyoqIFdoZXRoZXIgcmVhY2hpbmcgdGhlIGxhc3QgKHJlc3AuIGZpcnN0KSBpbWFnZSBzaG91bGQgd3JhcCBhcm91bmQgdG8gdGhlIGZpcnN0IChyZXNwLiBsYXN0KSBvbmUuIERlZmF1bHQgdHJ1ZS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZVNsaWRlc2hvd0xvb3AgPSB0cnVlO1xuICAvKipcbiAgICogV2hldGhlciBtb3JlIHJvd3MgbWF5IGV4aXN0IGJleW9uZCB0aGUgb25lcyBjdXJyZW50bHkgbG9hZGVkIChlLmcuIGEgZnVydGhlciBwYWdlLCBub3QgeWV0IGZldGNoZWQpLlxuICAgKiBXaGVuIHRydWUsIHJlYWNoaW5nIHRoZSBsYXN0IGltYWdlIGFza3MgdGhlIHBhcmVudCAodmlhIGBmZXRjaE1vcmVgKSBpbnN0ZWFkIG9mIGxvb3Bpbmcvc3RvcHBpbmcuXG4gICAqIFRoZSBnYWxsZXJ5IGhhcyBubyBvcGluaW9uIG9uIGhvdyBmZXRjaGluZyBpcyBhY3R1YWxseSBkb25lOiBpdCdzIGVudGlyZWx5IHVwIHRvIHRoZSBwYXJlbnQuXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2FuRmV0Y2hNb3JlID0gZmFsc2U7XG5cbiAgQElucHV0KCkgc2V0IGRhdGFTb3VyY2UoZGF0YVNvdXJjZTogVGFibGVEYXRhU291cmNlPFQsIGFueSwgYW55LCBhbnk+KSB7XG4gICAgaWYgKHRoaXMuX2RhdGFTb3VyY2UgIT09IGRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuX3N3aXRjaERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7XG4gICAgfVxuICB9XG4gIGdldCBkYXRhU291cmNlKCk6IFRhYmxlRGF0YVNvdXJjZTxULCBhbnksIGFueSwgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG4gIH1cbiAgZ2V0IGVuYWJsZWQoKSB7XG4gICAgcmV0dXJuICF0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgZ2V0IHJvd3MoKTogVGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhJC52YWx1ZTtcbiAgfVxuXG4gIGdldCByb3dDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzPy5sZW5ndGggfHwgMDtcbiAgfVxuXG4gIGdldCBpc1NsaWRlc2hvd1Zpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NsaWRlc2hvd1Zpc2libGU7XG4gIH1cblxuICBAVmlld0NoaWxkKCd6b29tTW9kYWwnKSB6b29tTW9kYWw6IElvbk1vZGFsO1xuICBAVmlld0NoaWxkKCd0aXRsZVBvcG92ZXInKSB0aXRsZVBvcG92ZXI6IElvblBvcG92ZXI7XG5cbiAgQE91dHB1dCgpIG9uQmVmb3JlRGVsZXRlUm93cyA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8Ym9vbGVhbiwgeyByb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSB9PigpO1xuICBAT3V0cHV0KCkgb25BZnRlckFkZFJvd3MgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWxlbWVudDxUPltdPigpO1xuICBAT3V0cHV0KCkgb25BZnRlckVkaXRSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWxlbWVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uQWZ0ZXJFZGl0SW1hZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEltYWdlRWRpdEV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgY2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWxlbWVudDxUPj4oKTtcbiAgLyoqIEVtaXR0ZWQgZnJvbSB0aGUgc2xpZGVzaG93IHdoZW5ldmVyIHRoZSBhY3RpdmUgc2xpZGUgbW92ZXMgYmFja3dhcmQgKHByZXZpb3VzIGltYWdlKS4gKi9cbiAgQE91dHB1dCgpIHByZXZpb3VzU2xpZGUgPSBuZXcgRXZlbnRFbWl0dGVyPEltYWdlR2FsbGVyeVNsaWRlQ2hhbmdlRXZlbnQ8VD4+KCk7XG4gIC8qKiBFbWl0dGVkIGZyb20gdGhlIHNsaWRlc2hvdyB3aGVuZXZlciB0aGUgYWN0aXZlIHNsaWRlIG1vdmVzIGZvcndhcmQgKG5leHQgaW1hZ2UpLiAqL1xuICBAT3V0cHV0KCkgbmV4dFNsaWRlID0gbmV3IEV2ZW50RW1pdHRlcjxJbWFnZUdhbGxlcnlTbGlkZUNoYW5nZUV2ZW50PFQ+PigpO1xuICAvKipcbiAgICogRm9yd2FyZGVkIGFzLWlzIGZyb20gdGhlIHNsaWRlc2hvdyB3aGVuIHJlYWNoaW5nIHRoZSBsYXN0IGltYWdlIHdoaWxlIGBjYW5GZXRjaE1vcmVgIGlzIHRydWU6IHRoZVxuICAgKiBwYXJlbnQgbXVzdCBmZXRjaCB0aGUgbmV4dCBwYWdlIChob3dldmVyIGl0IGRvZXMgc28pIGFuZCByZXNvbHZlIHdpdGggd2hldGhlciBuZXcgcm93cyB3ZXJlIGFkZGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIGZldGNoTW9yZSA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8Ym9vbGVhbiwgdm9pZD4oKTtcblxuICBzaG93VG9vbHRpcCA9IGluamVjdChBUFBfU0hPV19UT09MVElQLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbWFnZVNlcnZpY2U6IEltYWdlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByb3RlY3RlZCBhbHRlckN0cmw6IEFsZXJ0Q29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChFTlZJUk9OTUVOVCkgZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudFxuICApIHtcbiAgICB0aGlzLnZpZXdDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHsgc3RhcnQ6IDAsIGVuZDogTnVtYmVyLk1BWF9WQUxVRSB9KTtcblxuICAgIC8vIERFViBsb2dcbiAgICB0aGlzLmRlYnVnID0gZW52aXJvbm1lbnQgJiYgIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm1vYmlsZSA9IHRvQm9vbGVhbih0aGlzLm1vYmlsZSwgaXNNb2JpbGUod2luZG93KSk7XG4gICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID8/ICh0aGlzLm1vYmlsZSA/ICdsaXN0JyA6ICdtb3NhaWMnKTtcbiAgICB0aGlzLl9jb2xTaXplID0gSW1hZ2VHYWxsZXJ5TW9kZUNvbFNpemVbdGhpcy5tb2RlXTtcbiAgICB0aGlzLnNob3dUb29sYmFyID0gdG9Cb29sZWFuKHRoaXMuc2hvd1Rvb2xiYXIsICF0aGlzLm1vYmlsZSk7XG4gICAgdGhpcy5zaG93Q2FyZFRvb2xiYXIgPSB0b0Jvb2xlYW4odGhpcy5zaG93Q2FyZFRvb2xiYXIsICF0aGlzLm1vYmlsZSk7XG4gICAgdGhpcy5zaG93QWRkQ2FyZEJ1dHRvbiA9IHRvQm9vbGVhbih0aGlzLnNob3dBZGRDYXJkQnV0dG9uLCB0aGlzLm1vYmlsZSk7XG4gICAgdGhpcy5zaG93RmFiQnV0dG9uID0gdG9Cb29sZWFuKHRoaXMuc2hvd0ZhYkJ1dHRvbiwgdGhpcy5tb2JpbGUgJiYgIXRoaXMuc2hvd0FkZENhcmRCdXR0b24pO1xuICAgIHRoaXMuc2hvd0FkZFRvb2xiYXJCdXR0b24gPSB0aGlzLnNob3dBZGRUb29sYmFyQnV0dG9uID8/ICh0aGlzLnNob3dUb29sYmFyICYmICF0aGlzLnJlYWRPbmx5KTtcbiAgICB0aGlzLmVuYWJsZU1vdXNlWm9vbSA9IHRvQm9vbGVhbih0aGlzLmVuYWJsZU1vdXNlWm9vbSwgIXRoaXMubW9iaWxlKTtcbiAgICB0aGlzLmVuYWJsZVJvdGF0ZSA9IHRvQm9vbGVhbih0aGlzLmVuYWJsZVJvdGF0ZSwgdHJ1ZSk7XG4gICAgdGhpcy5lbmFibGVDcm9wID0gdG9Cb29sZWFuKHRoaXMuZW5hYmxlQ3JvcCwgdHJ1ZSk7XG4gICAgLy8gVGhlIGlubGluZSBwcmVzZW50YXRpb24gaXMgb25seSBtZWFuaW5nZnVsIG9uIGRlc2t0b3A6IHRoZXJlIGlzIG5vIFwicmVzdCBvZiB0aGUgcGFnZVwiIHdvcnRoXG4gICAgLy8gcHJlc2VydmluZyBvbiBhIHNtYWxsIG1vYmlsZSBzY3JlZW4sIGFuZCB0aGUgZnVsbHNjcmVlbiBtb2RhbCBhbHJlYWR5IHdvcmtzIHdlbGwgdGhlcmUuXG4gICAgaWYgKHRoaXMubW9iaWxlKSB0aGlzLnNsaWRlc2hvd01vZGUgPSAnbW9kYWwnO1xuXG4gICAgLy8gR2V0IG1vZGFsIHByZXNlbnRpbmcgZWxlbWVudCAoaU9TIG9ubHkpXG4gICAgdGhpcy5fcHJlc2VudGluZ0VsZW1lbnQgPSB0aGlzLm1vYmlsZSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pb24tcGFnZScpIDogbnVsbDtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy5kYXRhU291cmNlICYmICF0aGlzLl9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29ic2VydmVSZW5kZXJDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveVN1YmplY3QubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3lTdWJqZWN0LmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zbGlkZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAoaXNEYXRhU291cmNlKHRoaXMuZGF0YVNvdXJjZSkpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kaXNjb25uZWN0KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFkZChcbiAgICBldmVudD86IEV2ZW50LFxuICAgIG9wdHM/OiB7IG1heEhlaWdodD86IG51bWJlcjsgbWF3V2lkdGg/OiBudW1iZXI7IHF1YWxpdHk/OiBudW1iZXI7IG11bHRpcGxlPzogYm9vbGVhbjsgYXV0b0hpZGVEcm9wQXJlYT86IGJvb2xlYW4gfSAmIE9taXQ8XG4gICAgICBJbWFnZU9wdGlvbnMsXG4gICAgICAncmVzdWx0VHlwZSdcbiAgICA+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGltYWdlcyA9IGF3YWl0IHRoaXMuaW1hZ2VTZXJ2aWNlLmFkZChldmVudCwgb3B0cyk7XG5cbiAgICBpZiAoaXNFbXB0eUFycmF5KGltYWdlcykpIHJldHVybjtcblxuICAgIGNvbnNvbGUuaW5mbyhgW2ltYWdlLWdhbGxlcnldIEFkZGluZyBuZXcgJHtpbWFnZXMubGVuZ3RofSBpbWFnZShzKWAsIGltYWdlcyk7XG5cbiAgICBjb25zdCByb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgaW1hZ2Ugb2YgaW1hZ2VzKSB7XG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLl9kYXRhU291cmNlLmNyZWF0ZU5ldygpO1xuICAgICAgcm93LmN1cnJlbnREYXRhID0gaW1hZ2UgYXMgdW5rbm93biBhcyBUO1xuICAgICAgcm93cy5wdXNoKHJvdyk7XG4gICAgICBjb25zdCBhZGRlZCA9IGF3YWl0IHJvdy5jb25maXJtRWRpdENyZWF0ZSgpO1xuICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tpbWFnZS1nYWxsZXJ5XSBDYW5ub3QgY29uZmlybSBuZXcgaW1hZ2UhJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub25BZnRlckFkZFJvd3MuZW1pdChyb3dzKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShldmVudDogRXZlbnQsIHJvdzogVGFibGVFbGVtZW50PFQ+LCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChldmVudD8uZGVmYXVsdFByZXZlbnRlZCB8fCB0aGlzLnJlYWRPbmx5KSByZXR1cm4gZmFsc2U7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gQ2hlY2sgdXNpbmcgZW1pdHRlclxuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY2FuRGVsZXRlUm93cyhbcm93XSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGxldCBkZWxldGVkOiBib29sZWFuO1xuICAgIGlmIChyb3cuaWQgPT09IC0xKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1tpbWFnZS1nYWxsZXJ5XSBSZW1vdmluZyBuZXcgaW1hZ2UnKTtcbiAgICAgIGRlbGV0ZWQgPSBhd2FpdCByb3cuY2FuY2VsT3JEZWxldGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5pbmZvKCdbaW1hZ2UtZ2FsbGVyeV0gUmVtb3ZpbmcgaW1hZ2UgKGF0ICMnICsgcm93LmlkICsgJyknKTtcbiAgICAgIGRlbGV0ZWQgPSBhd2FpdCByb3cuZGVsZXRlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICB0b2dnbGVWaWV3TW9kZShfPzogRXZlbnQpIHtcbiAgICB0aGlzLnNldFZpZXdNb2RlKHRoaXMubW9kZSA9PT0gJ2xpc3QnID8gJ21vc2FpYycgOiAnbGlzdCcpO1xuICB9XG5cbiAgc2V0Vmlld01vZGUobW9kZTogR2FsbGVyeU1vZGUpIHtcbiAgICBpZiAodGhpcy5tb2RlICE9PSBtb2RlKSB7XG4gICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5fY29sU2l6ZSA9IEltYWdlR2FsbGVyeU1vZGVDb2xTaXplW3RoaXMubW9kZV07XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHRyYWNrQnlGbihpbmRleDogbnVtYmVyLCByb3c6IFRhYmxlRWxlbWVudDxUPikge1xuICAgIHJldHVybiByb3cuaWQ7XG4gIH1cblxuICBhc3luYyBlZGl0VGl0bGUoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogVGFibGVFbGVtZW50PFQ+LCBjYXJkVG9vbGJhcjogYW55KSB7XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50Py5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuZm9jdXNDYXJkVG9vbGJhcihjYXJkVG9vbGJhcik7XG5cbiAgICBjb25zdCB0aXRsZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wocm93LmN1cnJlbnREYXRhLnRpdGxlLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSldKSk7XG4gICAgdGhpcy5fdGl0bGVGb3JtID0gbmV3IEZvcm1Hcm91cCh7IHRpdGxlOiB0aXRsZUNvbnRyb2wgfSk7XG4gICAgdGhpcy5fdGl0bGVBdXRvZm9jdXMgPSB0aGlzLm1vYmlsZSAmJiB0aGlzLmVuYWJsZWQgJiYgIXRoaXMucmVhZE9ubHk7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBhd2FpdCB0aGlzLnRpdGxlUG9wb3Zlci5wcmVzZW50KCk7XG5cbiAgICBjb25zdCB7IGRhdGEsIHJvbGUgfSA9IGF3YWl0IHRoaXMudGl0bGVQb3BvdmVyLm9uRGlkRGlzbWlzcygpO1xuXG4gICAgaWYgKCFyb2xlIHx8IHJvbGUgIT09ICdDQU5DRUwnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbaW1hZ2UtZ2FsbGVyeV0gVXNlciBzZXQgdGl0bGU6ICcgKyBkYXRhKTtcbiAgICAgIHJvdy5jdXJyZW50RGF0YS50aXRsZSA9IGRhdGE7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5vbkFmdGVyRWRpdFJvdy5lbWl0KHJvdyk7XG4gICAgfVxuXG4gICAgLy8gSGlkZSB0aGUgdG9vbGJhciwgYmVjYXVzZSB0aGUgZm9jdXMgaGF2ZSBiZWVuIGdpdmVuIHRvIHRoZSBldmVudCdzIG9yaWdpbiAodGhlIGVkaXQgYnV0dG9uKVxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oaWRlQ2FyZFRvb2xiYXIoY2FyZFRvb2xiYXIpLCA3NTApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZvY3VzQ2FyZFRvb2xiYXIoY2FyZFRvb2xiYXI6IGFueSkge1xuICAgIGNvbnN0IGVsID0gY2FyZFRvb2xiYXJbJ2VsJ10gYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWwuY2xhc3NMaXN0LmFkZCgnZm9jdXNlZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVDYXJkVG9vbGJhcihjYXJkVG9vbGJhcjogYW55KSB7XG4gICAgY29uc3QgZWwgPSBjYXJkVG9vbGJhclsnZWwnXSBhcyBIVE1MRWxlbWVudDtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1c2VkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3N3aXRjaERhdGFTb3VyY2UoZGF0YVNvdXJjZTogVGFibGVEYXRhU291cmNlPFQ+KSB7XG4gICAgaWYgKGlzRGF0YVNvdXJjZSh0aGlzLl9kYXRhU291cmNlKSkge1xuICAgICAgdGhpcy5fZGF0YVNvdXJjZS5kaXNjb25uZWN0KHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb2JzZXJ2ZVJlbmRlckNoYW5nZXMoKSB7XG4gICAgLy8gSWYgbm8gZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0LCB0aGVyZSBpcyBub3RoaW5nIHRvIG9ic2VydmUgZm9yIGNoYW5nZXMuXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGRhdGFTdHJlYW06IE9ic2VydmFibGU8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+O1xuICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5kYXRhU291cmNlKSkge1xuICAgICAgZGF0YVN0cmVhbSA9IHRoaXMuZGF0YVNvdXJjZS5jb25uZWN0KHRoaXMpO1xuICAgIH1cbiAgICBpZiAoZGF0YVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyB0aGlzLmdldFRhYmxlVW5rbm93bkRhdGFTb3VyY2VFcnJvcigpO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uID0gZGF0YVN0cmVhbS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95U3ViamVjdCkpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2ltYWdlLWdhbGxlcnldIFJlY2VpdmVkIG5ldyByb3dzJywgZGF0YSk7XG4gICAgICB0aGlzLl9kYXRhJC5uZXh0KGRhdGEpO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRUYWJsZVVua25vd25EYXRhU291cmNlRXJyb3IoKSB7XG4gICAgcmV0dXJuIEVycm9yKGBQcm92aWRlZCBkYXRhIHNvdXJjZSBkaWQgbm90IG1hdGNoIGFuIGFycmF5LCBPYnNlcnZhYmxlLCBvciBEYXRhU291cmNlYCk7XG4gIH1cblxuICBjbGlja1JvdyhldmVudDogRXZlbnQgfCB1bmRlZmluZWQsIHJvdzogVGFibGVFbGVtZW50PFQ+KTogYm9vbGVhbiB7XG4gICAgLy8gRGVsZWdhdGUgY2xpY2sgYWN0aW9uXG4gICAgaWYgKHRoaXMuY2xpY2sub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMuY2xpY2suZW1pdChyb3cpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgb3BlbiB0aGUgc2xpZGVzaG93XG4gICAgdGhpcy5vcGVuU2xpZGVzaG93KGV2ZW50LCByb3cpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBzbGlkZXNob3cgKGlubGluZSBvdmVybGF5LCBvciBmdWxsLXNjcmVlbiBtb2RhbCwgZGVwZW5kaW5nIG9uIGB6b29tUHJlc2VudGF0aW9uYCkgb24gdGhlIHJvdyBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAqIENhbiBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIHRoZSBjb21wb25lbnQgKGUuZy4gdG8gb3BlbiB0aGUgZ2FsbGVyeSBkaXJlY3RseSBvbiBhIGdpdmVuIGltYWdlKS5cbiAgICovXG4gIGFzeW5jIG9wZW5TbGlkZXNob3coZXZlbnQ6IEV2ZW50IHwgdW5kZWZpbmVkLCByb3c6IFRhYmxlRWxlbWVudDxUPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yb3dzPy5maW5kSW5kZXgoKHIpID0+IHIgPT09IHJvdyk7XG4gICAgaWYgKGluZGV4ID09IG51bGwgfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucm93Q291bnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2ltYWdlLWdhbGxlcnldIENhbm5vdCBvcGVuIHNsaWRlc2hvdzogaW52YWxpZCBpbmRleCAoJHtpbmRleH0pYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0ZWRSb3dJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuX3NsaWRlc2hvd1Zpc2libGUgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNsaWRlc2hvd01vZGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnpvb21Nb2RhbC5wcmVzZW50KCk7XG4gICAgICBhd2FpdCB0aGlzLnpvb21Nb2RhbC5vbkRpZERpc21pc3MoKTtcbiAgICAgIHRoaXMuX3NsaWRlc2hvd1Zpc2libGUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbG9zZVNsaWRlc2hvdyhyb2xlPzogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc2xpZGVzaG93TW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHRoaXMuX3NsaWRlc2hvd1Zpc2libGUgPSBmYWxzZTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuem9vbU1vZGFsLmRpc21pc3MobnVsbCwgcm9sZSA/PyAnY2FuY2VsJyk7XG4gICAgICB0aGlzLl9zbGlkZXNob3dWaXNpYmxlID0gZmFsc2U7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGRlbGV0ZSByZXF1ZXN0IGNvbWluZyBmcm9tIHRoZSBzbGlkZXNob3cgY29tcG9uZW50IChlaXRoZXIgaW5saW5lIG9yIGluIHRoZSBtb2RhbCk6XG4gICAqIHJ1bnMgdGhlIHNhbWUgY29uZmlybWF0aW9uL2RlbGV0aW9uIGZsb3cgYXMgYSBjYXJkJ3MgZGVsZXRlIGJ1dHRvbiwgdGhlbiByZXNvbHZlcyB0aGUgcHJvbWlzZVxuICAgKiBzbyB0aGUgc2xpZGVzaG93IGtub3dzIHdoZXRoZXIgdG8gcmVzZXQgaXRzIHpvb20gb3IgY2xvc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25TbGlkZXNob3dEZWxldGVSZXF1ZXN0ZWQocHJvbWlzZUV2ZW50OiBQcm9taXNlRXZlbnQ8Ym9vbGVhbiwgeyByb3c6IFRhYmxlRWxlbWVudDxUPiB9Pikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgdGhpcy5kZWxldGUocHJvbWlzZUV2ZW50LCBwcm9taXNlRXZlbnQuZGV0YWlsLnJvdyk7XG4gICAgICBwcm9taXNlRXZlbnQuZGV0YWlsLnN1Y2Nlc3MoZGVsZXRlZCk7XG4gICAgICBpZiAoZGVsZXRlZCAmJiB0aGlzLnJvd3MubGVuZ3RoID09PSAwICYmIHRoaXMuc2xpZGVzaG93TW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgdGhpcy5jbG9zZVNsaWRlc2hvdygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcHJvbWlzZUV2ZW50LmRldGFpbC5lcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjYW5EZWxldGVSb3dzKHJvd3M6IFRhYmxlRWxlbWVudDxUPltdLCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIENoZWNrIHVzaW5nIGVtaXR0ZXJcbiAgICBpZiAodGhpcy5vbkJlZm9yZURlbGV0ZVJvd3Mub2JzZXJ2ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhbkRlbGV0ZSA9IGF3YWl0IGVtaXRQcm9taXNlRXZlbnQodGhpcy5vbkJlZm9yZURlbGV0ZVJvd3MsICdjYW5EZWxldGUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IHJvd3MgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY2FuRGVsZXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiBmYWxzZTsgLy8gVXNlciBjYW5jZWxcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgY2FuIGRlbGV0ZSByb3dzJywgZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpcm1CZWZvcmVEZWxldGUpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IEFsZXJ0cy5hc2tEZWxldGVDb25maXJtYXRpb24odGhpcy5hbHRlckN0cmwsIHRoaXMudHJhbnNsYXRlLCBldmVudCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlOyAvLyBDYW5jZWxsZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRJbWFnZVNpemVRdWVyeVBhcmFtcyhtb2RlPzogR2FsbGVyeU1vZGUgfCAnbW9kYWwnKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgbW9kZSA9IG1vZGUgPz8gdGhpcy5tb2RlO1xuICAgIGlmICghdGhpcy5pbWFnZVNpemVRdWVyeVBhcmFtIHx8IGlzTmlsT3JCbGFuayh0aGlzLmltYWdlU2l6ZXM/Llttb2RlXSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIFt0aGlzLmltYWdlU2l6ZVF1ZXJ5UGFyYW1dOiB0aGlzLmltYWdlU2l6ZXNbbW9kZV0sXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGlvbi10b29sYmFyIGNvbG9yPVwibGlnaHRcIiBjbGFzcz1cImdhbGxlcnktdG9vbGJhclwiICpuZ0lmPVwic2hvd1Rvb2xiYXIgJiYgIV9zbGlkZXNob3dWaXNpYmxlXCI+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cImlvbi1idXR0b25zW3Nsb3Q9c3RhcnRdXCI+PC9uZy1jb250ZW50PlxuXG4gIDwhLS0gQWRkIC0tPlxuICBAaWYgKCFyZWFkT25seSAmJiBzaG93QWRkVG9vbGJhckJ1dHRvbiAmJiBlbmFibGVkKSB7XG4gICAgPGJ1dHRvblxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdDT01NT04uQlROX0FERCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fQUREJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAoY2xpY2spPVwiYWRkKClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICB9XG5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaW9uLWJ1dHRvbnNbc2xvdD1lbmRdXCI+PC9uZy1jb250ZW50PlxuXG4gIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgPCEtLSBUb2dnbGUgdmlldyBtb2RlIC0tPlxuICAgIDxpb24tc2VnbWVudCAoaW9uQ2hhbmdlKT1cInRvZ2dsZVZpZXdNb2RlKCRldmVudClcIiBjb2xvcj1cImFjY2VudFwiIFt2YWx1ZV09XCJfY29sU2l6ZVwiPlxuICAgICAgPGlvbi1zZWdtZW50LWJ1dHRvbiBbdmFsdWVdPVwiNFwiPlxuICAgICAgICA8bWF0LWljb24+dmlld19tb2R1bGU8L21hdC1pY29uPlxuICAgICAgPC9pb24tc2VnbWVudC1idXR0b24+XG4gICAgICA8aW9uLXNlZ21lbnQtYnV0dG9uIFt2YWx1ZV09XCIxMlwiPlxuICAgICAgICA8bWF0LWljb24+dmlld19saXN0PC9tYXQtaWNvbj5cbiAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgIDwvaW9uLXNlZ21lbnQ+XG4gIDwvaW9uLWJ1dHRvbnM+XG48L2lvbi10b29sYmFyPlxuXG48ZGl2XG4gIGNsYXNzPVwiZ2FsbGVyeS1jb250YWluZXIgaW9uLXBhZGRpbmctYm90dG9tIHt7IG1vZGUgfX1cIlxuICBbY2xhc3MuaW5saW5lLXpvb20tYWN0aXZlXT1cIl9zbGlkZXNob3dWaXNpYmxlXCJcbiAgW3N0eWxlLi0taW5saW5lLXpvb20taGVpZ2h0XT1cImlubGluZVpvb21IZWlnaHRcIlxuPlxuICA8ZGl2ICpuZ0lmPVwibW9iaWxlICYmIHpvb21BY3RpdmVcIiBjbGFzcz1cImJhY2tkcm9wXCIgW3N0eWxlLm9wYWNpdHldPVwiem9vbVNjYWxlXCI+PC9kaXY+XG5cbiAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJfc2xpZGVzaG93VmlzaWJsZVwiPlxuICAgIDxpb24tcm93PlxuICAgICAgPGlvbi1jb2wgKnJ4Rm9yPVwibGV0IHJvdyBvZiBfZGF0YSQ7IGluZGV4IGFzIGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIiBbc2l6ZV09XCJfY29sU2l6ZVwiPlxuICAgICAgICBAbGV0IGltYWdlID0gcm93IHwgcHJvcGVydHlHZXQ6ICdjdXJyZW50RGF0YSc7XG4gICAgICAgIEBpZiAoY2FyZFRlbXBsYXRlKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXJkVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3csIG1vZGU6IG1vZGUsIGltYWdlOiBpbWFnZSB9XCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxpb24tY2FyZFxuICAgICAgICAgICAgI2NhcmRcbiAgICAgICAgICAgIGNsYXNzPVwiaW1hZ2UtY2FyZFwiXG4gICAgICAgICAgICBbY2xhc3Muem9vbS1ob3Zlcl09XCIhbW9iaWxlXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJjYXJkQ29sb3JcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrUm93KCRldmVudCwgcm93KVwiXG4gICAgICAgICAgICB0YXBwYWJsZVxuICAgICAgICAgICAgQGZhZGVJbkFuaW1hdGlvblxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxmaWd1cmUgY2xhc3M9XCJjYXJkLXRodW1ibmFpbFwiPlxuICAgICAgICAgICAgICBAaWYgKGltYWdlLnVybCkge1xuICAgICAgICAgICAgICAgIDxpb24taW1nIFtzcmNdPVwiaW1hZ2UudXJsIHwgYXBwZW5kUXVlcnlQYXJhbXM6IGdldEltYWdlU2l6ZVF1ZXJ5UGFyYW1zKClcIiAvPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8aW9uLWltZyBbc3JjXT1cImltYWdlLmRhdGFVcmxcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2ZpZ3VyZT5cblxuICAgICAgICAgICAgPCEtLSB0b29sYmFyIGZvciB0aXRsZSAod2hlbiBub3QgaG92ZXIpIC0tPlxuICAgICAgICAgICAgQGlmIChzaG93VGl0bGUgJiYgaW1hZ2UudGl0bGUpIHtcbiAgICAgICAgICAgICAgPGlvbi10b29sYmFyIGNvbG9yPVwidHJhbnNwYXJlbnRcIiBjbGFzcz1cInRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBpbWFnZS50aXRsZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8L2lvbi10b29sYmFyPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8IS0tIGFjdGlvbiB0b29sYmFyIHNob3duIHdoZW4gaG92ZXIgaW1hZ2UgLS0+XG4gICAgICAgICAgICBAaWYgKCFyZWFkT25seSAmJiAhbW9iaWxlICYmIHNob3dDYXJkVG9vbGJhcikge1xuICAgICAgICAgICAgICA8aW9uLXRvb2xiYXIgI2NhcmRUb29sYmFyIGNvbG9yPVwibGlnaHRcIiBjbGFzcz1cImJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICA8IS0tIGVkaXQgdGl0bGUgYnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1RpdGxlKSB7XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgc2xvdD1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRUaXRsZSgkZXZlbnQsIHJvdywgY2FyZFRvb2xiYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgKGZvY3VzaW4pPVwiZm9jdXNDYXJkVG9vbGJhcihjYXJkVG9vbGJhcilcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuY3VycmVudERhdGEudGl0bGUgfCBpc05vdE5pbE9yQmxhbms7IGVsc2UgZWRpdExhYmVsXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgSU1BR0UuR0FMTEVSWS5CVE5fRURJVF9USVRMRVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VkaXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5JTUFHRS5HQUxMRVJZLkJUTl9BRERfVElUTEU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1zcGFjZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gZGVsZXRlIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgIHNsb3Q9XCJlbmRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpb24tZmxvYXQtZW5kXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9ERUxFVEUnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKCRldmVudCwgcm93KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgfVxuICAgICAgPC9pb24tY29sPlxuXG4gICAgICA8IS0tIGFkZCBidXR0b24gLS0+XG4gICAgICBAaWYgKChzaG93QWRkVGV4dEJ1dHRvbiB8fCBzaG93QWRkQ2FyZEJ1dHRvbikgJiYgIXJlYWRPbmx5KSB7XG4gICAgICAgIDxpb24tY29sIFtzaXplXT1cIl9jb2xTaXplXCIgQGZhZGVJbkFuaW1hdGlvbj5cbiAgICAgICAgICBAaWYgKHNob3dBZGRUZXh0QnV0dG9uKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiYWRkKCRldmVudClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbY29sb3JdPVwiYWRkQnV0dG9uQ29sb3JcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBhZGRCdXR0b25UZXh0IHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiZW5kXCIgbmFtZT1cImNhbWVyYVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfSBAZWxzZSBpZiAoc2hvd0FkZENhcmRCdXR0b24pIHtcbiAgICAgICAgICAgIDxpb24tY2FyZFxuICAgICAgICAgICAgICBjbGFzcz1cImltYWdlLWNhcmQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoYWRkQnV0dG9uVGV4dCB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKGFkZEJ1dHRvblRleHQgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICB0YXBwYWJsZVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2FtZXJhXCIgW2NvbG9yXT1cImFkZEJ1dHRvbkNvbG9yXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiYWRkXCIgW2NvbG9yXT1cImFkZEJ1dHRvbkNvbG9yXCIgY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICB9XG4gICAgPC9pb24tcm93PlxuICA8L2lvbi1ncmlkPlxuXG4gIDwhLS0gSW5saW5lIHNsaWRlc2hvdzogc2hvd24gYXMgYW4gb3ZlcmxheSBkaXJlY3RseSB3aXRoaW4gdGhlIGdhbGxlcnksIGluc3RlYWQgb2YgYSBmdWxsLXNjcmVlbiBtb2RhbC5cbiAgICAgICBUaGUgcmVzdCBvZiB0aGUgcGFnZSAob3V0c2lkZSB0aGUgZ2FsbGVyeSkgc3RheXMgZnVsbHkgdmlzaWJsZSBhbmQgdXNhYmxlLCB1bmxpa2UgdGhlIG1vZGFsJ3MgYmFja2Ryb3AuIC0tPlxuICBAaWYgKHNsaWRlc2hvd01vZGUgPT09ICdpbmxpbmUnICYmIF9zbGlkZXNob3dWaXNpYmxlKSB7XG4gICAgPGFwcC1pbWFnZS1nYWxsZXJ5LXNsaWRlc2hvd1xuICAgICAgY2xhc3M9XCJpbmxpbmUtb3ZlcmxheVwiXG4gICAgICBAZmFkZUluT3V0QW5pbWF0aW9uXG4gICAgICBbcm93c109XCJyb3dzXCJcbiAgICAgIFtzZWxlY3RlZEluZGV4XT1cIl9zZWxlY3RlZFJvd0luZGV4XCJcbiAgICAgIFttb2JpbGVdPVwibW9iaWxlXCJcbiAgICAgIFtyZWFkT25seV09XCJyZWFkT25seVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2RlYnVnXT1cImRlYnVnXCJcbiAgICAgIFtlbmFibGVNb3VzZVpvb21dPVwiZW5hYmxlTW91c2Vab29tXCJcbiAgICAgIFt3aGVlbFpvb21TdGVwXT1cIndoZWVsWm9vbVN0ZXBcIlxuICAgICAgW21heFpvb21SYXRpb109XCJtYXhab29tUmF0aW9cIlxuICAgICAgW2VuYWJsZVJvdGF0ZV09XCJlbmFibGVSb3RhdGVcIlxuICAgICAgW2VuYWJsZUNyb3BdPVwiZW5hYmxlQ3JvcFwiXG4gICAgICBbZW5hYmxlTG9vcF09XCJlbmFibGVTbGlkZXNob3dMb29wXCJcbiAgICAgIFtlZGl0aW9uRm9ybWF0XT1cImVkaXRpb25Gb3JtYXRcIlxuICAgICAgW2VkaXRpb25RdWFsaXR5XT1cImVkaXRpb25RdWFsaXR5XCJcbiAgICAgIFtpbWFnZVNpemVRdWVyeVBhcmFtXT1cImltYWdlU2l6ZVF1ZXJ5UGFyYW1cIlxuICAgICAgW21vZGFsSW1hZ2VTaXplXT1cImltYWdlU2l6ZXM/Lm1vZGFsXCJcbiAgICAgIFtjYW5GZXRjaE1vcmVdPVwiY2FuRmV0Y2hNb3JlXCJcbiAgICAgIChkZWxldGVSZXF1ZXN0ZWQpPVwib25TbGlkZXNob3dEZWxldGVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAoY2xvc2VSZXF1ZXN0ZWQpPVwiY2xvc2VTbGlkZXNob3coKVwiXG4gICAgICAoYWZ0ZXJFZGl0SW1hZ2UpPVwib25BZnRlckVkaXRJbWFnZS5lbWl0KCRldmVudClcIlxuICAgICAgKGFmdGVyRWRpdFJvdyk9XCJvbkFmdGVyRWRpdFJvdy5lbWl0KCRldmVudClcIlxuICAgICAgKHByZXZpb3VzU2xpZGUpPVwicHJldmlvdXNTbGlkZS5lbWl0KCRldmVudClcIlxuICAgICAgKG5leHRTbGlkZSk9XCJuZXh0U2xpZGUuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChmZXRjaE1vcmUpPVwiZmV0Y2hNb3JlLmVtaXQoJGV2ZW50KVwiXG4gICAgPjwvYXBwLWltYWdlLWdhbGxlcnktc2xpZGVzaG93PlxuICB9XG48L2Rpdj5cblxuPCEtLSBGQUIgYnV0dG9uOiBhZGQgLS0+XG48aW9uLWZhYlxuICBzbG90PVwiZml4ZWRcIlxuICB2ZXJ0aWNhbD1cImJvdHRvbVwiXG4gIGhvcml6b250YWw9XCJlbmRcIlxuICAqbmdJZj1cInNob3dGYWJCdXR0b24gJiYgIXJlYWRPbmx5XCJcbiAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiZGlzYWJsZWRcIlxuICBAZmFkZUluT3V0QW5pbWF0aW9uXG4+XG4gIDxpb24tZmFiLWJ1dHRvbiBjb2xvcj1cInRlcnRpYXJ5XCIgKGNsaWNrKT1cImFkZCgkZXZlbnQpXCI+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJjYW1lcmFcIj48L2lvbi1pY29uPlxuICAgIDxpb24taWNvbiBuYW1lPVwiYWRkXCIgY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiIHN0eWxlPVwibGVmdDogMzNweDsgdG9wOiA5cHg7IGZvbnQtc2l6ZTogMjBweFwiPjwvaW9uLWljb24+XG4gIDwvaW9uLWZhYi1idXR0b24+XG48L2lvbi1mYWI+XG5cbjwhLS0gWm9vbSBtb2RhbCAtLT5cbkBpZiAoc2xpZGVzaG93TW9kZSA9PT0gJ21vZGFsJykge1xuICA8aW9uLW1vZGFsICN6b29tTW9kYWwgY2xhc3M9XCJzdGFjay1tb2RhbCB6b29tLW1vZGFsXCIgW2NsYXNzLm1vZGFsLWZ1bGxzY3JlZW5dPVwibW9iaWxlXCIgW2NsYXNzLm1vZGFsLWxhcmdlXT1cIiFtb2JpbGVcIj5cbiAgICA8bmctdGVtcGxhdGU+XG4gICAgICA8YXBwLWltYWdlLWdhbGxlcnktc2xpZGVzaG93XG4gICAgICAgIFtyb3dzXT1cInJvd3NcIlxuICAgICAgICBbc2VsZWN0ZWRJbmRleF09XCJfc2VsZWN0ZWRSb3dJbmRleFwiXG4gICAgICAgIFttb2JpbGVdPVwibW9iaWxlXCJcbiAgICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW2RlYnVnXT1cImRlYnVnXCJcbiAgICAgICAgW2VuYWJsZU1vdXNlWm9vbV09XCJlbmFibGVNb3VzZVpvb21cIlxuICAgICAgICBbd2hlZWxab29tU3RlcF09XCJ3aGVlbFpvb21TdGVwXCJcbiAgICAgICAgW21heFpvb21SYXRpb109XCJtYXhab29tUmF0aW9cIlxuICAgICAgICBbZW5hYmxlUm90YXRlXT1cImVuYWJsZVJvdGF0ZVwiXG4gICAgICAgIFtlbmFibGVDcm9wXT1cImVuYWJsZUNyb3BcIlxuICAgICAgICBbZWRpdGlvbkZvcm1hdF09XCJlZGl0aW9uRm9ybWF0XCJcbiAgICAgICAgW2VkaXRpb25RdWFsaXR5XT1cImVkaXRpb25RdWFsaXR5XCJcbiAgICAgICAgW2ltYWdlU2l6ZVF1ZXJ5UGFyYW1dPVwiaW1hZ2VTaXplUXVlcnlQYXJhbVwiXG4gICAgICAgIFttb2RhbEltYWdlU2l6ZV09XCJpbWFnZVNpemVzPy5tb2RhbFwiXG4gICAgICAgIFtsb29wXT1cImVuYWJsZVNsaWRlc2hvd0xvb3BcIlxuICAgICAgICBbY2FuRmV0Y2hNb3JlXT1cImNhbkZldGNoTW9yZVwiXG4gICAgICAgIChkZWxldGVSZXF1ZXN0ZWQpPVwib25TbGlkZXNob3dEZWxldGVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChjbG9zZVJlcXVlc3RlZCk9XCJ6b29tTW9kYWwuZGlzbWlzcygpXCJcbiAgICAgICAgKGFmdGVyRWRpdEltYWdlKT1cIm9uQWZ0ZXJFZGl0SW1hZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGFmdGVyRWRpdFJvdyk9XCJvbkFmdGVyRWRpdFJvdy5lbWl0KCRldmVudClcIlxuICAgICAgICAocHJldmlvdXNTbGlkZSk9XCJwcmV2aW91c1NsaWRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChuZXh0U2xpZGUpPVwibmV4dFNsaWRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChmZXRjaE1vcmUpPVwiZmV0Y2hNb3JlLmVtaXQoJGV2ZW50KVwiXG4gICAgICA+PC9hcHAtaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3c+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9pb24tbW9kYWw+XG59XG5cbjxpb24tcG9wb3ZlciAjdGl0bGVQb3BvdmVyPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBjZGtUcmFwRm9jdXMgW2Nka1RyYXBGb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIj5cbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiX3RpdGxlRm9ybVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cImF1dG9cIj5cbiAgICAgICAgICA8bWF0LWxhYmVsIHRyYW5zbGF0ZT5JTUFHRS5HQUxMRVJZLlRJVExFPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwiX3RpdGxlQXV0b2ZvY3VzXCJcbiAgICAgICAgICAgIChrZXlkb3duLmNvbnRyb2wuZW50ZXIpPVwidGl0bGVQb3BvdmVyLmRpc21pc3MoX3RpdGxlRm9ybS5jb250cm9scy50aXRsZS52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9pb24tY29udGVudD5cblxuICAgIDxpb24tZm9vdGVyPlxuICAgICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgbm93cmFwPlxuICAgICAgICAgIDxpb24tY29sPjwvaW9uLWNvbD5cblxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwidGl0bGVQb3BvdmVyLmRpc21pc3MobnVsbCwgJ0NBTkNFTCcpXCI+XG4gICAgICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fQ0FOQ0VMPC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBbZmlsbF09XCJkaXNhYmxlZCA/ICdjbGVhcicgOiAnc29saWQnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKF90aXRsZUZvcm0uY29udHJvbHMudGl0bGUudmFsdWUpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKF90aXRsZUZvcm0uY29udHJvbHMudGl0bGUudmFsdWUpXCJcbiAgICAgICAgICAgICAgY29sb3I9XCJ0ZXJ0aWFyeVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fVkFMSURBVEVfV0lUSF9TSE9SVENVVF9IRUxQJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdDT01NT04uQlROX1ZBTElEQVRFX1dJVEhfU0hPUlRDVVRfSEVMUCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX1ZBTElEQVRFPC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICA8L2lvbi10b29sYmFyPlxuICAgIDwvaW9uLWZvb3Rlcj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvaW9uLXBvcG92ZXI+XG4iXX0=
|
|
513
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9pbWFnZS9nYWxsZXJ5L2ltYWdlLWdhbGxlcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGVBQWUsRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXhFLE9BQU8sRUFBQyxXQUFXLEVBQWMsTUFBTSw0Q0FBNEMsQ0FBQztBQUlwRixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBbUIsWUFBWSxFQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDbkYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHcEMsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFDLHlCQUF5QixFQUFFLGdCQUFnQixFQUFlLE1BQU0sY0FB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QkFBbUI7c0JBQTNCLEtBQUs7Z0JBR2tDLGVBQWU7c0JBQXRELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRTdCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFa0MsWUFBWTtzQkFBbkQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFRSxVQUFVO3NCQUFqRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUU3QixhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRWtDLG1CQUFtQjtzQkFBMUQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFNRSxZQUFZO3NCQUFuRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUV6QixVQUFVO3NCQUF0QixLQUFLO2dCQWlDa0IsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNLLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFFZixrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxTQUFTO3NCQUFsQixNQUFNO2dCQUtHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtUYWJsZURhdGFTb3VyY2UsIFRhYmxlRWxlbWVudH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7RU5WSVJPTk1FTlQsIEVudmlyb25tZW50fSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHtJbWFnZVNlcnZpY2V9IGZyb20gJy4uL2ltYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHtJbWFnZSwgSW1hZ2VTaXplfSBmcm9tICcuLi9pbWFnZS5tb2RlbCc7XG5pbXBvcnQge0FsZXJ0Q29udHJvbGxlciwgSW9uTW9kYWwsIElvblBvcG92ZXIsIFBsYXRmb3JtfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge2lzTW9iaWxlfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHtmYWRlSW5BbmltYXRpb24sIGZhZGVJbk91dEFuaW1hdGlvbn0gZnJvbSAnLi4vLi4vbWF0ZXJpYWwvbWF0ZXJpYWwuYW5pbWF0aW9ucyc7XG5pbXBvcnQge2lzRW1wdHlBcnJheSwgaXNOaWxPckJsYW5rLCB0b0Jvb2xlYW59IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0NvbGxlY3Rpb25WaWV3ZXIsIGlzRGF0YVNvdXJjZSwgTGlzdFJhbmdlfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHt0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7QWxlcnRzfSBmcm9tICcuLi8uLi9hbGVydHMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7QXBwQ29sb3JzfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7Y3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlciwgZW1pdFByb21pc2VFdmVudCwgUHJvbWlzZUV2ZW50fSBmcm9tICcuLi8uLi9ldmVudHMnO1xuaW1wb3J0IHtQcmVkZWZpbmVkQ29sb3JzfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQge0ltYWdlT3B0aW9uc30gZnJvbSAnQGNhcGFjaXRvci9jYW1lcmEnO1xuXG5pbXBvcnQge0FQUF9TSE9XX1RPT0xUSVB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge0dhbGxlcnlNb2RlLCBJbWFnZUVkaXRFdmVudCwgSW1hZ2VFZGl0Rm9ybWF0LCBJbWFnZUdhbGxlcnlTbGlkZUNoYW5nZUV2ZW50fSBmcm9tICcuL2ltYWdlLWdhbGxlcnkubW9kZWwnO1xuXG5leHBvcnQgdHlwZSBJbWFnZUdhbGxlcnlTbGlkZXNob3dNb2RlID0gJ21vZGFsJyB8ICdpbmxpbmUnO1xuXG5jb25zdCBJbWFnZUdhbGxlcnlNb2RlQ29sU2l6ZSA9IE9iamVjdC5mcmVlemUoe1xuICBtb3NhaWM6IDQsXG4gIGxpc3Q6IDEyLFxufSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VHYWxsZXJ5U2l6ZXMge1xuICBtb3NhaWM6IEltYWdlU2l6ZSB8IHN0cmluZztcbiAgbGlzdDogSW1hZ2VTaXplIHwgc3RyaW5nO1xuICBtb2RhbDogSW1hZ2VTaXplIHwgc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtaW1hZ2UtZ2FsbGVyeScsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW1hZ2UtZ2FsbGVyeS5jb21wb25lbnQuc2NzcyddLFxuICBhbmltYXRpb25zOiBbZmFkZUluQW5pbWF0aW9uLCBmYWRlSW5PdXRBbmltYXRpb25dLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwSW1hZ2VHYWxsZXJ5Q29tcG9uZW50PFQgZXh0ZW5kcyBJbWFnZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29sbGVjdGlvblZpZXdlciwgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XG4gIHByb3RlY3RlZCBfZGVzdHJveVN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcm90ZWN0ZWQgX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJvdGVjdGVkIF9kYXRhU291cmNlOiBUYWJsZURhdGFTb3VyY2U8VD47XG4gIHByb3RlY3RlZCBfZGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRhYmxlRWxlbWVudDxUPltdIHwgUmVhZG9ubHlBcnJheTxUYWJsZUVsZW1lbnQ8VD4+PihudWxsKTtcblxuICBwcm90ZWN0ZWQgX2NvbFNpemU6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9zZWxlY3RlZFJvd0luZGV4OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfcHJlc2VudGluZ0VsZW1lbnQ6IEVsZW1lbnQgPSBudWxsO1xuICBwcm90ZWN0ZWQgX3RpdGxlRm9ybTogRm9ybUdyb3VwO1xuICBwcm90ZWN0ZWQgX3RpdGxlQXV0b2ZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfc2xpZGVzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHJvdGVjdGVkIHpvb21BY3RpdmUgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHpvb21TY2FsZSA9IDE7XG4gIC8qKiBXaGV0aGVyIHRoZSBpbmxpbmUgc2xpZGVzaG93IG92ZXJsYXkgaXMgY3VycmVudGx5IHNob3duIChvbmx5IHJlbGV2YW50IHdoZW4gem9vbVByZXNlbnRhdGlvbiA9PT0gJ2lubGluZScpLiAqL1xuICBwcm90ZWN0ZWQgX3NsaWRlc2hvd1Zpc2libGUgPSBmYWxzZTtcblxuICB2aWV3Q2hhbmdlOiBCZWhhdmlvclN1YmplY3Q8TGlzdFJhbmdlPjtcblxuICBASW5wdXQoKSBjYXJkQ29sb3I6IHN0cmluZyB8IFByZWRlZmluZWRDb2xvcnM7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkZWJ1ZzogYm9vbGVhbiA9IG51bGw7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVhZE9ubHkgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG1vYmlsZTogYm9vbGVhbiA9IG51bGw7XG4gIEBJbnB1dCgpIG1vZGU6IEdhbGxlcnlNb2RlID0gbnVsbDtcbiAgQElucHV0KCkgY29uZmlybUJlZm9yZURlbGV0ZSA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93VG9vbGJhciA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93RmFiQnV0dG9uOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd1RpdGxlID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dBZGRUb29sYmFyQnV0dG9uOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0FkZFRleHRCdXR0b24gPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dBZGRDYXJkQnV0dG9uID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dDYXJkVG9vbGJhciA9IHRydWU7XG4gIEBJbnB1dCgpIGFkZEJ1dHRvbkNvbG9yOiBBcHBDb2xvcnMgPSAndGVydGlhcnknO1xuICBASW5wdXQoKSBhZGRCdXR0b25UZXh0OiBzdHJpbmcgPSAnQ09NTU9OLkJUTl9BREQnO1xuICBASW5wdXQoKSBjYXJkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBUYWJsZUVsZW1lbnQ8VD47IGltYWdlOiBUOyBtb2RlOiBHYWxsZXJ5TW9kZSB9PjtcbiAgQElucHV0KCkgaW1hZ2VTaXplczogSW1hZ2VHYWxsZXJ5U2l6ZXMgPSB7XG4gICAgbW9zYWljOiA8SW1hZ2VTaXplPidzbWFsbCcsXG4gICAgbGlzdDogPEltYWdlU2l6ZT4nbWVkaXVtJyxcbiAgICBtb2RhbDogPEltYWdlU2l6ZT4nbGFyZ2UnLFxuICB9O1xuICBASW5wdXQoKSBpbWFnZVNpemVRdWVyeVBhcmFtID0gJ3NpemUnO1xuXG4gIC8qKiBFbmFibGUgbW91c2Utd2hlZWwgem9vbSBhbmQgbW91c2UtZHJhZyBwYW4gaW4gdGhlIHNsaWRlc2hvdyAoZGVmYXVsdHMgdG8gdHJ1ZSBvbiBkZXNrdG9wKS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZU1vdXNlWm9vbTogYm9vbGVhbiA9IG51bGw7XG4gIC8qKiBab29tIHN0ZXAgYXBwbGllZCBvbiBlYWNoIG1vdXNlLXdoZWVsIHRpY2sgKGRlZmF1bHQgMC4zKS4gKi9cbiAgQElucHV0KCkgd2hlZWxab29tU3RlcCA9IDAuMztcbiAgLyoqIE1heGltdW0gem9vbSByYXRpbyByZWFjaGFibGUgdmlhIG1vdXNlIHdoZWVsIChkZWZhdWx0IDMpLiAqL1xuICBASW5wdXQoKSBtYXhab29tUmF0aW8gPSAzO1xuICAvKiogRW5hYmxlIDkwwrAgcm90YXRpb24gYnV0dG9ucyBpbiB0aGUgc2xpZGVzaG93IChkZWZhdWx0cyB0byB0cnVlKS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZVJvdGF0ZTogYm9vbGVhbiA9IG51bGw7XG4gIC8qKiBFbmFibGUgdGhlIGNyb3AgdG9vbCBpbiB0aGUgc2xpZGVzaG93IChkZWZhdWx0cyB0byB0cnVlKS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZUNyb3A6IGJvb2xlYW4gPSBudWxsO1xuICAvKiogSW1hZ2UgZm9ybWF0IHVzZWQgd2hlbiBlbWl0dGluZyB0aGUgZWRpdGVkIChjcm9wcGVkL3JvdGF0ZWQpIGltYWdlLiAqL1xuICBASW5wdXQoKSBlZGl0aW9uRm9ybWF0OiBJbWFnZUVkaXRGb3JtYXQgPSAncG5nJztcbiAgLyoqIEV4cG9ydCBxdWFsaXR5LCBhcHBsaWVkIG9ubHkgd2hlbiBlZGl0aW9uRm9ybWF0IGlzICdqcGVnJyAoMCB0byAxKS4gKi9cbiAgQElucHV0KCkgZWRpdGlvblF1YWxpdHkgPSAwLjkyO1xuICAvKiogV2hlcmUgdG8gc2hvdyB0aGUgc2xpZGVzaG93OiBpbiBhIGZ1bGwtc2NyZWVuIG1vZGFsIChkZWZhdWx0KSwgb3IgaW5saW5lLCBhcyBhbiBvdmVybGF5IG92ZXIgdGhlIGdhbGxlcnkgaXRzZWxmIChkZXNrdG9wIG9ubHkpLiAqL1xuICBASW5wdXQoKSBzbGlkZXNob3dNb2RlOiBJbWFnZUdhbGxlcnlTbGlkZXNob3dNb2RlID0gJ2lubGluZSc7XG4gIC8qKiBIZWlnaHQgb2YgdGhlIGlubGluZSBzbGlkZXNob3cgb3ZlcmxheSAoQ1NTIHZhbHVlLCBlLmcuICc2MHZoJykuIE9ubHkgdXNlZCB3aGVuIHpvb21QcmVzZW50YXRpb24gaXMgJ2lubGluZScuICovXG4gIEBJbnB1dCgpIGlubGluZVpvb21IZWlnaHQgPSAnMTAwJSc7XG4gIC8qKiBXaGV0aGVyIHJlYWNoaW5nIHRoZSBsYXN0IChyZXNwLiBmaXJzdCkgaW1hZ2Ugc2hvdWxkIHdyYXAgYXJvdW5kIHRvIHRoZSBmaXJzdCAocmVzcC4gbGFzdCkgb25lLiBEZWZhdWx0IHRydWUuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBlbmFibGVTbGlkZXNob3dMb29wID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgbW9yZSByb3dzIG1heSBleGlzdCBiZXlvbmQgdGhlIG9uZXMgY3VycmVudGx5IGxvYWRlZCAoZS5nLiBhIGZ1cnRoZXIgcGFnZSwgbm90IHlldCBmZXRjaGVkKS5cbiAgICogV2hlbiB0cnVlLCByZWFjaGluZyB0aGUgbGFzdCBpbWFnZSBhc2tzIHRoZSBwYXJlbnQgKHZpYSBgZmV0Y2hNb3JlYCkgaW5zdGVhZCBvZiBsb29waW5nL3N0b3BwaW5nLlxuICAgKiBUaGUgZ2FsbGVyeSBoYXMgbm8gb3BpbmlvbiBvbiBob3cgZmV0Y2hpbmcgaXMgYWN0dWFsbHkgZG9uZTogaXQncyBlbnRpcmVseSB1cCB0byB0aGUgcGFyZW50LlxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNhbkZldGNoTW9yZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNldCBkYXRhU291cmNlKGRhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxULCBhbnksIGFueSwgYW55Pikge1xuICAgIGlmICh0aGlzLl9kYXRhU291cmNlICE9PSBkYXRhU291cmNlKSB7XG4gICAgICB0aGlzLl9zd2l0Y2hEYXRhU291cmNlKGRhdGFTb3VyY2UpO1xuICAgIH1cbiAgfVxuICBnZXQgZGF0YVNvdXJjZSgpOiBUYWJsZURhdGFTb3VyY2U8VCwgYW55LCBhbnksIGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuICB9XG4gIGdldCBlbmFibGVkKCkge1xuICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZDtcbiAgfVxuXG4gIGdldCByb3dzKCk6IFRhYmxlRWxlbWVudDxUPltdIHwgUmVhZG9ubHlBcnJheTxUYWJsZUVsZW1lbnQ8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YSQudmFsdWU7XG4gIH1cblxuICBnZXQgcm93Q291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucm93cz8ubGVuZ3RoIHx8IDA7XG4gIH1cblxuICBnZXQgaXNTbGlkZXNob3dWaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl9zbGlkZXNob3dWaXNpYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGlubGluZSBzbGlkZXNob3cgb3ZlcmxheSBpcyBjdXJyZW50bHkgc2hvd24gb3ZlciB0aGUgZ2FsbGVyeSBncmlkLiBPbmx5IG1lYW5pbmdmdWwgZm9yXG4gICAqIGBzbGlkZXNob3dNb2RlID09PSAnaW5saW5lJ2A6IGluICdtb2RhbCcgbW9kZSwgdGhlIGdyaWQgYmVoaW5kIHRoZSAoZnVsbHkgb3BhcXVlKSBtb2RhbCBtdXN0IHN0YXlcbiAgICogdW50b3VjaGVkLCBvdGhlcndpc2UgdG9nZ2xpbmcgaXQgaW4vb3V0IG9mIHZpZXcgY2F1c2VzIGEgbGF5b3V0IGp1bXAgd2hlbiB0aGUgbW9kYWwgaXMgZGlzbWlzc2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBpc0lubGluZVNsaWRlc2hvd09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2xpZGVzaG93TW9kZSA9PT0gJ2lubGluZScgJiYgdGhpcy5fc2xpZGVzaG93VmlzaWJsZTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3pvb21Nb2RhbCcpIHpvb21Nb2RhbDogSW9uTW9kYWw7XG4gIEBWaWV3Q2hpbGQoJ3RpdGxlUG9wb3ZlcicpIHRpdGxlUG9wb3ZlcjogSW9uUG9wb3ZlcjtcblxuICBAT3V0cHV0KCkgb25CZWZvcmVEZWxldGVSb3dzID0gY3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlcjxib29sZWFuLCB7IHJvd3M6IFRhYmxlRWxlbWVudDxUPltdIH0+KCk7XG4gIEBPdXRwdXQoKSBvbkFmdGVyQWRkUm93cyA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVFbGVtZW50PFQ+W10+KCk7XG4gIEBPdXRwdXQoKSBvbkFmdGVyRWRpdFJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVFbGVtZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25BZnRlckVkaXRJbWFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW1hZ2VFZGl0RXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBjbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVFbGVtZW50PFQ+PigpO1xuICAvKiogRW1pdHRlZCBmcm9tIHRoZSBzbGlkZXNob3cgd2hlbmV2ZXIgdGhlIGFjdGl2ZSBzbGlkZSBtb3ZlcyBiYWNrd2FyZCAocHJldmlvdXMgaW1hZ2UpLiAqL1xuICBAT3V0cHV0KCkgcHJldmlvdXNTbGlkZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW1hZ2VHYWxsZXJ5U2xpZGVDaGFuZ2VFdmVudDxUPj4oKTtcbiAgLyoqIEVtaXR0ZWQgZnJvbSB0aGUgc2xpZGVzaG93IHdoZW5ldmVyIHRoZSBhY3RpdmUgc2xpZGUgbW92ZXMgZm9yd2FyZCAobmV4dCBpbWFnZSkuICovXG4gIEBPdXRwdXQoKSBuZXh0U2xpZGUgPSBuZXcgRXZlbnRFbWl0dGVyPEltYWdlR2FsbGVyeVNsaWRlQ2hhbmdlRXZlbnQ8VD4+KCk7XG4gIC8qKlxuICAgKiBGb3J3YXJkZWQgYXMtaXMgZnJvbSB0aGUgc2xpZGVzaG93IHdoZW4gcmVhY2hpbmcgdGhlIGxhc3QgaW1hZ2Ugd2hpbGUgYGNhbkZldGNoTW9yZWAgaXMgdHJ1ZTogdGhlXG4gICAqIHBhcmVudCBtdXN0IGZldGNoIHRoZSBuZXh0IHBhZ2UgKGhvd2V2ZXIgaXQgZG9lcyBzbykgYW5kIHJlc29sdmUgd2l0aCB3aGV0aGVyIG5ldyByb3dzIHdlcmUgYWRkZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgZmV0Y2hNb3JlID0gY3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlcjxib29sZWFuLCB2b2lkPigpO1xuXG4gIHNob3dUb29sdGlwID0gaW5qZWN0KEFQUF9TSE9XX1RPT0xUSVAsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGltYWdlU2VydmljZTogSW1hZ2VTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJvdGVjdGVkIGFsdGVyQ3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBlbnZpcm9ubWVudD86IEVudmlyb25tZW50XG4gICkge1xuICAgIHRoaXMudmlld0NoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoeyBzdGFydDogMCwgZW5kOiBOdW1iZXIuTUFYX1ZBTFVFIH0pO1xuXG4gICAgLy8gREVWIGxvZ1xuICAgIHRoaXMuZGVidWcgPSBlbnZpcm9ubWVudCAmJiAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubW9iaWxlID0gdG9Cb29sZWFuKHRoaXMubW9iaWxlLCBpc01vYmlsZSh3aW5kb3cpKTtcbiAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPz8gKHRoaXMubW9iaWxlID8gJ2xpc3QnIDogJ21vc2FpYycpO1xuICAgIHRoaXMuX2NvbFNpemUgPSBJbWFnZUdhbGxlcnlNb2RlQ29sU2l6ZVt0aGlzLm1vZGVdO1xuICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSB0b0Jvb2xlYW4odGhpcy5zaG93VG9vbGJhciwgIXRoaXMubW9iaWxlKTtcbiAgICB0aGlzLnNob3dDYXJkVG9vbGJhciA9IHRvQm9vbGVhbih0aGlzLnNob3dDYXJkVG9vbGJhciwgIXRoaXMubW9iaWxlKTtcbiAgICB0aGlzLnNob3dBZGRDYXJkQnV0dG9uID0gdG9Cb29sZWFuKHRoaXMuc2hvd0FkZENhcmRCdXR0b24sIHRoaXMubW9iaWxlKTtcbiAgICB0aGlzLnNob3dGYWJCdXR0b24gPSB0b0Jvb2xlYW4odGhpcy5zaG93RmFiQnV0dG9uLCB0aGlzLm1vYmlsZSAmJiAhdGhpcy5zaG93QWRkQ2FyZEJ1dHRvbik7XG4gICAgdGhpcy5zaG93QWRkVG9vbGJhckJ1dHRvbiA9IHRoaXMuc2hvd0FkZFRvb2xiYXJCdXR0b24gPz8gKHRoaXMuc2hvd1Rvb2xiYXIgJiYgIXRoaXMucmVhZE9ubHkpO1xuICAgIHRoaXMuZW5hYmxlTW91c2Vab29tID0gdG9Cb29sZWFuKHRoaXMuZW5hYmxlTW91c2Vab29tLCAhdGhpcy5tb2JpbGUpO1xuICAgIHRoaXMuZW5hYmxlUm90YXRlID0gdG9Cb29sZWFuKHRoaXMuZW5hYmxlUm90YXRlLCB0cnVlKTtcbiAgICB0aGlzLmVuYWJsZUNyb3AgPSB0b0Jvb2xlYW4odGhpcy5lbmFibGVDcm9wLCB0cnVlKTtcbiAgICAvLyBUaGUgaW5saW5lIHByZXNlbnRhdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgb24gZGVza3RvcDogdGhlcmUgaXMgbm8gXCJyZXN0IG9mIHRoZSBwYWdlXCIgd29ydGhcbiAgICAvLyBwcmVzZXJ2aW5nIG9uIGEgc21hbGwgbW9iaWxlIHNjcmVlbiwgYW5kIHRoZSBmdWxsc2NyZWVuIG1vZGFsIGFscmVhZHkgd29ya3Mgd2VsbCB0aGVyZS5cbiAgICBpZiAodGhpcy5tb2JpbGUpIHRoaXMuc2xpZGVzaG93TW9kZSA9ICdtb2RhbCc7XG5cbiAgICAvLyBHZXQgbW9kYWwgcHJlc2VudGluZyBlbGVtZW50IChpT1Mgb25seSlcbiAgICB0aGlzLl9wcmVzZW50aW5nRWxlbWVudCA9IHRoaXMubW9iaWxlID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlvbi1wYWdlJykgOiBudWxsO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgIGlmICh0aGlzLmRhdGFTb3VyY2UgJiYgIXRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fb2JzZXJ2ZVJlbmRlckNoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95U3ViamVjdC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveVN1YmplY3QuY29tcGxldGUoKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3NsaWRlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblxuICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5kYXRhU291cmNlKSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRpc2Nvbm5lY3QodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkKFxuICAgIGV2ZW50PzogRXZlbnQsXG4gICAgb3B0cz86IHsgbWF4SGVpZ2h0PzogbnVtYmVyOyBtYXdXaWR0aD86IG51bWJlcjsgcXVhbGl0eT86IG51bWJlcjsgbXVsdGlwbGU/OiBib29sZWFuOyBhdXRvSGlkZURyb3BBcmVhPzogYm9vbGVhbiB9ICYgT21pdDxcbiAgICAgIEltYWdlT3B0aW9ucyxcbiAgICAgICdyZXN1bHRUeXBlJ1xuICAgID5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW1hZ2VzID0gYXdhaXQgdGhpcy5pbWFnZVNlcnZpY2UuYWRkKGV2ZW50LCBvcHRzKTtcblxuICAgIGlmIChpc0VtcHR5QXJyYXkoaW1hZ2VzKSkgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBbaW1hZ2UtZ2FsbGVyeV0gQWRkaW5nIG5ldyAke2ltYWdlcy5sZW5ndGh9IGltYWdlKHMpYCwgaW1hZ2VzKTtcblxuICAgIGNvbnN0IHJvd3M6IFRhYmxlRWxlbWVudDxUPltdID0gW107XG4gICAgZm9yIChjb25zdCBpbWFnZSBvZiBpbWFnZXMpIHtcbiAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuY3JlYXRlTmV3KCk7XG4gICAgICByb3cuY3VycmVudERhdGEgPSBpbWFnZSBhcyB1bmtub3duIGFzIFQ7XG4gICAgICByb3dzLnB1c2gocm93KTtcbiAgICAgIGNvbnN0IGFkZGVkID0gYXdhaXQgcm93LmNvbmZpcm1FZGl0Q3JlYXRlKCk7XG4gICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2ltYWdlLWdhbGxlcnldIENhbm5vdCBjb25maXJtIG5ldyBpbWFnZSEnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vbkFmdGVyQWRkUm93cy5lbWl0KHJvd3MpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGV2ZW50OiBFdmVudCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7IGludGVyYWN0aXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkIHx8IHRoaXMucmVhZE9ubHkpIHJldHVybiBmYWxzZTtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBDaGVjayB1c2luZyBlbWl0dGVyXG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5jYW5EZWxldGVSb3dzKFtyb3ddKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgbGV0IGRlbGV0ZWQ6IGJvb2xlYW47XG4gICAgaWYgKHJvdy5pZCA9PT0gLTEpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW2ltYWdlLWdhbGxlcnldIFJlbW92aW5nIG5ldyBpbWFnZScpO1xuICAgICAgZGVsZXRlZCA9IGF3YWl0IHJvdy5jYW5jZWxPckRlbGV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1tpbWFnZS1nYWxsZXJ5XSBSZW1vdmluZyBpbWFnZSAoYXQgIycgKyByb3cuaWQgKyAnKScpO1xuICAgICAgZGVsZXRlZCA9IGF3YWl0IHJvdy5kZWxldGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIHRvZ2dsZVZpZXdNb2RlKF8/OiBFdmVudCkge1xuICAgIHRoaXMuc2V0Vmlld01vZGUodGhpcy5tb2RlID09PSAnbGlzdCcgPyAnbW9zYWljJyA6ICdsaXN0Jyk7XG4gIH1cblxuICBzZXRWaWV3TW9kZShtb2RlOiBHYWxsZXJ5TW9kZSkge1xuICAgIGlmICh0aGlzLm1vZGUgIT09IG1vZGUpIHtcbiAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICB0aGlzLl9jb2xTaXplID0gSW1hZ2VHYWxsZXJ5TW9kZUNvbFNpemVbdGhpcy5tb2RlXTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIHJvdzogVGFibGVFbGVtZW50PFQ+KSB7XG4gICAgcmV0dXJuIHJvdy5pZDtcbiAgfVxuXG4gIGFzeW5jIGVkaXRUaXRsZShldmVudDogTW91c2VFdmVudCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4sIGNhcmRUb29sYmFyOiBhbnkpIHtcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQ/LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5mb2N1c0NhcmRUb29sYmFyKGNhcmRUb29sYmFyKTtcblxuICAgIGNvbnN0IHRpdGxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChyb3cuY3VycmVudERhdGEudGl0bGUsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KV0pKTtcbiAgICB0aGlzLl90aXRsZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHsgdGl0bGU6IHRpdGxlQ29udHJvbCB9KTtcbiAgICB0aGlzLl90aXRsZUF1dG9mb2N1cyA9IHRoaXMubW9iaWxlICYmIHRoaXMuZW5hYmxlZCAmJiAhdGhpcy5yZWFkT25seTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGF3YWl0IHRoaXMudGl0bGVQb3BvdmVyLnByZXNlbnQoKTtcblxuICAgIGNvbnN0IHsgZGF0YSwgcm9sZSB9ID0gYXdhaXQgdGhpcy50aXRsZVBvcG92ZXIub25EaWREaXNtaXNzKCk7XG5cbiAgICBpZiAoIXJvbGUgfHwgcm9sZSAhPT0gJ0NBTkNFTCcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tpbWFnZS1nYWxsZXJ5XSBVc2VyIHNldCB0aXRsZTogJyArIGRhdGEpO1xuICAgICAgcm93LmN1cnJlbnREYXRhLnRpdGxlID0gZGF0YTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB0aGlzLm9uQWZ0ZXJFZGl0Um93LmVtaXQocm93KTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIHRoZSB0b29sYmFyLCBiZWNhdXNlIHRoZSBmb2N1cyBoYXZlIGJlZW4gZ2l2ZW4gdG8gdGhlIGV2ZW50J3Mgb3JpZ2luICh0aGUgZWRpdCBidXR0b24pXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhpZGVDYXJkVG9vbGJhcihjYXJkVG9vbGJhciksIDc1MCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9jdXNDYXJkVG9vbGJhcihjYXJkVG9vbGJhcjogYW55KSB7XG4gICAgY29uc3QgZWwgPSBjYXJkVG9vbGJhclsnZWwnXSBhcyBIVE1MRWxlbWVudDtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdmb2N1c2VkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGlkZUNhcmRUb29sYmFyKGNhcmRUb29sYmFyOiBhbnkpIHtcbiAgICBjb25zdCBlbCA9IGNhcmRUb29sYmFyWydlbCddIGFzIEhUTUxFbGVtZW50O1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzZWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc3dpdGNoRGF0YVNvdXJjZShkYXRhU291cmNlOiBUYWJsZURhdGFTb3VyY2U8VD4pIHtcbiAgICBpZiAoaXNEYXRhU291cmNlKHRoaXMuX2RhdGFTb3VyY2UpKSB7XG4gICAgICB0aGlzLl9kYXRhU291cmNlLmRpc2Nvbm5lY3QodGhpcyk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vYnNlcnZlUmVuZGVyQ2hhbmdlcygpIHtcbiAgICAvLyBJZiBubyBkYXRhIHNvdXJjZSBoYXMgYmVlbiBzZXQsIHRoZXJlIGlzIG5vdGhpbmcgdG8gb2JzZXJ2ZSBmb3IgY2hhbmdlcy5cbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZGF0YVN0cmVhbTogT2JzZXJ2YWJsZTxUYWJsZUVsZW1lbnQ8VD5bXSB8IFJlYWRvbmx5QXJyYXk8VGFibGVFbGVtZW50PFQ+Pj47XG4gICAgaWYgKGlzRGF0YVNvdXJjZSh0aGlzLmRhdGFTb3VyY2UpKSB7XG4gICAgICBkYXRhU3RyZWFtID0gdGhpcy5kYXRhU291cmNlLmNvbm5lY3QodGhpcyk7XG4gICAgfVxuICAgIGlmIChkYXRhU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IHRoaXMuZ2V0VGFibGVVbmtub3duRGF0YVNvdXJjZUVycm9yKCk7XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb24gPSBkYXRhU3RyZWFtLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3lTdWJqZWN0KSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbaW1hZ2UtZ2FsbGVyeV0gUmVjZWl2ZWQgbmV3IHJvd3MnLCBkYXRhKTtcbiAgICAgIHRoaXMuX2RhdGEkLm5leHQoZGF0YSk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRhYmxlVW5rbm93bkRhdGFTb3VyY2VFcnJvcigpIHtcbiAgICByZXR1cm4gRXJyb3IoYFByb3ZpZGVkIGRhdGEgc291cmNlIGRpZCBub3QgbWF0Y2ggYW4gYXJyYXksIE9ic2VydmFibGUsIG9yIERhdGFTb3VyY2VgKTtcbiAgfVxuXG4gIGNsaWNrUm93KGV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4pOiBib29sZWFuIHtcbiAgICAvLyBEZWxlZ2F0ZSBjbGljayBhY3Rpb25cbiAgICBpZiAodGhpcy5jbGljay5vYnNlcnZlZCkge1xuICAgICAgdGhpcy5jbGljay5lbWl0KHJvdyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0LCBvcGVuIHRoZSBzbGlkZXNob3dcbiAgICB0aGlzLm9wZW5TbGlkZXNob3coZXZlbnQsIHJvdyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIHNsaWRlc2hvdyAoaW5saW5lIG92ZXJsYXksIG9yIGZ1bGwtc2NyZWVuIG1vZGFsLCBkZXBlbmRpbmcgb24gYHpvb21QcmVzZW50YXRpb25gKSBvbiB0aGUgcm93IGF0IHRoZSBnaXZlbiBpbmRleC5cbiAgICogQ2FuIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgdGhlIGNvbXBvbmVudCAoZS5nLiB0byBvcGVuIHRoZSBnYWxsZXJ5IGRpcmVjdGx5IG9uIGEgZ2l2ZW4gaW1hZ2UpLlxuICAgKi9cbiAgYXN5bmMgb3BlblNsaWRlc2hvdyhldmVudDogRXZlbnQgfCB1bmRlZmluZWQsIHJvdzogVGFibGVFbGVtZW50PFQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnJvd3M/LmZpbmRJbmRleCgocikgPT4gciA9PT0gcm93KTtcbiAgICBpZiAoaW5kZXggPT0gbnVsbCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5yb3dDb3VudCkge1xuICAgICAgY29uc29sZS53YXJuKGBbaW1hZ2UtZ2FsbGVyeV0gQ2Fubm90IG9wZW4gc2xpZGVzaG93OiBpbnZhbGlkIGluZGV4ICgke2luZGV4fSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zZWxlY3RlZFJvd0luZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5fc2xpZGVzaG93VmlzaWJsZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2xpZGVzaG93TW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuem9vbU1vZGFsLnByZXNlbnQoKTtcbiAgICAgIGF3YWl0IHRoaXMuem9vbU1vZGFsLm9uRGlkRGlzbWlzcygpO1xuICAgICAgdGhpcy5fc2xpZGVzaG93VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbG9zZVNsaWRlc2hvdyhyb2xlPzogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc2xpZGVzaG93TW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHRoaXMuX3NsaWRlc2hvd1Zpc2libGUgPSBmYWxzZTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuem9vbU1vZGFsLmRpc21pc3MobnVsbCwgcm9sZSA/PyAnY2FuY2VsJyk7XG4gICAgICB0aGlzLl9zbGlkZXNob3dWaXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBkZWxldGUgcmVxdWVzdCBjb21pbmcgZnJvbSB0aGUgc2xpZGVzaG93IGNvbXBvbmVudCAoZWl0aGVyIGlubGluZSBvciBpbiB0aGUgbW9kYWwpOlxuICAgKiBydW5zIHRoZSBzYW1lIGNvbmZpcm1hdGlvbi9kZWxldGlvbiBmbG93IGFzIGEgY2FyZCdzIGRlbGV0ZSBidXR0b24sIHRoZW4gcmVzb2x2ZXMgdGhlIHByb21pc2VcbiAgICogc28gdGhlIHNsaWRlc2hvdyBrbm93cyB3aGV0aGVyIHRvIHJlc2V0IGl0cyB6b29tIG9yIGNsb3NlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU2xpZGVzaG93RGVsZXRlUmVxdWVzdGVkKHByb21pc2VFdmVudDogUHJvbWlzZUV2ZW50PGJvb2xlYW4sIHsgcm93OiBUYWJsZUVsZW1lbnQ8VD4gfT4pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVsZXRlZCA9IGF3YWl0IHRoaXMuZGVsZXRlKHByb21pc2VFdmVudCwgcHJvbWlzZUV2ZW50LmRldGFpbC5yb3cpO1xuICAgICAgcHJvbWlzZUV2ZW50LmRldGFpbC5zdWNjZXNzKGRlbGV0ZWQpO1xuICAgICAgaWYgKGRlbGV0ZWQgJiYgdGhpcy5yb3dzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnNsaWRlc2hvd01vZGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgIHRoaXMuY2xvc2VTbGlkZXNob3coKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHByb21pc2VFdmVudC5kZXRhaWwuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2FuRGVsZXRlUm93cyhyb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBDaGVjayB1c2luZyBlbWl0dGVyXG4gICAgaWYgKHRoaXMub25CZWZvcmVEZWxldGVSb3dzLm9ic2VydmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjYW5EZWxldGUgPSBhd2FpdCBlbWl0UHJvbWlzZUV2ZW50KHRoaXMub25CZWZvcmVEZWxldGVSb3dzLCAnY2FuRGVsZXRlJywge1xuICAgICAgICAgIGRldGFpbDogeyByb3dzIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNhbkRlbGV0ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgPT09ICdDQU5DRUxMRUQnKSByZXR1cm4gZmFsc2U7IC8vIFVzZXIgY2FuY2VsXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGNoZWNraW5nIGlmIGNhbiBkZWxldGUgcm93cycsIGVycik7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maXJtQmVmb3JlRGVsZXRlKSB7XG4gICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBBbGVydHMuYXNrRGVsZXRlQ29uZmlybWF0aW9uKHRoaXMuYWx0ZXJDdHJsLCB0aGlzLnRyYW5zbGF0ZSwgZXZlbnQpO1xuICAgICAgaWYgKCFjb25maXJtZWQpIHJldHVybiBmYWxzZTsgLy8gQ2FuY2VsbGVkXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SW1hZ2VTaXplUXVlcnlQYXJhbXMobW9kZT86IEdhbGxlcnlNb2RlIHwgJ21vZGFsJyk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIG1vZGUgPSBtb2RlID8/IHRoaXMubW9kZTtcbiAgICBpZiAoIXRoaXMuaW1hZ2VTaXplUXVlcnlQYXJhbSB8fCBpc05pbE9yQmxhbmsodGhpcy5pbWFnZVNpemVzPy5bbW9kZV0pKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBbdGhpcy5pbWFnZVNpemVRdWVyeVBhcmFtXTogdGhpcy5pbWFnZVNpemVzW21vZGVdLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIkBpZiAoc2hvd1Rvb2xiYXIgJiYgIWlzSW5saW5lU2xpZGVzaG93T3Blbikge1xuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJsaWdodFwiIGNsYXNzPVwiZ2FsbGVyeS10b29sYmFyXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaW9uLWJ1dHRvbnNbc2xvdD1zdGFydF1cIj48L25nLWNvbnRlbnQ+XG5cbiAgICA8IS0tIEFkZCAtLT5cbiAgICBAaWYgKCFyZWFkT25seSAmJiBzaG93QWRkVG9vbGJhckJ1dHRvbiAmJiBlbmFibGVkKSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdDT01NT04uQlROX0FERCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9BREQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgKGNsaWNrKT1cImFkZCgpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpb24tYnV0dG9uc1tzbG90PWVuZF1cIj48L25nLWNvbnRlbnQ+XG5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgPCEtLSBUb2dnbGUgdmlldyBtb2RlIC0tPlxuICAgICAgPGlvbi1zZWdtZW50IChpb25DaGFuZ2UpPVwidG9nZ2xlVmlld01vZGUoJGV2ZW50KVwiIGNvbG9yPVwiYWNjZW50XCIgW3ZhbHVlXT1cIl9jb2xTaXplXCI+XG4gICAgICAgIDxpb24tc2VnbWVudC1idXR0b24gW3ZhbHVlXT1cIjRcIj5cbiAgICAgICAgICA8bWF0LWljb24+dmlld19tb2R1bGU8L21hdC1pY29uPlxuICAgICAgICA8L2lvbi1zZWdtZW50LWJ1dHRvbj5cbiAgICAgICAgPGlvbi1zZWdtZW50LWJ1dHRvbiBbdmFsdWVdPVwiMTJcIj5cbiAgICAgICAgICA8bWF0LWljb24+dmlld19saXN0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9pb24tc2VnbWVudC1idXR0b24+XG4gICAgICA8L2lvbi1zZWdtZW50PlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gIDwvaW9uLXRvb2xiYXI+XG59XG5cbjxkaXZcbiAgY2xhc3M9XCJnYWxsZXJ5LWNvbnRhaW5lciBpb24tcGFkZGluZy1ib3R0b20ge3sgbW9kZSB9fVwiXG4gIFtjbGFzcy5pbmxpbmUtem9vbS1hY3RpdmVdPVwiaXNJbmxpbmVTbGlkZXNob3dPcGVuXCJcbiAgW3N0eWxlLi0taW5saW5lLXpvb20taGVpZ2h0XT1cImlubGluZVpvb21IZWlnaHRcIlxuPlxuICBAaWYgKG1vYmlsZSAmJiB6b29tQWN0aXZlKSB7XG4gICAgPGRpdiBjbGFzcz1cImJhY2tkcm9wXCIgW3N0eWxlLm9wYWNpdHldPVwiem9vbVNjYWxlXCI+PC9kaXY+XG4gIH1cblxuICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cImlzSW5saW5lU2xpZGVzaG93T3BlblwiPlxuICAgIDxpb24tcm93PlxuICAgICAgPGlvbi1jb2wgKnJ4Rm9yPVwibGV0IHJvdyBvZiBfZGF0YSQ7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFtzaXplXT1cIl9jb2xTaXplXCI+XG4gICAgICAgIEBsZXQgaW1hZ2UgPSByb3cgfCBwcm9wZXJ0eUdldDogJ2N1cnJlbnREYXRhJztcbiAgICAgICAgQGlmIChjYXJkVGVtcGxhdGUpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNhcmRUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHJvdywgbW9kZTogbW9kZSwgaW1hZ2U6IGltYWdlIH1cIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGlvbi1jYXJkXG4gICAgICAgICAgICAjY2FyZFxuICAgICAgICAgICAgY2xhc3M9XCJpbWFnZS1jYXJkXCJcbiAgICAgICAgICAgIFtjbGFzcy56b29tLWhvdmVyXT1cIiFtb2JpbGVcIlxuICAgICAgICAgICAgW2NvbG9yXT1cImNhcmRDb2xvclwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tSb3coJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgIHRhcHBhYmxlXG4gICAgICAgICAgICBAZmFkZUluQW5pbWF0aW9uXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGZpZ3VyZSBjbGFzcz1cImNhcmQtdGh1bWJuYWlsXCI+XG4gICAgICAgICAgICAgIEBpZiAoaW1hZ2UudXJsKSB7XG4gICAgICAgICAgICAgICAgPGlvbi1pbWcgW3NyY109XCJpbWFnZS51cmwgfCBhcHBlbmRRdWVyeVBhcmFtczogZ2V0SW1hZ2VTaXplUXVlcnlQYXJhbXMoKVwiIC8+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxpb24taW1nIFtzcmNdPVwiaW1hZ2UuZGF0YVVybFwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZmlndXJlPlxuXG4gICAgICAgICAgICA8IS0tIHRvb2xiYXIgZm9yIHRpdGxlICh3aGVuIG5vdCBob3ZlcikgLS0+XG4gICAgICAgICAgICBAaWYgKHNob3dUaXRsZSAmJiBpbWFnZS50aXRsZSkge1xuICAgICAgICAgICAgICA8aW9uLXRvb2xiYXIgY29sb3I9XCJ0cmFuc3BhcmVudFwiIGNsYXNzPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7IGltYWdlLnRpdGxlIH19PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDwhLS0gYWN0aW9uIHRvb2xiYXIgc2hvd24gd2hlbiBob3ZlciBpbWFnZSAtLT5cbiAgICAgICAgICAgIEBpZiAoIXJlYWRPbmx5ICYmICFtb2JpbGUgJiYgc2hvd0NhcmRUb29sYmFyKSB7XG4gICAgICAgICAgICAgIDxpb24tdG9vbGJhciAjY2FyZFRvb2xiYXIgY29sb3I9XCJsaWdodFwiIGNsYXNzPVwiYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgIDwhLS0gZWRpdCB0aXRsZSBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgQGlmIChzaG93VGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBzbG90PVwic3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdFRpdGxlKCRldmVudCwgcm93LCBjYXJkVG9vbGJhcilcIlxuICAgICAgICAgICAgICAgICAgICAoZm9jdXNpbik9XCJmb2N1c0NhcmRUb29sYmFyKGNhcmRUb29sYmFyKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvdy5jdXJyZW50RGF0YS50aXRsZSB8IGlzTm90TmlsT3JCbGFuaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPklNQUdFLkdBTExFUlkuQlROX0VESVRfVElUTEU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+SU1BR0UuR0FMTEVSWS5CVE5fQUREX1RJVExFPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1zcGFjZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gZGVsZXRlIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgIHNsb3Q9XCJlbmRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpb24tZmxvYXQtZW5kXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9ERUxFVEUnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKCRldmVudCwgcm93KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgfVxuICAgICAgPC9pb24tY29sPlxuXG4gICAgICA8IS0tIGFkZCBidXR0b24gLS0+XG4gICAgICBAaWYgKChzaG93QWRkVGV4dEJ1dHRvbiB8fCBzaG93QWRkQ2FyZEJ1dHRvbikgJiYgIXJlYWRPbmx5KSB7XG4gICAgICAgIDxpb24tY29sIFtzaXplXT1cIl9jb2xTaXplXCIgQGZhZGVJbkFuaW1hdGlvbj5cbiAgICAgICAgICBAaWYgKHNob3dBZGRUZXh0QnV0dG9uKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiYWRkKCRldmVudClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbY29sb3JdPVwiYWRkQnV0dG9uQ29sb3JcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBhZGRCdXR0b25UZXh0IHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiZW5kXCIgbmFtZT1cImNhbWVyYVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfSBAZWxzZSBpZiAoc2hvd0FkZENhcmRCdXR0b24pIHtcbiAgICAgICAgICAgIDxpb24tY2FyZFxuICAgICAgICAgICAgICBjbGFzcz1cImltYWdlLWNhcmQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoYWRkQnV0dG9uVGV4dCB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKGFkZEJ1dHRvblRleHQgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICB0YXBwYWJsZVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2FtZXJhXCIgW2NvbG9yXT1cImFkZEJ1dHRvbkNvbG9yXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiYWRkXCIgW2NvbG9yXT1cImFkZEJ1dHRvbkNvbG9yXCIgY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICB9XG4gICAgPC9pb24tcm93PlxuICA8L2lvbi1ncmlkPlxuXG4gIDwhLS0gSW5saW5lIHNsaWRlc2hvdzogc2hvd24gYXMgYW4gb3ZlcmxheSBkaXJlY3RseSB3aXRoaW4gdGhlIGdhbGxlcnksIGluc3RlYWQgb2YgYSBmdWxsLXNjcmVlbiBtb2RhbC5cbiAgICAgICBUaGUgcmVzdCBvZiB0aGUgcGFnZSAob3V0c2lkZSB0aGUgZ2FsbGVyeSkgc3RheXMgZnVsbHkgdmlzaWJsZSBhbmQgdXNhYmxlLCB1bmxpa2UgdGhlIG1vZGFsJ3MgYmFja2Ryb3AuIC0tPlxuICBAaWYgKGlzSW5saW5lU2xpZGVzaG93T3Blbikge1xuICAgIDxhcHAtaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3dcbiAgICAgIGNsYXNzPVwiaW5saW5lLW92ZXJsYXlcIlxuICAgICAgW3Jvd3NdPVwicm93c1wiXG4gICAgICBbc2VsZWN0ZWRJbmRleF09XCJfc2VsZWN0ZWRSb3dJbmRleFwiXG4gICAgICBbbW9iaWxlXT1cIm1vYmlsZVwiXG4gICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHlcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtkZWJ1Z109XCJkZWJ1Z1wiXG4gICAgICBbZW5hYmxlTW91c2Vab29tXT1cImVuYWJsZU1vdXNlWm9vbVwiXG4gICAgICBbd2hlZWxab29tU3RlcF09XCJ3aGVlbFpvb21TdGVwXCJcbiAgICAgIFttYXhab29tUmF0aW9dPVwibWF4Wm9vbVJhdGlvXCJcbiAgICAgIFtlbmFibGVSb3RhdGVdPVwiZW5hYmxlUm90YXRlXCJcbiAgICAgIFtlbmFibGVDcm9wXT1cImVuYWJsZUNyb3BcIlxuICAgICAgW2VuYWJsZUxvb3BdPVwiZW5hYmxlU2xpZGVzaG93TG9vcFwiXG4gICAgICBbZWRpdGlvbkZvcm1hdF09XCJlZGl0aW9uRm9ybWF0XCJcbiAgICAgIFtlZGl0aW9uUXVhbGl0eV09XCJlZGl0aW9uUXVhbGl0eVwiXG4gICAgICBbaW1hZ2VTaXplUXVlcnlQYXJhbV09XCJpbWFnZVNpemVRdWVyeVBhcmFtXCJcbiAgICAgIFttb2RhbEltYWdlU2l6ZV09XCJpbWFnZVNpemVzPy5tb2RhbFwiXG4gICAgICBbY2FuRmV0Y2hNb3JlXT1cImNhbkZldGNoTW9yZVwiXG4gICAgICAoZGVsZXRlUmVxdWVzdGVkKT1cIm9uU2xpZGVzaG93RGVsZXRlUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgKGNsb3NlUmVxdWVzdGVkKT1cImNsb3NlU2xpZGVzaG93KClcIlxuICAgICAgKGFmdGVyRWRpdEltYWdlKT1cIm9uQWZ0ZXJFZGl0SW1hZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChhZnRlckVkaXRSb3cpPVwib25BZnRlckVkaXRSb3cuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChwcmV2aW91c1NsaWRlKT1cInByZXZpb3VzU2xpZGUuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChuZXh0U2xpZGUpPVwibmV4dFNsaWRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAoZmV0Y2hNb3JlKT1cImZldGNoTW9yZS5lbWl0KCRldmVudClcIlxuICAgID48L2FwcC1pbWFnZS1nYWxsZXJ5LXNsaWRlc2hvdz5cbiAgfVxuPC9kaXY+XG5cbjwhLS0gRkFCIGJ1dHRvbjogYWRkIC0tPlxuQGlmIChzaG93RmFiQnV0dG9uICYmICFyZWFkT25seSkge1xuICA8aW9uLWZhYiBzbG90PVwiZml4ZWRcIiB2ZXJ0aWNhbD1cImJvdHRvbVwiIGhvcml6b250YWw9XCJlbmRcIiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJkaXNhYmxlZFwiIEBmYWRlSW5PdXRBbmltYXRpb24+XG4gICAgPGlvbi1mYWItYnV0dG9uIGNvbG9yPVwidGVydGlhcnlcIiAoY2xpY2spPVwiYWRkKCRldmVudClcIj5cbiAgICAgIDxpb24taWNvbiBuYW1lPVwiY2FtZXJhXCI+PC9pb24taWNvbj5cbiAgICAgIDxpb24taWNvbiBuYW1lPVwiYWRkXCIgY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiIHN0eWxlPVwibGVmdDogMzNweDsgdG9wOiA5cHg7IGZvbnQtc2l6ZTogMjBweFwiPjwvaW9uLWljb24+XG4gICAgPC9pb24tZmFiLWJ1dHRvbj5cbiAgPC9pb24tZmFiPlxufVxuXG48IS0tIFpvb20gbW9kYWwgLS0+XG5AaWYgKHNsaWRlc2hvd01vZGUgPT09ICdtb2RhbCcpIHtcbiAgPGlvbi1tb2RhbCAjem9vbU1vZGFsIGNsYXNzPVwic3RhY2stbW9kYWwgem9vbS1tb2RhbFwiIFtjbGFzcy5tb2RhbC1mdWxsc2NyZWVuXT1cIm1vYmlsZVwiIFtjbGFzcy5tb2RhbC1sYXJnZV09XCIhbW9iaWxlXCI+XG4gICAgPG5nLXRlbXBsYXRlPlxuICAgICAgPGFwcC1pbWFnZS1nYWxsZXJ5LXNsaWRlc2hvd1xuICAgICAgICBbcm93c109XCJyb3dzXCJcbiAgICAgICAgW3NlbGVjdGVkSW5kZXhdPVwiX3NlbGVjdGVkUm93SW5kZXhcIlxuICAgICAgICBbbW9iaWxlXT1cIm1vYmlsZVwiXG4gICAgICAgIFtyZWFkT25seV09XCJyZWFkT25seVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtkZWJ1Z109XCJkZWJ1Z1wiXG4gICAgICAgIFtlbmFibGVNb3VzZVpvb21dPVwiZW5hYmxlTW91c2Vab29tXCJcbiAgICAgICAgW3doZWVsWm9vbVN0ZXBdPVwid2hlZWxab29tU3RlcFwiXG4gICAgICAgIFttYXhab29tUmF0aW9dPVwibWF4Wm9vbVJhdGlvXCJcbiAgICAgICAgW2VuYWJsZVJvdGF0ZV09XCJlbmFibGVSb3RhdGVcIlxuICAgICAgICBbZW5hYmxlQ3JvcF09XCJlbmFibGVDcm9wXCJcbiAgICAgICAgW2VkaXRpb25Gb3JtYXRdPVwiZWRpdGlvbkZvcm1hdFwiXG4gICAgICAgIFtlZGl0aW9uUXVhbGl0eV09XCJlZGl0aW9uUXVhbGl0eVwiXG4gICAgICAgIFtpbWFnZVNpemVRdWVyeVBhcmFtXT1cImltYWdlU2l6ZVF1ZXJ5UGFyYW1cIlxuICAgICAgICBbbW9kYWxJbWFnZVNpemVdPVwiaW1hZ2VTaXplcz8ubW9kYWxcIlxuICAgICAgICBbbG9vcF09XCJlbmFibGVTbGlkZXNob3dMb29wXCJcbiAgICAgICAgW2NhbkZldGNoTW9yZV09XCJjYW5GZXRjaE1vcmVcIlxuICAgICAgICAoZGVsZXRlUmVxdWVzdGVkKT1cIm9uU2xpZGVzaG93RGVsZXRlUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAoY2xvc2VSZXF1ZXN0ZWQpPVwiem9vbU1vZGFsLmRpc21pc3MoKVwiXG4gICAgICAgIChhZnRlckVkaXRJbWFnZSk9XCJvbkFmdGVyRWRpdEltYWdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChhZnRlckVkaXRSb3cpPVwib25BZnRlckVkaXRSb3cuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHByZXZpb3VzU2xpZGUpPVwicHJldmlvdXNTbGlkZS5lbWl0KCRldmVudClcIlxuICAgICAgICAobmV4dFNsaWRlKT1cIm5leHRTbGlkZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoZmV0Y2hNb3JlKT1cImZldGNoTW9yZS5lbWl0KCRldmVudClcIlxuICAgICAgPjwvYXBwLWltYWdlLWdhbGxlcnktc2xpZGVzaG93PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvaW9uLW1vZGFsPlxufVxuXG48aW9uLXBvcG92ZXIgI3RpdGxlUG9wb3Zlcj5cbiAgPG5nLXRlbXBsYXRlPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCIgY2RrVHJhcEZvY3VzIFtjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZV09XCJ0cnVlXCI+XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIl90aXRsZUZvcm1cIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJhdXRvXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbCB0cmFuc2xhdGU+SU1BR0UuR0FMTEVSWS5USVRMRTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cIl90aXRsZUF1dG9mb2N1c1wiXG4gICAgICAgICAgICAoa2V5ZG93bi5jb250cm9sLmVudGVyKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKF90aXRsZUZvcm0uY29udHJvbHMudGl0bGUudmFsdWUpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9mb3JtPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG5cbiAgICA8aW9uLWZvb3Rlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIG5vd3JhcD5cbiAgICAgICAgICA8aW9uLWNvbD48L2lvbi1jb2w+XG5cbiAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKG51bGwsICdDQU5DRUwnKVwiPlxuICAgICAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0NBTkNFTDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgW2ZpbGxdPVwiZGlzYWJsZWQgPyAnY2xlYXInIDogJ3NvbGlkJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0aXRsZVBvcG92ZXIuZGlzbWlzcyhfdGl0bGVGb3JtLmNvbnRyb2xzLnRpdGxlLnZhbHVlKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJ0aXRsZVBvcG92ZXIuZGlzbWlzcyhfdGl0bGVGb3JtLmNvbnRyb2xzLnRpdGxlLnZhbHVlKVwiXG4gICAgICAgICAgICAgIGNvbG9yPVwidGVydGlhcnlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdDT01NT04uQlROX1ZBTElEQVRFX1dJVEhfU0hPUlRDVVRfSEVMUCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9WQUxJREFURV9XSVRIX1NIT1JUQ1VUX0hFTFAnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9WQUxJREFURTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1mb290ZXI+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lvbi1wb3BvdmVyPlxuIl19
|