@esfaenza/es-table 11.2.134 → 11.2.136

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.
@@ -343,6 +343,8 @@ export class EsTableComponent {
343
343
  this.callTimeout = null;
344
344
  /** Cache dei th piuttosto che ricalcolarseli di continuo */
345
345
  this.thsCache = {};
346
+ /** Indica quando la cache dei th è stata fillata almeno la prima volta */
347
+ this.thsCacheSet = false;
346
348
  /**
347
349
  * Flag che, se **true**, per un giro di binding mantiene la visibilità impostata localmente, piuttosto che allineare alla View bindata.
348
350
  * Usata per modificare in maniera programmatica la visibilità delle colonne dal metodo **setHeaderVisibility**,
@@ -555,7 +557,7 @@ export class EsTableComponent {
555
557
  // vuol dire che l'es-table è cambiata quindi non imposto preference
556
558
  if (((_b = this.EsThsDirective) === null || _b === void 0 ? void 0 : _b.length) > 0) {
557
559
  for (let i = 0; i < repository.length; i++) {
558
- if (!this.thsCache[repository[i]]) {
560
+ if (this.thsCacheSet && !this.thsCache[repository[i]]) {
559
561
  updatedPrefs = false;
560
562
  break;
561
563
  }
@@ -759,6 +761,7 @@ export class EsTableComponent {
759
761
  let th = ths[i];
760
762
  this.thsCache[th.th] = th;
761
763
  }
764
+ this.thsCacheSet = true;
762
765
  // Prepassaggio per tirare fuori tutte le info utili sugli headers in modo da non ricacolarseli sempre dopo
763
766
  let hI = this.columnMetadata_H.evaluateHeadersGroupingInfos(ths);
764
767
  if (this.arrayMode) // In modalità array non ho un backend...
@@ -1641,7 +1644,7 @@ EsTableComponent.decorators = [
1641
1644
  viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }],
1642
1645
  changeDetection: ChangeDetectionStrategy.OnPush,
1643
1646
  encapsulation: ViewEncapsulation.None,
1644
- template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}}&nbsp;<input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\" [style.height]=\"Height\" [style.background-color]=\"EmptySpaceBackgroundColor\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity\">\r\n <thead [hidden]=\"HeaderHidden || FirstBind\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll && !SingleSelection) || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && !(View?.selection || arraymodeSelection)?.all && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\r\n </th>\r\n </tr>\r\n\r\n <!-- Blocco header group -->\r\n <ng-container *ngIf=\"RowThGroups\">\r\n <tr *ngFor=\"let level of RowThGroups; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\" \r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n \r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection && !HasPinnedColumns\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n\r\n <!-- Header che valgono per view mode e array mode -->\r\n <ng-container *ngIf=\"arrayMode || viewMode\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations; trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n \r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition; trackBy: PropertyNameTrackBy\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells && RowTHs?.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\" \r\n [style.width.px]=\"rowHeader.PinnedWidth\" \r\n es-th=\"{{rowHeader.ID}}\" \r\n class=\"{{rowHeader.Class || ''}}\" \r\n [class.est-pinned-internal-header]=\"true\" \r\n [class.est-no-border]=\"true\" \r\n [class.est-nowrap]=\"!rowHeader.Wrap\" \r\n [Pinned]=\"true\" \r\n [Fixed]=\"rowHeader.Fixed\" \r\n [Order]=\"rowHeader.Order\" \r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\" \r\n [OrderBy]=\"OrderByColumn\" \r\n [SearchInProgress]=\"!!researchInProgress\" \r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\" \r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n \r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\" \r\n es-th=\"{{rowHeader.ID}}\" \r\n class=\"{{rowHeader.Class || ''}}\" \r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\" \r\n [class.est-rtab-border]=\"rowHeader.RightBorder\" \r\n [class.est-nowrap]=\"!rowHeader.Wrap\" \r\n [Order]=\"rowHeader.Order\" \r\n [Resizable]=\"ColumnsResizable\" \r\n [Orderable]=\"rowHeader.Orderable\" \r\n [OrderBy]=\"OrderByColumn\" \r\n [SearchInProgress]=\"!!researchInProgress\" \r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal\" [class.est-right-9]=\"Export || HiddenColumns\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export || HiddenColumns || ColumnsOrdering || CornerMenuOptions\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n \r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns || ColumnsOrdering\" (click)=\"columnMetadata_H.resetColumnVisSelection(); changeColumnVisibilityModal.show();\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions; trackBy: idTrackBy\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" [class.est-no-selection]=\"RangeSelection\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode ? false : SelectionDisabled, sel: Selection }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle == 'both' || PagingStyle == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode && UseArrayModePaging && !SearchView\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <app-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></app-paging>\r\n <app-paging *ngIf=\"PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [GroupMode]=\"PagerOptions.Searches == 'groups'\" [AllSearch]=\"AllSearch\" [View]=\"PagerOptions.View\" (pagingSelected)=\"onItemsPerPageChanged($event);\"></app-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array; trackBy: valTrackBy\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \u00E8 templatizzato -->\r\n<ng-template #TBodySelection let-templateOptions>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even; let i=index; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || (!Hierarchy && !ArrayGrouping)\" \r\n [class]=\"item._rowClass ? item._rowClass : ''\" \r\n [class.est-line-through]=\"item.removed || item.deleted\" \r\n [class.est-pointer]=\"!item.locked\" \r\n [class.est-white-selected]=\"item._selected && !item.locked\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\r\n (click)=\"!RangeSelection && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\" \r\n [disabled]=\"templateOptions.selDisabled\" \r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\" \r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || !Hierarchy\" \r\n [class]=\"item._rowClass ? item._rowClass : ''\" \r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns.VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><app-paging [CountLabel]=\"CountLabel\" [AllSearch]=\"AllSearch\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n </div>\r\n\r\n <div class=\"est-rg-sep-flex-left\" *ngIf=\"RowGroupingPagingStyle == 'left'\">\r\n <div class=\"est-rg-ipp\"><app-paging [AllSearch]=\"AllSearch\" [CountLabel]=\"CountLabel\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item>\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"rowItem.Pinned\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { $implicit: { item: item, rowItem : rowItem, i:i, Pinned: true } };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell.Pinned; let pinned = false\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: {$implicit: item, index: index, cell: cell, pinned: pinned };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell.IconClass && cell.Visible\">\r\n <ng-container *ngIf=\"!cell.ConditionField || ((item.properties || item)[cell.ConditionField] == cell.ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations.length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell.Title}}\" class=\"{{cell.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell.ID)\">{{cell.Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell.ConditionField && ((item.properties || item)[cell.ConditionField] != cell.ConditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra le propriet\u00E0 di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell.IconClass && cell.Visible\" \r\n es-td=\"{{cell.Property || cell.ID}}\"\r\n id=\"estd_{{cell.Property || cell.ID}}_{{item._ordinal}}_{{index}}\" \r\n class=\"{{ cell.Class }} est-default-row-height\" \r\n [Context]=\"item._hash\" \r\n [class.est-no-selection]=\"Editable && cell.PropertyName\" \r\n [class.est-rg-hdr]=\"cell.GroupHeader\" \r\n [class.est-rg-agg]=\"cell.GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy || !cell.Wraps\"\r\n \r\n [style.text-align]=\" (!pinned && cell.Alignment) ? cell.Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell.PropAccessor) ? item.forecolors[cell.PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell.PropAccessor) ? item.backcolors[cell.PropAccessor] : null\"\r\n\r\n [style.width.px]=\"pinned ? cell.PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-ltab-border]=\"cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder\" \r\n [class.est-rtab-border]=\"cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder\" \r\n\r\n [class.est-selected-cell]=\"selectionStatus[item._ordinal][index]?.selected\"\r\n [class.est-cell-lborder]=\"selectionStatus[item._ordinal][index]?.lborder\"\r\n [class.est-cell-rborder]=\"selectionStatus[item._ordinal][index]?.rborder\"\r\n [class.est-cell-tborder]=\"selectionStatus[item._ordinal][index]?.tborder\"\r\n [class.est-cell-bborder]=\"selectionStatus[item._ordinal][index]?.bborder\"\r\n\r\n [class.est-cell-lborder-tmp]=\"!cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder && !selectionStatus[item._ordinal][index]?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder && !selectionStatus[item._ordinal][index]?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selectionStatus[item._ordinal][index]?.tborder && !selectionStatus[item._ordinal][index]?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selectionStatus[item._ordinal][index]?.bborder && !selectionStatus[item._ordinal][index]?.boverlaps\"\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\" \r\n (mouseenter)=\"mouseenter($event)\" \r\n (mouseup)=\"mouseup($event)\"\r\n (onCellGeneration)=\"registerCell($event)\"\r\n \r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\">\r\n\r\n <div [class.est-edit-hidden]=\"cell._editing\" [class.est-pre]=\"!(Hierarchy && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell.Template\">\r\n <ng-container *ngIf=\"!cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: (item[cell.MultiProp] ? item[cell.MultiProp][cell.MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n \r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da \r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro), \r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell.Template && !cell.Multi && !cell.Content\">\r\n <a *ngIf=\"cell.RoutePath\" [routerLink]=\"item | est_routerlink : cell.RoutePath : cell.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName]\"></a>\r\n \r\n <span *ngIf=\"cell.PropAccessor\">\r\n {{(item.values? item.values[cell.PropAccessor] : item[cell.PropAccessor]) | est_format: cell.Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell.PropAccessor && !cell.RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_renderer: { name: cell.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell, value: item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName], type: cell.PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell.Content\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_editor: { name: cell.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal && !RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal && RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export || HiddenColumns || CornerMenuOptions\" class=\"est-sticky-last-column{{options.even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"changeColumnVisibilityModal.hide();\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody \r\n cdkDropList \r\n [cdkDropListData]=\"TMPColumnsList\" \r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\" \r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last; trackBy: idTrackBy\" \r\n class=\"est-pointer est-droplist\" \r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\" \r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased && ColumnsPinnable\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>",
1647
+ template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}}&nbsp;<input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\" [style.height]=\"Height\" [style.background-color]=\"EmptySpaceBackgroundColor\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity\">\r\n <thead [hidden]=\"HeaderHidden || FirstBind\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll && !SingleSelection) || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && !(View?.selection || arraymodeSelection)?.all && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\r\n </th>\r\n </tr>\r\n\r\n <!-- Blocco header group -->\r\n <ng-container *ngIf=\"RowThGroups\">\r\n <tr *ngFor=\"let level of RowThGroups; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\" \r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n \r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection && !HasPinnedColumns\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n\r\n <!-- Header che valgono per view mode e array mode -->\r\n <ng-container *ngIf=\"arrayMode || viewMode\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations; trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n \r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition; trackBy: PropertyNameTrackBy\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells && RowTHs?.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\" \r\n [style.width.px]=\"rowHeader.PinnedWidth\" \r\n es-th=\"{{rowHeader.ID}}\" \r\n class=\"{{rowHeader.Class || ''}}\" \r\n [class.est-pinned-internal-header]=\"true\" \r\n [class.est-no-border]=\"true\" \r\n [class.est-nowrap]=\"!rowHeader.Wrap\" \r\n [Pinned]=\"true\" \r\n [Fixed]=\"rowHeader.Fixed\" \r\n [Order]=\"rowHeader.Order\" \r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\" \r\n [OrderBy]=\"OrderByColumn\" \r\n [SearchInProgress]=\"!!researchInProgress\" \r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\" \r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n \r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\" \r\n es-th=\"{{rowHeader.ID}}\" \r\n class=\"{{rowHeader.Class || ''}}\" \r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\" \r\n [class.est-rtab-border]=\"rowHeader.RightBorder\" \r\n [class.est-nowrap]=\"!rowHeader.Wrap\" \r\n [Order]=\"rowHeader.Order\" \r\n [Resizable]=\"ColumnsResizable\" \r\n [Orderable]=\"rowHeader.Orderable\" \r\n [OrderBy]=\"OrderByColumn\" \r\n [SearchInProgress]=\"!!researchInProgress\" \r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal\" [class.est-right-9]=\"Export || HiddenColumns\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export || HiddenColumns || ColumnsOrdering || CornerMenuOptions\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n \r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns || ColumnsOrdering\" (click)=\"columnMetadata_H.resetColumnVisSelection(); changeColumnVisibilityModal.show();\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions; trackBy: idTrackBy\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" [class.est-no-selection]=\"RangeSelection\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode ? false : SelectionDisabled, sel: Selection }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle == 'both' || PagingStyle == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode && UseArrayModePaging && !SearchView\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <app-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></app-paging>\r\n <app-paging *ngIf=\"PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [GroupMode]=\"PagerOptions.Searches == 'groups'\" [AllSearch]=\"AllSearch\" [View]=\"PagerOptions.View\" (pagingSelected)=\"onItemsPerPageChanged($event);\"></app-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array; trackBy: valTrackBy\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \u00E8 templatizzato -->\r\n<ng-template #TBodySelection let-templateOptions>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even; let i=index; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || (!Hierarchy && !ArrayGrouping)\" \r\n [class]=\"item._rowClass ? item._rowClass : ''\" \r\n [class.est-line-through]=\"item.removed || item.deleted\" \r\n [class.est-pointer]=\"!item.locked\" \r\n [class.est-white-selected]=\"item._selected && !item.locked\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\r\n (click)=\"!RangeSelection && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\" \r\n [disabled]=\"templateOptions.selDisabled\" \r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\" \r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || !Hierarchy\" \r\n [class]=\"item._rowClass ? item._rowClass : ''\" \r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns.VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><app-paging [CountLabel]=\"CountLabel\" [AllSearch]=\"AllSearch\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n </div>\r\n\r\n <div class=\"est-rg-sep-flex-left\" *ngIf=\"RowGroupingPagingStyle == 'left'\">\r\n <div class=\"est-rg-ipp\"><app-paging [AllSearch]=\"AllSearch\" [CountLabel]=\"CountLabel\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item let-index=\"index\">\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"rowItem.Pinned\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { $implicit: { item: item, rowItem : rowItem, i:i, Pinned: true } };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell.Pinned; let pinned = false\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: {$implicit: item, index: index, cell: cell, pinned: pinned };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell.IconClass && cell.Visible\">\r\n <ng-container *ngIf=\"!cell.ConditionField || ((item.properties || item)[cell.ConditionField] == cell.ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations.length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell.Title}}\" class=\"{{cell.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell.ID)\">{{cell.Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell.ConditionField && ((item.properties || item)[cell.ConditionField] != cell.ConditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra le propriet\u00E0 di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell.IconClass && cell.Visible\" \r\n es-td=\"{{cell.Property || cell.ID}}\"\r\n id=\"estd_{{cell.Property || cell.ID}}_{{item._ordinal}}_{{index}}\" \r\n class=\"{{ cell.Class }} est-default-row-height\" \r\n [Context]=\"item._hash\" \r\n [class.est-no-selection]=\"Editable && cell.PropertyName\" \r\n [class.est-rg-hdr]=\"cell.GroupHeader\" \r\n [class.est-rg-agg]=\"cell.GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy || !cell.Wraps\"\r\n \r\n [style.text-align]=\" (!pinned && cell.Alignment) ? cell.Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell.PropAccessor) ? item.forecolors[cell.PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell.PropAccessor) ? item.backcolors[cell.PropAccessor] : null\"\r\n\r\n [style.width.px]=\"pinned ? cell.PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-ltab-border]=\"cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder\" \r\n [class.est-rtab-border]=\"cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder\" \r\n\r\n [class.est-selected-cell]=\"selectionStatus[item._ordinal][index]?.selected\"\r\n [class.est-cell-lborder]=\"selectionStatus[item._ordinal][index]?.lborder\"\r\n [class.est-cell-rborder]=\"selectionStatus[item._ordinal][index]?.rborder\"\r\n [class.est-cell-tborder]=\"selectionStatus[item._ordinal][index]?.tborder\"\r\n [class.est-cell-bborder]=\"selectionStatus[item._ordinal][index]?.bborder\"\r\n\r\n [class.est-cell-lborder-tmp]=\"!cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder && !selectionStatus[item._ordinal][index]?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder && !selectionStatus[item._ordinal][index]?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selectionStatus[item._ordinal][index]?.tborder && !selectionStatus[item._ordinal][index]?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selectionStatus[item._ordinal][index]?.bborder && !selectionStatus[item._ordinal][index]?.boverlaps\"\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\" \r\n (mouseenter)=\"mouseenter($event)\" \r\n (mouseup)=\"mouseup($event)\"\r\n (onCellGeneration)=\"registerCell($event)\"\r\n \r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\">\r\n\r\n <div [class.est-edit-hidden]=\"cell._editing\" [class.est-pre]=\"!(Hierarchy && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell.Template\">\r\n <ng-container *ngIf=\"!cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: (item[cell.MultiProp] ? item[cell.MultiProp][cell.MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n \r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da \r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro), \r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell.Template && !cell.Multi && !cell.Content\">\r\n <a *ngIf=\"cell.RoutePath\" [routerLink]=\"item | est_routerlink : cell.RoutePath : cell.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName]\"></a>\r\n \r\n <span *ngIf=\"cell.PropAccessor\">\r\n {{(item.values? item.values[cell.PropAccessor] : item[cell.PropAccessor]) | est_format: cell.Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell.PropAccessor && !cell.RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_renderer: { name: cell.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell, value: item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName], type: cell.PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell.Content\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_editor: { name: cell.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal && !RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal && RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export || HiddenColumns || CornerMenuOptions\" class=\"est-sticky-last-column{{options.even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"changeColumnVisibilityModal.hide();\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody \r\n cdkDropList \r\n [cdkDropListData]=\"TMPColumnsList\" \r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\" \r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last; trackBy: idTrackBy\" \r\n class=\"est-pointer est-droplist\" \r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\" \r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased && ColumnsPinnable\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>",
1645
1648
  styles: [".est-loading-box{height:200px;text-align:center;position:relative;background:#ccc}.est-loading-content{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:35px}.est-scrollable{max-height:600px;overflow:auto}.est-head-resizer{top:0;right:0;bottom:0;width:7px;position:absolute;cursor:col-resize}.est-head-resizer-internal{top:0;right:0;left:6px;bottom:0;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density td,.est-high-density th{padding:0 .2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{height:1px!important}.est-edit-hidden,.est-hidden-view{visibility:hidden}.est-no-border{border:none!important}.est-nowrap{white-space:nowrap}.est-mt-min-5{margin-top:-5px}.est-white-selected{background-color:#ddd!important}.est-line-through{text-decoration:line-through}.est-no-side-padding{padding-left:0;padding-right:0}.est-no-left-padding,.est-no-right-padding{padding-left:0}.est-col-min{width:1px}.est-margin-bottom-0{margin-bottom:0!important}.est-margin-right-10{margin-right:10px!important}.est-right-9{right:9px!important}.est-table-dotted-menu{padding:0 0 2px!important;color:#999}.est-fs-18{font-size:18px}.est-fs-13,.est-fs-14{font-size:14px}.est-fw-bold{font-weight:700}.est-padding-3{padding:3px!important}.est-page-container{position:relative}.est-bring-to-front-strong{z-index:99999999!important}.est-switch{position:relative;display:inline-block;width:30px;height:17px;margin-bottom:0;margin-right:5px;margin-left:5px}.est-switch input{display:none}.est-slider{cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc}.est-slider,.est-slider:before{position:absolute;transition:.4s}.est-slider:before{content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{transform:translateX(11px)}.est-slider.round{border-radius:10px}.est-slider.round:before{border-radius:50%}.est-custom-input{width:30px;display:inline;padding:1px;height:20px}.est-row-lvl-1 td:first-child{padding-left:5px}.est-row-lvl-2 td:first-child{padding-left:20px}.est-row-lvl-3 td:first-child{padding-left:35px}.est-row-lvl-4 td:first-child{padding-left:50px}.est-row-lvl-5 td:first-child{padding-left:65px}.est-row-lvl-6 td:first-child{padding-left:80px}.est-row-lvl-7 td:first-child{padding-left:95px}.est-row-lvl-8 td:first-child{padding-left:110px}.est-row-lvl-9 td:first-child{padding-left:125px}.est-row-lvl-10 td:first-child{padding-left:140px}.est-row-lvl-11 td:first-child{padding-left:155px}.est-row-lvl-12 td:first-child{padding-left:170px}.est-row-lvl-13 td:first-child{padding-left:185px}.est-row-lvl-14 td:first-child{padding-left:200px}.est-row-lvl-15 td:first-child{padding-left:215px}.est-row-lvl-16 td:first-child{padding-left:230px}.est-row-lvl-17 td:first-child{padding-left:245px}.est-row-lvl-18 td:first-child{padding-left:260px}.est-row-lvl-19 td:first-child{padding-left:275px}.est-row-lvl-20 td:first-child{padding-left:290px}.est-row-lvl-21 td:first-child{padding-left:305px}.est-row-lvl-22 td:first-child{padding-left:320px}.est-row-lvl-23 td:first-child{padding-left:335px}.est-row-lvl-24 td:first-child{padding-left:350px}.est-row-lvl-25 td:first-child{padding-left:365px}.est-row-lvl-26 td:first-child{padding-left:380px}.est-row-lvl-27 td:first-child{padding-left:395px}.est-row-lvl-28 td:first-child{padding-left:410px}.est-row-lvl-29 td:first-child{padding-left:425px}.est-row-lvl-30 td:first-child{padding-left:440px}.est-row-lvl-31 td:first-child{padding-left:455px}.est-row-lvl-32 td:first-child{padding-left:470px}.est-row-lvl-33 td:first-child{padding-left:485px}.est-row-lvl-34 td:first-child{padding-left:500px}.est-row-lvl-35 td:first-child{padding-left:515px}.est-row-lvl-36 td:first-child{padding-left:530px}.est-row-lvl-37 td:first-child{padding-left:545px}.est-row-lvl-38 td:first-child{padding-left:560px}.est-row-lvl-39 td:first-child{padding-left:575px}.est-row-lvl-40 td:first-child{padding-left:590px}.est-row-lvl-41 td:first-child{padding-left:605px}.est-row-lvl-42 td:first-child{padding-left:620px}.est-row-lvl-43 td:first-child{padding-left:635px}.est-row-lvl-44 td:first-child{padding-left:650px}.est-row-lvl-45 td:first-child{padding-left:665px}.est-row-lvl-46 td:first-child{padding-left:680px}.est-row-lvl-47 td:first-child{padding-left:695px}.est-row-lvl-48 td:first-child{padding-left:710px}.est-row-lvl-49 td:first-child{padding-left:725px}.est-row-lvl-50 td:first-child{padding-left:740px}.est-row-lvl-51 td:first-child{padding-left:755px}.est-row-lvl-52 td:first-child{padding-left:770px}.est-row-lvl-53 td:first-child{padding-left:785px}.est-row-lvl-54 td:first-child{padding-left:800px}.est-row-lvl-55 td:first-child{padding-left:815px}.est-row-lvl-56 td:first-child{padding-left:830px}.est-row-lvl-57 td:first-child{padding-left:845px}.est-row-lvl-58 td:first-child{padding-left:860px}.est-row-lvl-59 td:first-child{padding-left:875px}.est-row-lvl-60 td:first-child{padding-left:890px}.est-row-lvl-61 td:first-child{padding-left:905px}.est-row-lvl-62 td:first-child{padding-left:920px}.est-row-lvl-63 td:first-child{padding-left:935px}.est-row-lvl-64 td:first-child{padding-left:950px}.est-row-lvl-65 td:first-child{padding-left:965px}.est-row-lvl-66 td:first-child{padding-left:980px}.est-row-lvl-67 td:first-child{padding-left:995px}.est-row-lvl-68 td:first-child{padding-left:1010px}.est-row-lvl-69 td:first-child{padding-left:1025px}.est-row-lvl-70 td:first-child{padding-left:1040px}.est-row-lvl-71 td:first-child{padding-left:1055px}.est-row-lvl-72 td:first-child{padding-left:1070px}.est-row-lvl-73 td:first-child{padding-left:1085px}.est-row-lvl-74 td:first-child{padding-left:1100px}.est-row-lvl-75 td:first-child{padding-left:1115px}.est-row-lvl-76 td:first-child{padding-left:1130px}.est-row-lvl-77 td:first-child{padding-left:1145px}.est-row-lvl-78 td:first-child{padding-left:1160px}.est-row-lvl-79 td:first-child{padding-left:1175px}.est-row-lvl-80 td:first-child{padding-left:1190px}.est-row-lvl-81 td:first-child{padding-left:1205px}.est-row-lvl-82 td:first-child{padding-left:1220px}.est-row-lvl-83 td:first-child{padding-left:1235px}.est-row-lvl-84 td:first-child{padding-left:1250px}.est-row-lvl-85 td:first-child{padding-left:1265px}.est-row-lvl-86 td:first-child{padding-left:1280px}.est-row-lvl-87 td:first-child{padding-left:1295px}.est-row-lvl-88 td:first-child{padding-left:1310px}.est-row-lvl-89 td:first-child{padding-left:1325px}.est-row-lvl-90 td:first-child{padding-left:1340px}.est-row-lvl-91 td:first-child{padding-left:1355px}.est-row-lvl-92 td:first-child{padding-left:1370px}.est-row-lvl-93 td:first-child{padding-left:1385px}.est-row-lvl-94 td:first-child{padding-left:1400px}.est-row-lvl-95 td:first-child{padding-left:1415px}.est-row-lvl-96 td:first-child{padding-left:1430px}.est-row-lvl-97 td:first-child{padding-left:1445px}.est-row-lvl-98 td:first-child{padding-left:1460px}.est-row-lvl-99 td:first-child{padding-left:1475px}.est-relative{position:relative}.est-top-pager{position:absolute;right:0;top:5px}.est-top-allselect{position:absolute;left:0;top:5px;font-weight:700}.est-padding-10{padding:10px!important}.est-margin-right-50{margin-right:50px}.est-margin-left-50{margin-left:50px}.est-quick-unpin{color:#000;margin-left:8px;font-size:14px;transform:rotate(45deg)}.est-full-height{height:100%}.est-page-sel{color:#000;margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-next,.est-page-prev{color:#000;font-size:inherit;padding:2px 0 0}.est-pinned-header{background-color:#fff;left:0;top:0;position:-webkit-sticky;position:sticky;z-index:1;border-bottom:1px solid #dee2e6!important;padding:0!important}.est-simple-border-bottom{border-bottom:1px solid #dee2e6}.est-pinned-internal-header{border-top:0;border-bottom:0 solid #dee2e6}.est-pinned-border{border-right:2px solid #dee2e6!important}.est-cell-padding{padding:.3rem}.est-pinned-body{background-color:#fff;left:0;position:-webkit-sticky;position:sticky;z-index:1;border-top:1px solid #dee2e6!important;padding:0!important}.est-inline{display:inline!important}.est-inline-block{display:inline-block!important}.est-link{color:#0275d8!important;cursor:pointer;text-decoration:none;display:block}.est-link:hover{color:#23527c!important;cursor:pointer;text-decoration:underline!important}.est-sticky-last-column{right:-1px;position:-webkit-sticky;position:sticky;z-index:0;background-color:#fff}.est-sticky-last-column-alt{right:-1px;position:-webkit-sticky;position:sticky;z-index:0;background-color:#f2f2f2}.est-ltab-border{border-left:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:rgba(33,150,243,.2)}.est-cell-lborder{border-left:1.02px solid #2196f3!important}.est-cell-tborder{border-top:1.02px solid #2196f3!important}.est-cell-rborder{border-right:1.02px solid #2196f3!important}.est-cell-bborder{border-bottom:1.02px solid #2196f3!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!important}.est-margin-bottom-10{margin-bottom:10px}.est-text-center{text-align:center}.est-flex{display:flex}.est-rg-sep-flex-right{display:flex;flex-direction:row-reverse;width:100%;margin:-5px}.est-rg-sep-flex-left{display:flex;flex-direction:row;width:100%;margin:-5px}.est-rg-hdr{font-weight:700}.est-rg-agg{font-style:italic}.est-rg{background-color:hsla(0,0%,46.7%,.4666666666666667)!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:hsla(0,0%,73.3%,.7333333333333333)!important}.est-rg-ipp{text-align:left;display:inline-flex;margin-right:25px}.est-rg-page{text-align:right;display:inline-flex;font-size:inherit;padding-top:5px}.est-droplist.cdk-drag-placeholder{opacity:0}.est-droplist.cdk-drag-preview{z-index:999999999!important;opacity:1;box-sizing:border-box;border-radius:4px;background-color:#fff;box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.est-droplist.cdk-drag-preview td:not(.drag-visible){visibility:hidden}.est-droplist.cdk-drag-preview td.drag-visible{padding-top:3px}.est-droplist.cdk-drag-animating,.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}"]
1646
1649
  },] }
1647
1650
  ];
@@ -1744,4 +1747,4 @@ EsTableComponent.propDecorators = {
1744
1747
  };
1745
1748
  export class EsTdReference {
1746
1749
  }
1747
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL2VzLXRhYmxlL2VzX3RhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsVUFBVTtBQUNWLE9BQU8sRUFDSCxTQUFTLEVBQUUsZUFBZSxFQUFhLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFDeEYsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFNBQVMsRUFBYyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFlLE1BQU0sRUFDOUksTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSzNELGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFTdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUVqRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFJbkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFN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QkFFTCxLQUFLOzZCQUVMLEtBQUs7NkJBRUwsS0FBSzs2QkFFTCxNQUFNOzhCQVdOLE1BQU07aUNBRU4sTUFBTTt3QkFFTixNQUFNOzZCQUVOLE1BQU07NEJBRU4sTUFBTTtnQ0FFTixNQUFNOzZCQUdOLE1BQU07aUNBRU4sTUFBTTsrQkFPTixTQUFTLFNBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzZCQUUvQyxTQUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtvQ0FVdkMsS0FBSzs7QUEwK0NWLE1BQU0sT0FBTyxhQUFhO0NBSXpCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBJbnB1dCxcclxuICAgIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBDb250ZW50Q2hpbGQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBWaWV3RW5jYXBzdWxhdGlvbiwgT3B0aW9uYWwsIFNlbGYsIFRlbXBsYXRlUmVmLCBJbmplY3RcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IFV0aWxpdHlTZXJ2aWNlLCBFeHBvcnRTZXJ2aWNlLCBNZXNzYWdlU2VydmljZSwgRGF0ZVNlcnZpY2UsIENzdkhlYWRlcnMsIENsaXBib2FyZFNlcnZpY2UgfSBmcm9tICdAZXNmYWVuemEvZXh0ZW5zaW9ucyc7XHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tICdAZXNmYWVuemEvbG9jYWxpemF0aW9ucyc7XHJcbmltcG9ydCB7IFByZWZlcmVuY2VzU2VydmljZSB9IGZyb20gJ0Blc2ZhZW56YS9wcmVmZXJlbmNlcyc7XHJcblxyXG4vLyBQbHVnaW5zXHJcbmltcG9ydCB7IENvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnQGVzZmFlbnphL25neC1jb250ZXh0bWVudSc7XHJcblxyXG4vLyBNb2RlbGxpIC8gVGlwaVxyXG5pbXBvcnQgeyBBcHBTZWFyY2ggfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvQXBwU2VhcmNoXCI7XHJcbmltcG9ydCB7IEFwcE9yZGVyaW5nIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0FwcE9yZGVyaW5nXCI7XHJcbmltcG9ydCB7IEVzVGFibGVDb2x1bW5zRGVmaW5pdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0VzVGFibGVDb2x1bW5zRGVmaW5pdGlvblwiO1xyXG5pbXBvcnQgeyBDb3JuZXJNZW51T3B0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvQ29ybmVyTWVudU9wdGlvblwiO1xyXG5pbXBvcnQgeyBFc1RhYmxlT3BlcmF0aW9uRGVmaW5pdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0VzVGFibGVPcGVyYXRpb25EZWZpbml0aW9uXCI7XHJcbmltcG9ydCB7IEVzVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9Fc1RhYmxlQ29sdW1uXCI7XHJcbmltcG9ydCB7IEdyb3VwUGFnZXIgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9Hcm91cFBhZ2VyXCI7XHJcbmltcG9ydCB7IEdyb3VwUm91dGVGcmFnbWVudCB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL0dyb3VwUm91dGVGcmFnbWVudFwiO1xyXG5pbXBvcnQgeyBUaEVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9UaEVsZW1lbnRcIjtcclxuaW1wb3J0IHsgUGFnZXJJbmZvcyB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL1BhZ2VySW5mb3NcIjtcclxuaW1wb3J0IHsgVGhHcm91cCB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL1RoR3JvdXBcIjtcclxuaW1wb3J0IHsgVGRFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvVGRFbGVtZW50XCI7XHJcbmltcG9ydCB7IEl0ZW1zU2VsZWN0aW9uIH0gZnJvbSAnLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvSXRlbXNTZWxlY3Rpb24nO1xyXG5pbXBvcnQgeyBHcm91cE9yQWdncmVnYXRpb24gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvR3JvdXBPckFnZ3JlZ2F0aW9uXCI7XHJcbmltcG9ydCB7IEdyb3VwRmlsdGVyIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0dyb3VwRmlsdGVyXCI7XHJcbmltcG9ydCB7IEdyb3VwIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0dyb3VwXCI7XHJcbmltcG9ydCB7IEVzVGFibGVNb2RlbENoYW5nZSB9IGZyb20gJy4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZU1vZGVsQ2hhbmdlJztcclxuaW1wb3J0IHsgSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZSB9IGZyb20gJy4uLy4uL2RvbWFpbi9leHRlcm5hbHMvSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZSc7XHJcbmltcG9ydCB7IEVzVGFibGVEZWZhdWx0YWJsZSB9IGZyb20gJy4uLy4uL2RvbWFpbi9jb25maWd1cmF0aW9uL0VzVGFibGVEZWZhdWx0YWJsZSc7XHJcblxyXG4vLyBDb21wb25lbnRpIGUgTG9jYWxpenphemlvbmVcclxuaW1wb3J0IHsgRXNUZCB9IGZyb20gJy4uL2VzLXRkL2VzX3RkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVzVGREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2VzX3RkLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEVzVGhEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2VzX3RoLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEVzVGRFZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2VzX3RkX2VkaXRvci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBJRXNUYWJsZVRlbXBsYXRlV3JhcHBlciB9IGZyb20gJy4uL2VzLXRhYmxlLXRlbXBsYXRlL2VzX3RhYmxlX3RlbXBsYXRlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVzVGFibGVMb2MgfSBmcm9tICcuL2VzX3RhYmxlLmNvbXBvbmVudC5sb2MnO1xyXG5cclxuLy8gVG9rZW5zXHJcbmltcG9ydCB7IEVTVF9ERUZBVUxUUywgRVNUX0xPQ0FMRSB9IGZyb20gJy4uLy4uL3Rva2Vucyc7XHJcblxyXG4vLyBIYW5kbGVyc1xyXG5pbXBvcnQgeyBFeHBvcnRIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvRXhwb3J0SGFuZGxlclwiO1xyXG5pbXBvcnQgeyBDb2x1bW5NZXRhZGF0YUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9Db2x1bW5NZXRhZGF0YUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgRHluYW1pY01vZGVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvRHluYW1pY01vZGVIYW5kbGVyXCI7XHJcbmltcG9ydCB7IEhpZXJhcmNoeU1vZGVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvSGllcmFyY2h5TW9kZUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgSXRlbXNIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvSXRlbXNIYW5kbGVyXCI7XHJcbmltcG9ydCB7IFJlcG9ydE1vZGVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvUmVwb3J0TW9kZUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgUm93R3JvdXBpbmdIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvUm93R3JvdXBpbmdIYW5kbGVyXCI7XHJcbmltcG9ydCB7IFNlbGVjdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9TZWxlY3Rpb25IYW5kbGVyXCI7XHJcbmltcG9ydCB7IFV0aWxpdGllc0hhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9VdGlsaXRpZXNIYW5kbGVyXCI7XHJcblxyXG4vLyBTZXJ2aWNlXHJcbmltcG9ydCB7IENvcHlQYXN0ZURldGVjdG9yIH0gZnJvbSAnLi4vLi4vY29yZS9Db3B5UGFzdGVEZXRlY3Rvcic7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uLy4uL2NvcmUvTG9nZ2VyJztcclxuXHJcbi8vIFJ4anNcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vKiogQ29tcG9uZW50ZSBjaGUgcGVybWV0dGUgZGkgcmFwcHJlc2VudGFyZSB1bmEgZ3JpZ2xpYSBkaSB2YWxvcmkgKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VzLXRhYmxlJyxcclxuICAgIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IExvY2FsaXphdGlvblNlcnZpY2UsIHVzZUNsYXNzOiBFc1RhYmxlTG9jIH1dLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZXNfdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9lc190YWJsZS5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEVzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzIHtcclxuXHJcbiAgICAvLyBDb21wb25lbnRpIHBlciBsYSBnZXN0aW9uZSBkZWxsZSB2YXJpZSBmdW56aW9uYWxpdMOgIGRlbGwnZXMtdGFibGVcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBleHBvcnRfSDogRXhwb3J0SGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBjb2x1bW5NZXRhZGF0YV9IOiBDb2x1bW5NZXRhZGF0YUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgZHluYW1pY01vZGVfSDogRHluYW1pY01vZGVIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGhpZXJhcmNoeU1vZGVfSDogSGllcmFyY2h5TW9kZUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgaXRlbXNfSDogSXRlbXNIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIHJlcG9ydE1vZGVfSDogUmVwb3J0TW9kZUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgcm93R3JvdXBpbmdfSDogUm93R3JvdXBpbmdIYW5kbGVyXHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgc2VsZWN0aW9uX0g6IFNlbGVjdGlvbkhhbmRsZXI7XHJcblxyXG4gICAgLy8gU3Vic2NyaWJlcnMgcGVyIGdsaSBldmVudGkgZGkgY29waWEgZSBpbmNvbGxhXHJcbiAgICAvKiogQGlnbm9yZSAqLyBwcml2YXRlIGNvcHlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICAgIC8qKiBAaWdub3JlICovIHByaXZhdGUgcGFzdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBwcmVmU2VydmljZTogUHJlZmVyZW5jZXNTZXJ2aWNlLFxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRVNUX0RFRkFVTFRTKSBwcml2YXRlIGRlYWZ1bHRzOiBFc1RhYmxlRGVmYXVsdGFibGUsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChFU1RfTE9DQUxFKSBwdWJsaWMgbG9jYWxlOiBzdHJpbmcsXHJcbiAgICAgICAgcHVibGljIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgdXRpbGl0aWVzX0g6IFV0aWxpdGllc0hhbmRsZXIsXHJcbiAgICAgICAgcHVibGljIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZXhwRXh0czogRXhwb3J0U2VydmljZSxcclxuICAgICAgICBwdWJsaWMgZGF0ZUV4dHM6IERhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbXNnRXh0czogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjb3B5UGFzdGVEZXRlY3RvcjogQ29weVBhc3RlRGV0ZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBjbGlwYm9hcmRTZXJ2aWNlOiBDbGlwYm9hcmRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXIpIHtcclxuXHJcbiAgICAgICAgLy8gQ29waWEgZSBpbmNvbGxhIHNpIGVmZmV0dHVhbm8gc29sbyBzZSBsYSB0YWJlbGxhIGF0dHVhbGUgw6ggdW5pdm9jYW1lbnRlIHNlbGV6aW9uYXRhXHJcbiAgICAgICAgdGhpcy5jb3B5U3Vic2NyaXB0aW9uID0gdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5PbkNvcHkuc3Vic2NyaWJlKCgpID0+IHsgaWYgKHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuQWN0aXZlRXN0UmVmZXJlbmNlID09IHRoaXMpIHRoaXMuaGFuZGxlQ29weSgpOyB9KTtcclxuICAgICAgICB0aGlzLnBhc3RlU3Vic2NyaXB0aW9uID0gdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5PblBhc3RlLnN1YnNjcmliZSgoKSA9PiB7IGlmICh0aGlzLmNvcHlQYXN0ZURldGVjdG9yLkFjdGl2ZUVzdFJlZmVyZW5jZSA9PSB0aGlzKSB0aGlzLmhhbmRsZVBhc3RlKCk7IH0pO1xyXG5cclxuICAgICAgICB0aGlzLmV4cG9ydF9IID0gbmV3IEV4cG9ydEhhbmRsZXIodGhpcywgdGhpcy5leHBFeHRzLCB0aGlzLm1zZ0V4dHMsIHRoaXMudXRpRXh0cywgdGhpcy5kYXRlRXh0cyk7XHJcbiAgICAgICAgdGhpcy5yb3dHcm91cGluZ19IID0gbmV3IFJvd0dyb3VwaW5nSGFuZGxlcih0aGlzLCB0aGlzLnV0aWxpdGllc19ILCB0aGlzLmRhdGVFeHRzKTtcclxuICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0ggPSBuZXcgQ29sdW1uTWV0YWRhdGFIYW5kbGVyKHRoaXMsIHRoaXMudXRpbGl0aWVzX0gsIHRoaXMudXRpRXh0cywgdGhpcy5wcmVmU2VydmljZSwgdGhpcy5yb3dHcm91cGluZ19IKTtcclxuICAgICAgICB0aGlzLmR5bmFtaWNNb2RlX0ggPSBuZXcgRHluYW1pY01vZGVIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaGllcmFyY2h5TW9kZV9IID0gbmV3IEhpZXJhcmNoeU1vZGVIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaXRlbXNfSCA9IG5ldyBJdGVtc0hhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRNb2RlX0ggPSBuZXcgUmVwb3J0TW9kZUhhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fSCA9IG5ldyBTZWxlY3Rpb25IYW5kbGVyKHRoaXMsIHRoaXMucm93R3JvdXBpbmdfSCk7XHJcblxyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wpXHJcbiAgICAgICAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gQXNzZWduYXppb25lIHBlciB0dXR0aSBnbGkgSW5wdXQgZGkgZGVmYXVsdFxyXG4gICAgICAgIHRoaXMuQ29sdW1uc1Jlc2l6YWJsZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Db2x1bW5zUmVzaXphYmxlLCB0aGlzLmRlYWZ1bHRzPy5Db2x1bW5zUmVzaXphYmxlKTtcclxuICAgICAgICB0aGlzLkF1dG9VcGRhdGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQXV0b1VwZGF0ZSwgdGhpcy5kZWFmdWx0cz8uQXV0b1VwZGF0ZSk7XHJcbiAgICAgICAgdGhpcy5BbGxTZWFyY2ggPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQWxsU2VhcmNoLCB0aGlzLmRlYWZ1bHRzPy5BbGxTZWFyY2gsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuRXhwb3J0ID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkV4cG9ydCwgdGhpcy5kZWFmdWx0cz8uRXhwb3J0KTtcclxuICAgICAgICB0aGlzLkhpZGVQYWdpbmcgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuSGlkZVBhZ2luZywgdGhpcy5kZWFmdWx0cz8uSGlkZVBhZ2luZywgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuSGlkZVBhZ2luZ0NvdW50ID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkhpZGVQYWdpbmdDb3VudCwgdGhpcy5kZWFmdWx0cz8uSGlkZVBhZ2luZ0NvdW50KTtcclxuICAgICAgICB0aGlzLkhpZGVQYWdpbmdCdXR0b25zID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkhpZGVQYWdpbmdCdXR0b25zLCB0aGlzLmRlYWZ1bHRzPy5IaWRlUGFnaW5nQnV0dG9ucyk7XHJcbiAgICAgICAgdGhpcy5Db250YWluZXJDbGFzcyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Db250YWluZXJDbGFzcywgdGhpcy5kZWFmdWx0cz8uQ29udGFpbmVyQ2xhc3MsICcnKTtcclxuICAgICAgICB0aGlzLlRhYmxlQ2xhc3MgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuVGFibGVDbGFzcywgdGhpcy5kZWFmdWx0cz8uVGFibGVDbGFzcywgJ3RhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIgdGFibGUtc20nKTtcclxuICAgICAgICB0aGlzLlNlbGVjdGlvbiA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5TZWxlY3Rpb24sIHRoaXMuZGVhZnVsdHM/LlNlbGVjdGlvbik7XHJcbiAgICAgICAgdGhpcy5TYXZlUHJlZmVyZW5jZXMgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuU2F2ZVByZWZlcmVuY2VzLCB0aGlzLmRlYWZ1bHRzPy5TYXZlUHJlZmVyZW5jZXMpO1xyXG4gICAgICAgIHRoaXMuUGFnaW5nU3R5bGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuUGFnaW5nU3R5bGUsIHRoaXMuZGVhZnVsdHM/LlBhZ2luZ1N0eWxlLCAnYm90dG9tJyk7XHJcbiAgICAgICAgdGhpcy5Sb3dHcm91cGluZ1BhZ2luZ1N0eWxlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlJvd0dyb3VwaW5nUGFnaW5nU3R5bGUsIHRoaXMuZGVhZnVsdHM/LlJvd0dyb3VwaW5nUGFnaW5nU3R5bGUsICdsZWZ0Jyk7XHJcbiAgICAgICAgdGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSwgdGhpcy5kZWFmdWx0cz8uVXNlU2VsZWN0aW9uQ2FjaGUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuU2hvd0l0ZW1Hcm91cHNDb2x1bW5zID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlNob3dJdGVtR3JvdXBzQ29sdW1ucywgdGhpcy5kZWFmdWx0cz8uU2hvd0l0ZW1Hcm91cHNDb2x1bW5zLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5BcnJheW1vZGVJdGVtc1BlclBhZ2UgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQXJyYXltb2RlSXRlbXNQZXJQYWdlLCB0aGlzLmRlYWZ1bHRzPy5BcnJheW1vZGVJdGVtc1BlclBhZ2UsIDE1KTtcclxuICAgICAgICB0aGlzLkNvbHVtbnNQaW5uYWJsZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Db2x1bW5zUGlubmFibGUsIHRoaXMuZGVhZnVsdHM/LkNvbHVtbnNQaW5uYWJsZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5EZWZhdWx0QWxpZ25tZW50ID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkRlZmF1bHRBbGlnbm1lbnQsIHRoaXMuZGVhZnVsdHM/LkRlZmF1bHRBbGlnbm1lbnQsICdMZWZ0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFN1YmplY3QgdXRpbGl6emF0byBpbnRlcm5hbWVudGUgbGF0byBFc1RhYmxlIHBlciBjYXVzYXJlIGlsIEZvY3VzIGxhdG8gY29tcG9uZW50ZSBkaSBJbnB1dCAqL1xyXG4gICAgcHVibGljIEZvY3VzU3ViamVjdDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcclxuICAgIC8qKiBUaW1lciBjaGUgdmVycsOgIGltcG9zdGF0byBhICoqZG91YmxlQ2xpY2tCdWZmZXJNcyoqIHBlciBjYXBpcmUgc2Ugw6ggc3RhdG8gZWZmZXR0dWF0byB1biBjbGljayBzaW5nb2xvIG8gdW4gZG91YmxlY2xpY2sgKi9cclxuICAgIHByaXZhdGUgY2VsbERiQ2xpY2tUaW1lcjogYW55O1xyXG4gICAgLyoqIFNlIHZlbmdvbm8gZWZmZXR0dWF0aSAyIGNsaWNrIGEgZGlzdGFuemEgaW5mZXJpb3JlIGEgcXVlc3RpIE1pbGxpc2Vjb25kaSB2aWVuZSBjb25zaWRlcmF0byB1biBkb3BwaW8gY2xpY2sgKi9cclxuICAgIHByaXZhdGUgZG91YmxlQ2xpY2tCdWZmZXJNczogbnVtYmVyID0gMjAwO1xyXG4gICAgLyoqIFZpZXcgZmluYWxlIHN1IGN1aSBiaW5kYXJzaSBsYXRvIEZyb250ZW5kLCBpbCB0aXBvIHB1w7IgZXNzZXJlIElBcHBTZWFyY2g8YW55PiAocGVyIGxhICoqdmlld01vZGUqKiksIGFueVtdIChwZXIgbCcqKmFycmF5TW9kZSoqKSAqL1xyXG4gICAgcHVibGljIFZpZXc6IGFueSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyBkYSBjdWkgbCdlcy10YWJsZSBtb3N0cmEgaSBwdWxzYW50aSBkaSBwYWdpbmF6aW9uZSBpbiBiYXNzbyBhIGRlc3RyYSAqL1xyXG4gICAgcHVibGljIGFycmF5UHVsc2FudGk6IHsgdmFsOiBudW1iZXIsIGNzc0NsYXNzOiBzdHJpbmcgfVtdO1xyXG4gICAgLyoqIEluZGljYSBzZSBsJ2VzLXRhYmxlIGRldmUgbW9zdHJhcmUgaWwgY2hlY2sgZ2xvYmFsZSBuZWxsJ2hlYWRlciBwZXIgZmFyZSBpbCBcInNlbGV6aW9uYSB0dXR0b1wiICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ2hlY2sgPSBmYWxzZTtcclxuICAgIC8qKiBUaWVuZSBkYSBjb250byBsJ3VsdGltbyBlbGVtZW50byBzZWxlemlvbmF0byBpbiBtb2RvIGRhIHBvdGVyIGVmZmV0dHVhcmUgaWwgU0hJRlQrQ0xJQ0sgKi9cclxuICAgIHByaXZhdGUgbGFzdFNlbGVjdGVkOiBhbnkgPSBudWxsO1xyXG4gICAgLyoqIENvbnRlZ2dpbyBpbnRlcm5vIHBlciBpbCBudW1lcm8gZGkgZWxlbWVudGkgc2VsZXppb25hdGkgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RlZE9iamVjdHMgPSAwO1xyXG4gICAgLyoqIEluZGljYSBzZSDDqCBwb3NzaWJpbGUgZWZmZXR0dWFyZSB1bmEgc2VsZXppb25lIG1hc3NpdmEgKi9cclxuICAgIHB1YmxpYyBjYW5TZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgY29tcG9uZW50ZSBzdGEgZ2VzdGVuZG8gdW4gSUFwcFNlYXJjaDxhbnk+ICovXHJcbiAgICBwdWJsaWMgdmlld01vZGUgPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgY29tcG9uZW50ZSBzdGEgZ2VzdGVuZG8gdW4gYW55W10gKi9cclxuICAgIHB1YmxpYyBhcnJheU1vZGUgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRlbml0b3JlIGRlZ2xpIGVsZW1lbnRpIGRhIGxpc3RhcmUgbGF0byBpbnRlcmZhY2NpYSBkb3BvIHR1dHRlIGxlIGVsYWJvcmF6aW9uaSBkZWwgY2FzbyxcclxuICAgICAqIGdlbmVyYWxtZW50ZSBub24gc29ubyBhbHRybyBjaGUgdHV0dGkgZ2xpIG9nZ2V0dGkgZGEgcHJlc2VudGFyZSBjb24gaW4gcGnDuSBsJ2hhc2ggY2FsY29sYXRvIHBlciBpZGVudGlmaWNhcmUgMSBvZ2dldHRvIGNvbiBsYSBwcm9wcmlhIHJpZ2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJvdW5kU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIFN0ZXNzYSBjb3NhIGRlbGxhICoqYm91bmRTb3VyY2UqKiwgdXRpbGl6emF0YSBjb21lIGFwcG9nZ2lvIHRlbXBvcmFuZW8gaW50ZXJubyAqL1xyXG4gICAgcHVibGljIFRNUEJvdW5kU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIFwiRmV0dGFcIiBkaSBvZ2dldHRpIHV0aWxpenphdGEgbmVsbCdlbmRsZXNzIHNjcm9sbCwgb2duaSBlbGVtZW50byBkaSBxdWVzdG8gYXJyYXkgw6ggdW4gYmxvY2NoZXR0byBkaSAxMDAgZWxlbWVudGkgKi9cclxuICAgIHB1YmxpYyBib3VuZFN1YlNvdXJjZXM6IGFueVtdID0gW107XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgUXVlc3RhIGZ1bmdlIGRhIGluZGljYXRvcmUgcGVyIGdsaSBzbGljZSBpbnNlcml0aSwgbGEgbHVuZ2hlenphIGRvdnJlYmJlIGVzc2VyZSBjb3JyaXNwb25kZW50ZSBhICoqYm91bmRTdWJTb3VyY2VzKiogKi9cclxuICAgIHB1YmxpYyBhZGRlZFNsaWNlczogbnVtYmVyW10gPSBbXTtcclxuICAgIC8qKiBWYXJpYWJpbGUgY2hlIGlkZW50aWZpY2EgaWwgdmFsb3JlIGRlbCBcInNlbGV6aW9uYSBUdXR0b1wiIG5lbGxhIHBhZ2luYXppb25lICovXHJcbiAgICBwdWJsaWMgZGVmYXVsdEFsbFBhZ2VPdmVycmlkZSA9IDk5OTk5OTtcclxuICAgIC8qKiBTZXJ2ZSBwZXIgdGVuZXJlIGluIG1lbW9yaWEgaWwgY29udGVnZ2lvIHByZWNlZGVudGUgZSByZWN1cGVyYXJsbyBpbiBjYXNvIGRpdmVudGkgLTIgKHZlcmlmaWNhcmUgY29uIEFsZSBwZXJjaMOpIGxhIGxvZ2ljYSBkZWwgLTIpICovXHJcbiAgICBwdWJsaWMgcHJldmlvdXNDb3VudDogbnVtYmVyO1xyXG4gICAgLyoqIEluZGljYSBzZSB1dGlsaXp6YXJlIGlsIHNpc3RlbWEgZGkgYXV0b3VwZGF0ZSwgY2lvw6ggdW4gdHJpZ2dlciB0aW1lLWl6emF0byBpbiBhbHRvIGEgZGVzdHJhIGRlbGxhIHRhYmVsbGEgY2hlIHJpcGV0ZSBsZSByaWNlcmNoZSBvZ25pIFggKipzZWNvbmRzKiogKi9cclxuICAgIHB1YmxpYyBhdXRvVXBkYXRlID0gZmFsc2U7XHJcbiAgICAvKiogTnVtZXJvIGRpIHNlY29uZGkgZGEgZmFyZSB0cmFzY29ycmVyZSBmcmEgdW5hIHJpY2VyY2EgZSBsJ2FsdHJhICovXHJcbiAgICBwdWJsaWMgc2Vjb25kcyA9ICcxMCc7XHJcbiAgICAvKiogUmlmZXJpbWVudG8gYWxsJ0ludGVydmFsIGNoZSB2aWVuZSBnZW5lcmF0byBzZSAqKmF1dG9VcGRhdGUqKiDDqCBpbXBvc3RhdGEgYSB0cnVlIGluIG1vZG8gZGEgcG90ZXJsbyByaXB1bGlyZSAqL1xyXG4gICAgcHVibGljIHVwZGF0ZVRpbWVyOiBhbnk7XHJcbiAgICAvKiogSW1wb3N0YXRhIGEgdHJ1ZSBvZ25pIHZvbHRhIGNoZSB2aWVuZSBhdnZpYXRhIHVuYSByaWNlcmNhLCBlIGEgZmFsc2Ugb2duaSB2b2x0YSBjaGUgdW4gbnVvdm8gdmFsb3JlIHZpZW5lIHJpY2V2dXRvICovXHJcbiAgICBwdWJsaWMgcmVzZWFyY2hJblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogTW9kZWxsbyBkaSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIHBlciBpICoqUm93VERzKiogKi9cclxuICAgIHB1YmxpYyBUTVBSb3dURHM6IHsgW2NvbnRleHQ6IHN0cmluZ106IFRkRWxlbWVudFtdIH0gPSBudWxsO1xyXG4gICAgLyoqIE1vZGVsbG8gcmFwcHJlc2VudGFudGUgdW4gZGl6aW9uYXJpbyBkaSByaWdoZSBkZWxsYSB0YWJlbGxhLCBjb24gY2hpYXZlIGwnaGFzaCBlIHZhbG9yZSBsYSBsaXN0YSBkaSBjZWxsZSAqL1xyXG4gICAgcHVibGljIFJvd1REczogeyBbY29udGV4dDogc3RyaW5nXTogVGRFbGVtZW50W10gfSA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlICoqUm93VERzKiogw6ggdW4gb2dnZXR0byB2dW90byBvIG1lbm8gKi9cclxuICAgIHB1YmxpYyBFbXB0eVJvd1RkczogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvKiogTW9kZWxsbyBkaSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIHBlciBpICoqUm93VEhzKiogKi9cclxuICAgIHB1YmxpYyBUTVBSb3dUSHM6IFRoRWxlbWVudFtdID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIHJhcHByZXNlbnRhbnRlIHVuIHNpbmdvbG8gdGggZGVsbGEgdGFiZWxsYSwgZ2VuZXJhdG8gaW4gYmFzZSBhbGxlIGNvbmZpZ3VyYXppb25pIGUgYWdsaSBvZ2dldHRpIHJpY2V2dXRpICovXHJcbiAgICBwdWJsaWMgUm93VEhzOiBUaEVsZW1lbnRbXSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyBkaSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIHBlciBpICoqUm93VGhHcm91cHMqKiAqL1xyXG4gICAgcHVibGljIFRNUFJvd1RoR3JvdXBzOiBUaEdyb3VwW11bXSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyByYXBwcmVzZW50YW50ZSB1biBzaW5nb2xvIGhlYWRlciBncm91cCBkZWxsYSB0YWJlbGxhLiBRdWVzdGEgbGlzdGEgw6ggZ2nDoCBvcmRpbmF0YSBlIHByb250YSBwZXIgZXNzZXJlIHV0aWxpenphdGEgaW4gbmdGb3IgKi9cclxuICAgIHB1YmxpYyBSb3dUaEdyb3VwczogVGhHcm91cFtdW10gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdGEgZGVpIGNvbnRlc3RpLiBVbiBjb250ZXN0byBub24gw6ggYWx0cm8gY2hlIHVuIGhhc2ggcGFydGljb2xhcmUgY2FsY29sYXRvIHN1IHVuIG9nZ2V0dG8gY2hlIGlkZW50aWZpY2EgdW5pdm9jYW1lbnRlIHRhbGUgb2dnZXR0by5cclxuICAgICAqXHJcbiAgICAgKiBPZ251bm8gZGkgcXVlc3RpIGNvbnRlc3RpIHJhcHByZXNlbnRlcsOgIGEgc3VhIHZvbHRhLCB1bml2b2NhbWVudGUsIHVuYSByaWdhIGFsbCdpbnRlcm5vIGRlbGxhIHRhYmVsbGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJvd0NvbnRleHRzOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIERpcmV0dGl2ZSBkaSBvcmRpbmFtZW50byBkZWxsZSBjb2xvbm5lIChub24gb3JkaW5hbWVudG8gZGVpIGRhdGkgbWEgZGVsbGUgY29sb25uZSBpbiBzZSkgKi9cclxuICAgIHB1YmxpYyBPcmRlckRpcmVjdGl2ZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAvKiogQ29kaWNlIGRlbGwndWx0aW1vIG9nZ2V0dG8gc29sZXppb25hdG8gKi9cclxuICAgIHB1YmxpYyBsYXN0U2VsZWN0ZWRJdGVtSUQgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVjaWRlIHNlIHV0aWxpenphcmUgbyBtZW5vIGxlIEN1c3RvbUNlbGxzLiBJbXBvc3RhbmRvbG8gYSAqKnRydWUqKiBsJ2VzLXRhYmxlIGRpdmVudGEgaW4gZ3JhZG8gZGkgZ2VzdGlyZSBuYXRpdmFtZW50ZTpcclxuICAgICAqXHJcbiAgICAgKiAxKSBPcmRpbmFtZW50byBlIHZpc2liaWxpdMOgIGRlbGxlIGNvbG9ubmVcclxuICAgICAqXHJcbiAgICAgKiAyKSBPcmRpbmFtZW50byBkZWkgZGF0aVxyXG4gICAgICpcclxuICAgICAqIDMpIE1vZGFsaXTDoCBHZXJhcmNoaWNhXHJcbiAgICAgKlxyXG4gICAgICogZWNjLi4uXHJcbiAgICAgKiB2aWVuZSBkZWRvdHRvIGRhbCBzaXN0ZW1hIGluIGF1dG9tYXRpY29cclxuICAgICAqL1xyXG4gICAgcHVibGljIFVzZUN1c3RvbUNlbGxzOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBvbHRyZSBhbGxlIGNvbG9ubmUgZGluYW1pY2hlIHNwZWNpZmljaGUgZGkgdW4gdGlwbyBkaSBvZ2dldHRvIGNpIHNvbm8gYW5jaGUgY29sb25uZSBkaW5hbWljaGUgYWdnaXVudGUgZGFsbCd1dGVudGVcclxuICAgICAqXHJcbiAgICAgKiBFcy4gdW5hIGNvbG9ubmEgaW4gY3VpIG1vc3RyYXJlIHNlbXByZSB1biBpY29uY2luYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVXNlckRlZmluZWREeW5hbWljQ29sczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBjaGUgcXVlc3RvIMOoIGlsIHByaW1vIEJpbmQgZGVsbGEgdGFiZWxsYSwgdmllbmUgc2V0dGF0byBhIGZhbHNlIG5vbiBhcHBlbmEgaWwgcHJpbW8gYmluZCB2aWVuZSB0ZXJtaW5hdG8gY29uIHN1Y2Nlc3NvICovXHJcbiAgICBwdWJsaWMgRmlyc3RCaW5kOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8qKiBMaXN0YSBkaSBjb2xvbm5lIGNoZSBzaSBwb3Nzb25vIHZpc3VhbGl6emFyZS9vcmRpbmFyZSBmcmEgZGkgbG9ybyAqL1xyXG4gICAgcHVibGljIENvbHVtbnNMaXN0OiBFc1RhYmxlQ29sdW1uW10gPSBbXTtcclxuICAgIC8qKiBWYXJpYWJpbGUgZCdhcHBvZ2dpbyB1c2F0YSBkYWxsYSBkaWFsb2cgZGkgc2VsZXppb25lL25hc2NvbmRpbWVudG8sIHBlciBldml0YXJlIGRpIGRhbm5lZ2dpYXJlICoqQ29sdW1uc0xpc3QqKiBpbiBjYXNvIGRpIG1vZGlmaWNoZSBwb2kgYW5udWxsYXRlICovXHJcbiAgICBwdWJsaWMgVE1QQ29sdW1uc0xpc3Q6IEVzVGFibGVDb2x1bW5bXSA9IFtdO1xyXG4gICAgLyoqIFZhbG9yZSBkZWwgY2hlY2sgZ2xvYmFsZSBkaSB2aXNpYmlsaXTDoCB2YWxpZG8gcGVyIHR1dHRlIGxlIGNvbG9ubmUgaW4gKipDb2x1bW5zTGlzdCoqICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ29sVmlzQ2hlY2sgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGUgbGUgZGlyZXR0aXZlIHBlciBnbGkgZWRpdG9yIGN1c3RvbSBkZWxsZSBjZWxsZSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihFc1RkRWRpdG9yRGlyZWN0aXZlKSBFc1RkRWRpdG9yRGlyZWN0aXZlczogUXVlcnlMaXN0PEVzVGRFZGl0b3JEaXJlY3RpdmU+O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIHR1dHRlIGxlIG51b3ZlIGRpcmV0dGl2ZSAgYXNzZWduYXRpIGEgZGlyZXR0aXZhIChQZXIgbGEgbW9kYWxpdMOgIGRpbmFtaWNhIGRlbGwnZXMtdGFibGUpICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGREaXJlY3RpdmUpIEVzVGRzRGlyZWN0aXZlOiBRdWVyeUxpc3Q8RXNUZERpcmVjdGl2ZT47XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGkgZ2xpIGVzLXRkIGFzc2VnbmF0aSBhIGRpcmV0dGl2YSAoUGVyIGxhIG1vZGFsaXTDoCBkaW5hbWljYSBkZWxsJ2VzLXRhYmxlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihFc1RoRGlyZWN0aXZlKSBFc1Roc0RpcmVjdGl2ZTogUXVlcnlMaXN0PEVzVGhEaXJlY3RpdmU+O1xyXG4gICAgLyoqIElucHV0IGNvbGxlZ2F0byBhIHVuIHRlbXBsYXRlIGNoZSBjb250aWVuZSBsZSBkaXJldHRpdmUgcGVyIHJlbmRlcml6emFyZSBxdWVzdGEgdGFiZWxsYS4gc2UgY2kgc29ubyAqKkVzVGRzRGlyZWN0aXZlKiogZSAqKkVzVGhzRGlyZWN0aXZlKiogcXVlc3RpIGhhbm5vIGxhIHByaW9yaXTDoCAqL1xyXG4gICAgQElucHV0KCkgRXNUYWJsZVRlbXBsYXRlOiBJRXNUYWJsZVRlbXBsYXRlV3JhcHBlcjtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgZGVsIGJvZHkgKHB1bnRvIGRlbGxhIHRhYmVsbGEgZG92ZSB2ZW5nb25vIG1vc3RyYXRlIGxlIHJpZ2hlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnYm9keScsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgYm9keVJlZjogYW55O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBkZWxsJ2hlYWRlciAocHVudG8gZGVsbGEgdGFiZWxsYSBkb3ZlIHZlbmdvbm8gbW9zdHJhdGUgbGUgaW50ZXN0YXppb25pIGRlbGxlIHJpZ2hlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnaGVhZGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBoZWFkZXJSZWY6IGFueTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgc3VsIHJhZ2dydXBwYW1lbnRvIGRlZ2xpIGhlYWRlciAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnaGVhZGVyR3JvdXAnLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGhlYWRlckdyb3VwUmVmOiBhbnk7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgUXVlcnkgcGVyIHJlY3VwZXJhcmUgbGUgaW5mb3JtYXppb25pIHN1bCByYWdncnVwcGFtZW50byBkaSBzZWNvbmRvIGxpdmVsbG8gZGVnbGkgaGVhZGVyICovXHJcbiAgICBAQ29udGVudENoaWxkKCdzZWNvbmRhcnlIZWFkZXJHcm91cCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgc2Vjb25kYXJ5SGVhZGVyR3JvdXBSZWY6IGFueTtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSBpbCBjYW1wbyBkaSBJbnB1dCBhdHR1YWxlLiBEb3BvIHVuIGRvcHBpbyBjbGljayBsbyBiZWNjbyBlIGxvIGZvY3Vzc28gYXBwZW5hIHRlcm1pbmEgbGEgY2hhbmdlIGRldGVjdGlvbiAqL1xyXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGlucHV0RmllbGQ6IEVsZW1lbnRSZWY7XHJcbiAgICAvKiogT3B6aW9uaSBleHRyYSBjaGUgZGV2b25vIGFwcGFyaXJlIG5lbCBNZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhLCByaWNoaWFtYXRvIGRhaSAzIHBhbGxpbmkgdmVydGljYWxpICovXHJcbiAgICBASW5wdXQoKSBDb3JuZXJNZW51T3B0aW9uczogQ29ybmVyTWVudU9wdGlvbltdID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBwb3NzaWJpbGUgZWZmZXR0dWFyZSBpbCByZXNpemUgZGVsbGUgY29sb25uZSAqL1xyXG4gICAgQElucHV0KCkgQ29sdW1uc1Jlc2l6YWJsZTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGRldidlc3NlcmUgcG9zc2liaWxlIGVmZmV0dHVhcmUgaWwgcGlubmluZyBkZWxsZSBjb2xvbm5lICovXHJcbiAgICBASW5wdXQoKSBDb2x1bW5zUGlubmFibGU6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBkZXYnZXNzZXJlIGRpc3BvbmliaWxlIGlsIHNpc3RlbWEgZGkgYWdnaW9ybmFtZW50byBhdXRvbWF0aWNvICovXHJcbiAgICBASW5wdXQoKSBBdXRvVXBkYXRlOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgbCdhbHRlenphIGNhYmxhdGEgY2hlIGRldmUgYXNzdW1lcmUgbGEgdGFiZWxsYS4gRXM6IFwiMTAwcHhcIiB8IFwiMTAwJVwiIC4uLiAgKi9cclxuICAgIEBJbnB1dCgpIEhlaWdodDogc3RyaW5nID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgaWwgY29sb3JlIGRpIHNmb25kbyBkZWxsbyBzcGF6aW8gdnVvdG8gKG5vbiByaWNvcGVydG8gZGEgZGF0aSkuIFBhcnRpY29sYXJtZW50ZSB1dGlsZSBkYSBpbXBvc3RhcmUgaW4gY2FzbyBkaSAqKkhlaWdodCoqIGRpdmVyc28gZGEgbnVsbCAgKi9cclxuICAgIEBJbnB1dCgpIEVtcHR5U3BhY2VCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGRldidlc3NlcmUgbCdlc3RhYmxlIGEgZ2VzdGlyZSBsYSByaWNlcmNhLCBhbmNoZSBsYSBwcmltYS4gICoqL1xyXG4gICAgQElucHV0KCkgRXNUYWJsZUhhbmRsZWRTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogUGVybWV0dGUgZGkgaW1wb3N0YXJlIGwnYWx0ZXp6YSBtYXNzaW1hIGRlbGxhIHRhYmVsbGEuIFNlIG51bGwgbGEgZGltZW5zaW9uZSBzaSBhZGF0dGEgYWwgbnVtZXJvIGRpIGVsZW1lbnRpIGF0dHVhbG1lbnRlIGluIHZpc3VhbGl6emF6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgTWF4SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xyXG4gICAgLyoqIENsYXNzaSBkYSBhcHBsaWNhcmUgYWwgY29udGVuaXRvcmUgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgQ29udGFpbmVyQ2xhc3MgPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIG8gbWVubyBsJ2V4cG9ydCBpbiBmb3JtYXRvIFhMU1ggKi9cclxuICAgIEBJbnB1dCgpIFhMU1hFeHBvcnQ6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIG8gbWVubyBsJ2V4cG9ydCBpbiBmb3JtYXRvIENTViAqL1xyXG4gICAgQElucHV0KCkgQ1NWRXhwb3J0ID0gdHJ1ZTtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSB2aXN1YWxpenphcmUgbyBtZW5vIGwnb3B6aW9uZSBkaSBwYWdpbmF6aW9uZSBcIlR1dHRpXCIgKi9cclxuICAgIEBJbnB1dCgpIEFsbFNlYXJjaCA9IG51bGw7XHJcbiAgICAvKiogRGltaW51aXNjZSBnbGkgc3BhemkgZnJhIHVuYSBjZWxsYSBlIGwnYWx0cmEsIGUgaW50ZXJuYW1lbnRlIGlsIHBhZGRpbmcgZGVsIGZvbnQgaW4gbW9kbyBkYSBwcmVzZW50YXJlIG1vbHRpIHBpw7kgZGF0aSBpbiB1bid1bmljYSBwYWdpbmEgKi9cclxuICAgIEBJbnB1dCgpIEhpZ2hDZWxsRGVuc2l0eTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogQWJpbGl0YSBvIG1lbm8gbGEgcG9zc2liaWxpdMOgIGRpIHNlbGV6aW9uYXJlIG9nZ2V0dGkgKi9cclxuICAgIEBJbnB1dCgpIFNlbGVjdGlvbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogTW9zdHJhIG8gbWVubyB1biBtZXNzYWdnaW8gZGkgTG9hZGluZyBhbCBwcmltbyBjYXJpY2FtZW50byBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBTaG93TG9hZGluZ09uQm9vdHN0cmFwOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBTZSBpbXBvc3RhdG8gYSAqKnRydWUqKiBhZ2dpdW5nZSB1bmEgY29sb25uYSBjb24gcHVsc2FudGUgZGkgZWxpbWluYXppb25lIHBlciBlZmZldHR1YXJlIGwnZWxpbWluYSBkZWxsJ29nZ2V0dG8gcmVsYXRpdm8gKi9cclxuICAgIEBJbnB1dCgpIFJlbW92YWw6IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uZGl6aW9uZSBjaGUgbmFzY29uZGUgbCdpY29uYSBkaSBlbGltaW5hemlvbmUgaW5zZXJpdGEgaW1wb3N0YW5kbyAqKlJlbW92YWwqKiBhIHRydWUgcXVhbG9yYSBsYSBjb25kaXppb25lIG5vbiB2ZW5pc3NlIHJpc3BldHRhdGFcclxuICAgICAqXHJcbiAgICAgKiBDb21lIGNvbmRpemlvbmUgc2kgY29uc2lkZXJhIHVuIHNlbXBsaWNlIGNhbXBvIHN1IGN1aSBlZmZldHR1YXJlIHVuIGNvbnRyb2xsbyBib29sZWFubywgY29tZSBhZCBlc2VtcGlvIFwiY2FucmVtb3ZlXCJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgUmVtb3ZhbENvbmRpdGlvbiA9ICcnO1xyXG4gICAgLyoqIEluZGljYSBzZSBhYmlsaXRhcmUgbGEgcG9zc2liaWxpdMOgIGRpIGVzcG9ydGFyZSBsYSB2aXN0YSBkYXRpIGF0dHVhbGUgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIHBlcm1ldHRlcmUgbGEgc2VsZXppb25lIG11bHRpcGxhIFdpbmRvd3MtbGlrZSBjbGljY2FuZG8gdW4gb2dnZXR0byBlIGZhY2VuZG8gcG9pIFNoaWZ0ICsgY2xpY2sgc3UgdW4gb2dnZXR0byBzdWNjZXNzaXZvICovXHJcbiAgICBASW5wdXQoKSBTaGlmdENsaWNrOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgaWwgdGVzdG8gY2hlIHZhIGEgc29zdGl0dWlyZSBcIk9nZ2V0dGkgVmlzdWFsaXp6YXRpXCIgaW4gY2FzbyBzaSBzdGlhIGZhY2VuZG8gcXVhbGNvc2EgZGkgY3VzdG9tICovXHJcbiAgICBASW5wdXQoKSBDb3VudExhYmVsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIG8gbW9zdHJhcmUgaWwgY29tcG9uZW50ZSBkaSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgSGlkZVBhZ2luZzogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgbyBtb3N0cmFyZSBpbCBjb250ZWdnaW8gZGVnbGkgZWxlbWVudGkgdHJvdmF0aSAqL1xyXG4gICAgQElucHV0KCkgSGlkZVBhZ2luZ0NvdW50OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBvIG1vc3RyYXJlIGkgcHVsc2FudGkgZGkgcGFnaW5hemlvbmUgKi9cclxuICAgIEBJbnB1dCgpIEhpZGVQYWdpbmdCdXR0b25zOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBSaWZlcmltZW50byBhbCBDb250ZXh0TWVudSAobmd4LWNvbnRleHRtZW51KSBhc3NvY2lhdG8gYWwgY2xpY2sgZGVzdHJvIGRpIHVubyBvIHBpw7kgZWxlbWVudGkgc2VsZXppb25hdGkgbmVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgQ29udGV4dE1lbnU6IENvbnRleHRNZW51Q29tcG9uZW50ID0gbnVsbDtcclxuICAgIC8qKiBOb21lIGRlbGwnZXNwb3J0YXppb25lIGdlbmVyYXRhIGRhIHF1ZXN0YSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBFeHBvcnRGaWxlTmFtZSA9ICdFeHBvcnQuY3N2JztcclxuICAgIC8qKiBDbGFzc2UgKEhUTUwpIGRpIGRlZmF1bHQgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgVGFibGVDbGFzcyA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW56aW9uZSBkYSB1dGlsaXp6YXJlIGluIGVzcG9ydGF6aW9uZS4gTmVsIGZvcm1hdG8gXCJSZXBvcnRcIiBhdnLDoCB1biB1bmljbyBwYXJhbWV0cm8gXCJGb3JtYXRvXCIgZSBuZXNzdW4gdmFsb3JlIGRpIHJpdG9ybm8uXHJcbiAgICAgKlxyXG4gICAgICogTmVsIGZvcm1hdG8gXCJWaWV3XCIgaGEgY29tZSBwYXJhbWV0cm8gdW5hIGNhbGxiYWNrIGNvbiBpIGRhdGkgY29tcGxldGkgZGEgZXNwb3J0YXJlIChkYXRvIGNoZSBkaSBkZWZhdWx0IGxhIHJpY2VyY2Egw6ggcGFnaW5hdGEpXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydEZ1bmN0aW9uOiBhbnk7XHJcbiAgICAvKiogSW5kaWNhIGRpIGVzcG9ydGFyZSBzb2xvIGxlIGNvbG9ubmUgYXR0dWFsbWVudGUgdmlzaWJpbGkgZGVsbGEgdmlldyAqL1xyXG4gICAgQElucHV0KCkgRXhwb3J0T25seVZpc2libGVDb2x1bW5zOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgSW5kaWNhIGxhIHByZXNlbnphIGRpIHJhZ2dydXBwYW1lbnRpIGEgbGl2ZWxsbyBkaSBoZWFkZXIgKi9cclxuICAgIEBJbnB1dCgpIEhhc0hlYWRlckdyb3VwOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBJbmRpY2EgbGEgcHJlc2VuemEgZGkgcmFnZ3J1cHBhbWVudGkgYSBsaXZlbGxvIGRlbCByYWdncnVwcGFtZW50byBwcmVjZWRlbnRlbWVudGUgZXNpc3RlbnRlLCBjaGlhcmFtZW50ZSDDqCBpbnNlbnNhdGEgc2VuemEgKipIYXNIZWFkZXJHcm91cCoqICovXHJcbiAgICBASW5wdXQoKSBIYXNTZWNvbmRhcnlIZWFkZXJHcm91cDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgZ2xpIEhlYWRlciBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBIZWFkZXJIaWRkZW46IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIGlsIEJvZHkgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgQm9keUhpZGRlbjogYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgbGEgc2VsZXppb25lIMOoIHRlbXBvcmFuZWFtZW50ZSBkaXNhYmlsaXRhdGEuIFJpc3BldHRvIGFsbCdJbnB1dCAqKlNlbGVjdGlvbioqIGNoZSB2aXNpdmFtZW50ZSBnZXN0aXNjZSBzZSBjaSBzb25vIG8gbm8gZ2xpIGlucHV0IGRpIHNlbGV6aW9uZSxcclxuICAgICAqIHF1ZXN0byBJbnB1dCBnZXN0aXNjZSBzZSBxdWVzdGkgaW5wdXQgc29ubyBhYmlsaXRhdGkgbyBtZW5vXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFNlbGVjdGlvbkRpc2FibGVkOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBmb3J6YXJlIGlsIHNpc3RlbWEgZGkgc2VsZXppb25lIGEgZ2VzdGlyZSB1biBlbGVtZW50byBwZXIgdm9sdGEuXHJcbiAgICAgKiBTZWxlemlvbmFyZSB1bidhbHRyYSByaWdhIGNvbiB1bmEgZ2nDoCBzZWxlemlvbmF0YSBhcHBsaWNoZXLDoCBsYSBzZWxlemlvbmUgYWxsYSBudW92YSByaWdhLCByaW11b3ZlbmRvbGEgZGFsbCdhdHR1YWxlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFNpbmdsZVNlbGVjdGlvbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogQ2FsbGJhY2sgY2hlIGRhdG8gdW4gb2dnZXR0byByZXNpdHVpc2NlIGwnZXZlbnR1YWxlIGNsYXNzZSBkYSBhcHBsaWNhcmUgYWxsYSByaWdhIGNvbGxlZ2F0YSBhbGwnb2dnZXR0byAqL1xyXG4gICAgQElucHV0KCkgUm93Q2xhc3NBc3NpZ25lcjogYW55ID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBvcmRpbmFyZSBpIGRhdGkgaW4gbWFuaWVyYSBkaXNjZW5kZW50ZSBvIGFzY2VuZGVudGUgKi9cclxuICAgIEBJbnB1dCgpIE9yZGVyQnlDb2x1bW46IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIGF2ZXJlIHBpw7kgZGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvIGRlaSBkYXRpICovXHJcbiAgICBASW5wdXQoKSBNdWx0aXBsZU9yZGVyaW5nRGlyZWN0aXZlcyA9IHRydWU7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgbmFzY29uZGVyZSBsZSBjb2xvbm5lIGluIGJhc2UgYWxsZSBzZWxlemlvbmkgZWZmZXR0dWF0ZSBkYWwgTWVuw7kgY29udGVzdHVhbGUgaW4gYWx0byBhIGRlc3RyYSAqL1xyXG4gICAgQElucHV0KCkgSGlkZGVuQ29sdW1uczogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgcmlvcmRpbmFyZSBsZSBjb2xvbm5lIGluIGJhc2UgYWxsZSBpbXBvc3RhemlvbmkgZWZmZXR0dWF0ZSBkYWwgTWVuw7kgY29udGVzdHVhbGUgaW4gYWx0byBhIGRlc3RyYSAqL1xyXG4gICAgQElucHV0KCkgQ29sdW1uc09yZGVyaW5nOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBFdmVudHVhbGUgc3VwcG9ydG8gYWxsZSByaWNlcmNoZSBhcHBsaWNhdGUgYWxsYSBtb2RhbGl0w6AgQXJyYXkgKi9cclxuICAgIEBJbnB1dCgpIFNlYXJjaFZpZXcgPSBudWxsIGFzIEFwcFNlYXJjaDxhbnk+O1xyXG4gICAgLyoqIEFiaWxpdGEgbyBkaXNhYmlsaXRhIGlsIHNpc3RlbWEgY2hlIHBlcm1ldHRlIGRpIHNlbGV6aW9uYXJlIHR1dHRpIGdsaSBlbGVtZW50aSBuZWxsYSB2aXN0YSAqL1xyXG4gICAgQElucHV0KCkgU2VsZWN0QWxsOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBTaW11bGEgbGEgcGFnaW5hemlvbmUgYW5jaGUgcGVyIGxlIHRhYmVsbGUgY2hlIGZ1bnppb25hbm8gaW4gbW9kYWxpdMOgIEFycmF5ICovXHJcbiAgICBASW5wdXQoKSBVc2VBcnJheU1vZGVQYWdpbmcgPSB0cnVlO1xyXG4gICAgLyoqIERlZmluaXppb25lIGRpIGNvbG9ubmUgZGluYW1jaGUgcGVyIGxhIG1vZGFsaXTDoCwgYXBwdW50bywgZGluYW1pY2EgKi9cclxuICAgIEBJbnB1dCgpIER5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbjogRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uW10gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBvcGVyYXppb25pIGRpbmFtaWNoZSBnZW5lcmljaGUgY2hlIHBvc3Nvbm8gZXNzZXJlIGVmZmV0dHVhdGUgcGVyIHJpZ2EuIEFwcGFpb25vIGNvbWUgY29sb25uZSBleHRyYSBzdWwgbGF0byBzaW5pc3RybyBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBEeW5hbWljT3BlcmF0aW9uczogRXNUYWJsZU9wZXJhdGlvbkRlZmluaXRpb25bXSA9IFtdO1xyXG4gICAgLyoqIEluZGljYSBzZSB2aXN1YWxpenphcmUgaSBkYXRpIGluIG1hbmllcmEgZ2VyYXJjaGljYSAqL1xyXG4gICAgQElucHV0KCkgSGllcmFyY2h5OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIGwnSUQgZGVsIHBhZHJlLiBEYSB1dGlsaXp6YXJlIHNlICoqSGllcmFyY2h5Kiogw6ggaW1wb3N0YXRvICovXHJcbiAgICBASW5wdXQoKSBQYXJlbnRLZXkgPSAnJztcclxuICAgIC8qKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIGwnSUQgZGVsbCdvZ2dldHRvIGF0dHVhbGUuIERhIHV0aWxpenphcmUgc2UgKipIaWVyYXJjaHkqKiDDqCBpbXBvc3RhdG8gKi9cclxuICAgIEBJbnB1dCgpIE93bktleSA9ICcnO1xyXG4gICAgLyoqIEluZGljYSBzZSBwYXJ0aXJlIGNvbiB1biBhbGJlcm8gZXNwYW5zby4gRGEgdXRpbGl6emFyZSBzZSAqKkhpZXJhcmNoeSoqIMOoIGltcG9zdGF0byAqL1xyXG4gICAgQElucHV0KCkgU3RhcnRzRXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgLyoqIEluZGljYSBzZSBlZmZldHR1YXJlIGlsIHNhbHZhdGFnZ2lvIGRlbGxlIHByZWZlcmVuemUgZGkgcmljZXJjYSAqL1xyXG4gICAgQElucHV0KCkgU2F2ZVByZWZlcmVuY2VzOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBBbGxpbmVhbWVudG8gZGkgZGVmYXVsdCBwZXIgY2VsbGUgZSBoZWFkZXJzICovXHJcbiAgICBASW5wdXQoKSBEZWZhdWx0QWxpZ25tZW50OiAnTGVmdCcgfCAnUmlnaHQnIHwgJ0NlbnRlcicgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBkb3ZlIHZpc3VhbGl6emFyZSBsZSBpbmZvcm1hemlvbmkgZGkgcGFnaW5hemlvbmUsIHNlIHNvcHJhLCBzb3R0byBvIGluIGVudHJhbWJpICovXHJcbiAgICBASW5wdXQoKSBQYWdpbmdTdHlsZTogJ2JvdGgnIHwgJ3RvcCcgfCAnYm90dG9tJyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIGRvdmUgdmlzdWFsaXp6YXJlIGxlIGluZm9ybWF6aW9uaSBkaSBwYWdpbmF6aW9uZSwgc2Ugc29wcmEsIHNvdHRvIG8gaW4gZW50cmFtYmkgKi9cclxuICAgIEBJbnB1dCgpIFJvd0dyb3VwaW5nUGFnaW5nU3R5bGU6ICdsZWZ0JyB8ICdyaWdodCcgPSBudWxsO1xyXG4gICAgLyoqIFF1YWxvcmEgcGVyIHF1YWxzaWFzaSBtb3Rpdm8gbm9uIHZlbmlzc2UgdXNhdG8gKippdGVtcyoqIGRlbGwnQXBwU2VhcmNoIHF1ZXN0byBJbnB1dCBpbmRpY2EgcXVhbCDDqCBpbCBub21lIGRlbGxhIHByb3ByaWV0w6AgZGEgdXRpbGl6emFyZSAqL1xyXG4gICAgQElucHV0KCkgSXRlbVNvdXJjZVByb3BlcnR5OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgLyoqIEluZGljYSBzZSB1dGlsaXp6YXJlIGxhIGNhY2hlIGRpIHNlbGV6aW9uZSBjaGUgcGVybWV0dGUgZGkgbWFudGVuZXJlIGdsaSBzdGF0aSBkaSBzZWxlemlvbmUgZGVpIHZhcmkgb2dnZXR0aSBuYXZpZ2FuZG8gZGEgdW5hIHBhZ2luYSBhbGwnYWx0cmEgKi9cclxuICAgIEBJbnB1dCgpIFVzZVNlbGVjdGlvbkNhY2hlID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBkZWNpZGVyZSBzZSwgaW4gbW9kYWxpdMOgIHJhZ2dydXBwYW1lbnRvLCBtb3N0cmFyZSBvIG1lbm8gaWwgdmFsb3JlIGRlbGxlIGNvbG9ubmUgZGkgZ3J1cHBvIG5lZ2xpIG9nZ2V0dGkgZmluYWxpLiBEaSBkZWZhdWx0IHNvbm8gbmFzY29zdGkgKi9cclxuICAgIEBJbnB1dCgpIFNob3dJdGVtR3JvdXBzQ29sdW1ucyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIGNoZSB0dXR0aSBpIGNhbXBpIGNoZSBkZWZpbmlzY29ubyBsZSBtb2RhbGl0w6AgZGkgbW9kaWZpY2EgY2FtcG8gcG9zc29ubyBlc3NlcmUgbW9kaWZpY2F0aSBpbiBiYXNlIGFsbGUgaW1wb3N0YXppb25pICovXHJcbiAgICBASW5wdXQoKSBFZGl0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBzZSDDqCBwb3NzaWJpbGUgZWZmZXR0dWFyZSBzZWxlemlvbmkgYSByYW5nZSBwZXIgcG9pIGZhcmNpIGV2ZW50dWFsbWVudGUgY29waWEgaW5jb2xsYSAqL1xyXG4gICAgQElucHV0KCkgUmFuZ2VTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2EgaWwgbnVtZXJvIGRpIG1pbGxpc2Vjb25kaSBwZXIgY3VpIGRlYm91bmNhcmUgaWwgd3JpdGVWYWx1ZSBwZXIgbGEgbW9kYWxpdMOgICoqRXNUYWJsZUhhbmRsZWRTZWFyY2gqKiAqL1xyXG4gICAgQElucHV0KCkgU2VhcmNoVGhyb3R0bGU6IG51bWJlciA9IDUwO1xyXG4gICAgLyoqIEV2ZW50byBjaGUgdmllbmUgcmljaGlhbWF0byBhbCBjYW1iaW8gZGkgb3JpZG5hbWVudG8gZGkgdW5hIGNvbG9ubmEgKi9cclxuICAgIEBPdXRwdXQoKSBvbk9yZGVyQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFwcE9yZGVyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8QXBwT3JkZXJpbmc+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudG8gY2hlIHZpZW5lIHJpY2hpYW1hdG8gcXVhbmRvIGwnZXMtdGFibGUgcml0aWVuZSBzaWEgbmVjZXNzYXJpbyByaS1lZmZldHR1YXJlIGxhIHJpY2VyY2EuXHJcbiAgICAgKiBJbCBib29sZWFubyBkZWxsJ2V2ZW50byBpbmRpY2Egc2UgdmllbmUgc3VnZ2VyaXRvIGRpIHJlc2V0dGFyZSBsYSBwYWdpbmEgbyBtZW5vLlxyXG4gICAgICogXHJcbiAgICAgKiBTb2xvIGluIGNhc28gdmVuZ2EgdXRpbGl6emF0YSBsYSBtb2RhbGl0w6AgYSByYWdncnVwcGFtZW50aSBkaSByaWdoZSBwdcOyIHN1Y2NlZGVyZSBjaGUgbCdlcy10YWJsZSBwYXNzaSB1biBpbnRlcm8gQXBwU2VhcmNoIGNvbWUgcGFyYW1ldHJvIGRpIHJpY2VyY2EsXHJcbiAgICAgKiBpbiBxdWVsIGNhc28gbCdhcHBsaWNhemlvbmUgcmljZXZlbnRlIGRvdnLDoCBvbm9yYXJlIGxhIHJpY2hpZXN0YSBzcGVkZW5kbyBhbCBiYWNrYW5kIGwnb2dnZXR0byBkaSByaWNlcmNhIEFTLUlTXHJcbiAgICAgKiBcclxuICAgICAqIGlsIHRpcG8gZGVsbCdFbWl0dGVyIGludmVjZSBkaSBlc3NlcmUgW2Jvb2xlYW4gfCBBcHBTZWFyY2g8YW55Pl0gw6ggc3RhdG8gaW1wb3N0YXRvIGEgXCJhbnlcIiBwZXIgZXZpdGFyZSBwcm9ibGVtaSBkaSByZXRyb2NvbXBhdGliaWxpdMOgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBvblNlYXJjaFJlcXVlc3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICAvKiogRXZlbnRvIGNoZSBwYXJ0ZSBhZCBvZ25pIG1vZGlmaWNhIGRpIFwiY2hlY2thZ2dpb1wiIGluIGZvcm1hIGRpIGNvbW9kbyBhcnJheS4gRXNwb25lIGwnb2dnZXR0byBjb24gbG8gc3RhdG8gZGkgY2hlY2sgYXR0dWFsZSAqL1xyXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0aW9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEl0ZW1zU2VsZWN0aW9uPGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxJdGVtc1NlbGVjdGlvbjxhbnk+PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbCdlbGltaW5hemlvbmUgZGkgdW4gb2dnZXR0byAqL1xyXG4gICAgQE91dHB1dCgpIG9uUmVtb3ZhbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBhbGwnYW5udWxsYW1lbnRvIGRpIHVuJ2VsaW1pbmF6aW9uZSAqL1xyXG4gICAgQE91dHB1dCgpIG9uQWJvcnRSZW1vdmFsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbGEgbW9kaWZpY2EgZGVpIG1vZGVsbGkgYmluZGF0aSAqL1xyXG4gICAgQE91dHB1dCgpIG9uTW9kZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxFc1RhYmxlTW9kZWxDaGFuZ2VbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPEVzVGFibGVNb2RlbENoYW5nZVtdPigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbCdhcGVydHVyYSBkZWwgbWVuw7kgY29udGVzdHVhbGUgKi9cclxuICAgIEBPdXRwdXQoKSBvbk9wZW5Db250ZXh0TWVudTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBxdWFuZG8gc2kgY2xpY2NhIHN1IHVuIG9wemlvbmUgZGVmaW5pdGEgbmVsbGUgKipDb3JuZXJNZW51T3B0aW9ucyoqICovXHJcbiAgICBAT3V0cHV0KCkgb25Db3JuZXJBY3Rpb246IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGVzdGFibGU6IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nLCBlc3RhYmxlOiBhbnkgfT4oKTtcclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBxdWFuZG8gc2kgY2xpY2NhIHN1IHVuIG9wemlvbmUgZGVmaW5pdGEgbmVsbGUgKipEeW5hbWljT3BlcmF0aW9ucyoqICovXHJcbiAgICBAT3V0cHV0KCkgb25EeW5hbWljT3BlcmF0aW9uOiBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nLCBpdGVtOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZywgaXRlbTogYW55IH0+KCk7XHJcblxyXG4gICAgLyoqIERhdGkgZXNwb3J0YXRpIGRhIG5neC1jc3YgKi9cclxuICAgIHB1YmxpYyBkYXRhOiBhbnlbXTtcclxuICAgIC8qKiBIZWFkZXIgZGVpIGRhdGkgZXNwb3J0YXRpIGRhIG5neC1jc3YgKi9cclxuICAgIHB1YmxpYyBoZWFkZXJzOiBDc3ZIZWFkZXJzW107XHJcbiAgICAvKiogRWxlbWVudG8gSFRNTCBkYSBjbGljY2FyZSBwZXIgbCdlc3BvcnRhemlvbmUgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2V4cG9ydERvd25sb2FkZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGV4cG9ydERvd25sb2FkZXI6IEVsZW1lbnRSZWY7XHJcbiAgICAvKiogUGxhY2Vob2xkZXIgZGkgbWVuw7kgY29udGVzdHVhbGUgcGVyIHF1YW5kbyBub24gY2kgc29ubyBvcHppb25pIG5lbCBwbGFjZWhvbGRlciBcIlZlcm9cIiAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2VtcHR5TWVudScsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyB0YWJsZUVtcHR5TWVudTogQ29udGV4dE1lbnVDb21wb25lbnQ7XHJcblxyXG4gICAgLyoqIFN1YnNjcmlwdGlvbiBzdWxsJ2FwZXJ0dXJhIGRlbCBjb250ZXh0IG1lbnUgZGEgcmlwdWxpcmUgYWwgZGVzdHJveSBkZWxsYSBjbGFzc2UgKi9cclxuICAgIHByaXZhdGUgY3R4TWVudVN1YnNjcmlwdGlvbjogYW55O1xyXG5cclxuICAgIC8qKiBQYWdpbmEgaW4gdmlzdWFsaXp6YXppb25lIChkdXJhbnRlIGxhIHBhZ2luYXppb25lIGluIG1vZGFsaXTDoCBBcnJheSkgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVQYWdlID0gMTtcclxuICAgIC8qKiBOdW1lcm8gZGkgcGFnaW5lIChkdXJhbnRlIGxhIHBhZ2luYXppb25lIGluIG1vZGFsaXTDoCBBcnJheSkgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVQYWdlcyA9IDE7XHJcbiAgICAvKiogT2dnZXR0aSBwZXIgb2duaSBwYWdpbmEgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgQElucHV0KCkgQXJyYXltb2RlSXRlbXNQZXJQYWdlID0gbnVsbDtcclxuICAgIC8qKiBPZ2dldHRvIGRpIHNlbGV6aW9uZSBwZXIgbGEgbW9kYWxpdMOgIEFycmF5LCBjaGUgZGV2ZSBjb21wb3J0YXJzaSBjb21lIGxhIGNvbnRyb3BhcnRlIGluIG1vZGFsaXTDoCBWaWV3ICovXHJcbiAgICBwdWJsaWMgYXJyYXltb2RlU2VsZWN0aW9uOiBJdGVtc1NlbGVjdGlvbjxhbnk+O1xyXG4gICAgLyoqIENvbG9ubmUgZGEgdmlzdWFsaXp6YXJlIGluIG1vZGFsaXTDoCBhcnJheSAqL1xyXG4gICAgcHVibGljIGFycmF5Q29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBPcmRpbmUgZGVsbGUgY29sb25uZSBkYSB2aXN1YWxpenphcmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlDb2x1bW5PcmRlcmluZzogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBPcmRpbmFtZW50aSBBU0MtREVTQyBzdWxsZSBjb2xvbm5lIGluIG1vZGFsaXTDoCBhcnJheSAqL1xyXG4gICAgcHVibGljIGFycmF5T3JkZXJzOiBBcHBPcmRlcmluZ1tdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYXJpYWJpbGUgY2hlIHNlcnZlIGEgZ2VzdGlyZSBpbCBtb21lbnRvIGluIGN1aSBsJ2VzLXRhYmxlIGFnZ2lvcm5hIGxhIHBhZ2luYXppb25lIChwdWxzYW50aSBlY2MpLlxyXG4gICAgICogRXNzZW5kbyBvcGVyYXppb25pIGNvbXVucXVlIGNvc3Rvc2UgbGUgZWZmZXR0dW8gc29sbyBzdSBiaW5kaW5nIGVzdGVybmksIG5vbiBzdSByZXdyaXRlIGdlbmVyYXRpIGludGVybmFtZW50ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGludGVybmFsV3JpdGVDYWxsID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWNoZSBjaGUgY29udGVycsOgIHR1dHRlIGxlIHJpY2VyY2hlIGVmZmV0dHVhdGUgc3UgZ3J1cHBpIGRpdmVyc2kgZGFsIHByaW1vIGUgc3UgZWxlbWVudGkgY29udGVudXRpIG5laSBncnVwcGkuXHJcbiAgICAgKiBJbiBjYXNvIGRpIGNhbWJpIGRpIG9yZGluYW1lbnRvIGRlbGxlIGNvbG9ubmUgZGl2ZXJzZSBkYWxsYSBwcmltYSB0dXR0ZSBsZSBjaGlhbWF0ZSBmYXR0ZSBkYWwgc2Vjb25kbyBsaXZlbGxvIGluIHBvaSBkZXZvbm8gZXNzZXJlIHJpZXNlZ3VpdGUgc2Vjb25kbyBsYSBzZWd1ZW50ZSBsb2dpY2E6XHJcbiAgICAgKiBcclxuICAgICAqIFxyXG4gICAgICogKipDYW1iaW8gb3JkaW5hbWVudG8gc3VsIHByaW1vIGdydXBwbyoqOiByZWxvYWQgY29tcGxldG8sIG5vbiBtaSBvY2N1cG8gZGkgcmlwdWxpcmUgZ2xpIGVsZW1lbnRpIGJpbmRhdGkgaW4gYWxjdW4gbW9kb1xyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdWxsYSBjb2xvbm5hIHJlbGF0aXZhIGFsbCdOLWVzaW1vIGdydXBwbyoqOiByZWxvYWQgY29tcGxldG8gZGVsIGNvbnRlbnV0byBkZWkgZ3J1cHBpIHByZWNlZGVudGksIHJpcHVsZW5kbyBwcmVjZWRlbnRlbWVudGUgXHJcbiAgICAgKiB0dXR0aSBnbGkgZWxlbWVudGkgY29uICoqX2dyb3VwbGV2ZWwqKiA9IE5cclxuICAgICAqIFxyXG4gICAgICogKipDYW1iaW8gb3JkaW5hbWVudG8gc3UgdW5hIGNvbG9ubmEgbm9uIHJhZ2dydXBwYXRhKio6IHJlbG9hZCBjb21wbGV0byBwZXIgdHV0dGkgaSBncnVwcGkgZmluYWxpIGFwZXJ0aSwgZGV2byBwcmVjZWRlbnRlbWVudGUgcmlwdWxpcmUgdHV0dGkgZ2xpIGVsZW1lbnRpIGNvbiAqKl9pdGVtKiogPSB0cnVlXHJcbiAgICAgKiBcclxuICAgICAqIEFsdHJpIGV2ZW50aSBub24gZG92cmViYmVybyByYXBwcmVzZW50YXJlIHByb2JsZW1pOlxyXG4gICAgICogLSBTZWxlemlvbmU6IG5vbiBjYW1iaWEgbnVsbGFcclxuICAgICAqIC0gUGFnaW5hemlvbmU6IGNhbWJpYSBhIGxpdmVsbG8gcm9vdCBxdWluZGkgdmllbmUgcmljYXJpY2F0byB0dXR0byBjb211bnF1ZSwgc3Rlc3NvIHZhbGUgcGVyIGxlIHBhZ2luYXppb25pIGludGVybmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZTogeyBwYXRoOiBzdHJpbmcsIHJvdXRlOiBHcm91cFJvdXRlRnJhZ21lbnRbXSwgdmlldzogQXBwU2VhcmNoPGFueT4sIGdyb3VwX2NvbHVtbjogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKiBWYXJpYWJpbGUgZCdhcHBvZ2dpbyBwZXIgY2FwaXJlIHNlIGMnw6ggYmlzb2dubyBkaSByaS1lZmZldHR1YXJlIHVuYSByaWNlcmNhIG8gbWVubyAqL1xyXG4gICAgcHJpdmF0ZSBSZXNlYXJjaE5lZWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIENvbG9ubmUgdmlzaWJpbGkgZGVsbGEgdmlzdGEgYXR0dWFsZS4gVmFsb3JpenphdG8gZGkgZGVmYXVsdCBhbCBudW1lcm8gbWFzc2ltbyBkaSBjb2xvbm5lIHN1cHBvcnRhdGUgZGFsbGEgdGFiZWxsYSBwZXIgbGUgY2FzaXN0aWNoZSBpbiBhc3NlbnphIGRpIGN1c3RvbSBjZWxscyAqL1xyXG4gICAgcHVibGljIENvbHVtbnM6IHsgVmlzaWJpbGU6IG51bWJlciwgVmlzaWJsZVVucGlubmVkOiBudW1iZXIsIEdsb2JhbDogbnVtYmVyIH0gPSB7IFZpc2liaWxlOiAxMDAsIFZpc2libGVVbnBpbm5lZDogMTAwLCBHbG9iYWw6IDEwMCB9O1xyXG4gICAgLyoqIEluIGNhc28gZGkgUm93IEdyb3VwaW5nIHF1aSB2aWVuZSBzYWx2YXRhIGxhIHZpc3RhIHByaW5jaXBhbGUgZGVpIGdydXBwaSBiYXNlICovXHJcbiAgICBwdWJsaWMgTWFpbkdyb3VwVmlldzogQXBwU2VhcmNoPGFueT4gPSBudWxsO1xyXG4gICAgLyoqIENvbnRlZ2dpbyBiYXNlIGRlZ2xpIG9nZ2V0dGkuIEluIG1vZGFsaXTDoCBub3JtYWxlIHZpZW5lIHJlc2V0dGF0byBhZCBvZ25pIG51b3ZhIFZpZXcgaW5zZXJpdGEsIGluIG1vZGFsaXTDoCBSb3dHcm91cGluZyB2aWVuZSByZXNldHRhdG8gc29sbyBhZCB1bmEgbnVvdmEgVmlldyBkaSBsaXZlbGxvIFwiMFwiICovXHJcbiAgICBwdWJsaWMgQmFzZUl0ZW1zQ291bnQgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBjaSBzb25vIGRlbGxlIGNvbG9ubmUgcGlubmF0ZSBlIHZpc2liaWxpLiBTZXJ2ZSBwZXIgcG90ZXIgc2V0dGFyZSB0dXR0ZSBsZSBjb2xvbm5lIHByaW1hIGNoZSBhcnJpdmlubyBkYXRpIGEgcGlubmVkKi9cclxuICAgIHB1YmxpYyBIYXNQaW5uZWRDb2x1bW5zOiBib29sZWFuXHJcbiAgICAvKiogTGFyZ2hlenphIGNhbGNvbGF0YSBkZWwgY29udGFpbmVyIGRlbGxlIGNvbG9ubmUgcGlubmF0ZSAqL1xyXG4gICAgcHVibGljIFBpbm5lZENvbnRhaW5lcldpZHRoOiBudW1iZXI7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5vbm9zdGFudGUgc2lhbW8gaW4gbW9kYWxpdMOgIGFycmF5IHNvbm8gc3RhdGkgaW5kaXZpZHVhdGkgZGVpIGdydXBwaS4gSW4gdGFsIGNhc28gZXMtdGFibGUgc2kgY29tcG9ydGEgZGEgcHNldWRvIGJhY2tlbmQgZWQgZWZmZXR0dWEgbGUgYWdncmVnYXppb25pIGUgcmFnZ3J1cHBhbWVudGkgY29tcGxldGFtZW50ZSBsYXRvIGNsaWVudCAqL1xyXG4gICAgcHVibGljIEFycmF5R3JvdXBpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2EgY2hlIGwnZXMtdGFibGUgw6ggYmFzYXRhIHN1bGxlIGRpcmV0dGl2ZSAobnVvdmEgbW9kYWxpdMOgKSAqL1xyXG4gICAgcHVibGljIERpcmVjdGl2ZXNCYXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBsbyBzdGF0byBkaSBzZWxlemlvbmUgcGVyIHNpbmdvbGEgY2VsbGEgKi9cclxuICAgIHB1YmxpYyBzZWxlY3Rpb25TdGF0dXM6IHsgW2luZGV4OiBudW1iZXJdOiB7IFtpbmRleDogbnVtYmVyXTogSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZSB9IH0gPSB7fTtcclxuICAgIC8qKiBDaGlhbWF0YSByZWFsZSBhbCB3cml0ZVZhbHVlIGRvcG8gaWwgcGFzc2FnZ2lvIGRpICoqU2VhcmNoVGhyb3R0bGUqKiBtaWxsaXNlY29uZGkuIFNvbG8gbW9kYWxpdMOgIEVzVGFibGVIYW5kbGVkU2VhcmNoICovXHJcbiAgICBwcml2YXRlIGNhbGxUaW1lb3V0IDogYW55ID0gbnVsbDtcclxuICAgIC8qKiBDYWNoZSBkZWkgdGggcGl1dHRvc3RvIGNoZSByaWNhbGNvbGFyc2VsaSBkaSBjb250aW51byAqL1xyXG4gICAgcHJpdmF0ZSB0aHNDYWNoZTogIHsgW2luZGV4OiBzdHJpbmddOiBFc1RoRGlyZWN0aXZlIH0gPSB7fTtcclxuICAgIC8qKiBcclxuICAgICAqIEZsYWcgY2hlLCBzZSAqKnRydWUqKiwgcGVyIHVuIGdpcm8gZGkgYmluZGluZyBtYW50aWVuZSBsYSB2aXNpYmlsaXTDoCBpbXBvc3RhdGEgbG9jYWxtZW50ZSwgcGl1dHRvc3RvIGNoZSBhbGxpbmVhcmUgYWxsYSBWaWV3IGJpbmRhdGEuIFxyXG4gICAgICogVXNhdGEgcGVyIG1vZGlmaWNhcmUgaW4gbWFuaWVyYSBwcm9ncmFtbWF0aWNhIGxhIHZpc2liaWxpdMOgIGRlbGxlIGNvbG9ubmUgZGFsIG1ldG9kbyAqKnNldEhlYWRlclZpc2liaWxpdHkqKiwgXHJcbiAgICAgKiBcclxuICAgICAqIERpc2NsYWltZXI6ICoqTk9OIE1PRElGSUNBUkUqKlxyXG4gICAgICoqL1xyXG4gICAgcHVibGljIHVzZUxvY2FsVmlzaWJpbGl0eTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIE9wemlvbmkgZGkgcGFnaW5hemlvbmUgKi9cclxuICAgIHB1YmxpYyBQYWdlck9wdGlvbnM6IFBhZ2VySW5mb3MgPSBuZXcgUGFnZXJJbmZvcygpXHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICAvLyBjbGljayBkZXN0cm8gc3UgdW5hIHJpZ2EgY29uIHNlbGV6aW9uZSBhdHRpdmE6IFRpcm8gZnVvcmkgaWwgY29udGV4dCBtZW51IGUgc2VsZXppb25lIGwnZWxlbWVudG8gY29ycmVudGVcclxuICAgICAgICB0aGlzLmN0eE1lbnVTdWJzY3JpcHRpb24gPSAodGhpcy5Db250ZXh0TWVudSB8fCB0aGlzLnRhYmxlRW1wdHlNZW51KS5vcGVuLnN1YnNjcmliZSh0ID0+IHtcclxuICAgICAgICAgICAgLy8gR3J1cHBpIHZhIGJlbmUsIG9nZ2V0dGkgcHVyZSwgbWEgc2VwYXJhdG9yaSBmcmEgZ3J1cHBpIHByb3ByaW8gbm8uLi5cclxuICAgICAgICAgICAgaWYgKHQuaXRlbS5fc2VwKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBsZXQgc2hvdWxkRW1pdCA9ICF0Lml0ZW0uX3NlbGVjdGVkO1xyXG5cclxuICAgICAgICAgICAgdC5pdGVtLl9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXNFeGNsdWRpbmcobnVsbCk7XHJcbiAgICAgICAgICAgIHZhciBpdGVtU2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25fSC5oYW5kbGVJdGVtc1NlbGVjdGlvbihbdC5pdGVtXSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNob3VsZEVtaXQpXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KGl0ZW1TZWxlY3Rpb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIC8vIFNlIHV0aWxpenpvIGxhIG5ldyBzcGljeSBtb2RlIGRlZHVjbyB0dXR0aSBpIHBhcmFtZXRyaSBkaSBsYXZvcm8gcG9zc2liaWxpIGFsIGNhcmljYW1lbnRvIGRlbGxhIHRhYmVsbGFcclxuICAgICAgICAvLyBWZW5nb25vIHNvdnJhc2NyaXR0ZSBzb2xvIGxlIHByb3ByaWV0w6Agbm9uIGltcG9zdGF0ZSBkYWxsJ3V0ZW50ZVxyXG4gICAgICAgIGxldCB0ZHNEID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5sZW5ndGggPT0gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUZHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGRzRGlyZWN0aXZlIDogdGhpcy5Fc1Rkc0RpcmVjdGl2ZSA6IHRoaXMuRXNUZHNEaXJlY3RpdmU7XHJcbiAgICAgICAgbGV0IHRoc0QgPSB0aGlzLkVzVGhzRGlyZWN0aXZlLmxlbmd0aCA9PSAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Roc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUaHNEaXJlY3RpdmUgOiB0aGlzLkVzVGhzRGlyZWN0aXZlIDogdGhpcy5Fc1Roc0RpcmVjdGl2ZTtcclxuICAgICAgICBsZXQgdXNlc1Roc0FuZFRkc0RpcmVjdGl2ZXMgPSB0ZHNEICYmIHRkc0QubGVuZ3RoID4gMCAmJiB0aHNEICYmIHRoc0QubGVuZ3RoID4gMDtcclxuICAgICAgICBsZXQgaGFzTm9Db250ZW50UHJvamVjdGlvbiA9ICF0aGlzLmJvZHlSZWYgJiYgIXRoaXMuaGVhZGVyUmVmICYmICF0aGlzLmhlYWRlckdyb3VwUmVmICYmICF0aGlzLnNlY29uZGFyeUhlYWRlckdyb3VwUmVmO1xyXG5cclxuICAgICAgICBpZiAodXNlc1Roc0FuZFRkc0RpcmVjdGl2ZXMgfHwgaGFzTm9Db250ZW50UHJvamVjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5Vc2VDdXN0b21DZWxscyA9PSBudWxsKSB0aGlzLlVzZUN1c3RvbUNlbGxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuSGlkZGVuQ29sdW1ucyA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuSGlkZGVuQ29sdW1ucyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbHVtbnNPcmRlcmluZyA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuQ29sdW1uc09yZGVyaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuT3JkZXJCeUNvbHVtbiA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuT3JkZXJCeUNvbHVtbiA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlbGVjdEFsbCA9PSBudWxsICYmIHRoaXMuU2VsZWN0aW9uKSB0aGlzLlNlbGVjdEFsbCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNoaWZ0Q2xpY2sgPT0gbnVsbCAmJiB0aGlzLlNlbGVjdGlvbikgdGhpcy5TaGlmdENsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5EaXJlY3RpdmVzQmFzZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9QZXIgcG90ZXIgY2FtYmlhcmUgaWwgbGF5b3V0IGluIGJhc2UgYWwgbGl2ZWxsbyBnZXJhcmNoaWNvIGlsIGNvbXBvbmVudGUgZGV2YSBhdmVyZSBpbCBwaWVubyBjb250cm9sbG8gZGkgb2duaSBjZWxsYSxcclxuICAgICAgICAvL2NoZSBjb24gc29sbyBsYSBwcm9pZXppb25lIChzZW56YSBjZWxsZSBjdXNvdG0pIG5vbiDDqCBkaXNwb25pYmlsZVxyXG4gICAgICAgIGlmICh0aGlzLkhpZXJhcmNoeSAmJiAhdGhpcy5Vc2VDdXN0b21DZWxscylcclxuICAgICAgICAgICAgdGhyb3cgXCJFcy10YWJsZSBlcnJvcjogUGVyIHBvdGVyIHV0aWxpenphcmUgbCdlcy10YWJsZSBjb24gW0hpZXJhcmNoeV09XFxcInRydWVcXFwiIMOoIHJpY2hpZXN0byBhbmNoZSBbVXNlQ3VzdG9tQ2VsbHNdPVxcXCJ0cnVlXFxcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29weVN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5jb3B5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhc3RlU3Vic2NyaXB0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLnBhc3RlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN0eE1lbnVTdWJzY3JpcHRpb24pXHJcbiAgICAgICAgICAgIHRoaXMuY3R4TWVudVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPT0gdGhpcylcclxuICAgICAgICAgICAgdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGxldCBuZXdTZWFyY2hWaWV3ID0gY2hhbmdlc1snU2VhcmNoVmlldyddO1xyXG4gICAgICAgIGlmIChuZXdTZWFyY2hWaWV3ICYmIHRoaXMuU2VhcmNoVmlldylcclxuICAgICAgICAgICAgdGhpcy5hcnJheVB1bHNhbnRpID0gdGhpcy51dGlsaXRpZXNfSC5nZXRQYWdlc0FycmF5KDYsIHRoaXMuU2VhcmNoVmlldy5wYWdlLCB0aGlzLlNlYXJjaFZpZXcucGFnZXMgfHwgMSwgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50LCB0aGlzLlNlYXJjaFZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbik6IHZvaWQgeyB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuOyB9XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKTogdm9pZCB7IH1cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY2hhbmdlZChjbGVhckl0ZW1zOiBib29sZWFuID0gZmFsc2UpIHsgXHJcbiAgICAgICAgaWYoY2xlYXJJdGVtcyAmJiB0aGlzLnZpZXdNb2RlKVxyXG4gICAgICAgICAgICAoPEFwcFNlYXJjaDxhbnk+PnRoaXMuVmlldykuaXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5WaWV3KTsgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBhc3luYyB3cml0ZVZhbHVlKG9iajogYW55LCB0aHJvdHRsZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLlZpZXcgPSBvYmogPyBvYmogOiBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCAmJiB0aHJvdHRsZSkge1xyXG4gICAgICAgICAgICBpZih0aGlzLmNhbGxUaW1lb3V0KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2FsbFRpbWVvdXQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLndyaXRlVmFsdWUob2JqLCBmYWxzZSk7IH0sIHRoaXMuU2VhcmNoVGhyb3R0bGUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgICAgLy8gTWkgw6ggYXJyaXZhdGEgbCdBcHBTZWFyY2ggcXVpbmRpIGRpIHNpY3VybyBub24gaG8gdW5hIHJpY2VyY2EgaW4gcHJvZ3Jlc3NcclxuICAgICAgICB0aGlzLnJlc2VhcmNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuVmlldyAmJiAhdGhpcy5TZWFyY2hWaWV3KSB7XHJcbiAgICAgICAgICAgIC8vIFN1IHZpZXcgbnVsbGEgZXZpdG8gZGkgZmFyZSBwcmVzc29jaMOpIHF1YWxzaWFzaSBjb3NhLiBTZSBhcnJpdmEgdW4gbnVsbCBkZXZvIGFuY2hlIGFzc2ljdXJhcm1pIGRpIG5vbiBtb3N0cmFyZSBudWxsYVxyXG4gICAgICAgICAgICB0aGlzLmJvdW5kU291cmNlID0gdGhpcy5UTVBCb3VuZFNvdXJjZSB8fCBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFBlciBlc3NlcmUgc2ljdXJvIGNoZSBkb3BvIHVuIGJpbmQgZGkgb2dnZXR0aSBsYSBlcy10YWJsZSBhZ2dpb3JuaSBsYSBncmFmaWNhXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZSBwZXIgc2JhZ2xpbyBsJ29nZ2V0dG8gY2hlIG1pIGFycml2YSBub24gw6ggdGlwaXp6YXRvIChpbnN0YW5jZW9mIEFwcFNlYXJjaCByZXN0aXR1aXNjZSBmYWxzZSBhbmNoZSBzZSDDqCBkZWwgdGlwbyBnaXVzdG8pXHJcbiAgICAgICAgLy8gbG8gY29ycmVnZ28tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgdHlwZW9mICh0aGlzLlZpZXcgYXMgYW55KS5pdGVtc3BlcnBhZ2VvdmVycmlkZSAhPSAndW5kZWZpbmVkJyAmJiAhKHRoaXMuVmlldyBpbnN0YW5jZW9mIEFwcFNlYXJjaCkpXHJcbiAgICAgICAgICAgICh0aGlzLlZpZXcgYXMgYW55KS5fX3Byb3RvX18gPSBuZXcgQXBwU2VhcmNoKCk7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5TZWFyY2hWaWV3ICYmIHR5cGVvZiAodGhpcy5TZWFyY2hWaWV3IGFzIGFueSkuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgIT0gJ3VuZGVmaW5lZCcgJiYgISh0aGlzLlNlYXJjaFZpZXcgaW5zdGFuY2VvZiBBcHBTZWFyY2gpKVxyXG4gICAgICAgICAgICAodGhpcy5TZWFyY2hWaWV3IGFzIGFueSkuX19wcm90b19fID0gbmV3IEFwcFNlYXJjaCgpO1xyXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVmlldyAmJiB0aGlzLlZpZXcgaW5zdGFuY2VvZiBBcHBTZWFyY2gpIHtcclxuICAgICAgICAgICAgLy8gU2UgY2FtYmlhIGwnb2dnZXR0byBpbnRlcm8gc2lnbmlmaWNhIGNoZSBobyByaW1hbmRhdG8gbGEgcmljZXJjYVxyXG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ3ZpZXcnKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBmaXJzdEl0ZW1Hcm91cE9yTm9Hcm91cGluZyA9ICh0aGlzLlZpZXcucmVxdWVzdGVkZ3JvdXBzPy5sZW5ndGggfHwgMCkgPT0gMDtcclxuXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBTZSB2ZW5nbyBkYSB1bmEgcmljZXJjYSBpbnRlcm5hIG1hbnRlbmdvIGxvIHN0YXRvIGRpIHNlbGV6aW9uZSBwcmVjZWRlbnRlIChxdWluZGkgc3UgY2FtYmlvIHBhZ2luYSwgY2FtYmlvIGlwcCwgZWNjLi4uKVxyXG4gICAgICAgICAgICAvLyBzZSBpbnZlY2UgbCd1dGVudGUgaGEgZmF0dG8gdW5hIHJpY2VyY2EgbHVpIChxdWluZGkgY2FtYmlhbmRvIGZpbHRyaSksIHNlY2NvIGxlIGluZm8gZGkgc2VsZXppb25lXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5WaWV3LnNlbGVjdGlvbiB8fCAoIXRoaXMuVmlldy5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgJiYgZmlyc3RJdGVtR3JvdXBPck5vR3JvdXBpbmcpIHx8ICF0aGlzLlVzZVNlbGVjdGlvbkNhY2hlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uQ2FjaGVzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlZpZXcuc2VsZWN0aW9uID0gbmV3IEl0ZW1zU2VsZWN0aW9uKFtdKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQodGhpcy5WaWV3LnNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuVmlldy5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlY3VwZXJvIFByZWZlcmVuY2VcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2F2ZVByZWZlcmVuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmdDb250cm9sLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgYXZlcmUgdW4gJ25hbWUnIHBlciBxdWVzdGEgdGFiZWxsYVwiKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnByZWZTZXJ2aWNlKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb24gcG9zc28gdXRpbGl6emFyZSBsZSBwcmVmZXJlbmNlIHNlbnphIGNoZSBpbCBwYWNjaGV0dG8gQGVzZmFlbnphL3ByZWZlcmVuY2VzIHNpYSBpbnN0YWxsYXRvXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZWZzID0gYXdhaXQgdGhpcy5wcmVmU2VydmljZS5nZXRJdGVtPHsgY29sdW1uczogc3RyaW5nW10sIGNvbHVtbl9vcmRlcmluZzogc3RyaW5nW10sIG9yZGVyczogQXBwT3JkZXJpbmdbXSB9Pig8c3RyaW5nPnRoaXMubmdDb250cm9sLm5hbWUpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2kgbGEgZ2VudGUgc2kgbWV0dGEgYSBzcGFtbWFyZSByZWZyZXNoIGNvbiBuZ2lmIHN0cmFuaSBzdWxsJ2VzdGFibGUgY3JlYW5kb2xhIGUgZGlzdHJ1Z2dlbmRvbGEgTiB2b2x0ZSBhbCBzZWNvbmRvIG5lbCB0ZW1wbyBjaGUgY2kgbWV0dGVcclxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRpcmFyZSBzdSBsZSBwcmVmZXJlbmNlIGRhIHF1aSBzb3ByYSBsYSBWaWV3IHBvdHJlYmJlIGVzc2VyZSBjYW1iaWF0YVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZpZXcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWRQcmVmcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBvc2l0b3J5OiBzdHJpbmdbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZTogc3RyaW5nW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5WaWV3LnJlcG9ydF9jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gdGhpcy5WaWV3LnJlcG9ydF9jb2x1bW5zLm1hcCh0ID0+IHQuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gdGhpcy5WaWV3LmNvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCByZXBvcnQgZGV2byBjb250cm9sbGFyZSBjaGUgdHV0dGUgbGUgY29sb25uZSBzYWx2YXRlIGZhY2NpYW5vIHBhcnRlIGRlbGxhIHZpc3RhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCBub3JtYWxlIGludmVjZSBzZSBsZSBwcmVmZXJlbnplIGZhbm5vIHJpZmVyaW1lbnRvIGEgZGVsbGUgY29sb25uZSBjaGUgaW8gbm9uIGhvIG5lbGxhIFZpZXcgYXR0dWFsZSBzaWduaWZpY2EgY2hlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0byBmYWNlbmRvIHJpZmVyaW1lbnRvIGEgdW5hIHZlcnNpb25lIHZlY2NoaWEgZGVsbCdlcy10YWJsZSwgcXVpbmRpIG5vbiBmYWNjaW8gb3BlcmF6aW9uaVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkuaW5kZXhPZihzb3VyY2VbaV0pID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlIG1pIGJhc28gc3UgZGlyZXR0aXZlIG1hIG5lbGxlIHByZWZlcmVuY2Ugw6ggcHJlc2VudGUgYW5jaGUgc29sbyB1bmEgY29sb25uYSBub24gcHJlc2VudGUgbmVsbGUgZGlyZXR0aXZlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2dW9sIGRpcmUgY2hlIGwnZXMtdGFibGUgw6ggY2FtYmlhdGEgcXVpbmRpIG5vbiBpbXBvc3RvIHByZWZlcmVuY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkVzVGhzRGlyZWN0aXZlPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcG9zaXRvcnkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudGhzQ2FjaGVbcmVwb3NpdG9yeVtpXV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3LmNvbHVtbnMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5fb3JkZXJpbmcgPSBwcmVmcz8uY29sdW1uX29yZGVyaW5nIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgbGUgcHJlZiBzb25vIG51bGxlIG5vbiBzb3ZyYXNjcml2byBnbGkgb3JkaW5pIGRhdG8gY2hlIHBvdHJlYmJlIHNlcnZpcmUgbWV0dGVyZSBkZWdsaSBvcmRpbmFtZW50aSBkaSBkZWZhdWx0IGxhdG8gdHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5vcmRlcnMgPSBwcmVmcz8ub3JkZXJzIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBMYSBwYWdpbmF6aW9uZSBkZXZvIGZhcmxhIHNvbGFtZW50ZSBxdWFuZG8gcmljaGllZG8gbyB1biBncnVwcG8gcHJpbmNpcGFsZSAoc2Ugc29ubyBpbiByb3cgZ3JvdXBpbmcpIG8gc2Ugbm9uIHJpY2hpZWRvIGdydXBwaSAoaW4gdHV0dGkgbGdpIGFsdHJpIGNhc2kpXHJcbiAgICAgICAgICAgIGlmIChmaXJzdEl0ZW1Hcm91cE9yTm9Hcm91cGluZylcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJyYXlQdWxzYW50aSA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCB0aGlzLlZpZXcucGFnZSwgdGhpcy5WaWV3LnBhZ2VzIHx8IDEsIHRoaXMuVmlldy5pdGVtcy5sZW5ndGgsIHRoaXMuVmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuVmlldyAmJiAodGhpcy5WaWV3Lmxlbmd0aCAhPSBudWxsICYmIHRoaXMuVmlldy5sZW5ndGggIT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2FycmF5Jyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuVXNlU2VsZWN0aW9uQ2FjaGUgfHwgIXRoaXMuYXJyYXltb2RlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uQ2FjaGVzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbiA9IG5ldyBJdGVtc1NlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUmVjdXBlcm8gUHJlZmVyZW5jZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5TYXZlUHJlZmVyZW5jZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wubmFtZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBhdmVyZSB1biAnbmFtZScgcGVyIHF1ZXN0YSB0YWJlbGxhXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucHJlZlNlcnZpY2UpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgY2hlIGlsIHBhY2NoZXR0byBAZXNmYWVuemEvcHJlZmVyZW5jZXMgc2lhIGluc3RhbGxhdG9cIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZnMgPSBhd2FpdCB0aGlzLnByZWZTZXJ2aWNlLmdldEl0ZW08eyBjb2x1bW5zOiBzdHJpbmdbXSwgY29sdW1uX29yZGVyaW5nOiBzdHJpbmdbXSwgb3JkZXJzOiBBcHBPcmRlcmluZ1tdIH0+KDxzdHJpbmc+dGhpcy5uZ0NvbnRyb2wubmFtZSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZFByZWZzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwb3NpdG9yeTogc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZTogc3RyaW5nW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucy5tYXAodCA9PiB0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0aGlzLlZpZXcuY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCByZXBvcnQgYWdnaW9ybm8gbGUgcHJlZmVyZW56ZSBzb2xvIHNlIGMnw6ggYWxtZW5vIHVuYSBjb2xvbm5hLCBhbHRyaW1lbnRpIHZ1b2wgZGlyZSBjaGUgc2kgcGFydGUgZGEgdnVvdGlcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb24gdHV0dGUgbGUgY29sb25uZSBkaXNwb25pYmlsaVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucyAmJiAoc291cmNlPy5sZW5ndGggfHwgMCkgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCBub3JtYWxlIGludmVjZSBzZSBsZSBwcmVmZXJlbnplIGZhbm5vIHJpZmVyaW1lbnRvIGEgZGVsbGUgY29sb25uZSBjaGUgaW8gbm9uIGhvIG5lbGxhIFZpZXcgYXR0dWFsZSBzaWduaWZpY2EgY2hlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvIGZhY2VuZG8gcmlmZXJpbWVudG8gYSB1bmEgdmVyc2lvbmUgdmVjY2hpYSBkZWxsJ2VzLXRhYmxlLCBxdWluZGkgbm9uIGZvY2NpbyBvcGVyYXppb25pXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkuaW5kZXhPZihzb3VyY2VbaV0pID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJlZnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5zID0gcHJlZnM/LmNvbHVtbnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5fb3JkZXJpbmcgPSBwcmVmcz8uY29sdW1uX29yZGVyaW5nIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgbGUgcHJlZiBzb25vIG51bGxlIG5vbiBzb3ZyYXNjcml2byBnbGkgb3JkaW5pIGRhdG8gY2hlIHBvdHJlYmJlIHNlcnZpcmUgbWV0dGVyZSBkZWdsaSBvcmRpbmFtZW50aSBkaSBkZWZhdWx0IGxhdG8gdHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcub3JkZXJzID0gcHJlZnM/Lm9yZGVycyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlYXJjaFZpZXcpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgdGhpcy5TZWFyY2hWaWV3LnBhZ2UsIHRoaXMuU2VhcmNoVmlldy5wYWdlcyB8fCAxLCB0aGlzLlNlYXJjaFZpZXcuaXRlbXMubGVuZ3RoLCB0aGlzLlNlYXJjaFZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZUNvbnRleHQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb3N0Qm91bmRTb3VyY2VDYWxjdWxhdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5WaWV3ICYmICF0aGlzLlZpZXcuc2VsZnNlYXJjaCAmJiB0aGlzLkVzVGFibGVIYW5kbGVkU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmlldy5zZWxmc2VhcmNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoUmVxdWVzdC5lbWl0KGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3LnNlbGZzZWFyY2ggJiYgdGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLlZpZXcuc2VsZnNlYXJjaCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgcGVyIGlsIGJvZHkgY2hlIGRvdnJlYmJlIGV2aXRhcmUgaWwgOTAlIGRlbGxlIGNoYW5nZSBkZXRlY3Rpb24gKi9cclxuICAgIHB1YmxpYyBib2R5VHJhY2tCeSA9IChfOiBudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbS5faGFzaDtcclxuXHJcbiAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBnZW5lcmljYSBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgY2hlIGhhbm5vIGlsIGNhbXBvIGlkICovXHJcbiAgICBwdWJsaWMgaWRUcmFja0J5ID0gKF86IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtLmlkO1xyXG5cclxuICAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBnZW5lcmljYSBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgY2hlIGhhbm5vIGlsIGNhbXBvIFByb3BlcnR5TmFtZSAqL1xyXG4gICAgcHVibGljIFByb3BlcnR5TmFtZVRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0uUHJvcGVydHlOYW1lO1xyXG5cclxuICAgIC8qKiBGdW56aW9uZSBkaSB0cmFja2J5IGdlbmVyaWNhIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBjaGUgaGFubm8gaWwgY2FtcG8gSUQgKi9cclxuICAgIHB1YmxpYyBJRFRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0uSUQ7XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgZ2VuZXJpY2EgcGVyIHR1dHRpIGdsaSBvZ2dldHRpIGNoZSBoYW5ubyBpbCBjYW1wbyBJRCAqL1xyXG4gICAgcHVibGljIHZhbFRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0udmFsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VjY2Vzc2l2YW1lbnRlIGFsIGJpbmQgZGVsIG51b3ZvIGlucHV0IHF1ZXN0YSBmdW56aW9uZSBzaSBvY2N1cGEgZGkgZmluYWxpenphcmUgdHV0dGkgaSBwYXJhbWV0cmkgZGkgZnVuemlvbmFtZW50byBkZWxsJ2VzLXRhYmxlIFxyXG4gICAgICogaW4gYmFzZSBhIElucHV0IC0gTW9kZWxsbywgZSBxdWFsc2lhc2kgYWx0cmEgY29zYSBwb3NzYSBzZXJ2aXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmluYWxpemVDb250ZXh0KCkge1xyXG4gICAgICAgIGxldCB2aWV3Q2FzdGVkID0gdGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+O1xyXG5cclxuICAgICAgICBsZXQgaGFzUm93R3JvdXBzID0gdmlld0Nhc3RlZCAmJiAodmlld0Nhc3RlZC5ncm91cGluZ3MgJiYgdmlld0Nhc3RlZC5ncm91cGluZ3MuZmlsdGVyKHQgPT4gIXQuYWdncmVnYXRpb24pLmxlbmd0aCA+IDApIHx8ICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLkVzVGhzRGlyZWN0aXZlLnNvbWUodCA9PiB0LnRoR3JvdXApKTtcclxuXHJcbiAgICAgICAgLy8gU2UgaG8gZGVpIGdydXBwaSBpbiBtb2RhbGl0w6AgYXJyYXkgZGV2byBzaXN0ZW1hcmUgdW4gcG8nIGRpIHZhcmlhYmlsaSBjaGUgZGl2ZW50YW5vIGluc2Vuc2F0ZVxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiBoYXNSb3dHcm91cHMpXHJcbiAgICAgICAgICAgIHRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFJpZW1waW1lbnRvIGRlbGxhIFRNUEJvdW5kU291cmNlIGNvbiBnbGkgb2dnZXR0aSBjaGUgdmVycmFubm8gcG9pIG1vc3RyYXRpIGFkIGludGVyZmFjY2lhXHJcbiAgICAgICAgdGhpcy5UTVBCb3VuZFNvdXJjZSA9IHRoaXMuaXRlbXNfSC5nZXRJdGVtc0J5TW9kZShmYWxzZSwgIXRoaXMuaW50ZXJuYWxXcml0ZUNhbGwpO1xyXG5cclxuICAgICAgICAvLyBTZSBobyB1bmEgZ2VyYXJjaGlhLCBhc3NlZ25vIGkgbGl2ZWxsaSBnZXJhcmNoaWNpIGFsbGEgVE1QQm91bmRTb3VyY2VcclxuICAgICAgICBpZiAodGhpcy5IaWVyYXJjaHkgJiYgIWhhc1Jvd0dyb3VwcylcclxuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlNb2RlX0guYXNzaWduSGllcmFyY2h5TGV2ZWxzKHRoaXMuVE1QQm91bmRTb3VyY2UpO1xyXG5cclxuICAgICAgICAvLyBMJ2hhc2hpbmcgZGVnbGkgb2dnZXR0aSBsbyBmYWNjaW8gYSBwcmVzY2luZGVyZVxyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaCh0aGlzLlRNUEJvdW5kU291cmNlKTtcclxuXHJcbiAgICAgICAgLy8gQXNzZWdubyBhIHVuYSB2YXJpYWJpbGUgbWlhIGwnZXZlbnR1YWxlIG92ZXJyaWRlIHBlciBsYSBjbGFzc2UgZGVsbGEgcmlnYVxyXG4gICAgICAgIC8vIFNlIHBvaSBzb25vIGluIG1vZGFsaXTDoCBnZXJhcmNoaWNhIGluaWV0dG8gYW5jaGUgbGEgY2xhc3NlIHBlciBsYSBjb25maWd1cmF6aW9uZSBkZWwgbGl2ZWxsbyBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCh0aGlzLlRNUEJvdW5kU291cmNlICYmIHRoaXMuUm93Q2xhc3NBc3NpZ25lcikgfHwgdGhpcy5IaWVyYXJjaHkpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlRNUEJvdW5kU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuVE1QQm91bmRTb3VyY2VbaV07XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyA9IHRoaXMuUm93Q2xhc3NBc3NpZ25lciA/IHRoaXMuUm93Q2xhc3NBc3NpZ25lcihpdGVtKSA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyArPSB0aGlzLkhpZXJhcmNoeSA/IFwiIGVzdC1yb3ctbHZsLVwiICsgaXRlbS5fbGV2ZWwgOiBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZW5lcmEgbGUgaW5mb3JtemlvbmkgZGkgcGFnaW5hemlvbmUgcGVyIGxhIHZpc3RhIGdsb2JhbGUgZGVsbCdlcy10YWJsZSAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cFBhZ2luZ0luZm9ybWF0aW9ucygpIHtcclxuXHJcbiAgICAgICAgLy8gRGVmYXVsdCBjaGUgdmFsZ29ubyBkaSBiYXNlLCBwb2kgZXZlbnR1YWxtZW50ZSBtb2RkYXRpIGRhbGxlIGZ1bnppb25pIHNvdHRvXHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gIXRoaXMuSGlkZVBhZ2luZ0NvdW50O1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gIXRoaXMuSGlkZVBhZ2luZ0J1dHRvbnM7XHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9ICF0aGlzLkhpZGVQYWdpbmdcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLlVzZUFycmF5TW9kZVBhZ2luZyAmJiAhdGhpcy5TZWFyY2hWaWV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgdGhpcy5WaWV3Lmxlbmd0aCA+IDEwO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3ID0gdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFycmF5TW9kZSAmJiAoIXRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nIHx8IHRoaXMuU2VhcmNoVmlldykpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVmlldyA9IHRoaXMuU2VhcmNoVmlld1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IHRoaXMuU2VhcmNoVmlldy5vYmplY3Rjb3VudCB8fCAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDBcclxuXHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgKHRoaXMuVmlldy5sZW5ndGggPiAxMCB8fCAodGhpcy5TZWFyY2hWaWV3Py5vYmplY3Rjb3VudCB8fCAwKSA+IDEwKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50IHx8ICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3Lmxlbmd0aCkgfHwgKHRoaXMuU2VhcmNoVmlldyAmJiB0aGlzLlNlYXJjaFZpZXcub2JqZWN0Y291bnQgJiYgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50ICE9IC0xKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmcgJiYgKHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zIHx8IHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmdPcHRpb25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlld01vZGUpIHtcclxuICAgICAgICAgICAgbGV0IHRtcFZpZXcgPSB0aGlzLk1haW5Hcm91cFZpZXcgfHwgdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICBsZXQgY291bnQgPSB0bXBWaWV3Py5ncm91cGNvdW50IHx8IHRtcFZpZXc/Lm9iamVjdGNvdW50O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TZWFyY2hlcyA9IHRtcFZpZXc/Lmdyb3VwY291bnQgIT0gbnVsbCAmJiB0bXBWaWV3Py5ncm91cGNvdW50ICE9IHVuZGVmaW5lZCA/ICdncm91cHMnIDogJ2l0ZW1zJztcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IGNvdW50IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlZpZXcgPSB0bXBWaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgfHwgKHRtcFZpZXcgJiYgY291bnQgJiYgY291bnQgIT0gLTEpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmICh0bXBWaWV3LnBhZ2luZ2F2YWlsYWJsZSB8fCB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBsYW5jaWF0byBkb3BvIGNoZSBsYSBzb3JnZW50ZSBkYXRpIMOoIHN0YXRhIGNvcnJldHRhbWVudGUgYmluZGF0YSwgc2kgb2NjdXBhIGRpIHJpY2FsY29sYXJlIHR1dHRvIGNpw7IgY2hlIHNlcnZlXHJcbiAgICAgKiBhbGwnZXMtdGFibGUgcGVyIHJlbmRlcml6emFyZSBpIHZhbG9yaSBkYSBtb3N0cmFyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc3RCb3VuZFNvdXJjZUNhbGN1bGF0aW9uKCkge1xyXG4gICAgICAgIC8vIFJlc2V0dG8gdHV0dG8gdHJhbm5lIFJvd1REcyBlIFJvd1RIcyBwZXIgZXZpdGFyZSBmbGlja2VyaW5nLiBSb3dURHMgZSBSb3dUSHMgc2FyYW5ubyBtb2RpZmljYXRlIGFsbCdpbnRlcm5vIGRlbCBwcm9zc2ltbyBjaWNsbyBkaSBDRFxyXG4gICAgICAgIHRoaXMuUm93Q29udGV4dHMgPSBbXTtcclxuICAgICAgICB0aGlzLk9yZGVyRGlyZWN0aXZlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbUlEID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFBvc3RCb3VuZFNvdXJjZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBQZXIgcG90ZXIgZGlzdGluZ3VlcmUgbGUgY2hpYW1hdGUgYSBxdWVzdG8gbWV0b2RvOiBEb3BvIGlsIHNldFRpbWVvdXQgc2UgdXNvIGdsaSBFc1RkL0VzVGggdmVjY2hpLCBzZW56YSBpbCBzZXRUaW1lb3V0IHNlIHVzbyBsZSBudW92ZSBkaXJldHRpdmUgKi9cclxuICAgIHByaXZhdGUgaW50ZXJuYWxQb3N0Qm91bmRTb3VyY2UoKSB7XHJcbiAgICAgICAgbGV0IFZpZXcgPSB0aGlzLlZpZXc7XHJcblxyXG4gICAgICAgIGxldCB0ZHNEID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5sZW5ndGggPT0gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUZHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGRzRGlyZWN0aXZlIDogdGhpcy5Fc1Rkc0RpcmVjdGl2ZSA6IHRoaXMuRXNUZHNEaXJlY3RpdmU7XHJcbiAgICAgICAgbGV0IHRoc0QgPSB0aGlzLkVzVGhzRGlyZWN0aXZlLmxlbmd0aCA9PSAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Roc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUaHNEaXJlY3RpdmUgOiB0aGlzLkVzVGhzRGlyZWN0aXZlIDogdGhpcy5Fc1Roc0RpcmVjdGl2ZTtcclxuXHJcbiAgICAgICAgbGV0IHRocyA9IHRoc0QgJiYgdGhzRC5sZW5ndGggPiAwID8gdGhzRC50b0FycmF5KCkgOiBbXTtcclxuICAgICAgICBsZXQgdGRzID0gdGRzRCAmJiB0ZHNELmxlbmd0aCA+IDAgPyB0ZHNELnRvQXJyYXkoKSA6IFtdO1xyXG5cclxuICAgICAgICAvLyBTZSBub24gaG8gY29sb25uZSBkaW5hbWljaGUgbWEgc29ubyBpbiBtb2RhbGl0w6AgZGluYW1pY2EgKGxvIGNhcGlzY28gcGVyY2jDqSBjJ8OoIHVuYSB2aWV3IHBpZW5hIGRpIGdlbmVyaWNpdGVtKSBtZXR0byBpbCBkZWZhdWx0IGRlbGxlIGNvbG9ubmVcclxuICAgICAgICB0aGlzLmR5bmFtaWNNb2RlX0guZXZlbnR1YWxseVJldmlld0R5bmFtaWNDb2x1bW5zKCk7XHJcblxyXG4gICAgICAgIC8vIEdlc3Rpc2NlIGxhIHJpY2hpZXN0YSBwZXIgZ3J1cHBpIG8gcGVyIHNpbmdvbGkgb2dnZXR0aVxyXG4gICAgICAgIHRoaXMuYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHMoVmlldyk7XHJcblxyXG4gICAgICAgIC8vIFF1ZXN0byBkZXYnZXNzZXJlIHBlciBmb3J6YSBsYW5jaWF0byBkb3BvICoqYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHMqKiBkYXRvIGNoZSDDqCBsw6wgY2hlIGFsY3VuZSBjb3NlIHZlbmdvbm8gdmFsb3JpenphdGVcclxuICAgICAgICB0aGlzLnNldHVwUGFnaW5nSW5mb3JtYXRpb25zKCk7XHJcblxyXG4gICAgICAgIC8vIE1vbHRlIGNvc2Ugc29ubyBvdnZpYW1lbnRlIGRpc3BvbmliaWxpIHNvbG8gaW4gbW9kYWxpdMOgIFZpZXdcclxuICAgICAgICBpZiAoKHRoaXMudmlld01vZGUgfHwgdGhpcy5hcnJheU1vZGUpICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHtcclxuICAgICAgICAgICAgbGV0IHZpZXcgPSB0aGlzLnZpZXdNb2RlID8gVmlldyBhcyBBcHBTZWFyY2g8YW55PiA6IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBpdGVtc0FuZEdyb3VwcyA9IHRoaXMudmlld01vZGUgPyBbLi4uKHZpZXcuaXRlbXMgfHwgW10pLCAuLi4odmlldy5ncm91cHMgfHwgW10pXSA6IFZpZXcgYXMgYW55W107XHJcbiAgICAgICAgICAgIGxldCBzaSA9IHRoaXMudmlld01vZGUgPyB2aWV3LnNlbGVjdGlvbiA6IHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAvLyBOLkI6IFJpc3BldHRhcmUgbCdvcmRpbmUgZGkgcXVlc3RlIDMgbWFjcm9jYXRlZ29yaWUgw6ggVklUQUxFXHJcblxyXG4gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICBTaXN0ZW1hemlvbmkgZGkgVEgsIFRELCBlIHZpc2liaWxpdMOgIHZhcmllICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICAgICAgICAgICAgLy8gU2UgaG8gZGVmaW5pemlvbmkgZGluYW1pY2hlLCBwcmltYSBkaSBxdWFsc2lhc2kgYWx0cmEgY29zYSBkZXZvIHRyYXNmb3JtYXJsZSBpbiB0aC90ZCBpbiBtb2RvIGNoZSBwb2kgaWwgY29kaWNlIHF1aSBzb3R0byBmYWNjaWEgbGUgc3VlIG1hZ2llXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5hcnJheU1vZGUgJiYgdGhpcy5EeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb24/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcIkdlbmVyYXRpbmcgdGhzIGFuZCB0ZHMgZnJvbSBEeW5hbWljIGRlZmluaXRpb25cIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5keW5hbWljTW9kZV9ILmVtaXRUaHNBbmRUZHNCYXNlZE9uRHluYW1pY0RlZmluaXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRocyA9IHJldC50aHM7XHJcbiAgICAgICAgICAgICAgICB0ZHMgPSByZXQudGRzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBHZXN0aW9uZSBkZWxsZSB2aWV3IGluIG1vZGFsaXTDoCByZXBvcnQsIGkgdGggZSBpIHRkIHZlbmdvbm8gcmlnZW5lcmF0aSBkYWxsZSBjb25maWd1cmF6aW9uaSBkZWxsYSB2aWV3XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5hcnJheU1vZGUgJiYgdmlldy5yZXBvcnRfY29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwiR2VuZXJhdGluZyB0aHMgYW5kIHRkcyBmcm9tIHJlcG9ydCByZXN1bHRzXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJldCA9IHRoaXMucmVwb3J0TW9kZV9ILmdlbmVyYXRlVGhzQW5kVGRzRnJvbVZpZXcodmlldyk7XHJcbiAgICAgICAgICAgICAgICB0aHMgPSByZXQudGhzO1xyXG4gICAgICAgICAgICAgICAgdGRzID0gcmV0LnRkcztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gRXNwYW5kbyBpIHRoIGUgaSB0ZCBtdWx0aXBsaSBkdXBsaWNhbmRvbGlcclxuICAgICAgICAgICAgbGV0IHJldCA9IHRoaXMuY29sdW1uTWV0YWRhdGFfSC5leHBhbmRNdWx0aVRoc0FuZFRkcyh0aHMsIHRkcywgaXRlbXNBbmRHcm91cHMpO1xyXG4gICAgICAgICAgICB0aHMgPSByZXQuZXhwVGhzO1xyXG4gICAgICAgICAgICB0ZHMgPSByZXQuZXhwVGRzO1xyXG5cclxuICAgICAgICAgICAgLy8gR2VuZXJvIGxhIGNhY2hlIGRlaSB0aCBkYSB1c2FyZSBkYSBxdWkgaW4gcG9pLCBkb3BvIGF2ZXJnbGkgbGFzY2lhdG8gZmFyZSBsZSBzdWUgY29zZSBpbiBjYXNvIGNpIHNpYW5vIGRlaSBtdWx0aSBvIGRlaSByZXBvcnRcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuICAgICAgICAgICAgICAgIHRoaXMudGhzQ2FjaGVbdGgudGhdID0gdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFByZXBhc3NhZ2dpbyBwZXIgdGlyYXJlIGZ1b3JpIHR1dHRlIGxlIGluZm8gdXRpbGkgc3VnbGkgaGVhZGVycyBpbiBtb2RvIGRhIG5vbiByaWNhY29sYXJzZWxpIHNlbXByZSBkb3BvXHJcbiAgICAgICAgICAgIGxldCBoSSA9IHRoaXMuY29sdW1uTWV0YWRhdGFfSC5ldmFsdWF0ZUhlYWRlcnNHcm91cGluZ0luZm9zKHRocyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5hcnJheU1vZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYXJyYXkgbm9uIGhvIHVuIGJhY2tlbmQuLi5cclxuICAgICAgICAgICAgICAgIHRoaXMucm93R3JvdXBpbmdfSC5hcnJheU1vZGVSZXZpZXdHcm91cGluZ3MoaEkubGVhZnMpOyAgLy8gLi4uIGkgcmFnZ3J1cHBhbWVudGkgbGkgZGV2byBmYXJlIGxhdG8gY2xpZW50XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0gucmV2aWV3Q29sdW1uc0xpc3QoaEkubGVhZnMpOyAgICAgICAgICAgICAgICAgICAgICAvLyBBZ2dpb3JuYSBsYSBsaXN0YSBkZWxsZSBjb2xvbm5lIGRhIG1vc3RyYXJlIG5lbGxhIGRpYWxvZyBwZXIgb3JkaW5hbWVudG8gZWNjXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hbGlnbkNvbHVtbnNJZkxvYWRlZFZpZXcodmlldyk7ICAgICAgICAgICAgICAgICAgIC8vIFNlIHN0byBjYXJpY2FuZG8gdW5hIFZpZXcgZGEgaG90cG90YXRvIChxdWluZGkgY29uIHNhdmVkc3RhdGUgPSB0cnVlKSByaWFsbGluZW8gbGEgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZSBlIGlsIGxvcm8gb3JkaW5lLlxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0gubW92ZUZpeGVkQ29sdW1uc0F0VGhlQmVnaW5uaW5nKGhJLmxlYWZzLCB0ZHMpOyAgICAvLyBTcG9zdG8gdHV0dGUgbGUgY29zZSBmaXhlZCBhbGwnaW5pemlvIGluIG1vZG8gY2hlIGxhIGNyZWF6aW9uZSBkaSB0aCBlIHRkIHNpYSBwacO5IHNuZWxsYSAoVXRpbGl6emEgbGUgQ29sdW1uc0xpc3QsIHF1aW5kaSBkZXYnZXNzZXJlIHJpY2hpYW1hdGEgUElSTUEgZGkgcmV2aWV3Q29sdW1uc0xpc3QpXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hbGlnbkhlYWRlcnNPcmRlcmluZyhoSS5sZWFmcywgdmlldyk7ICAgICAgICAgICAgIC8vIEFsbGluZW8gZ2xpIG9yZGluYW1lbnRpIGFnbGkgaGVhZGVyXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5yZWZyZXNoQ29sdW1uc1Zpc2liaWxpdHkoaEkubGVhZnMsIHRkcywgdmlldyk7ICAgIC8vIExhdm9ybyBzdWkgVEggZWQgZXZlbnR1YWxtZW50ZSBtb2RpZmljbyBsYSB2aXNpYmlsaXTDoCBhbmNoZSBkZWkgVEQuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5ldmFsdWF0ZVBpbm5lZENvbHVtbnNXaWR0aCgpOyAgICAgICAgICAgICAgICAgICAgIC8vIFNlIHNvbm8gcHJlc2VudGkgY29sb25uZSBwaW5uYXRlIHZhbHV0YSBsYSBkaW1lbnNpb25lIGRlbCBjb250ZW5pdG9yZVxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZ2VuZXJhdGVEZWZhdWx0T3JkZXIoaEkubGVhZnMsIHZpZXcpOyAgICAgICAgICAgICAvLyBHZW5lcm8gbGUgZGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvLCBjaGUgc2lhbm8gZGVmYXVsdCBvIGRlcml2YW50aSBkYWxsYSBBcHBTZWFyY2hcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV2YWx1YXRlSGVhZGVyR3JvdXBzKGhJKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsdXRvIGkgcmFnZ3J1cHBhbWVudGkgZGVnbGkgaGVhZGVyIHNlIHByZXNlbnRpXHJcblxyXG4gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICBHZW5lcmF6aW9uZSBiaW5kaW5nIHBlciByaWdoZSBlIGNvbG9ubmUgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblxyXG4gICAgICAgICAgICB0aGlzLmV2YWx1YXRlUm93VGhzKGhJLmxlYWZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYWNjb2xnbyBpIFRIXHJcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVSb3dUZHMoaEkubGVhZnMsIHRkcyk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhY2NvbGdvIGkgVEQgaW4gY29udGVzdGkgc2VwYXJhdGksIHVuIGNvbnRlc3RvIHBlciBvZ25pIGl0ZW0gbyBncnVwcG9cclxuXHJcbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgIFVsdGltaSBhZ2dpdXN0bWFlbnRpIGRlaSBiaW5kaW5nICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hcHBseU9yZGVyaW5nKHZpZXcsIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxpY28gbCdvcmRpbmFtZW50byBzdWxsZSBjb2xvbm5lIChub24gQVNDIERFU0MsIG1hIFwicHJpbWEgcXVlc3RhIG8gcXVlbGxhIGNvbG9ubmFcIilcclxuICAgICAgICAgICAgdGhpcy5Nb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sbGVnbyBUSCBlIFREIGFnZ2l1c3RhdGkgZmlubyBhZCBvcmEgYWxsZSB2YXJpYWJpbGkgZGkgQmluZGluZyBIVE1MXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIHNpKTsgICAgICAgICAgICAgICAgIC8vIFJpYWxsaW5lbyBsZSBpbmZvIGRpIHNlbGV6aW9uZSBkZWdsaSBlbGVtZW50aSBkZWxsYSBWaWV3XHJcblxyXG4gICAgICAgICAgICAvLyBWYWx1dGEgbG8gc3RhdG8gaW5pemlhbGUgZGkgc2VsZXppb25lIGEgcmFuZ2VcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5ldmFsdWF0ZVNpbmdsZUNlbGxTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIGhJLmxlYWZzLCB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5SZXNlYXJjaE5lZWRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVzZWFyY2hOZWVkZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgodGhpcy52aWV3TW9kZSB8fCB0aGlzLmFycmF5TW9kZSkgJiYgIXRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHtcclxuICAgICAgICAgICAgLy8gUmlhbGxpbmVvIGxlIGluZm8gZGkgc2VsZXppb25lIGRlZ2xpIGVsZW1lbnRpIGRlbGxhIFZpZXdcclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy52aWV3TW9kZSA/IChWaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pdGVtcyA6IFZpZXcgYXMgYW55W107XHJcbiAgICAgICAgICAgIGxldCBzaSA9IHRoaXMudmlld01vZGUgPyAoVmlldyBhcyBBcHBTZWFyY2g8YW55Pikuc2VsZWN0aW9uIDogdGhpcy5hcnJheW1vZGVTZWxlY3Rpb247XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXMsIHNpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFBlciBlc3NlcmUgc2ljdXJvIGNoZSBkb3BvIHVuIGJpbmQgZGkgb2dnZXR0aSBsYSBlcy10YWJsZSBhZ2dpb3JuaSBsYSBncmFmaWNhXHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgdGhpcy5GaXJzdEJpbmQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIGlsIGJpbmRpbmcgZGVnbGkgb2dnZXR0aSBwZXJ2ZW51dGkgZGEgcXVlc3RhIGNoaWFtYXRhIGNvbiBnbGkgb2dnZXR0aSBlZmZldHRpdmFtZW50ZSBkYSBncmFmaWNhcmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IHZpZXcgVmlldyBkYSBjdWkgc29ubyBhcnJpdmF0aSBnbGkgb2dnZXR0aS4gUHXDsiBlc3NlcmUgbyB1biBhcnJheSBzZSBzb25vIGluICoqYXJyYXlNb2RlKiogbyB1bmEgQXBwU2VhcmNoPFQ+IHNlIHNvbm8gaW4gKip2aWV3TW9kZSoqXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHModmlldzogYW55KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlRNUEJvdW5kU291cmNlIHx8IHRoaXMuVE1QQm91bmRTb3VyY2UubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5CYXNlSXRlbXNDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlIHx8ICF0aGlzLlVzZUN1c3RvbUNlbGxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgdmlldz8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBncm91cGluZ0tleXMgPSB2aWV3Py5ncm91cGluZ3M/LmZpbHRlcih0ID0+ICF0LmFnZ3JlZ2F0aW9uKT8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgaWYgKGdyb3VwaW5nS2V5cyA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgMDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yb3dHcm91cGluZ19ILmhhbmRsZU5ld0RhdGFPblJvd0dyb3VwaW5nKHZpZXcsIGdyb3VwaW5nS2V5cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1ldG9kbyByaWNoaWFtYXRvIHNvbG8gcXVhbmRvICoqVE1QUm93VERzKiogZSAqKlRNUFJvd1RIcyoqIHNvbm8gY29tcGxldGFtZW50ZSBnZW5lcmF0aSBlZCBhZ2dpdXN0YXRpLiBTZXJ2ZSBwZXIgY29sbGVnYXJsaSBhbGxlIHZhcmlhYmlsaSB1c2F0ZSBsYXRvIGJpbmRpbmcgSFRNTCAqL1xyXG4gICAgcHJpdmF0ZSBNb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpIHtcclxuXHJcbiAgICAgICAgdGhpcy5Sb3dURHMgPSB0aGlzLlRNUFJvd1REcztcclxuICAgICAgICB0aGlzLlJvd1RIcyA9IHRoaXMuVE1QUm93VEhzO1xyXG4gICAgICAgIHRoaXMuUm93VGhHcm91cHMgPSB0aGlzLlRNUFJvd1RoR3JvdXBzID8gdGhpcy5UTVBSb3dUaEdyb3Vwcy5yZXZlcnNlKCkgOiBudWxsO1xyXG4gICAgICAgIHRoaXMuRW1wdHlSb3dUZHMgPSB0aGlzLmlzRW1wdHkodGhpcy5Sb3dURHMpO1xyXG5cclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJpbGUgPSB0aGlzLlJvd1RIcy5maWx0ZXIodCA9PiB0LlZpc2libGUpLmxlbmd0aDtcclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkID0gdGhpcy5Sb3dUSHMuZmlsdGVyKHQgPT4gdC5WaXNpYmxlICYmICF0LlBpbm5lZCkubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuQ29sdW1ucy5HbG9iYWwgPSB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkICsgKHRoaXMuSGFzUGlubmVkQ29sdW1ucyA/IDEgOiAwKSArICh0aGlzLlNlbGVjdGlvbiA/IDEgOiAwKSArICh0aGlzLlJlbW92YWwgPyAxIDogMCkgKyAodGhpcy5FeHBvcnQgfHwgdGhpcy5IaWRkZW5Db2x1bW5zIHx8IHRoaXMuQ29sdW1uc09yZGVyaW5nIHx8IHRoaXMuQ29ybmVyTWVudU9wdGlvbnMgPyAxIDogMClcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBNZXRvZG8gcGVyIGNhcGlyZSBzZSB1biBvZ2dldHRvIMOoIGNvbXBsZXRhbWVudGUgdnVvdG8gXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkYSBjb250cm9sbGFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvZ2dldHRvIMOoIHZ1b3RvLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBpc0VtcHR5KG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yICh2YXIgXyBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmUgaW4gbWFuaWVyYSBhcmJpdHJhcmlhIGRlZ2xpIG9nZ2V0dGlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkYSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0ICoqdHJ1ZSoqIHBlciBzZWxlemlvbmFybGksICoqZmFsc2UqKiBwZXIgbm9uIHRvY2NhcmxpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTZWxlY3Rpb25TdGF0dXMoaXRlbXM6IGFueVtdLCBhbGw6IGJvb2xlYW4sIHNlbGVjdDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChhbGwpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLlNlbGVjdEFsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkltcG9zc2liaWxlIGltcG9zdGFyZSBsYSBzZWxlemlvbmUgY29uIGwnYWxsIHNlbGVjdGlvbiBxdWFuZG8gbCdJbnB1dCBTZWxlY3RBbGwgw6ggZmFsc2VcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBzaSA9ICh0aGlzLlZpZXcgYXMgQXBwU2VhcmNoPGFueT4pPy5zZWxlY3Rpb24gfHwgdGhpcy5hcnJheW1vZGVTZWxlY3Rpb247XHJcbiAgICAgICAgICAgIC8vc2UgZGVzZWxlemlvbm8gY29uIGF0dHVhbGUgc2VsZXppb25lIGFkIGFsbCBvIHNlIHNlbGV6aW9ubyBjb24gYXR0dWFsZSBzZWxlemlvbmUgbWFudWFsZSBkZXZvIHJpY2hpYW1hcmUgbGEgKipzZWxlY3RBbGxPclJlc2V0U2VsZWN0aW9uKipcclxuICAgICAgICAgICAgaWYgKChzaS5hbGwgJiYgIXNlbGVjdCkgfHwgKCFzaS5hbGwgJiYgc2VsZWN0KSlcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guc2VsZWN0QWxsT3JSZXNldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oaXRlbXMsIHNlbGVjdCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBnZXN0aXNjZSBpbCBjYW1iaW8gZGkgT3JkaW5hbWVudG8gZGkgdW5hIGNvbG9ubmFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgZGVsbGEgY29sb25uYSBpbCBjdWkgb3JpZG5hbWVudG8gw6ggY2FtYmlhdG9cclxuICAgICAqIEBwYXJhbSB7J0RFU0MnIHwgJ0FTQyd9IG9yZGVyIE51b3ZvIG9yZGluZSBzZWxlemlvbmF0byBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdGhPcmRlckNoYW5nZWQoaWQ6IHN0cmluZywgb3JkZXI/OiAnREVTQycgfCAnQVNDJykge1xyXG4gICAgICAgIGlmICghdGhpcy52aWV3TW9kZSAmJiAhdGhpcy5hcnJheU1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdPcmRlciBjaGFuZ2VkIG9uIGEgdGFibGUgbm90IGluIHZpZXdNb2RlIG9yIEFycmF5IG1vZGUuIE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5PcmRlckJ5Q29sdW1uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5oYW5kbGVUSE9yZGVyQ2hhbmdlKGlkLCBvcmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gZGEgY2hpYW1hcmUgb2duaSB2b2x0YSBjaGUgc2kgdnVvbGUgZGFyZSBldmlkZW56YSBhbGwnZXN0ZXJubyBkZWwgYmlzb2dubyBkaSByaWVmZmV0dHVhcmUgbGEgcmljZXJjYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlc2V0c1BhZ2UgSW5kaWNhIGFsIGxpc3RlbmVyIGNoZSBkZXZlIHJlc2V0dGFyZSBpbCBudW1lcm8gZGkgcGFnaW5hXHJcbiAgICAgKiBAcGFyYW0ge0FwcFNlYXJjaDxhbnk+fSB2aWV3T3ZlcnJpZGUgT3ZlcnJpZGUgZGVsbGEgdmlldyBkYSBlbWV0dGVyZSBwZXIgcXVlc3RhIHJpY2VyY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGVtaXRTZWFyY2hSZXF1ZXN0KHJlc2V0c1BhZ2U6IGJvb2xlYW4sIHZpZXdPdmVycmlkZT86IEFwcFNlYXJjaDxhbnk+KSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlld01vZGUgJiYgIXZpZXdPdmVycmlkZSkge1xyXG4gICAgICAgICAgICAodGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2aWV3T3ZlcnJpZGUpIHtcclxuICAgICAgICAgICAgaWYgKHJlc2V0c1BhZ2UpXHJcbiAgICAgICAgICAgICAgICB2aWV3T3ZlcnJpZGUucGFnZSA9IDE7XHJcbiAgICAgICAgICAgIHZpZXdPdmVycmlkZS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2VhcmNoSW5Qcm9ncmVzcyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgIXRoaXMuVmlldy5zZWxmc2VhcmNoICYmIHRoaXMuRXNUYWJsZUhhbmRsZWRTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2hSZXF1ZXN0LmVtaXQoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QuZW1pdCh2aWV3T3ZlcnJpZGUgPyB2aWV3T3ZlcnJpZGUgOiByZXNldHNQYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnRlbmRvIGRhZ2xpICoqRXNUZHMqKiBiaW5kYXRpIGdlbmVyYSwgYWxsJ2ludGVybm8gZGVsIGRpemlvbmFyaW8gKipUTVBSb3dURHMqKiB0dXR0aSBpIGNvbnRlc3RpIGRlaSB2YXJpIG9nZ2V0dGkuXHJcbiAgICAgKlxyXG4gICAgICogVmVuZ29ubyBlc2NsdXNpIGkgVEQgXCJJbnRlcm5pXCIgaW4gcXVhbnRvIHZlbmdvbm8gZ2VuZXJhdGkgZGFnbGkgb3JpZ2luYWxpIHF1aW5kaSBpbmNsdWRlcmxpIHZvcnJlYmJlIGRpcmUgcmllZmZldHR1YXJlIGxlIG9wZXJhemlvbmkgZHVlIHZvbHRlXHJcbiAgICAgKlxyXG4gICAgICogQ29zdG86IDIgc2NhbiBFc1RocywgMSBzY2FuIEVzVGRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlW119IHRocyBDb2xvbm5lIGRlbGxhIHRhYmVsbGFcclxuICAgICAqIEBwYXJhbSB7RXNUZERpcmVjdGl2ZVtdfSB0ZHMgQ2VsbGUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlUm93VGRzKHRoczogRXNUaERpcmVjdGl2ZVtdLCB0ZHM6IEVzVGREaXJlY3RpdmVbXSkge1xyXG4gICAgICAgIGlmICh0ZHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbnNDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEVzVGFibGVDb2x1bW4gfSA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKGxldCBjb2xpID0gMDsgY29saSA8IHRoaXMuQ29sdW1uc0xpc3QubGVuZ3RoOyBjb2xpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IHRoaXMuQ29sdW1uc0xpc3RbY29saV07XHJcbiAgICAgICAgICAgIGNvbHVtbnNDYWNoZVtjb2wuaWRdID0gY29sO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5UTVBSb3dURHMgPSB7fTtcclxuICAgICAgICAvLyBWYXJpYWJpbGUgZCdhcHBvZ2dpbyBwZXIgcGVybWV0dGVybWkgZGkgaW5zZXJpcmUgdHV0dGUgbGUgY29sb25uZSBcIkZpeGVkXCIgZGF2YW50aVxyXG4gICAgICAgIGxldCBjb250ZXh0Rml4ZWRzOiB7IFtjb250ZXh0OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ZCA9IHRkc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib3VuZFNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmJvdW5kU291cmNlW2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IGN0eCA9IGl0ZW0uX2hhc2g7XHJcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGQudGQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGggPSB0aGlzLnRoc0NhY2hlW3RkLnRkXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoISF0aClcclxuICAgICAgICAgICAgICAgICAgICB0aC5fcmVmZXJlbmNlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2tpcHBhcmUgc2VuemEgdGggKGNhc2lzdGljYSB0YWJlbGxhIGRpbmFtaWNhKVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoICYmIHRoLnRoSWYgJiYgKHRkLnRkSWYgfHwgdGgudGhHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhDYXN0ZWQgPSA8RXNUaERpcmVjdGl2ZT50aDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXhlZCA9IHRoLnRoRml4ZWQgfHwgdGgudGhHcm91cCB8fCB0aC50aFBpbm5lZDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbVRvQWRkID0gaXRlbS5faXRlbSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZEVsZW1lbnQ+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVmdEJvcmRlcjogKDxhbnk+dGhDYXN0ZWQpLl9sYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX3Jib3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IGtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbm5lZDogY29sdW1uc0NhY2hlW3RkLnRkXS5waW5uZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW5uZWRXaWR0aDogdGhDYXN0ZWQudGhQaW5uZWRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwSGVhZGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwQWdncmVnYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaWJsZTogY29sdW1uc0NhY2hlW3RkLnRkXS52aXNpYmxlLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyYXBzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiB0ZC50ZENsYXNzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSWNvbkNsYXNzOiB0ZC50ZEljb25DbGFzcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbkZpZWxkOiB0ZC50ZENvbmRpdGlvbkZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVmFsdWU6IHRkLnRkQ29uZGl0aW9uVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZTogdGQudGRUaXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQ6IHRkLnRkQ29udGVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlOiB0aENhc3RlZC50aEdyb3VwICYmICF0aGlzLlNob3dJdGVtR3JvdXBzQ29sdW1ucyA/IG51bGwgOiB0ZC5UZW1wbGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpOiB0ZC5fbXVsdGksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVByb3A6IHRkLl9tdWx0aSA/IHRkLnRkLnNwbGl0KCdfJylbMF0gOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlJbmRleDogdGQuX211bHRpID8gdGQudGQuc3BsaXQoJ18nKVsxXSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ6ICh0ZC50ZEFsaWdubWVudCB8fCB0aC50aEFsaWdubWVudCB8fCB0aGlzLkRlZmF1bHRBbGlnbm1lbnQpLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQ6IHRkLnRkRm9ybWF0IHx8IHRoLnRoRm9ybWF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlOYW1lOiB0aC50aFByb3BlcnR5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlOiB0aC50aFR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVNvdXJjZTogdGgudGhTb3VyY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wQWNjZXNzb3I6IHRkLnRkUHJvcGVydHlBY2Nlc3NvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPFRkRWxlbWVudD57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWZ0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX2xib3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHRCb3JkZXI6ICg8YW55PnRoQ2FzdGVkKS5fcmJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDoga2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlubmVkOiBjb2x1bW5zQ2FjaGVbdGQudGRdLnBpbm5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbm5lZFdpZHRoOiB0aENhc3RlZC50aFBpbm5lZFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBIZWFkZXI6IHRoQ2FzdGVkLnRoR3JvdXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cEFnZ3JlZ2F0aW9uOiAhIXRoQ2FzdGVkLnRoQWdncmVnYXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXNpYmxlOiBjb2x1bW5zQ2FjaGVbdGQudGRdLnZpc2libGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcmFwczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogdGhDYXN0ZWQudGhHcm91cENsYXNzIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudDogdGhpcy5yb3dHcm91cGluZ19ILmdldEdyb3VwQ2VsbERpc3BsYXkoPEdyb3VwPml0ZW0sIGtleSwgPEVzVGhEaXJlY3RpdmU+dGgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlRNUFJvd1REc1tjdHhdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVE1QUm93VERzW2N0eF0ucHVzaChpdGVtVG9BZGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Sb3dDb250ZXh0cy5wdXNoKGN0eCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVE1QUm93VERzW2N0eF0gPSBbaXRlbVRvQWRkXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dEZpeGVkc1tjdHhdID0gaXNGaXhlZCA/IDEgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2Ugbm9uIGhvIG9nZ2V0dGkgw6ggaW51dGlsZSBjaGUgY29udHJvbGxvIGdsaSBlcnJvcmksIGRhdG8gY2hlIGdsaSBlcy10ZCBub24gZXNpc3RlcmFubm8gZGkgY2VydG8gZSBkaSBjb25zZWd1ZW56YSBnbGkgZXMtdGggbm9uIHNhcmFubm8gcmVmZXJlbnppYXRpXHJcbiAgICAgICAgaWYgKHRoaXMuVE1QQm91bmRTb3VyY2UubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdmFyIGVycnM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICBpZiAoIXRoLl9yZWZlcmVuY2VkKVxyXG4gICAgICAgICAgICAgICAgZXJycy5wdXNoKHRoLnRoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdmFyIGVycklkcyA9IGVycnMuam9pbignLCAnKTtcclxuICAgICAgICAgICAgdGhyb3cgXCJMJ0lEIGRpIHVubyBvIHBpw7kgRXNUaCBub24gaGFubm8gYWxjdW4gRXNUZCBhc3NvY2lhdG86IFwiICsgZXJySWRzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnRlbmRvIGRhZ2xpICoqRXNUaHMqKiBiaW5kYXRpIGdlbmVyYSwgYWxsJ2ludGVybm8gZGVsIGRpemlvbmFyaW8gKipUTVBSb3dUSHMqKiB0dXR0aSBpIGNvbnRlc3RpIGRlaSB2YXJpIG9nZ2V0dGkuXHJcbiAgICAgKlxyXG4gICAgICogVmVuZ29ubyBlc2NsdXNpIGkgVEggXCJJbnRlcm5pXCIgaW4gcXVhbnRvIHZlbmdvbm8gZ2VuZXJhdGkgZGFnbGkgb3JpZ2luYWxpIHF1aW5kaSBpbmNsdWRlcmxpIHZvcnJlYmJlIGRpcmUgcmllZmZldHR1YXJlIGxlIG9wZXJhemlvbmkgZHVlIHZvbHRlXHJcbiAgICAgKlxyXG4gICAgICogQ29zdG86IDEgc2NhbiBFc1RocyArIDEgc2NhbiBDb2x1bW5zTGlzdFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXNUaERpcmVjdGl2ZVtdfSB0aHMgQ29sb25uZSBkZWxsYSB0YWJlbGxhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGVSb3dUaHModGhzOiBFc1RoRGlyZWN0aXZlW10pIHtcclxuICAgICAgICBpZiAodGhzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBjb2x1bW5zTGlzdENhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogRXNUYWJsZUNvbHVtbiB9ID0ge307XHJcbiAgICAgICAgbGV0IGNhc3RlZFZpZXcgPSA8QXBwU2VhcmNoPGFueT4+dGhpcy5WaWV3O1xyXG4gICAgICAgIGxldCBncm91cGluZ3NVbmRlZmluZWQgPSB0aGlzLnZpZXdNb2RlICYmIChjYXN0ZWRWaWV3ICYmICFjYXN0ZWRWaWV3Lmdyb3VwaW5ncyB8fCBjYXN0ZWRWaWV3Lmdyb3VwaW5ncy5sZW5ndGggPT0gMCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5Db2x1bW5zTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaXRtID0gdGhpcy5Db2x1bW5zTGlzdFtpXTtcclxuICAgICAgICAgICAgY29sdW1uc0xpc3RDYWNoZVtpdG0uaWRdID0gaXRtXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLlRNUFJvd1RIcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuICAgICAgICAgICAgbGV0IHRvQWRkOiBUaEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGgudGhJZiB8fCB0aC50aEdyb3VwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHRoQ2xhc3MgPSAodGgudGhDbGFzcyB8fCBcIlwiKSArICh0aC50aFNocmluayA/IFwiIGFwcC1jb2wtbWluXCIgOiBcIlwiKSArICh0aC50aEdyb3VwID8gXCIgZXN0LWNvbC1taW5cIiA6IFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgdG9BZGQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgUGlubmVkOiBjb2x1bW5zTGlzdENhY2hlW3RoLnRoXS5waW5uZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgRml4ZWQ6IHRoLnRoRml4ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgUGlubmVkV2lkdGg6IHRoLnRoUGlubmVkV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgSUQ6IHRoLnRoLFxyXG4gICAgICAgICAgICAgICAgICAgIFZpc2libGU6IHRoLnRoVmlzaWJsZSxcclxuICAgICAgICAgICAgICAgICAgICBDbGFzczogdGhDbGFzcyxcclxuICAgICAgICAgICAgICAgICAgICBPcmRlcjogdGgudGhPcmRlcixcclxuICAgICAgICAgICAgICAgICAgICBPcmRlcmFibGU6IHRoLnRoT3JkZXJhYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlOiB0aC5UZW1wbGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ6ICh0aC50aEFsaWdubWVudCB8fCB0aGlzLkRlZmF1bHRBbGlnbm1lbnQpLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2Ugbm9uIMOoIG5lc3N1biBjb250ZW51dG8gbsOpIG5lc3N1biB0ZW1wbGF0ZSBtb3N0cm8gc2VtcGxpY2VtZW50ZSBsJ0lEIGRlbGwnaGVhZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgQ29udGVudDogdGgudGhTdGF0aWNDb250ZW50ICE9IG51bGwgPyB0aC50aFN0YXRpY0NvbnRlbnQgOiB0aC5UZW1wbGF0ZSA/ICcnIDogdGgudGgsXHJcbiAgICAgICAgICAgICAgICAgICAgV3JhcDogdGgudGhXcmFwLFxyXG4gICAgICAgICAgICAgICAgICAgIExlZnRCb3JkZXI6ICg8YW55PnRoKS5fbGJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgUmlnaHRCb3JkZXI6ICg8YW55PnRoKS5fcmJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgTXVsdGk6IHRoLl9tdWx0aSxcclxuICAgICAgICAgICAgICAgICAgICBNdWx0aUNvbnRlbnQ6IHRoLl9tdWx0aV9jb250ZW50XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5UTVBSb3dUSHMucHVzaCh0b0FkZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2UgaG8gdW4gbW9kZWxsbyBjaGUgZGV2ZSBmdW56aW9uYXJlIGEgcm93Z3JvdXBpbmcgbWEgbm9uIMOoIGFuY29yYSBzdGF0YSBlZmZldHR1YXRhIG5lc3N1bmEgcmljZXJjYSBzdWkgZ3J1cHBpIHByaW5jaXBhbGkgKGdyb3VwaW5nc1VuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgIC8vIGxpIGdlbmVybyBlIG1hbmRvIGxhIHByaW1hIHJpY2VyY2EgY2hlIGRldidlc3NlcmUgc3BlZGl0YSBhbCBiYWNrZW5kIHBlciBpbCBwcmltbyBjYXJpY2FtZW50byBkZWkgZ3J1cHBpXHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBpbmdzVW5kZWZpbmVkICYmICh0aC50aEFnZ3JlZ2F0aW9uIHx8IHRoLnRoR3JvdXApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwQWdncmVnYXRpb25zOiBHcm91cE9yQWdncmVnYXRpb25bXSA9IHRoaXMucm93R3JvdXBpbmdfSC5nZXRHcm91cEFnZ3JlZ2F0aW9ucyh0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXN0ZWRWaWV3Lmdyb3VwaW5ncylcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzdGVkVmlldy5ncm91cGluZ3MgPSBncm91cEFnZ3JlZ2F0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RlZFZpZXcuZ3JvdXBpbmdzLnB1c2goLi4uZ3JvdXBBZ2dyZWdhdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlJlc2VhcmNoTmVlZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNwb3N0YSBsYSByaWNlcmNhIGRpIHVuYSBwYWdpbmEgaW4gYXZhbnRpIChvIGluZGlldHJvKVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIE51bWVybyBkaSBwYWdpbmUgZGEgYWdnaXVuZ2VyZSAobyBzb3R0cmFycmUsIHNlIG5lZ2F0aXZvKSBhbGxhIHBhZ2luYSBhdHR1YWxlXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gcGFnZXIgRWxlbWVudG8gZGkgc2VwYXJhemlvbmUgc3UgY3VpIMOoIGVmZmV0dHVhdGEgbGEgcmljZXJjYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkVG9QYWdlR3JvdXAocGFnZTogbnVtYmVyLCBwYWdlcjogR3JvdXBQYWdlcikge1xyXG4gICAgICAgIHRoaXMuZ29Ub1BhZ2VHcm91cChwYWdlci52aWV3LnBhZ2UgKyBwYWdlLCBwYWdlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcG9zdGEgbGEgcmljZXJjYSBhbGxhIHBhZ2luYSBzcGVjaWZpY2F0YVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIFBhZ2luYSBhIGN1aSBuYXZpZ2FyZVxyXG4gICAgICogQHBhcmFtIHthbnl9IHBhZ2VyIEVsZW1lbnRvIGRpIHNlcGFyYXppb25lIHN1IGN1aSDDqCBlZmZldHR1YXRhIGxhIHJpY2VyY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9QYWdlR3JvdXAocGFnZTogbnVtYmVyLCBwYWdlcjogR3JvdXBQYWdlcikge1xyXG5cclxuICAgICAgICBsZXQgYXBwU2VhcmNoRWxlbWVudCA9IHBhZ2VyLnZpZXc7XHJcbiAgICAgICAgaWYgKHBhZ2UgPT09IDAgfHwgKHBhZ2UgPiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzICYmIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMgPiAwKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBhcHBTZWFyY2hFbGVtZW50LnBhZ2UgPSBwYWdlO1xyXG4gICAgICAgIHBhZ2VyLmJ1dHRvbnMgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgYXBwU2VhcmNoRWxlbWVudC5wYWdlLCBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSwgYXBwU2VhcmNoRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQFRPRE8gU3Bvc3RhcmUgaW4gU2VsZWN0aW9uSGFuZGxlclxyXG4gICAgICogXHJcbiAgICAgKiBHZXN0aXNjZSBpIGNsaWNrIHN1bGxhIHRhYmVsbGEgc29sbyBwZXIgbGUgcmlnaGUgYSBncnVwcG8uIFxyXG4gICAgICogTyByaW11b3ZlIGdsaSBlbGVtZW50aSBhdHR1YWxtZW50ZSBwcmVzZW50aSBvIGNhcmljYSBpbCBjb250ZW51dG8gZGVsIGdydXBwb1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBncm91cCBHcnVwcG8gYmluZGF0byBzdSBjdWkgc2kgw6ggZWZmZXR0dWF0byBpbCBjbGlja1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsJ29wZXJhaXpvbmUgw6ggYW5kYXRhIGEgYnVvbiBmaW5lLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlR3JvdXBDbGljayhncm91cDogR3JvdXApOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgY2FzdGVkID0gdGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+O1xyXG4gICAgICAgIGxldCBhbnlHID0gKDxhbnk+Z3JvdXApO1xyXG4gICAgICAgIGFueUcuX2V4cGFuZGVkID0gIWFueUcuX2V4cGFuZGVkO1xyXG5cclxuICAgICAgICAvLyBTb25vIGluIG1vZGFsaXTDoCByYWdncnVwcGFtZW50byB2aXJ0dWFsZSBkYSBhcnJheTogRXNwYW5kZXJlIHNpZ25pZmljYSByZW5kZXJlIHZpc2liaWxpIHR1dHRpIGdsaSBvZ2dldHRpIHJlbGF0aXZpIGEgcXVlc3RvIGdydXBwbywgdmljZXZlcnNhIGlsIGNvbnRyYXJyZVxyXG4gICAgICAgIGlmICh0aGlzLkFycmF5R3JvdXBpbmcpIHtcclxuICAgICAgICAgICAgbGV0IGFsbFJlbGF0aXZlcyA9IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT5cclxuICAgICAgICAgICAgICAgICh0Ll9ncm91cCAmJiAoKGFueUcuX2V4cGFuZGVkICYmIHQuX3BhcmVudCA9PSBhbnlHLl90aGlzS2V5KSB8fCAoIWFueUcuX2V4cGFuZGVkICYmIHQuX3BhcmVudCAmJiB0Ll9wYXJlbnQuc3RhcnRzV2l0aChhbnlHLl90aGlzS2V5KSkpKSB8fFxyXG4gICAgICAgICAgICAgICAgKHQuX2l0ZW0gJiYgKChhbnlHLl9leHBhbmRlZCAmJiB0Ll90aGlzS2V5ID09IGFueUcuX3RoaXNLZXkpIHx8ICghYW55Ry5fZXhwYW5kZWQgJiYgdC5fdGhpc0tleS5zdGFydHNXaXRoKGFueUcuX3RoaXNLZXkpKSkpKVxyXG4gICAgICAgICAgICBhbGxSZWxhdGl2ZXMuZm9yRWFjaCh0ID0+IHsgdC5fdmlzaWJsZSA9IGFueUcuX2V4cGFuZGVkOyBpZiAodC5fZ3JvdXApIHQuX2V4cGFuZGVkID0gZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhbnlHLl9leHBhbmRlZCkge1xyXG4gICAgICAgICAgICAvLyBSZXNldHRvIGlwcFxyXG4gICAgICAgICAgICBjYXN0ZWQuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgPSAxNTtcclxuICAgICAgICAgICAgaWYgKCFjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzKVxyXG4gICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3VwcyA9IFtuZXcgR3JvdXBGaWx0ZXIoZ3JvdXAuY29sdW1uLCBncm91cC52YWx1ZSldO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IGFueUcuX2dyb3VwbGV2ZWw7XHJcbiAgICAgICAgICAgICAgICAvLyBzZSBpbCBncnVwcG8gY2xpY2NhdG8gbm9uIGhhIHVuIGxpdmVsbG8gw6ggaWwgcHJpbW8gZ3J1cHBvLCBxdWluZGkgb3JkaW5hbWVudG8gdW5pY29cclxuICAgICAgICAgICAgICAgIC8vIGFsdHJpbWVudGkgZGV2byByaW11b3ZlcmUgdHV0dGkgaSBmaWx0cmkgc3UgbGl2ZWxsaSBzdXBlcmlvcmkgYWwgbGV2ZWwgY2xpY2NhdG8gZSBhZ2dpdW5nZXJlIGlsIGxldmVsIGNsaWNjYXRvXHJcbiAgICAgICAgICAgICAgICBpZiAoIWxldmVsKVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMgPSBbbmV3IEdyb3VwRmlsdGVyKGdyb3VwLmNvbHVtbiwgZ3JvdXAudmFsdWUpXTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBhbnlHLl9wYXJlbnRSb3V0ZS5mb3JFYWNoKChzdGVwOiBHcm91cFJvdXRlRnJhZ21lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3Vwcy5wdXNoKG5ldyBHcm91cEZpbHRlcihzdGVwLmNvbHVtbiwgc3RlcC52YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMucHVzaChuZXcgR3JvdXBGaWx0ZXIoZ3JvdXAuY29sdW1uLCBncm91cC52YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBwYXRoID0gKGFueUcuX3BhcmVudCB8fCAnJykgKyBncm91cC52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIGhvIGNoaXVzbyB1biBncnVwcG8gbm9uIG1pIHNlcnZlIHJpZWZmZXR0dWFyZSByaWNlcmNlLCBtaSBiYXN0YSBlbGltaW5hcmUgZGFnbGkgb2dnZXR0aSBiaW5kYXRpIHR1dHRpIGdsaSBlbGVtZW50aSBzb3R0b3N0YW50aSBhIHF1ZWwgZ3J1cHBvXHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLmJvdW5kU291cmNlLmZpbHRlcih0ID0+ICF0Ll9wYXJlbnQgfHwgIXQuX3BhcmVudC5zdGFydHNXaXRoKHBhdGgpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGRldm8gcGVyw7IgYW5jaGUgcmltdW92ZXJlIGV2ZW50dWFsaSBjYWNoZSByZWxhdGl2ZVxyXG4gICAgICAgICAgICB0aGlzLmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZSA9IHRoaXMuZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlLmZpbHRlcih0ID0+IHQucGF0aCAhPSBwYXRoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlc3Rpc2NlIGxhIHNlbGV6aW9uZSBnbG9iYWxlIGRlZ2xpIG9nZ2V0dGksIHNpYSBwZXIgcGFnaW5hIGNoZSBhIGxpdmVsbG8gZGkgKipTZWxlY3RBbGwqKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VkVmFsIFZhbG9yZSBmb3J6YXRvIGRpIGNoZWNrIGRhIGFzc2VnbmFyZSBhZ2xpIG9nZ2V0dGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdsb2JhbENoZWNrQ2hhbmdlZChmb3JjZWRWYWw6IGJvb2xlYW4gPSBudWxsKSB7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXNFeGNsdWRpbmcobnVsbCk7XHJcblxyXG4gICAgICAgIC8vIFByZW5kbyB0dXR0aSBnbGkgZWxlbWVudGkgcHJlc2VudGkgaW4gcXVlc3RhIHZpc3RhLiBTZSBobyBncnVwcGkgcHJlbmRvIHNvbG8gaSBncnVwcGkgYSBsaXZlbGxvIDAsIGFsdHJpbWVudGkgcHJlbmRvIHR1dHRpIGdsaSBvZ2dldHRpIHBlciBzZWxlemlvbmFybGlcclxuICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmJvdW5kU291cmNlLmZpbmQodCA9PiB0Ll9ncm91cCkgPyB0aGlzLmJvdW5kU291cmNlLmZpbHRlcih0ID0+IHQuX2dyb3VwICYmICF0Ll9wYXJlbnQpIDogdGhpcy5ib3VuZFNvdXJjZTtcclxuICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oaXRlbXMsIGZvcmNlZFZhbCwgdGhpcy5nbG9iYWxDaGVjayk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAVE9ETyBTcG9zdGFyZSBpbiBTZWxlY3Rpb25IYW5kbGVyXHJcbiAgICAgKiBcclxuICAgICAqIEdlc3Rpc2NlIGkgY2xpY2sgc3VsbGEgdGFiZWxsYSwgZ2VzdGVuZG8gZXZlbnR1YWxtZW50ZSBhbmNoZSBnbGkgU2hpZnQgKyBDbGljayBwZXIgc2VsZXppb25hcmUgdW4gcmFuZ2UgZGkgb2dnZXR0aVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudCBFdmVudG8gbmF0aXZvIEhUTUwgZGVsIGNsaWNrXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIGJpbmRhdG8gc3UgY3VpIHNpIMOoIGVmZmV0dHVhdG8gaWwgY2xpY2tcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvcGVyYWl6b25lIMOoIGFuZGF0YSBhIGJ1b24gZmluZSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZUNsaWNrKGV2ZW50OiBhbnksIGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJUZXh0U2VsZWN0aW9uKGV2ZW50KTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRpdGVtczogYW55W10gPSBbXTtcclxuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgdGhpcy5TaGlmdENsaWNrICYmICF0aGlzLlNpbmdsZVNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRTZWxlY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gIXQuX2dyb3VwICYmICF0Ll9zZXApO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0U2VsZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5fc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkaXRlbXMucHVzaCh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgodCA9PSBpdGVtIHx8IHQgPT0gdGhpcy5sYXN0U2VsZWN0ZWQpICYmICFzdGFydFNlbGVjdGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0Ll9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRpdGVtcy5wdXNoKHQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodCA9PSBpdGVtIHx8IHQgPT0gdGhpcy5sYXN0U2VsZWN0ZWQpICYmIHN0YXJ0U2VsZWN0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpdGVtLl9zZWxlY3RlZCA9ICFpdGVtLl9zZWxlY3RlZDtcclxuICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSBpdGVtO1xyXG4gICAgICAgICAgICBzZWxlY3RlZGl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oc2VsZWN0ZWRpdGVtcyk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgZGkgdW5hIHBhZ2luYSBpbiBhdmFudGkgKG8gaW5kZWl0cm8pXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFRvUGFnZShwYWdlOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgdmlldyA9IHRoaXMuTWFpbkdyb3VwVmlldyA/IHRoaXMuTWFpbkdyb3VwVmlldyA6IHRoaXMuVmlldztcclxuXHJcbiAgICAgICAgdGhpcy5nb1RvUGFnZSgoKHRoaXMuU2VhcmNoVmlldyB8fCB2aWV3KT8ucGFnZSB8fCAwKSArIHBhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgYWxsYSBwYWdpbmEgc3BlY2lmaWNhdGFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBQYWdpbmEgYSBjdWkgbmF2aWdhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5NYWluR3JvdXBWaWV3ID8gdGhpcy5NYWluR3JvdXBWaWV3IDogKHRoaXMuYXJyYXlNb2RlID8gdGhpcy5TZWFyY2hWaWV3IDogdGhpcy5WaWV3KTtcclxuICAgICAgICBpZiAoIXZpZXcucGFnZSB8fCAhdmlldy5wYWdlcylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgYXBwU2VhcmNoRWxlbWVudCA9IHRoaXMuU2VhcmNoVmlldyB8fCB2aWV3O1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IChwYWdlID4gYXBwU2VhcmNoRWxlbWVudC5wYWdlcyAmJiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzID4gMCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgYXBwU2VhcmNoRWxlbWVudC5wYWdlID0gcGFnZTtcclxuICAgICAgICBsZXQgY291bnQgPSAodmlldy5pdGVtcy5sZW5ndGggfHwgdmlldy5ncm91cHM/Lmxlbmd0aCB8fCAwKTtcclxuICAgICAgICBsZXQgaXBwID0gdmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSB8fCAxNTtcclxuICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgYXBwU2VhcmNoRWxlbWVudC5wYWdlLCBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzLCBjb3VudCwgaXBwKTtcclxuXHJcbiAgICAgICAgbGV0IGhhc0dyb3VwaW5ncyA9ICEhdGhpcy5NYWluR3JvdXBWaWV3O1xyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QoZmFsc2UsIGhhc0dyb3VwaW5ncyA/IHZpZXcgOiB0aGlzLlNlYXJjaFZpZXcgPyB0aGlzLlNlYXJjaFZpZXcgOiBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byByaWNoaWFtYXRvIHN1bCBjYW1iaW8gZGVsbGEgcGFnaW5hemlvbmUuIFZlcnLDoCByaWNoaWFtYXRvIGwnZXZlbnRvICoqZW1pdFNlYXJjaFJlcXVlc3QqKlxyXG4gICAgICogcGVyIGNvbXVuaWNhcmUgYWwgY29tcG9uZW50ZSBjaGUgdXRpbGl6emEgcXVlc3RhIHRhYmVsbGEgY2hlIGkgZGF0aSBzb25vIGRhIGFnZ2lvcm5hcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSXRlbXNQZXJQYWdlQ2hhbmdlZChuZXdJcHApIHtcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlID0gbmV3SXBwO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgIGlmICh0aGlzLk1haW5Hcm91cFZpZXcpXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgdGhpcy5NYWluR3JvdXBWaWV3KTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLlNlYXJjaFZpZXcpIHtcclxuICAgICAgICAgICAgLy8gUXVlc3RvIHNlY29uZG8gbWUgc2kgcHXDsiBwb3J0YXJlIGEgbGl2ZWxsbyB1biBwbycgcGnDuSBhbHRvXHJcbiAgICAgICAgICAgIHRoaXMuU2VhcmNoVmlldy5wYWdlID0gMTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlLCB0aGlzLlNlYXJjaFZpZXcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHN1bCBjYW1iaW8gZGVsbGEgcGFnaW5hemlvbmUuIFZlcnLDoCByaWNoaWFtYXRvIGwnZXZlbnRvICoqZW1pdFNlYXJjaFJlcXVlc3QqKiBjb24gbGEgdmlzdGEgZGVsIHNlcGFyYXRvcmUgKi9cclxuICAgIHB1YmxpYyBvbkdyb3VwSXRlbXNQZXJQYWdlQ2hhbmdlZChwYWdlcjogR3JvdXBQYWdlciwgbmV3SXBwOiBudW1iZXIpIHtcclxuICAgICAgICBwYWdlci52aWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlID0gbmV3SXBwO1xyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgcGFnZXIudmlldyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiBNZXRvZG8gY2hlIGdlc3Rpc2NlIGxhIG1vZGlmaWNhIGRlbCB0ZW1wbyBzcGVjaWZpY2F0byBwZXIgbCdhZ2dpb3JuYW1lbnRvIGF1dG9tYXRpY28gKi9cclxuICAgIHB1YmxpYyBhdXRvVXBkYXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAoIS9eWzEtOV1cXGQqJC8udGVzdCh0aGlzLnNlY29uZHMpKVxyXG4gICAgICAgICAgICB0aGlzLnNlY29uZHMgPSAnMTAnO1xyXG5cclxuICAgICAgICBsZXQgc2Vjb25kc0luTXMgPSBwYXJzZUludCh0aGlzLnNlY29uZHMsIG51bGwpICogMTAwMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1VwZGF0ZSlcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lciA9IHNldEludGVydmFsKCgpID0+IHsgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSk7IH0sIHNlY29uZHNJbk1zKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hpYW1hdG8gZGFsIGNsaWNrIHN1IHVuYSBkZWxsZSBjb2xvbm5lIGdlbmVyYXRlIGRhbGwnSW5wdXQgKipEeW5hbWljT3BlcmF0aW9ucyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gTCdvZ2dldHRvIHN1IGN1aSB2YSBlZmZldHR1YXRhIGwnb3BlcmF6aW9uZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9waWQgQ29kaWNlIGlkZW50aWZpY2F0aXZvIGRlbGwnb3BlcmF6aW9uZSBkYSBlZmZldHR1YXJzaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHluYW1pY09wZXJhdGlvbihpdGVtOiBhbnksIG9waWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub25EeW5hbWljT3BlcmF0aW9uLmVtaXQoeyBpZDogb3BpZCwgaXRlbTogaXRlbSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgY29udGVudXRvIGRlbGwnRXNUZCBkYSB1dGlsaXp6YXJlIHBlciBsYSBjb2xvbm5hIHNwZWNpZmljYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gQ29sb25uYSBwZXIgY3VpIGNlcmNhcmUgbGEgY2VsbGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5vbWUgZGlyZXR0byBwZXIgY2VyY2FyZSBpbCBURCBjb24gbCdJRC4gUXVlc3RhIHZhcmlhYmlsZSBoYSBwcmlvcml0w6AgcmlzcGV0dG8gYSAqKmNvbHVtbioqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtUZW1wbGF0ZVJlZjxhbnk+fSBUZW1wbGF0ZSBkYSB1c2FyZSBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZEVzVGQoY29sdW1uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IG51bGwpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgICAgICB2YXIgRXNUZCA9IHRoaXMuRXNUZHNEaXJlY3RpdmUuZmluZCgoaXRlbSkgPT4gbmFtZSA/IGl0ZW0udGQgPT09IG5hbWUgOiBpdGVtLnRkRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgLy8gTmFtZSBub24gdHJvdmF0bywgZmFsbGJhY2sgYWwgbm9tZSBkZWxsYSBjb2xvbm5hXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgY29sdW1uICYmICFFc1RkKVxyXG4gICAgICAgICAgICBFc1RkID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5maW5kKChpdGVtKSA9PiBpdGVtLnRkRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIEVzVGQgPyBFc1RkLlRlbXBsYXRlIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgY29udGVudXRvIGRlbGwnZWRpdG9yIEVzVGQgZGEgdXRpbGl6emFyZSBwZXIgbGEgY29sb25uYSBzcGVjaWZpY2F0YVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uIENvbG9ubmEgcGVyIGN1aSBjZXJjYXJlIGwnZWRpdG9yXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOb21lIGRpcmV0dG8gcGVyIGNlcmNhcmUgbCdFZGl0b3IgY29uIGwnSUQuIFF1ZXN0YSB2YXJpYWJpbGUgaGEgcHJpb3JpdMOgIHJpc3BldHRvIGEgKipjb2x1bW4qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7VGVtcGxhdGVSZWY8YW55Pn0gVGVtcGxhdGUgZGEgdXNhcmUgcGVyIGxhIGNvbG9ubmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbmRFZGl0b3IoY29sdW1uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IG51bGwpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgICAgICB2YXIgRWRpdG9yID0gdGhpcy5Fc1RkRWRpdG9yRGlyZWN0aXZlcy5maW5kKChpdGVtKSA9PiBuYW1lID8gaXRlbS5lZGl0b3IgPT09IG5hbWUgOiBpdGVtLmVkaXRvckZvclByb3BlcnR5ID09PSBjb2x1bW4pO1xyXG4gICAgICAgIC8vIE5hbWUgbm9uIHRyb3ZhdG8sIGZhbGxiYWNrIGFsIG5vbWUgZGVsbGEgY29sb25uYVxyXG4gICAgICAgIGlmIChuYW1lICYmIGNvbHVtbiAmJiAhRWRpdG9yKVxyXG4gICAgICAgICAgICBFZGl0b3IgPSB0aGlzLkVzVGRFZGl0b3JEaXJlY3RpdmVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZWRpdG9yRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIEVkaXRvciA/IEVkaXRvci5UZW1wbGF0ZSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFcXVpdmFsZW50ZSBkZWwgbWV0b2RvICoqYWRkVG9QYWdlKiogcmlhZGF0dGF0byBwZXIgbGEgbW9kYWxpdMOgIGFycmF5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFycmF5QWRkVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYXJyYXlHb1RvUGFnZSh0aGlzLmFycmF5bW9kZVBhZ2UgKyBwYWdlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXF1aXZhbGVudGUgZGVsIG1ldG9kbyAqKmdvVG9QYWdlKiogcmlhZGF0dGF0byBwZXIgbGEgbW9kYWxpdMOgIGFycmF5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgUGFnaW5hIGEgY3VpIG5hdmlnYXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcnJheUdvVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IHBhZ2UgPiB0aGlzLmFycmF5bW9kZVBhZ2VzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgdGhpcy5hcnJheW1vZGVQYWdlID0gcGFnZTtcclxuXHJcbiAgICAgICAgLy8gUmlmb3J6byBpbCB3cml0ZXZhbHVlIGluIG1vZG8gY2hlIGlsIGNvZGljZSBwYXNzaSBkYWxsYSBnZXN0aW9uZSBjb21lIHNlIGZvc3NlIGZhdHRhIHJpcGFydGlyZSB1bmEgcmljZXJjYVxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxXcml0ZVZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXN0aW9uZSBkZWkgY2xpY2sgc3VsbGUgb3B6aW9uaSBkZWwgbWVuw7kgY29udGVzdHVhbGUgaW4gYWx0byBhIGRlc3RyYSBnZW5lcmF0byBkYWxsJ0lucHV0ICoqQ29ybmVyTWVudU9wdGlvbnMqKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb3JuZXJpZCBDb2RpY2UgZGVsbCdvcGVyYXppb25lIHNlbGV6aW9uYXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3JuZXJBY3Rpb25DbGlja2VkKGNvcm5lcmlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9uQ29ybmVyQWN0aW9uLmVtaXQoeyBpZDogY29ybmVyaWQsIGVzdGFibGU6IHRoaXMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogSW1wb3N0YXppb25lIG1vZGFsaXTDoCBkZWxsJ0VzVGFibGUgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7J2FycmF5JyB8ICd2aWV3JyB8ICdyZXBvcnQnfSBtb2RlIE1vZGFsaXTDoCBkYSBpbXBvc3RhcmVcclxuICAgICAqKi9cclxuICAgIHByaXZhdGUgc2V0TW9kZShtb2RlOiAnYXJyYXknIHwgJ3ZpZXcnKSB7XHJcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9IG1vZGUgPT0gJ3ZpZXcnO1xyXG4gICAgICAgIHRoaXMuYXJyYXlNb2RlID0gbW9kZSA9PSAnYXJyYXknO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHBlciBlZmZldHR1YXJlIGNoaWFtYXRlIGludGVybmUgZGkgYWxsaW5lYW1lbnRvIGFsbGEgZnVuemlvbmUgKip3cml0ZVZhbHVlKiosIFxyXG4gICAgICogaW1wb3N0YW5kbyBwcmltYSAqKmludGVybmFsV3JpdGVDYWxsKiogaW4gbW9kbyBkYSBub24gZWZmZXR0dWFyZSBvcGVyYXppb25pIGludXRpbGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVybmFsV3JpdGVWYWx1ZSgpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsV3JpdGVDYWxsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5WaWV3KTtcclxuICAgICAgICB0aGlzLmludGVybmFsV3JpdGVDYWxsID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1ldG9kbyBldmVudHVhbG1lbnRlIHJpY2hpYW1hYmlsZSBhbmNoZSBkYWwgY29tcG9uZW50ZSBlc3Rlcm5vIGNoZSBwZXJtZXR0ZSBkaSBmb3J6YXJlIHVuIHJlZnJlc2ggZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgcHVibGljIGZvcmNlUmVmcmVzaChyZWxhdW5jaFNlYXJjaDogYm9vbGVhbiA9IHRydWUpIHtcclxuXHJcbiAgICAgICAgLy8gU2Ugc29ubyBpbiBtb2RhbGl0w6AgVmlldyB2aWVuZSBtYW50ZW51dG8gaW4gYXV0b21hdGljbyBpbCBudW1lcm8gZGkgcGFnaW5hLCBtYSBwZXIgbGEgbW9kYWxpdMOgIGFycmF5IGRldm8gcHJlbmRlcmUgbGUgaW5mbyBkaSBwYWdpbmF6aW9uZSBwcmltYSBlIHJpYXBwbGljYXJsZSBkb3BvXHJcbiAgICAgICAgbGV0IGFycmF5UGFnZTogbnVtYmVyO1xyXG4gICAgICAgIGxldCBhcnJheUlwcDogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICBhcnJheVBhZ2UgPSB0aGlzLmFycmF5bW9kZVBhZ2U7XHJcbiAgICAgICAgICAgIGFycmF5SXBwID0gdGhpcy5BcnJheW1vZGVJdGVtc1BlclBhZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZighcmVsYXVuY2hTZWFyY2ggJiYgdGhpcy52aWV3TW9kZSlcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5WaWV3KTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZSA9IGFycmF5SXBwO1xyXG4gICAgICAgICAgICB0aGlzLmFycmF5R29Ub1BhZ2UoYXJyYXlQYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogSW1wb3N0YSBsYSB2aXNpYmlsaXTDoCBkaSB1biBoZWFkZXIgZSBkaSBldmVudHVhbGkgaGVhZGVyIGNvbGxlZ2F0aSBzZSBxdWVzdG8gaGVhZGVyIMOoIHVuIGdydXBwbywgZG9wb2RpY2jDqSBhZ2dpb3JuYSBsJ2VzLXRhYmxlIFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBPckhlYWRlciBIZWFkZXIgZGkgY3VpIHNldHRhcmUgbGEgdmlzaWJpbGl0w6BcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmlzaWJpbGl0eSBWaXNpYmlsaXTDoCBkYSBpbXBvc3RhcmVcclxuICAgICAqKi9cclxuICAgIHB1YmxpYyBzZXRIZWFkZXJWaXNpYmlsaXR5KGdyb3VwT3JIZWFkZXI6IHN0cmluZywgdmlzaWJpbGl0eTogYm9vbGVhbiwgcmVmcmVzaDogYm9vbGVhbiA9IHRydWUsIHJlbGF1bmNoU2VhcmNoOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBncm91cE9ySGVhZCA9IHRoaXMudGhzQ2FjaGVbZ3JvdXBPckhlYWRlcl07XHJcbiAgICAgICAgaWYgKCFncm91cE9ySGVhZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBncm91cE9ySGVhZC50aFZpc2libGUgPSB2aXNpYmlsaXR5O1xyXG5cclxuICAgICAgICBsZXQgdGhzQXJyID0gdGhpcy5Fc1Roc0RpcmVjdGl2ZS50b0FycmF5KCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHNBcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzQXJyW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoLnRoUGFyZW50ID09IGdyb3VwT3JIZWFkZXIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclZpc2liaWxpdHkodGgudGgsIHZpc2liaWxpdHksIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZWZyZXNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlTG9jYWxWaXNpYmlsaXR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVJlZnJlc2gocmVsYXVuY2hTZWFyY2gpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBpbiBiYXNlIGFpIGNsaWNrIHN1IHVuYSBjZWxsYSBjYXBpc2NlIHNlIHN0byBlZmZldHR1YW5kbyB1bidvcGVyYXppb25lIGRpIHNlbGV6aW9uZSBvIHNlIHN0byBlbnRyYW5kbyBuZWxsJ2VkaXQgZGkgdW5hIGNlbGxhIGNvbiB1biBkb3BwaW8gY2xpY2tcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9ICRldmVudCBFdmVudG8gbmF0aXZvIGphdmFzY3JpcHRcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIFJpZmVyaW1lbnRvIGEgYmluZGVyIGRlbGxhIHJpZ2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIEl0ZW0gY2hlIHJhcHByZXNlbnRhIGlsIGNvbnRlc3RvIHN1IGN1aSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkYkNsaWNrRWRpdE9yU2luZ2xlQ2xpY2tSb3dTZWxlY3Rpb24oJGV2ZW50OiBNb3VzZUV2ZW50LCByb3dJdGVtOiBUZEVsZW1lbnQsIGl0ZW06IGFueSkge1xyXG5cclxuICAgICAgICAvLyBQcmltYSBjb3NhIGRhIGZhcmUgw6ggY29udHJvbGxhcmUgc2UgY2kgc29ubyBkZWkgcmFuZ2UgbGFzY2lhdGkgZGEgb3BlcmF6aW9uaSBwcmVjZWRlbnRpIChzZSBhcHBsaWNhYmlsZSkgZSByaXB1bGlybGlcclxuICAgICAgICBpZiAodGhpcy5yYW5nZVNlbGVjdGVkICYmICEkZXZlbnQuY3RybEtleSAmJiB0aGlzLlNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJjbGVhcmluZyBwcmV2aW91c2x5IHNlbGVjdGVkIHJhbmdlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgICAgICB0aGlzLnJhbmdlU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTW9kYWxpdMOgIEVkaXRhYmxlLCBnZXN0aXNjbyBpIGRvcHBpIGNsaWNrIHNlbnphIHBlcsOyIHJhbGxlbnRhcmUgbGEgbW9kYWxpdMOgIGRpIHNlbGV6aW9uZSBhIHJhbmdlXHJcbiAgICAgICAgaWYgKHRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgLy8gU2Vjb25kbyBjbGljazogc2UgaWwgdGltZXIgbm9uIMOoIHNjYWR1dG8gw6ggdW4gZG9wcGlvIGNsaWNrIGVkIGVzZWd1byBpbCByZXN0b1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsRGJDbGlja1RpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJoYW5kbGluZyBkb3VibGVjbGljayBvbiBlZGl0YWJsZSBjZWxsOiBcIiArIChyb3dJdGVtLlByb3BlcnR5TmFtZSA/ICdlZGl0IG1vZGUgZm9yIHByb3BlcnR5ICcgKyByb3dJdGVtLlByb3BlcnR5TmFtZSA6ICdubyBwcm9wZXJ0eSBzZXQsIGZhbGxiYWNrIHRvIHNpbXBsZSBjbGljaycpKTtcclxuICAgICAgICAgICAgICAgIGlmIChyb3dJdGVtLlByb3BlcnR5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHVwVXNlckVkaXQocm93SXRlbSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIHRoaXMuU2VsZWN0aW9uLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJDZWxsQ2xpY2tUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUHJpbW8gY2xpY2s6IG5vbiBmYSBuaWVudGUgZSBzZSBpbCB0ZW1wbyBwZXIgaWwgc2Vjb25kbyBjbGljayBzY2FkZSByZXNldHRhIHR1dHRvXHJcbiAgICAgICAgICAgIHRoaXMuY2VsbERiQ2xpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckNlbGxDbGlja1RpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuUmFuZ2VTZWxlY3Rpb24gfHwgIXRoaXMubW91c2VJc0Rvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJ0aW1lJ3MgdXAgZm9yIHNlY29uZCBjbGljaywgaGFuZGxpbmcgc2luZ2xlIGNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2soJGV2ZW50LCBpdGVtLCB0aGlzLlNlbGVjdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIHRoaXMuZG91YmxlQ2xpY2tCdWZmZXJNcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYSByYW5nZSBsYSBjcmVhemlvbmUgZGVsIHJhbmdlIMOoIGdlc3RpdGEgZGFpIG1vdXNlZG93biwgbW92ZSBlZCB1cC4uLlxyXG4gICAgICAgIC8vIExhIHNlbGV6aW9uZSBkZWxsZSByaWdoZSBpbnZlY2Ugw6ggZ2VzdGl0YSBkYWxsZSBjYXNlbGxpbmUgYSBzaW5pc3RyYVxyXG4gICAgICAgIGlmICh0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFNlIGhvIGZhdHRvIGNsaWNrIGNvbCBjb250cm9sIGF0dGFjY2F0byBlc2NvIHN1Yml0byBkYXRvIGNoZSBkZXZlIHNvbG8gcGVybWV0dGVyZSBsYSBuYXZpZ2F6aW9uZSBkZWkgbGlua1xyXG4gICAgICAgIGlmICgkZXZlbnQuY3RybEtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFBlciBldml0YXJlIGRpIHJhbGxlbnRhcmUgYSBwcmVzY2luZGVyZVxyXG4gICAgICAgIGlmICghdGhpcy5FZGl0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJvd0NsaWNrKCRldmVudCwgaXRlbSwgdGhpcy5TZWxlY3Rpb24sIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFdmVudG8gY2hlIGdlc3Rpc2NlIGlsIGNvbWFuZG8gXCJDb3BpYVwiIGJ1dHRhbmRvIGkgdmFsb3JpIHNlbGV6aW9uYXRpIG5lbGxhIGNsaXBib2FyZCBpbiBiYXNlIGFsIGxvcm8gdGlwbyAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb3B5KCkge1xyXG4gICAgICAgIGlmKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGV0IHNlbCA9IHRoaXMuc2VsZWN0aW9uX0guZ2V0U2VsZWN0aW9uU3RhdHVzU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbC5sZW5ndGggPiAwICYmIHNlbFswXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25UZXh0ID0gdGhpcy5zZWxlY3Rpb25fSC5nZXRDbGlwYmFyZFRleHRGcm9tU2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS5jb3B5VGV4dFRvQ2xpcGJvYXJkKHNlbGVjdGlvblRleHQpO1xyXG4gICAgICAgICAgICB0aGlzLm1zZ0V4dHMuc2ltcGxlSW5mbyh0aGlzLmxjLmxvYyhcIlZhbHVlcyBjb3BpZWQgaW4gdGhlIGNsaXBib2FyZFwiKSwgXCJ0b2FzdHJcIiwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFdmVudG8gY2hlIGdlc3Rpc2NlIGlsIGNvbWFuZG8gXCJJbmNvbGxhXCIgcHJlbmRlbmRvIGkgZGF0aSBkZWxsYSBjbGlwYm9hcmQgZSBhcHBsaWNhbmRvbGkgYWwgcmFuZ2UgZGkgc2VsZXppb25lIGF0dHVhbGUgaW4gYmFzZSBhbCB0aXBvIGRlbGxlIGNlbGxlIHNvdHRvICovXHJcbiAgICBoYW5kbGVQYXN0ZSgpIHtcclxuICAgICAgICBpZighdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxldCBzZWwgPSB0aGlzLnNlbGVjdGlvbl9ILmdldFNlbGVjdGlvblN0YXR1c1NlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWwubGVuZ3RoID4gMCAmJiBzZWxbMF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaXBib2FyZFNlcnZpY2UuZ2V0Q2xpcGJvYXJkKFwibWF0cml4XCIsICh2YWx1ZXM6IHN0cmluZ1tdW10pID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEZpeCBjbGlwYm9hcmQgc2VydmljZSBjaGUgcGFyZSB1biBwbycgc3Ryb256YSwgcmltdW92byBsJ3VsdGltbyBhcnJheSBzZSBtaSBhY2NvcmdvIGNoZSDDqCB1biBzaW5nb2xvIGFycmF5IGNvbiB1biBzb2xvIGVsZW1lbnRvIHZ1b3RvXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDAgJiYgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXS5sZW5ndGggPT0gMSAmJiB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdWzBdID09ICcnKVxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5zcGxpY2UodmFsdWVzLmxlbmd0aCAtIDEsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCAmJiB2YWx1ZXNbMF0ubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBzZSBsYSBtb2RpZmljYSDDqCBhYmlsaXRhdGFcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tc2dFeHRzLnNpbXBsZVdhcm5pbmcodGhpcy5sYy5sb2MoXCJEYXRhIGZvciB0aGlzIHRhYmxlIGNhbm5vdCBiZSBlZGl0ZWRcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbG8gY2hlIHF1ZWxsbyBjaGUgc3RvIGNvcGlhbmRvIHNpYSBkZWxsYSBzdGVzc2EgZGltZW5zaW9uZSBkZWxsYSBzZWxlemlvbmUgc3VsbCdlcy10YWJsZSwgdHJhbm5lIG5lbCBjYXNvIGhvIHVuIHNpbmdvbG8gdmFsb3JlIGRhIGNvcGlhcmVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHNlbC5sZW5ndGggIT0gdmFsdWVzLmxlbmd0aCB8fCBzZWxbMF0ubGVuZ3RoICE9IHZhbHVlc1swXS5sZW5ndGgpICYmICh2YWx1ZXMubGVuZ3RoICE9IDEgfHwgdmFsdWVzWzBdLmxlbmd0aCAhPSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1zZ0V4dHMuc2ltcGxlV2FybmluZyh0aGlzLmxjLmxvYyhcIlNpemUgb2YgY29waWVkIGRhdGEgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNpemUgb2YgdGhlIHNlbGVjdGlvblwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlIGxlIGRpbWVuc2lvbmkgY29pbmNpZG9ubyBjb3BpbyBkYSB1bmEgcGFydGUgYWxsJ2FsdHJhXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoYW5nZXM6IEVzVGFibGVNb2RlbENoYW5nZVtdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBzZWwubGVuZ3RoOyByKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IHNlbFtyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCByb3cubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93W2NdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgaG8gdW4gc2luZ29sbyB2YWxvcmUgbG8gYXBwbGljbyBhIHR1dHRhIGxhIHNlbGV6aW9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxICYmIHZhbHVlc1swXS5sZW5ndGggPT0gMSA/IHZhbHVlc1swXVswXSA6IHZhbHVlc1tyXVtjXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9sZCA9IGNlbGwudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbml1ID0gY2VsbC52YWxfc2V0dGVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2xkZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24ob2xkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuaXVkYXRlID0gdGhpcy5kYXRlRXh0cy5nZXREYXRlQ29udmVydGlvbihuaXUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvbGRkYXRlICYmIG5pdWRhdGUgJiYgb2xkZGF0ZS5pc1NhbWUgJiYgb2xkZGF0ZS5pc1NhbWUobml1ZGF0ZSkpIHx8IG9sZCA9PT0gbml1KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChuZXcgRXNUYWJsZU1vZGVsQ2hhbmdlKGNlbGwuaXRlbSwgY2VsbC5oZWFkZXIsIGNlbGwucHJvcGVydHksIG9sZCwgbml1KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZS5lbWl0KGNoYW5nZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJpcHVsaXNjZSBpbCB0aW1lciB1dGlsaXp6YXRvIHBlciBjYXBpcmUgc2Ugw6ggc3RhdG8gZWZmZXR0dWF0byB1biBkb3BwaW8gY2xpY2sgbyBtZW5vICovXHJcbiAgICBwcml2YXRlIGNsZWFyQ2VsbENsaWNrVGltZXIoKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2VsbERiQ2xpY2tUaW1lcilcclxuICAgICAgICB0aGlzLmNlbGxEYkNsaWNrVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlciBjbGljayBzaW5nb2xvIHN1IHVuYSByaWdhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSAkZXZlbnQgRXZlbnRvIG5hdGl2byBqYXZhc2NyaXB0XHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBJdGVtIGNoZSByYXBwcmVzZW50YSBpbCBjb250ZXN0byBzdSBjdWkgw6ggc3RhdG8gZWZmZXR0dWF0byB1biBjbGlja1xyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzZWxlY3Rpb24gSW5kaWNhIHNlIGxhIHNlbGV6aW9uZSDDqCBhdHRpdmFcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW50ZXJuYWxDYWxsIEluZGljYSBzZSBsYSBjaGlhbWF0YSBhIHF1ZXN0YSBmdW56aW9uZSDDqCBpbnRlcm5hOiBwZXJtZXR0ZSBkaSBza2lwcGFyZSBpIGNoZWNrIHN1bGxlIEN1c3RvbUNlbGxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVSb3dDbGljaygkZXZlbnQ6IGFueSwgaXRlbTogYW55LCBzZWxlY3Rpb246IGJvb2xlYW4sIGludGVybmFsQ2FsbDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgLy8gU2UgaG8gdW4gY3RybCBwcmVtdXRvIGVzY28gY29uIHRydWUgaW4gbW9kbyBkYSBmYXJlIGJ1YmJsaW5nIGRlbGwnZXZlbnRvIGUgbGFzY2lhcmxvIGdlc3RpcmUgYWwgYnJvd3NlciAobGluayBlY2MuLi4pXHJcbiAgICAgICAgLy8gU3Rlc3NhIGNvc2Egc2UgaG8gY3VzdG9tIGNlbGwgZGF0byBjaGUgbGEgZ2VzdGlvbmUgZGVpIGNsaWNrIHZpZW5lIGFmZmlkYXRhIGFpIHNpbmdvbGkgVERcclxuICAgICAgICBpZiAoJGV2ZW50LmN0cmxLZXkgfHwgKHRoaXMuVXNlQ3VzdG9tQ2VsbHMgJiYgIWludGVybmFsQ2FsbCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmICFpdGVtLmxvY2tlZCAmJiAhaXRlbS5fc2VwICYmICFpdGVtLl9ncm91cClcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVDbGljaygkZXZlbnQsIGl0ZW0pO1xyXG4gICAgICAgIGVsc2UgaWYgKGl0ZW0uX2dyb3VwKVxyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUdyb3VwQ2xpY2soaXRlbSk7XHJcblxyXG4gICAgICAgIC8vIE9yYSBjaGUgbm9uIMOoIGF0dGFjY2F0byBkaXJldHRhbWVudGUgYWxsJ2h0bWwgZGV2byBmYXJlIHVuIG1hcmtmb3JjaGVjayBmaW5pdGUgbGUgb3BlcmF6aW9uaSBzdWkgZ3JvdXBpbmdcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlc3Rpb25lIGRlbCBjbGljayBkZXN0cm8gc3VsbCdlcy10YWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25SaWdodENsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLlNlbGVjdGlvbilcclxuICAgICAgICAgICAgdGhpcy5vbk9wZW5Db250ZXh0TWVudS5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMYSBtb2RpZmljYSBkZWxsJ3V0ZW50ZSDDqCBpbml6aWF0YS4gU2kgaW1wb3N0YSBsYSB2YXJpYWJpbGUgcmVsYXRpdmEgYSBcInRydWVcIiBpbiBtb2RvIGRhIG1vc3RyYXJlIGwnaW5wdXQgZGkgdGVzdG9cclxuICAgICAqIFxyXG4gICAgICogRG9wbyBjaGUgbCdpbnB1dCDDqCBhcHBhcnNvLCBkb3BvIHVuIGNpY2xvIGRpIENoYW5nZSBEZXRlY3Rpb24gdmllbmUgYXR0aXZhdG8gaWwgU3ViamVjdCBjb2xsZWdhdG8gYWxsJ2lucHV0IGNoZSBzZXJ2aXLDoCBhIGVmZmV0dHVhcmUgaWwgZm9jdXNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtUZEVsZW1lbnR9IHJvd0l0ZW0gRWxlbWVudG8gZGkgcmlnYSBzdSBjdWkgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gc29wcmEgaWwgcXVhbGUgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldHVwVXNlckVkaXQocm93SXRlbTogVGRFbGVtZW50LCBpdGVtOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgIGlmICh0aGlzLkVkaXRhYmxlICYmIHJvd0l0ZW0uUHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCBkeW5Nb2RlID0gdGhpcy5EeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb24/Lmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgICg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgKDxhbnk+cm93SXRlbSkub2xkX3ZhbHVlID0gZHluTW9kZSA/IGl0ZW0ucHJvcGVydGllc1tyb3dJdGVtLlByb3BlcnR5TmFtZV0gOiBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5Gb2N1c1N1YmplY3QubmV4dCgpOyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExhIG1vZGlmaWNhIGRlbGwndXRlbnRlIMOoIHRlcm1pbmF0YS4gU2kgcmVpbXBvc3RhIGxhIHZhcmlhYmlsZSByZWxhdGl2YSBhIFwiZmFsc2VcIiBpbiBtb2RvIGRhIG5hc2NvbmRlcmUgbCdpbnB1dCBkaSB0ZXN0byBlIHNpIGVtZXR0ZSBsYSBtb2RpZmljYSBkZWwgdmFsb3JlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIEVsZW1lbnRvIGRpIHJpZ2Egc3UgY3VpIMOoIHN0YXRhIGF0dGl2YXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIHNvcHJhIGlsIHF1YWxlIMOoIHN0YXRhIGF0dGl2YXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uSW5kZXggSW5kaWNlIGRlbGxhIGNvbG9ubmEgc3UgY3VpIMOoIGF2dmVudXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5hbGl6ZVVzZXJFZGl0KHJvd0l0ZW06IFRkRWxlbWVudCwgaXRlbTogYW55LCBjb2x1bW5JbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGR5bk1vZGUgPSB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMDtcclxuICAgICAgICBsZXQgcm93SXRtID0gPGFueT5yb3dJdGVtO1xyXG4gICAgICAgIHJvd0l0bS5fZWRpdGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgb2xkID0gcm93SXRtLm9sZF92YWx1ZTtcclxuICAgICAgICBsZXQgbml1ID0gZHluTW9kZSA/IGl0ZW0ucHJvcGVydGllc1tyb3dJdGVtLlByb3BlcnR5TmFtZV0gOiBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuXHJcbiAgICAgICAgbGV0IG9sZGRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG9sZCk7XHJcbiAgICAgICAgbGV0IG5pdWRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG5pdSk7XHJcbiAgICAgICAgaWYgKChvbGRkYXRlICYmIG5pdWRhdGUgJiYgb2xkZGF0ZS5pc1NhbWUgJiYgb2xkZGF0ZS5pc1NhbWUobml1ZGF0ZSkpIHx8IG9sZCA9PT0gbml1KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZS5lbWl0KFtuZXcgRXNUYWJsZU1vZGVsQ2hhbmdlKGl0ZW0sIHJvd0l0ZW0uSUQsIHJvd0l0ZW0uUHJvcGVydHlOYW1lLCBvbGQsIG5pdSldKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXVtjb2x1bW5JbmRleF0udmFsX3NldHRlcihuaXUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJhbmdlIHNlbGVjdGlvbiBFeHBlcmltZW50YWxzXHJcblxyXG4gICAgcHJpdmF0ZSBtb3VzZUlzRG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSByYW5nZVNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHJhbmdlU3RhcnRXYXNJZ25vcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGZpcnN0Q29vcmRpbmF0ZXM6IHtyb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9ID0gbnVsbDtcclxuXHJcbiAgICBtb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0l0ZW06IGFueSwgXzogYW55KSB7XHJcblxyXG4gICAgICAgIC8vIFRhc3RvIGRpdmVyc28gZGFsIGNsaWNrIHNpbmlzdHJvIC0+IGNpYW8gw6ggc3RhdG8gYmVsbG8gZSBpbnRlbnNvXHJcbiAgICAgICAgaWYoZXZlbnQuYnV0dG9ucyAhPSAxIHx8ICF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFN0byBsYXZvcmFuZG8gc3UgUVVFU1RBIGVzLXRhYmxlXHJcbiAgICAgICAgdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgY29vcmRzID0gKDxIVE1MRWxlbWVudD5ldmVudC5jdXJyZW50VGFyZ2V0KS5pZC5zcGxpdCgnXycpO1xyXG4gICAgICAgIGxldCByb3cgPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDJdKTtcclxuICAgICAgICBsZXQgY29sdW1uID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgdGhpcy5maXJzdENvb3JkaW5hdGVzID0geyByb3csIGNvbHVtbiB9O1xyXG4gICAgICAgIC8vIFNlIGhvIGdpw6AgdW4gcmFuZ2UgZGkgc2VsZXppb25lIGlnbm9ybyB0ZW1wb3JhbmVtYWVudGUgcXVlc3RhIHNlbGV6aW9uZSBpbiBtb2RvIGRhIGNhcGlyZSBiZW5lIGNvc2EgZGV2byBmYXJlIGRvcG8gKGNsaWNrIHN1bGxhIHJpZ2EgLyBhbHRyYSBzZWxlemlvbmUpXHJcbiAgICAgICAgLy8gZSBnZXN0aXJlIGxhIGdyYWZpY2EgaW4gbWFuaWVyYSB1biBwbycgcGnDuSBwcmVjaXNhXHJcbiAgICAgICAgaWYgKCF0aGlzLnJhbmdlU2VsZWN0ZWQgfHwgKGV2ZW50LmN0cmxLZXkgfHwgIXRoaXMuU2VsZWN0aW9uKSlcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgcmFuZ2U6IGZhbHNlIH0sIHJvdywgY29sdW1uKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgbW91c2UgZG93biBvbiAke3Jvd306JHtjb2x1bW59YCk7XHJcbiAgICB9XHJcblxyXG4gICAgbW91c2VlbnRlcihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmIChldmVudC5idXR0b25zID09IDApXHJcbiAgICAgICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubW91c2VJc0Rvd24gJiYgdGhpcy5maXJzdENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgIGxldCBpZCA9ICg8SFRNTEVsZW1lbnQ+ZXZlbnQuY3VycmVudFRhcmdldCkuaWQ7XHJcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBpZC5zcGxpdCgnXycpO1xyXG4gICAgICAgICAgICBsZXQgcm93ID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAyXSk7XHJcbiAgICAgICAgICAgIGxldCBjb2x1bW4gPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICAgICAgLy8gU2UgaG8gaWdub3JhdG8gbCdpbml6aW8gZGVsbGEgc2VsZXppb25lIG5lbCBtb3VzZWRvd24gbG8gcmVjdXBlcm8gcXVpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlU3RhcnRXYXNJZ25vcmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogZmFsc2UgfSwgdGhpcy5maXJzdENvb3JkaW5hdGVzLnJvdywgdGhpcy5maXJzdENvb3JkaW5hdGVzLmNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlU3RhcnRXYXNJZ25vcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgcmFuZ2U6IHRydWUgfSwgcm93LCBjb2x1bW4sIHRoaXMuZmlyc3RDb29yZGluYXRlcyk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgbW91c2UgbW92ZSBvdmVyICR7cm93fToke2NvbHVtbn1gKTtcclxuICAgICAgICAgICAgdGhpcy5yYW5nZVNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbW91c2V1cChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICghdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgaWQgPSAoPEhUTUxFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQpLmlkO1xyXG4gICAgICAgIGxldCBjb29yZHMgPSBpZC5zcGxpdCgnXycpO1xyXG4gICAgICAgIGxldCByb3cgPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDJdKTtcclxuICAgICAgICBsZXQgY29sdW1uID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXSk7XHJcblxyXG4gICAgICAgIC8vIFNlIGlsIG1vdXNldXAgdmllbmUgZWZmZXR0dWF0byBzdWxsYSBzdGVzc2EgY2VsbGEgZGVsIHByaW1vIG1vdXNlZG93biBlIHNpYW1vIGluIG1vZGFsaXTDoCBkaSBzZWxlemlvbmUgZGVzZWxlemlvbm8gbGEgY2VsbGEgcGVyY2jDqSDDqCB1biBzZW1wbGljZSBjbGlja1xyXG4gICAgICAgIGlmICh0aGlzLm1vdXNlSXNEb3duICYmIHRoaXMuZmlyc3RDb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdENvb3JkaW5hdGVzLnJvdyA9PSByb3cgJiYgdGhpcy5maXJzdENvb3JkaW5hdGVzLmNvbHVtbiA9PSBjb2x1bW4gJiYgIWV2ZW50LmN0cmxLZXkgJiYgIXRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQgJiYgdGhpcy5TZWxlY3Rpb24pXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogZmFsc2UgfSwgcm93LCBjb2x1bW4pO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChldmVudC5jdHJsS2V5IHx8ICF0aGlzLlNlbGVjdGlvbilcclxuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdXNlSXNEb3duID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKGBtb3VzZSBsaWZ0ZWQgdXBgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyogUGlhbmdvXHJcbiAgICBwcml2YXRlIEVzVGRzQ2FjaGU6IHsgW2lkOiBzdHJpbmddOiBFc1RkIH0gPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2VsbFJlZmVyZW5jZShvYmplY3Q6IGFueSwgY29sdW1uOiBzdHJpbmcpOiBFc1RkIHtcclxuICAgICAgICBsZXQgZmtUaGlzU2hpdEltT3V0ID0gdGhpcy51dGlFeHRzLmRlZXBDbG9uZShvYmplY3QpO1xyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaChbZmtUaGlzU2hpdEltT3V0XSk7XHJcbiAgICAgICAgbGV0IHByb3AgPSBjb2x1bW47XHJcbiAgICAgICAgbGV0IGhhc2ggPSBma1RoaXNTaGl0SW1PdXQuX2hhc2g7XHJcblxyXG4gICAgICAgIGxldCB0b1JldCA9IHRoaXMuRXNUZHNDYWNoZVtgJHtwcm9wfV8ke2hhc2h9YF07XHJcbiAgICAgICAgcmV0dXJuIHRvUmV0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RlckNlbGwoZXZlbnQ6IEVzVGRSZWZlcmVuY2UpIHtcclxuICAgICAgICB0aGlzLkVzVGRzQ2FjaGVbYCR7ZXZlbnQuaWR9XyR7ZXZlbnQuaGFzaH1gXSA9IGV2ZW50LnNlbGZcclxuICAgIH1cclxuICAgIC8vKiBQaWFuZ28gYW5jb3JhXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBFc1RkUmVmZXJlbmNlIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBoYXNoOiBzdHJpbmc7IFxyXG4gICAgc2VsZjogRXNUZDtcclxufSJdfQ==
1750
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL2VzLXRhYmxlL2VzX3RhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsVUFBVTtBQUNWLE9BQU8sRUFDSCxTQUFTLEVBQUUsZUFBZSxFQUFhLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFDeEYsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFNBQVMsRUFBYyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFlLE1BQU0sRUFDOUksTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSzNELGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFTdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUVqRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFJbkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFN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TCxLQUFLOzZCQUVMLEtBQUs7OEJBRUwsS0FBSzsrQkFFTCxLQUFLOzBCQUVMLEtBQUs7cUNBRUwsS0FBSztpQ0FFTCxLQUFLO2dDQUVMLEtBQUs7b0NBRUwsS0FBSzt1QkFFTCxLQUFLOzZCQUVMLEtBQUs7NkJBRUwsS0FBSzs2QkFFTCxNQUFNOzhCQVdOLE1BQU07aUNBRU4sTUFBTTt3QkFFTixNQUFNOzZCQUVOLE1BQU07NEJBRU4sTUFBTTtnQ0FFTixNQUFNOzZCQUdOLE1BQU07aUNBRU4sTUFBTTsrQkFPTixTQUFTLFNBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzZCQUUvQyxTQUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtvQ0FVdkMsS0FBSzs7QUE2K0NWLE1BQU0sT0FBTyxhQUFhO0NBSXpCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBJbnB1dCxcclxuICAgIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBDb250ZW50Q2hpbGQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBWaWV3RW5jYXBzdWxhdGlvbiwgT3B0aW9uYWwsIFNlbGYsIFRlbXBsYXRlUmVmLCBJbmplY3RcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IFV0aWxpdHlTZXJ2aWNlLCBFeHBvcnRTZXJ2aWNlLCBNZXNzYWdlU2VydmljZSwgRGF0ZVNlcnZpY2UsIENzdkhlYWRlcnMsIENsaXBib2FyZFNlcnZpY2UgfSBmcm9tICdAZXNmYWVuemEvZXh0ZW5zaW9ucyc7XHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tICdAZXNmYWVuemEvbG9jYWxpemF0aW9ucyc7XHJcbmltcG9ydCB7IFByZWZlcmVuY2VzU2VydmljZSB9IGZyb20gJ0Blc2ZhZW56YS9wcmVmZXJlbmNlcyc7XHJcblxyXG4vLyBQbHVnaW5zXHJcbmltcG9ydCB7IENvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnQGVzZmFlbnphL25neC1jb250ZXh0bWVudSc7XHJcblxyXG4vLyBNb2RlbGxpIC8gVGlwaVxyXG5pbXBvcnQgeyBBcHBTZWFyY2ggfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvQXBwU2VhcmNoXCI7XHJcbmltcG9ydCB7IEFwcE9yZGVyaW5nIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0FwcE9yZGVyaW5nXCI7XHJcbmltcG9ydCB7IEVzVGFibGVDb2x1bW5zRGVmaW5pdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0VzVGFibGVDb2x1bW5zRGVmaW5pdGlvblwiO1xyXG5pbXBvcnQgeyBDb3JuZXJNZW51T3B0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvQ29ybmVyTWVudU9wdGlvblwiO1xyXG5pbXBvcnQgeyBFc1RhYmxlT3BlcmF0aW9uRGVmaW5pdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0VzVGFibGVPcGVyYXRpb25EZWZpbml0aW9uXCI7XHJcbmltcG9ydCB7IEVzVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9Fc1RhYmxlQ29sdW1uXCI7XHJcbmltcG9ydCB7IEdyb3VwUGFnZXIgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9Hcm91cFBhZ2VyXCI7XHJcbmltcG9ydCB7IEdyb3VwUm91dGVGcmFnbWVudCB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL0dyb3VwUm91dGVGcmFnbWVudFwiO1xyXG5pbXBvcnQgeyBUaEVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9UaEVsZW1lbnRcIjtcclxuaW1wb3J0IHsgUGFnZXJJbmZvcyB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL1BhZ2VySW5mb3NcIjtcclxuaW1wb3J0IHsgVGhHcm91cCB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL1RoR3JvdXBcIjtcclxuaW1wb3J0IHsgVGRFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvVGRFbGVtZW50XCI7XHJcbmltcG9ydCB7IEl0ZW1zU2VsZWN0aW9uIH0gZnJvbSAnLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvSXRlbXNTZWxlY3Rpb24nO1xyXG5pbXBvcnQgeyBHcm91cE9yQWdncmVnYXRpb24gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvR3JvdXBPckFnZ3JlZ2F0aW9uXCI7XHJcbmltcG9ydCB7IEdyb3VwRmlsdGVyIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0dyb3VwRmlsdGVyXCI7XHJcbmltcG9ydCB7IEdyb3VwIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0dyb3VwXCI7XHJcbmltcG9ydCB7IEVzVGFibGVNb2RlbENoYW5nZSB9IGZyb20gJy4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZU1vZGVsQ2hhbmdlJztcclxuaW1wb3J0IHsgSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZSB9IGZyb20gJy4uLy4uL2RvbWFpbi9leHRlcm5hbHMvSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZSc7XHJcbmltcG9ydCB7IEVzVGFibGVEZWZhdWx0YWJsZSB9IGZyb20gJy4uLy4uL2RvbWFpbi9jb25maWd1cmF0aW9uL0VzVGFibGVEZWZhdWx0YWJsZSc7XHJcblxyXG4vLyBDb21wb25lbnRpIGUgTG9jYWxpenphemlvbmVcclxuaW1wb3J0IHsgRXNUZCB9IGZyb20gJy4uL2VzLXRkL2VzX3RkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVzVGREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2VzX3RkLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEVzVGhEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2VzX3RoLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEVzVGRFZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2VzX3RkX2VkaXRvci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBJRXNUYWJsZVRlbXBsYXRlV3JhcHBlciB9IGZyb20gJy4uL2VzLXRhYmxlLXRlbXBsYXRlL2VzX3RhYmxlX3RlbXBsYXRlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVzVGFibGVMb2MgfSBmcm9tICcuL2VzX3RhYmxlLmNvbXBvbmVudC5sb2MnO1xyXG5cclxuLy8gVG9rZW5zXHJcbmltcG9ydCB7IEVTVF9ERUZBVUxUUywgRVNUX0xPQ0FMRSB9IGZyb20gJy4uLy4uL3Rva2Vucyc7XHJcblxyXG4vLyBIYW5kbGVyc1xyXG5pbXBvcnQgeyBFeHBvcnRIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvRXhwb3J0SGFuZGxlclwiO1xyXG5pbXBvcnQgeyBDb2x1bW5NZXRhZGF0YUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9Db2x1bW5NZXRhZGF0YUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgRHluYW1pY01vZGVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvRHluYW1pY01vZGVIYW5kbGVyXCI7XHJcbmltcG9ydCB7IEhpZXJhcmNoeU1vZGVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvSGllcmFyY2h5TW9kZUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgSXRlbXNIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvSXRlbXNIYW5kbGVyXCI7XHJcbmltcG9ydCB7IFJlcG9ydE1vZGVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvUmVwb3J0TW9kZUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgUm93R3JvdXBpbmdIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvUm93R3JvdXBpbmdIYW5kbGVyXCI7XHJcbmltcG9ydCB7IFNlbGVjdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9TZWxlY3Rpb25IYW5kbGVyXCI7XHJcbmltcG9ydCB7IFV0aWxpdGllc0hhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9VdGlsaXRpZXNIYW5kbGVyXCI7XHJcblxyXG4vLyBTZXJ2aWNlXHJcbmltcG9ydCB7IENvcHlQYXN0ZURldGVjdG9yIH0gZnJvbSAnLi4vLi4vY29yZS9Db3B5UGFzdGVEZXRlY3Rvcic7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uLy4uL2NvcmUvTG9nZ2VyJztcclxuXHJcbi8vIFJ4anNcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vKiogQ29tcG9uZW50ZSBjaGUgcGVybWV0dGUgZGkgcmFwcHJlc2VudGFyZSB1bmEgZ3JpZ2xpYSBkaSB2YWxvcmkgKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VzLXRhYmxlJyxcclxuICAgIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IExvY2FsaXphdGlvblNlcnZpY2UsIHVzZUNsYXNzOiBFc1RhYmxlTG9jIH1dLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZXNfdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9lc190YWJsZS5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEVzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzIHtcclxuXHJcbiAgICAvLyBDb21wb25lbnRpIHBlciBsYSBnZXN0aW9uZSBkZWxsZSB2YXJpZSBmdW56aW9uYWxpdMOgIGRlbGwnZXMtdGFibGVcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBleHBvcnRfSDogRXhwb3J0SGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBjb2x1bW5NZXRhZGF0YV9IOiBDb2x1bW5NZXRhZGF0YUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgZHluYW1pY01vZGVfSDogRHluYW1pY01vZGVIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGhpZXJhcmNoeU1vZGVfSDogSGllcmFyY2h5TW9kZUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgaXRlbXNfSDogSXRlbXNIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIHJlcG9ydE1vZGVfSDogUmVwb3J0TW9kZUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgcm93R3JvdXBpbmdfSDogUm93R3JvdXBpbmdIYW5kbGVyXHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgc2VsZWN0aW9uX0g6IFNlbGVjdGlvbkhhbmRsZXI7XHJcblxyXG4gICAgLy8gU3Vic2NyaWJlcnMgcGVyIGdsaSBldmVudGkgZGkgY29waWEgZSBpbmNvbGxhXHJcbiAgICAvKiogQGlnbm9yZSAqLyBwcml2YXRlIGNvcHlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICAgIC8qKiBAaWdub3JlICovIHByaXZhdGUgcGFzdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBwcmVmU2VydmljZTogUHJlZmVyZW5jZXNTZXJ2aWNlLFxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRVNUX0RFRkFVTFRTKSBwcml2YXRlIGRlYWZ1bHRzOiBFc1RhYmxlRGVmYXVsdGFibGUsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChFU1RfTE9DQUxFKSBwdWJsaWMgbG9jYWxlOiBzdHJpbmcsXHJcbiAgICAgICAgcHVibGljIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgdXRpbGl0aWVzX0g6IFV0aWxpdGllc0hhbmRsZXIsXHJcbiAgICAgICAgcHVibGljIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZXhwRXh0czogRXhwb3J0U2VydmljZSxcclxuICAgICAgICBwdWJsaWMgZGF0ZUV4dHM6IERhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbXNnRXh0czogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjb3B5UGFzdGVEZXRlY3RvcjogQ29weVBhc3RlRGV0ZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBjbGlwYm9hcmRTZXJ2aWNlOiBDbGlwYm9hcmRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXIpIHtcclxuXHJcbiAgICAgICAgLy8gQ29waWEgZSBpbmNvbGxhIHNpIGVmZmV0dHVhbm8gc29sbyBzZSBsYSB0YWJlbGxhIGF0dHVhbGUgw6ggdW5pdm9jYW1lbnRlIHNlbGV6aW9uYXRhXHJcbiAgICAgICAgdGhpcy5jb3B5U3Vic2NyaXB0aW9uID0gdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5PbkNvcHkuc3Vic2NyaWJlKCgpID0+IHsgaWYgKHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuQWN0aXZlRXN0UmVmZXJlbmNlID09IHRoaXMpIHRoaXMuaGFuZGxlQ29weSgpOyB9KTtcclxuICAgICAgICB0aGlzLnBhc3RlU3Vic2NyaXB0aW9uID0gdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5PblBhc3RlLnN1YnNjcmliZSgoKSA9PiB7IGlmICh0aGlzLmNvcHlQYXN0ZURldGVjdG9yLkFjdGl2ZUVzdFJlZmVyZW5jZSA9PSB0aGlzKSB0aGlzLmhhbmRsZVBhc3RlKCk7IH0pO1xyXG5cclxuICAgICAgICB0aGlzLmV4cG9ydF9IID0gbmV3IEV4cG9ydEhhbmRsZXIodGhpcywgdGhpcy5leHBFeHRzLCB0aGlzLm1zZ0V4dHMsIHRoaXMudXRpRXh0cywgdGhpcy5kYXRlRXh0cyk7XHJcbiAgICAgICAgdGhpcy5yb3dHcm91cGluZ19IID0gbmV3IFJvd0dyb3VwaW5nSGFuZGxlcih0aGlzLCB0aGlzLnV0aWxpdGllc19ILCB0aGlzLmRhdGVFeHRzKTtcclxuICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0ggPSBuZXcgQ29sdW1uTWV0YWRhdGFIYW5kbGVyKHRoaXMsIHRoaXMudXRpbGl0aWVzX0gsIHRoaXMudXRpRXh0cywgdGhpcy5wcmVmU2VydmljZSwgdGhpcy5yb3dHcm91cGluZ19IKTtcclxuICAgICAgICB0aGlzLmR5bmFtaWNNb2RlX0ggPSBuZXcgRHluYW1pY01vZGVIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaGllcmFyY2h5TW9kZV9IID0gbmV3IEhpZXJhcmNoeU1vZGVIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaXRlbXNfSCA9IG5ldyBJdGVtc0hhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRNb2RlX0ggPSBuZXcgUmVwb3J0TW9kZUhhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fSCA9IG5ldyBTZWxlY3Rpb25IYW5kbGVyKHRoaXMsIHRoaXMucm93R3JvdXBpbmdfSCk7XHJcblxyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wpXHJcbiAgICAgICAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gQXNzZWduYXppb25lIHBlciB0dXR0aSBnbGkgSW5wdXQgZGkgZGVmYXVsdFxyXG4gICAgICAgIHRoaXMuQ29sdW1uc1Jlc2l6YWJsZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Db2x1bW5zUmVzaXphYmxlLCB0aGlzLmRlYWZ1bHRzPy5Db2x1bW5zUmVzaXphYmxlKTtcclxuICAgICAgICB0aGlzLkF1dG9VcGRhdGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQXV0b1VwZGF0ZSwgdGhpcy5kZWFmdWx0cz8uQXV0b1VwZGF0ZSk7XHJcbiAgICAgICAgdGhpcy5BbGxTZWFyY2ggPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQWxsU2VhcmNoLCB0aGlzLmRlYWZ1bHRzPy5BbGxTZWFyY2gsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuRXhwb3J0ID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkV4cG9ydCwgdGhpcy5kZWFmdWx0cz8uRXhwb3J0KTtcclxuICAgICAgICB0aGlzLkhpZGVQYWdpbmcgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuSGlkZVBhZ2luZywgdGhpcy5kZWFmdWx0cz8uSGlkZVBhZ2luZywgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuSGlkZVBhZ2luZ0NvdW50ID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkhpZGVQYWdpbmdDb3VudCwgdGhpcy5kZWFmdWx0cz8uSGlkZVBhZ2luZ0NvdW50KTtcclxuICAgICAgICB0aGlzLkhpZGVQYWdpbmdCdXR0b25zID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkhpZGVQYWdpbmdCdXR0b25zLCB0aGlzLmRlYWZ1bHRzPy5IaWRlUGFnaW5nQnV0dG9ucyk7XHJcbiAgICAgICAgdGhpcy5Db250YWluZXJDbGFzcyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Db250YWluZXJDbGFzcywgdGhpcy5kZWFmdWx0cz8uQ29udGFpbmVyQ2xhc3MsICcnKTtcclxuICAgICAgICB0aGlzLlRhYmxlQ2xhc3MgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuVGFibGVDbGFzcywgdGhpcy5kZWFmdWx0cz8uVGFibGVDbGFzcywgJ3RhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIgdGFibGUtc20nKTtcclxuICAgICAgICB0aGlzLlNlbGVjdGlvbiA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5TZWxlY3Rpb24sIHRoaXMuZGVhZnVsdHM/LlNlbGVjdGlvbik7XHJcbiAgICAgICAgdGhpcy5TYXZlUHJlZmVyZW5jZXMgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuU2F2ZVByZWZlcmVuY2VzLCB0aGlzLmRlYWZ1bHRzPy5TYXZlUHJlZmVyZW5jZXMpO1xyXG4gICAgICAgIHRoaXMuUGFnaW5nU3R5bGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuUGFnaW5nU3R5bGUsIHRoaXMuZGVhZnVsdHM/LlBhZ2luZ1N0eWxlLCAnYm90dG9tJyk7XHJcbiAgICAgICAgdGhpcy5Sb3dHcm91cGluZ1BhZ2luZ1N0eWxlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlJvd0dyb3VwaW5nUGFnaW5nU3R5bGUsIHRoaXMuZGVhZnVsdHM/LlJvd0dyb3VwaW5nUGFnaW5nU3R5bGUsICdsZWZ0Jyk7XHJcbiAgICAgICAgdGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSwgdGhpcy5kZWFmdWx0cz8uVXNlU2VsZWN0aW9uQ2FjaGUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuU2hvd0l0ZW1Hcm91cHNDb2x1bW5zID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlNob3dJdGVtR3JvdXBzQ29sdW1ucywgdGhpcy5kZWFmdWx0cz8uU2hvd0l0ZW1Hcm91cHNDb2x1bW5zLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5BcnJheW1vZGVJdGVtc1BlclBhZ2UgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQXJyYXltb2RlSXRlbXNQZXJQYWdlLCB0aGlzLmRlYWZ1bHRzPy5BcnJheW1vZGVJdGVtc1BlclBhZ2UsIDE1KTtcclxuICAgICAgICB0aGlzLkNvbHVtbnNQaW5uYWJsZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Db2x1bW5zUGlubmFibGUsIHRoaXMuZGVhZnVsdHM/LkNvbHVtbnNQaW5uYWJsZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5EZWZhdWx0QWxpZ25tZW50ID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkRlZmF1bHRBbGlnbm1lbnQsIHRoaXMuZGVhZnVsdHM/LkRlZmF1bHRBbGlnbm1lbnQsICdMZWZ0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFN1YmplY3QgdXRpbGl6emF0byBpbnRlcm5hbWVudGUgbGF0byBFc1RhYmxlIHBlciBjYXVzYXJlIGlsIEZvY3VzIGxhdG8gY29tcG9uZW50ZSBkaSBJbnB1dCAqL1xyXG4gICAgcHVibGljIEZvY3VzU3ViamVjdDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcclxuICAgIC8qKiBUaW1lciBjaGUgdmVycsOgIGltcG9zdGF0byBhICoqZG91YmxlQ2xpY2tCdWZmZXJNcyoqIHBlciBjYXBpcmUgc2Ugw6ggc3RhdG8gZWZmZXR0dWF0byB1biBjbGljayBzaW5nb2xvIG8gdW4gZG91YmxlY2xpY2sgKi9cclxuICAgIHByaXZhdGUgY2VsbERiQ2xpY2tUaW1lcjogYW55O1xyXG4gICAgLyoqIFNlIHZlbmdvbm8gZWZmZXR0dWF0aSAyIGNsaWNrIGEgZGlzdGFuemEgaW5mZXJpb3JlIGEgcXVlc3RpIE1pbGxpc2Vjb25kaSB2aWVuZSBjb25zaWRlcmF0byB1biBkb3BwaW8gY2xpY2sgKi9cclxuICAgIHByaXZhdGUgZG91YmxlQ2xpY2tCdWZmZXJNczogbnVtYmVyID0gMjAwO1xyXG4gICAgLyoqIFZpZXcgZmluYWxlIHN1IGN1aSBiaW5kYXJzaSBsYXRvIEZyb250ZW5kLCBpbCB0aXBvIHB1w7IgZXNzZXJlIElBcHBTZWFyY2g8YW55PiAocGVyIGxhICoqdmlld01vZGUqKiksIGFueVtdIChwZXIgbCcqKmFycmF5TW9kZSoqKSAqL1xyXG4gICAgcHVibGljIFZpZXc6IGFueSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyBkYSBjdWkgbCdlcy10YWJsZSBtb3N0cmEgaSBwdWxzYW50aSBkaSBwYWdpbmF6aW9uZSBpbiBiYXNzbyBhIGRlc3RyYSAqL1xyXG4gICAgcHVibGljIGFycmF5UHVsc2FudGk6IHsgdmFsOiBudW1iZXIsIGNzc0NsYXNzOiBzdHJpbmcgfVtdO1xyXG4gICAgLyoqIEluZGljYSBzZSBsJ2VzLXRhYmxlIGRldmUgbW9zdHJhcmUgaWwgY2hlY2sgZ2xvYmFsZSBuZWxsJ2hlYWRlciBwZXIgZmFyZSBpbCBcInNlbGV6aW9uYSB0dXR0b1wiICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ2hlY2sgPSBmYWxzZTtcclxuICAgIC8qKiBUaWVuZSBkYSBjb250byBsJ3VsdGltbyBlbGVtZW50byBzZWxlemlvbmF0byBpbiBtb2RvIGRhIHBvdGVyIGVmZmV0dHVhcmUgaWwgU0hJRlQrQ0xJQ0sgKi9cclxuICAgIHByaXZhdGUgbGFzdFNlbGVjdGVkOiBhbnkgPSBudWxsO1xyXG4gICAgLyoqIENvbnRlZ2dpbyBpbnRlcm5vIHBlciBpbCBudW1lcm8gZGkgZWxlbWVudGkgc2VsZXppb25hdGkgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RlZE9iamVjdHMgPSAwO1xyXG4gICAgLyoqIEluZGljYSBzZSDDqCBwb3NzaWJpbGUgZWZmZXR0dWFyZSB1bmEgc2VsZXppb25lIG1hc3NpdmEgKi9cclxuICAgIHB1YmxpYyBjYW5TZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgY29tcG9uZW50ZSBzdGEgZ2VzdGVuZG8gdW4gSUFwcFNlYXJjaDxhbnk+ICovXHJcbiAgICBwdWJsaWMgdmlld01vZGUgPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgY29tcG9uZW50ZSBzdGEgZ2VzdGVuZG8gdW4gYW55W10gKi9cclxuICAgIHB1YmxpYyBhcnJheU1vZGUgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRlbml0b3JlIGRlZ2xpIGVsZW1lbnRpIGRhIGxpc3RhcmUgbGF0byBpbnRlcmZhY2NpYSBkb3BvIHR1dHRlIGxlIGVsYWJvcmF6aW9uaSBkZWwgY2FzbyxcclxuICAgICAqIGdlbmVyYWxtZW50ZSBub24gc29ubyBhbHRybyBjaGUgdHV0dGkgZ2xpIG9nZ2V0dGkgZGEgcHJlc2VudGFyZSBjb24gaW4gcGnDuSBsJ2hhc2ggY2FsY29sYXRvIHBlciBpZGVudGlmaWNhcmUgMSBvZ2dldHRvIGNvbiBsYSBwcm9wcmlhIHJpZ2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJvdW5kU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIFN0ZXNzYSBjb3NhIGRlbGxhICoqYm91bmRTb3VyY2UqKiwgdXRpbGl6emF0YSBjb21lIGFwcG9nZ2lvIHRlbXBvcmFuZW8gaW50ZXJubyAqL1xyXG4gICAgcHVibGljIFRNUEJvdW5kU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIFwiRmV0dGFcIiBkaSBvZ2dldHRpIHV0aWxpenphdGEgbmVsbCdlbmRsZXNzIHNjcm9sbCwgb2duaSBlbGVtZW50byBkaSBxdWVzdG8gYXJyYXkgw6ggdW4gYmxvY2NoZXR0byBkaSAxMDAgZWxlbWVudGkgKi9cclxuICAgIHB1YmxpYyBib3VuZFN1YlNvdXJjZXM6IGFueVtdID0gW107XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgUXVlc3RhIGZ1bmdlIGRhIGluZGljYXRvcmUgcGVyIGdsaSBzbGljZSBpbnNlcml0aSwgbGEgbHVuZ2hlenphIGRvdnJlYmJlIGVzc2VyZSBjb3JyaXNwb25kZW50ZSBhICoqYm91bmRTdWJTb3VyY2VzKiogKi9cclxuICAgIHB1YmxpYyBhZGRlZFNsaWNlczogbnVtYmVyW10gPSBbXTtcclxuICAgIC8qKiBWYXJpYWJpbGUgY2hlIGlkZW50aWZpY2EgaWwgdmFsb3JlIGRlbCBcInNlbGV6aW9uYSBUdXR0b1wiIG5lbGxhIHBhZ2luYXppb25lICovXHJcbiAgICBwdWJsaWMgZGVmYXVsdEFsbFBhZ2VPdmVycmlkZSA9IDk5OTk5OTtcclxuICAgIC8qKiBTZXJ2ZSBwZXIgdGVuZXJlIGluIG1lbW9yaWEgaWwgY29udGVnZ2lvIHByZWNlZGVudGUgZSByZWN1cGVyYXJsbyBpbiBjYXNvIGRpdmVudGkgLTIgKHZlcmlmaWNhcmUgY29uIEFsZSBwZXJjaMOpIGxhIGxvZ2ljYSBkZWwgLTIpICovXHJcbiAgICBwdWJsaWMgcHJldmlvdXNDb3VudDogbnVtYmVyO1xyXG4gICAgLyoqIEluZGljYSBzZSB1dGlsaXp6YXJlIGlsIHNpc3RlbWEgZGkgYXV0b3VwZGF0ZSwgY2lvw6ggdW4gdHJpZ2dlciB0aW1lLWl6emF0byBpbiBhbHRvIGEgZGVzdHJhIGRlbGxhIHRhYmVsbGEgY2hlIHJpcGV0ZSBsZSByaWNlcmNoZSBvZ25pIFggKipzZWNvbmRzKiogKi9cclxuICAgIHB1YmxpYyBhdXRvVXBkYXRlID0gZmFsc2U7XHJcbiAgICAvKiogTnVtZXJvIGRpIHNlY29uZGkgZGEgZmFyZSB0cmFzY29ycmVyZSBmcmEgdW5hIHJpY2VyY2EgZSBsJ2FsdHJhICovXHJcbiAgICBwdWJsaWMgc2Vjb25kcyA9ICcxMCc7XHJcbiAgICAvKiogUmlmZXJpbWVudG8gYWxsJ0ludGVydmFsIGNoZSB2aWVuZSBnZW5lcmF0byBzZSAqKmF1dG9VcGRhdGUqKiDDqCBpbXBvc3RhdGEgYSB0cnVlIGluIG1vZG8gZGEgcG90ZXJsbyByaXB1bGlyZSAqL1xyXG4gICAgcHVibGljIHVwZGF0ZVRpbWVyOiBhbnk7XHJcbiAgICAvKiogSW1wb3N0YXRhIGEgdHJ1ZSBvZ25pIHZvbHRhIGNoZSB2aWVuZSBhdnZpYXRhIHVuYSByaWNlcmNhLCBlIGEgZmFsc2Ugb2duaSB2b2x0YSBjaGUgdW4gbnVvdm8gdmFsb3JlIHZpZW5lIHJpY2V2dXRvICovXHJcbiAgICBwdWJsaWMgcmVzZWFyY2hJblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogTW9kZWxsbyBkaSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIHBlciBpICoqUm93VERzKiogKi9cclxuICAgIHB1YmxpYyBUTVBSb3dURHM6IHsgW2NvbnRleHQ6IHN0cmluZ106IFRkRWxlbWVudFtdIH0gPSBudWxsO1xyXG4gICAgLyoqIE1vZGVsbG8gcmFwcHJlc2VudGFudGUgdW4gZGl6aW9uYXJpbyBkaSByaWdoZSBkZWxsYSB0YWJlbGxhLCBjb24gY2hpYXZlIGwnaGFzaCBlIHZhbG9yZSBsYSBsaXN0YSBkaSBjZWxsZSAqL1xyXG4gICAgcHVibGljIFJvd1REczogeyBbY29udGV4dDogc3RyaW5nXTogVGRFbGVtZW50W10gfSA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlICoqUm93VERzKiogw6ggdW4gb2dnZXR0byB2dW90byBvIG1lbm8gKi9cclxuICAgIHB1YmxpYyBFbXB0eVJvd1RkczogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvKiogTW9kZWxsbyBkaSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIHBlciBpICoqUm93VEhzKiogKi9cclxuICAgIHB1YmxpYyBUTVBSb3dUSHM6IFRoRWxlbWVudFtdID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIHJhcHByZXNlbnRhbnRlIHVuIHNpbmdvbG8gdGggZGVsbGEgdGFiZWxsYSwgZ2VuZXJhdG8gaW4gYmFzZSBhbGxlIGNvbmZpZ3VyYXppb25pIGUgYWdsaSBvZ2dldHRpIHJpY2V2dXRpICovXHJcbiAgICBwdWJsaWMgUm93VEhzOiBUaEVsZW1lbnRbXSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyBkaSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIHBlciBpICoqUm93VGhHcm91cHMqKiAqL1xyXG4gICAgcHVibGljIFRNUFJvd1RoR3JvdXBzOiBUaEdyb3VwW11bXSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyByYXBwcmVzZW50YW50ZSB1biBzaW5nb2xvIGhlYWRlciBncm91cCBkZWxsYSB0YWJlbGxhLiBRdWVzdGEgbGlzdGEgw6ggZ2nDoCBvcmRpbmF0YSBlIHByb250YSBwZXIgZXNzZXJlIHV0aWxpenphdGEgaW4gbmdGb3IgKi9cclxuICAgIHB1YmxpYyBSb3dUaEdyb3VwczogVGhHcm91cFtdW10gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdGEgZGVpIGNvbnRlc3RpLiBVbiBjb250ZXN0byBub24gw6ggYWx0cm8gY2hlIHVuIGhhc2ggcGFydGljb2xhcmUgY2FsY29sYXRvIHN1IHVuIG9nZ2V0dG8gY2hlIGlkZW50aWZpY2EgdW5pdm9jYW1lbnRlIHRhbGUgb2dnZXR0by5cclxuICAgICAqXHJcbiAgICAgKiBPZ251bm8gZGkgcXVlc3RpIGNvbnRlc3RpIHJhcHByZXNlbnRlcsOgIGEgc3VhIHZvbHRhLCB1bml2b2NhbWVudGUsIHVuYSByaWdhIGFsbCdpbnRlcm5vIGRlbGxhIHRhYmVsbGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJvd0NvbnRleHRzOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIERpcmV0dGl2ZSBkaSBvcmRpbmFtZW50byBkZWxsZSBjb2xvbm5lIChub24gb3JkaW5hbWVudG8gZGVpIGRhdGkgbWEgZGVsbGUgY29sb25uZSBpbiBzZSkgKi9cclxuICAgIHB1YmxpYyBPcmRlckRpcmVjdGl2ZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAvKiogQ29kaWNlIGRlbGwndWx0aW1vIG9nZ2V0dG8gc29sZXppb25hdG8gKi9cclxuICAgIHB1YmxpYyBsYXN0U2VsZWN0ZWRJdGVtSUQgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVjaWRlIHNlIHV0aWxpenphcmUgbyBtZW5vIGxlIEN1c3RvbUNlbGxzLiBJbXBvc3RhbmRvbG8gYSAqKnRydWUqKiBsJ2VzLXRhYmxlIGRpdmVudGEgaW4gZ3JhZG8gZGkgZ2VzdGlyZSBuYXRpdmFtZW50ZTpcclxuICAgICAqXHJcbiAgICAgKiAxKSBPcmRpbmFtZW50byBlIHZpc2liaWxpdMOgIGRlbGxlIGNvbG9ubmVcclxuICAgICAqXHJcbiAgICAgKiAyKSBPcmRpbmFtZW50byBkZWkgZGF0aVxyXG4gICAgICpcclxuICAgICAqIDMpIE1vZGFsaXTDoCBHZXJhcmNoaWNhXHJcbiAgICAgKlxyXG4gICAgICogZWNjLi4uXHJcbiAgICAgKiB2aWVuZSBkZWRvdHRvIGRhbCBzaXN0ZW1hIGluIGF1dG9tYXRpY29cclxuICAgICAqL1xyXG4gICAgcHVibGljIFVzZUN1c3RvbUNlbGxzOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBvbHRyZSBhbGxlIGNvbG9ubmUgZGluYW1pY2hlIHNwZWNpZmljaGUgZGkgdW4gdGlwbyBkaSBvZ2dldHRvIGNpIHNvbm8gYW5jaGUgY29sb25uZSBkaW5hbWljaGUgYWdnaXVudGUgZGFsbCd1dGVudGVcclxuICAgICAqXHJcbiAgICAgKiBFcy4gdW5hIGNvbG9ubmEgaW4gY3VpIG1vc3RyYXJlIHNlbXByZSB1biBpY29uY2luYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVXNlckRlZmluZWREeW5hbWljQ29sczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBjaGUgcXVlc3RvIMOoIGlsIHByaW1vIEJpbmQgZGVsbGEgdGFiZWxsYSwgdmllbmUgc2V0dGF0byBhIGZhbHNlIG5vbiBhcHBlbmEgaWwgcHJpbW8gYmluZCB2aWVuZSB0ZXJtaW5hdG8gY29uIHN1Y2Nlc3NvICovXHJcbiAgICBwdWJsaWMgRmlyc3RCaW5kOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8qKiBMaXN0YSBkaSBjb2xvbm5lIGNoZSBzaSBwb3Nzb25vIHZpc3VhbGl6emFyZS9vcmRpbmFyZSBmcmEgZGkgbG9ybyAqL1xyXG4gICAgcHVibGljIENvbHVtbnNMaXN0OiBFc1RhYmxlQ29sdW1uW10gPSBbXTtcclxuICAgIC8qKiBWYXJpYWJpbGUgZCdhcHBvZ2dpbyB1c2F0YSBkYWxsYSBkaWFsb2cgZGkgc2VsZXppb25lL25hc2NvbmRpbWVudG8sIHBlciBldml0YXJlIGRpIGRhbm5lZ2dpYXJlICoqQ29sdW1uc0xpc3QqKiBpbiBjYXNvIGRpIG1vZGlmaWNoZSBwb2kgYW5udWxsYXRlICovXHJcbiAgICBwdWJsaWMgVE1QQ29sdW1uc0xpc3Q6IEVzVGFibGVDb2x1bW5bXSA9IFtdO1xyXG4gICAgLyoqIFZhbG9yZSBkZWwgY2hlY2sgZ2xvYmFsZSBkaSB2aXNpYmlsaXTDoCB2YWxpZG8gcGVyIHR1dHRlIGxlIGNvbG9ubmUgaW4gKipDb2x1bW5zTGlzdCoqICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ29sVmlzQ2hlY2sgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGUgbGUgZGlyZXR0aXZlIHBlciBnbGkgZWRpdG9yIGN1c3RvbSBkZWxsZSBjZWxsZSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihFc1RkRWRpdG9yRGlyZWN0aXZlKSBFc1RkRWRpdG9yRGlyZWN0aXZlczogUXVlcnlMaXN0PEVzVGRFZGl0b3JEaXJlY3RpdmU+O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIHR1dHRlIGxlIG51b3ZlIGRpcmV0dGl2ZSAgYXNzZWduYXRpIGEgZGlyZXR0aXZhIChQZXIgbGEgbW9kYWxpdMOgIGRpbmFtaWNhIGRlbGwnZXMtdGFibGUpICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGREaXJlY3RpdmUpIEVzVGRzRGlyZWN0aXZlOiBRdWVyeUxpc3Q8RXNUZERpcmVjdGl2ZT47XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGkgZ2xpIGVzLXRkIGFzc2VnbmF0aSBhIGRpcmV0dGl2YSAoUGVyIGxhIG1vZGFsaXTDoCBkaW5hbWljYSBkZWxsJ2VzLXRhYmxlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihFc1RoRGlyZWN0aXZlKSBFc1Roc0RpcmVjdGl2ZTogUXVlcnlMaXN0PEVzVGhEaXJlY3RpdmU+O1xyXG4gICAgLyoqIElucHV0IGNvbGxlZ2F0byBhIHVuIHRlbXBsYXRlIGNoZSBjb250aWVuZSBsZSBkaXJldHRpdmUgcGVyIHJlbmRlcml6emFyZSBxdWVzdGEgdGFiZWxsYS4gc2UgY2kgc29ubyAqKkVzVGRzRGlyZWN0aXZlKiogZSAqKkVzVGhzRGlyZWN0aXZlKiogcXVlc3RpIGhhbm5vIGxhIHByaW9yaXTDoCAqL1xyXG4gICAgQElucHV0KCkgRXNUYWJsZVRlbXBsYXRlOiBJRXNUYWJsZVRlbXBsYXRlV3JhcHBlcjtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgZGVsIGJvZHkgKHB1bnRvIGRlbGxhIHRhYmVsbGEgZG92ZSB2ZW5nb25vIG1vc3RyYXRlIGxlIHJpZ2hlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnYm9keScsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgYm9keVJlZjogYW55O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBkZWxsJ2hlYWRlciAocHVudG8gZGVsbGEgdGFiZWxsYSBkb3ZlIHZlbmdvbm8gbW9zdHJhdGUgbGUgaW50ZXN0YXppb25pIGRlbGxlIHJpZ2hlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnaGVhZGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBoZWFkZXJSZWY6IGFueTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgc3VsIHJhZ2dydXBwYW1lbnRvIGRlZ2xpIGhlYWRlciAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnaGVhZGVyR3JvdXAnLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGhlYWRlckdyb3VwUmVmOiBhbnk7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgUXVlcnkgcGVyIHJlY3VwZXJhcmUgbGUgaW5mb3JtYXppb25pIHN1bCByYWdncnVwcGFtZW50byBkaSBzZWNvbmRvIGxpdmVsbG8gZGVnbGkgaGVhZGVyICovXHJcbiAgICBAQ29udGVudENoaWxkKCdzZWNvbmRhcnlIZWFkZXJHcm91cCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgc2Vjb25kYXJ5SGVhZGVyR3JvdXBSZWY6IGFueTtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSBpbCBjYW1wbyBkaSBJbnB1dCBhdHR1YWxlLiBEb3BvIHVuIGRvcHBpbyBjbGljayBsbyBiZWNjbyBlIGxvIGZvY3Vzc28gYXBwZW5hIHRlcm1pbmEgbGEgY2hhbmdlIGRldGVjdGlvbiAqL1xyXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGlucHV0RmllbGQ6IEVsZW1lbnRSZWY7XHJcbiAgICAvKiogT3B6aW9uaSBleHRyYSBjaGUgZGV2b25vIGFwcGFyaXJlIG5lbCBNZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhLCByaWNoaWFtYXRvIGRhaSAzIHBhbGxpbmkgdmVydGljYWxpICovXHJcbiAgICBASW5wdXQoKSBDb3JuZXJNZW51T3B0aW9uczogQ29ybmVyTWVudU9wdGlvbltdID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBwb3NzaWJpbGUgZWZmZXR0dWFyZSBpbCByZXNpemUgZGVsbGUgY29sb25uZSAqL1xyXG4gICAgQElucHV0KCkgQ29sdW1uc1Jlc2l6YWJsZTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGRldidlc3NlcmUgcG9zc2liaWxlIGVmZmV0dHVhcmUgaWwgcGlubmluZyBkZWxsZSBjb2xvbm5lICovXHJcbiAgICBASW5wdXQoKSBDb2x1bW5zUGlubmFibGU6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBkZXYnZXNzZXJlIGRpc3BvbmliaWxlIGlsIHNpc3RlbWEgZGkgYWdnaW9ybmFtZW50byBhdXRvbWF0aWNvICovXHJcbiAgICBASW5wdXQoKSBBdXRvVXBkYXRlOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgbCdhbHRlenphIGNhYmxhdGEgY2hlIGRldmUgYXNzdW1lcmUgbGEgdGFiZWxsYS4gRXM6IFwiMTAwcHhcIiB8IFwiMTAwJVwiIC4uLiAgKi9cclxuICAgIEBJbnB1dCgpIEhlaWdodDogc3RyaW5nID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgaWwgY29sb3JlIGRpIHNmb25kbyBkZWxsbyBzcGF6aW8gdnVvdG8gKG5vbiByaWNvcGVydG8gZGEgZGF0aSkuIFBhcnRpY29sYXJtZW50ZSB1dGlsZSBkYSBpbXBvc3RhcmUgaW4gY2FzbyBkaSAqKkhlaWdodCoqIGRpdmVyc28gZGEgbnVsbCAgKi9cclxuICAgIEBJbnB1dCgpIEVtcHR5U3BhY2VCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGRldidlc3NlcmUgbCdlc3RhYmxlIGEgZ2VzdGlyZSBsYSByaWNlcmNhLCBhbmNoZSBsYSBwcmltYS4gICoqL1xyXG4gICAgQElucHV0KCkgRXNUYWJsZUhhbmRsZWRTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogUGVybWV0dGUgZGkgaW1wb3N0YXJlIGwnYWx0ZXp6YSBtYXNzaW1hIGRlbGxhIHRhYmVsbGEuIFNlIG51bGwgbGEgZGltZW5zaW9uZSBzaSBhZGF0dGEgYWwgbnVtZXJvIGRpIGVsZW1lbnRpIGF0dHVhbG1lbnRlIGluIHZpc3VhbGl6emF6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgTWF4SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xyXG4gICAgLyoqIENsYXNzaSBkYSBhcHBsaWNhcmUgYWwgY29udGVuaXRvcmUgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgQ29udGFpbmVyQ2xhc3MgPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIG8gbWVubyBsJ2V4cG9ydCBpbiBmb3JtYXRvIFhMU1ggKi9cclxuICAgIEBJbnB1dCgpIFhMU1hFeHBvcnQ6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIG8gbWVubyBsJ2V4cG9ydCBpbiBmb3JtYXRvIENTViAqL1xyXG4gICAgQElucHV0KCkgQ1NWRXhwb3J0ID0gdHJ1ZTtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSB2aXN1YWxpenphcmUgbyBtZW5vIGwnb3B6aW9uZSBkaSBwYWdpbmF6aW9uZSBcIlR1dHRpXCIgKi9cclxuICAgIEBJbnB1dCgpIEFsbFNlYXJjaCA9IG51bGw7XHJcbiAgICAvKiogRGltaW51aXNjZSBnbGkgc3BhemkgZnJhIHVuYSBjZWxsYSBlIGwnYWx0cmEsIGUgaW50ZXJuYW1lbnRlIGlsIHBhZGRpbmcgZGVsIGZvbnQgaW4gbW9kbyBkYSBwcmVzZW50YXJlIG1vbHRpIHBpw7kgZGF0aSBpbiB1bid1bmljYSBwYWdpbmEgKi9cclxuICAgIEBJbnB1dCgpIEhpZ2hDZWxsRGVuc2l0eTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogQWJpbGl0YSBvIG1lbm8gbGEgcG9zc2liaWxpdMOgIGRpIHNlbGV6aW9uYXJlIG9nZ2V0dGkgKi9cclxuICAgIEBJbnB1dCgpIFNlbGVjdGlvbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogTW9zdHJhIG8gbWVubyB1biBtZXNzYWdnaW8gZGkgTG9hZGluZyBhbCBwcmltbyBjYXJpY2FtZW50byBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBTaG93TG9hZGluZ09uQm9vdHN0cmFwOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBTZSBpbXBvc3RhdG8gYSAqKnRydWUqKiBhZ2dpdW5nZSB1bmEgY29sb25uYSBjb24gcHVsc2FudGUgZGkgZWxpbWluYXppb25lIHBlciBlZmZldHR1YXJlIGwnZWxpbWluYSBkZWxsJ29nZ2V0dG8gcmVsYXRpdm8gKi9cclxuICAgIEBJbnB1dCgpIFJlbW92YWw6IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uZGl6aW9uZSBjaGUgbmFzY29uZGUgbCdpY29uYSBkaSBlbGltaW5hemlvbmUgaW5zZXJpdGEgaW1wb3N0YW5kbyAqKlJlbW92YWwqKiBhIHRydWUgcXVhbG9yYSBsYSBjb25kaXppb25lIG5vbiB2ZW5pc3NlIHJpc3BldHRhdGFcclxuICAgICAqXHJcbiAgICAgKiBDb21lIGNvbmRpemlvbmUgc2kgY29uc2lkZXJhIHVuIHNlbXBsaWNlIGNhbXBvIHN1IGN1aSBlZmZldHR1YXJlIHVuIGNvbnRyb2xsbyBib29sZWFubywgY29tZSBhZCBlc2VtcGlvIFwiY2FucmVtb3ZlXCJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgUmVtb3ZhbENvbmRpdGlvbiA9ICcnO1xyXG4gICAgLyoqIEluZGljYSBzZSBhYmlsaXRhcmUgbGEgcG9zc2liaWxpdMOgIGRpIGVzcG9ydGFyZSBsYSB2aXN0YSBkYXRpIGF0dHVhbGUgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIHBlcm1ldHRlcmUgbGEgc2VsZXppb25lIG11bHRpcGxhIFdpbmRvd3MtbGlrZSBjbGljY2FuZG8gdW4gb2dnZXR0byBlIGZhY2VuZG8gcG9pIFNoaWZ0ICsgY2xpY2sgc3UgdW4gb2dnZXR0byBzdWNjZXNzaXZvICovXHJcbiAgICBASW5wdXQoKSBTaGlmdENsaWNrOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgaWwgdGVzdG8gY2hlIHZhIGEgc29zdGl0dWlyZSBcIk9nZ2V0dGkgVmlzdWFsaXp6YXRpXCIgaW4gY2FzbyBzaSBzdGlhIGZhY2VuZG8gcXVhbGNvc2EgZGkgY3VzdG9tICovXHJcbiAgICBASW5wdXQoKSBDb3VudExhYmVsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIG8gbW9zdHJhcmUgaWwgY29tcG9uZW50ZSBkaSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgSGlkZVBhZ2luZzogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgbyBtb3N0cmFyZSBpbCBjb250ZWdnaW8gZGVnbGkgZWxlbWVudGkgdHJvdmF0aSAqL1xyXG4gICAgQElucHV0KCkgSGlkZVBhZ2luZ0NvdW50OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBvIG1vc3RyYXJlIGkgcHVsc2FudGkgZGkgcGFnaW5hemlvbmUgKi9cclxuICAgIEBJbnB1dCgpIEhpZGVQYWdpbmdCdXR0b25zOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBSaWZlcmltZW50byBhbCBDb250ZXh0TWVudSAobmd4LWNvbnRleHRtZW51KSBhc3NvY2lhdG8gYWwgY2xpY2sgZGVzdHJvIGRpIHVubyBvIHBpw7kgZWxlbWVudGkgc2VsZXppb25hdGkgbmVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgQ29udGV4dE1lbnU6IENvbnRleHRNZW51Q29tcG9uZW50ID0gbnVsbDtcclxuICAgIC8qKiBOb21lIGRlbGwnZXNwb3J0YXppb25lIGdlbmVyYXRhIGRhIHF1ZXN0YSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBFeHBvcnRGaWxlTmFtZSA9ICdFeHBvcnQuY3N2JztcclxuICAgIC8qKiBDbGFzc2UgKEhUTUwpIGRpIGRlZmF1bHQgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgVGFibGVDbGFzcyA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW56aW9uZSBkYSB1dGlsaXp6YXJlIGluIGVzcG9ydGF6aW9uZS4gTmVsIGZvcm1hdG8gXCJSZXBvcnRcIiBhdnLDoCB1biB1bmljbyBwYXJhbWV0cm8gXCJGb3JtYXRvXCIgZSBuZXNzdW4gdmFsb3JlIGRpIHJpdG9ybm8uXHJcbiAgICAgKlxyXG4gICAgICogTmVsIGZvcm1hdG8gXCJWaWV3XCIgaGEgY29tZSBwYXJhbWV0cm8gdW5hIGNhbGxiYWNrIGNvbiBpIGRhdGkgY29tcGxldGkgZGEgZXNwb3J0YXJlIChkYXRvIGNoZSBkaSBkZWZhdWx0IGxhIHJpY2VyY2Egw6ggcGFnaW5hdGEpXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydEZ1bmN0aW9uOiBhbnk7XHJcbiAgICAvKiogSW5kaWNhIGRpIGVzcG9ydGFyZSBzb2xvIGxlIGNvbG9ubmUgYXR0dWFsbWVudGUgdmlzaWJpbGkgZGVsbGEgdmlldyAqL1xyXG4gICAgQElucHV0KCkgRXhwb3J0T25seVZpc2libGVDb2x1bW5zOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgSW5kaWNhIGxhIHByZXNlbnphIGRpIHJhZ2dydXBwYW1lbnRpIGEgbGl2ZWxsbyBkaSBoZWFkZXIgKi9cclxuICAgIEBJbnB1dCgpIEhhc0hlYWRlckdyb3VwOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBJbmRpY2EgbGEgcHJlc2VuemEgZGkgcmFnZ3J1cHBhbWVudGkgYSBsaXZlbGxvIGRlbCByYWdncnVwcGFtZW50byBwcmVjZWRlbnRlbWVudGUgZXNpc3RlbnRlLCBjaGlhcmFtZW50ZSDDqCBpbnNlbnNhdGEgc2VuemEgKipIYXNIZWFkZXJHcm91cCoqICovXHJcbiAgICBASW5wdXQoKSBIYXNTZWNvbmRhcnlIZWFkZXJHcm91cDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgZ2xpIEhlYWRlciBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBIZWFkZXJIaWRkZW46IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIGlsIEJvZHkgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgQm9keUhpZGRlbjogYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgbGEgc2VsZXppb25lIMOoIHRlbXBvcmFuZWFtZW50ZSBkaXNhYmlsaXRhdGEuIFJpc3BldHRvIGFsbCdJbnB1dCAqKlNlbGVjdGlvbioqIGNoZSB2aXNpdmFtZW50ZSBnZXN0aXNjZSBzZSBjaSBzb25vIG8gbm8gZ2xpIGlucHV0IGRpIHNlbGV6aW9uZSxcclxuICAgICAqIHF1ZXN0byBJbnB1dCBnZXN0aXNjZSBzZSBxdWVzdGkgaW5wdXQgc29ubyBhYmlsaXRhdGkgbyBtZW5vXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFNlbGVjdGlvbkRpc2FibGVkOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBmb3J6YXJlIGlsIHNpc3RlbWEgZGkgc2VsZXppb25lIGEgZ2VzdGlyZSB1biBlbGVtZW50byBwZXIgdm9sdGEuXHJcbiAgICAgKiBTZWxlemlvbmFyZSB1bidhbHRyYSByaWdhIGNvbiB1bmEgZ2nDoCBzZWxlemlvbmF0YSBhcHBsaWNoZXLDoCBsYSBzZWxlemlvbmUgYWxsYSBudW92YSByaWdhLCByaW11b3ZlbmRvbGEgZGFsbCdhdHR1YWxlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFNpbmdsZVNlbGVjdGlvbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogQ2FsbGJhY2sgY2hlIGRhdG8gdW4gb2dnZXR0byByZXNpdHVpc2NlIGwnZXZlbnR1YWxlIGNsYXNzZSBkYSBhcHBsaWNhcmUgYWxsYSByaWdhIGNvbGxlZ2F0YSBhbGwnb2dnZXR0byAqL1xyXG4gICAgQElucHV0KCkgUm93Q2xhc3NBc3NpZ25lcjogYW55ID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBvcmRpbmFyZSBpIGRhdGkgaW4gbWFuaWVyYSBkaXNjZW5kZW50ZSBvIGFzY2VuZGVudGUgKi9cclxuICAgIEBJbnB1dCgpIE9yZGVyQnlDb2x1bW46IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIGF2ZXJlIHBpw7kgZGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvIGRlaSBkYXRpICovXHJcbiAgICBASW5wdXQoKSBNdWx0aXBsZU9yZGVyaW5nRGlyZWN0aXZlcyA9IHRydWU7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgbmFzY29uZGVyZSBsZSBjb2xvbm5lIGluIGJhc2UgYWxsZSBzZWxlemlvbmkgZWZmZXR0dWF0ZSBkYWwgTWVuw7kgY29udGVzdHVhbGUgaW4gYWx0byBhIGRlc3RyYSAqL1xyXG4gICAgQElucHV0KCkgSGlkZGVuQ29sdW1uczogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgcmlvcmRpbmFyZSBsZSBjb2xvbm5lIGluIGJhc2UgYWxsZSBpbXBvc3RhemlvbmkgZWZmZXR0dWF0ZSBkYWwgTWVuw7kgY29udGVzdHVhbGUgaW4gYWx0byBhIGRlc3RyYSAqL1xyXG4gICAgQElucHV0KCkgQ29sdW1uc09yZGVyaW5nOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBFdmVudHVhbGUgc3VwcG9ydG8gYWxsZSByaWNlcmNoZSBhcHBsaWNhdGUgYWxsYSBtb2RhbGl0w6AgQXJyYXkgKi9cclxuICAgIEBJbnB1dCgpIFNlYXJjaFZpZXcgPSBudWxsIGFzIEFwcFNlYXJjaDxhbnk+O1xyXG4gICAgLyoqIEFiaWxpdGEgbyBkaXNhYmlsaXRhIGlsIHNpc3RlbWEgY2hlIHBlcm1ldHRlIGRpIHNlbGV6aW9uYXJlIHR1dHRpIGdsaSBlbGVtZW50aSBuZWxsYSB2aXN0YSAqL1xyXG4gICAgQElucHV0KCkgU2VsZWN0QWxsOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBTaW11bGEgbGEgcGFnaW5hemlvbmUgYW5jaGUgcGVyIGxlIHRhYmVsbGUgY2hlIGZ1bnppb25hbm8gaW4gbW9kYWxpdMOgIEFycmF5ICovXHJcbiAgICBASW5wdXQoKSBVc2VBcnJheU1vZGVQYWdpbmcgPSB0cnVlO1xyXG4gICAgLyoqIERlZmluaXppb25lIGRpIGNvbG9ubmUgZGluYW1jaGUgcGVyIGxhIG1vZGFsaXTDoCwgYXBwdW50bywgZGluYW1pY2EgKi9cclxuICAgIEBJbnB1dCgpIER5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbjogRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uW10gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBvcGVyYXppb25pIGRpbmFtaWNoZSBnZW5lcmljaGUgY2hlIHBvc3Nvbm8gZXNzZXJlIGVmZmV0dHVhdGUgcGVyIHJpZ2EuIEFwcGFpb25vIGNvbWUgY29sb25uZSBleHRyYSBzdWwgbGF0byBzaW5pc3RybyBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBEeW5hbWljT3BlcmF0aW9uczogRXNUYWJsZU9wZXJhdGlvbkRlZmluaXRpb25bXSA9IFtdO1xyXG4gICAgLyoqIEluZGljYSBzZSB2aXN1YWxpenphcmUgaSBkYXRpIGluIG1hbmllcmEgZ2VyYXJjaGljYSAqL1xyXG4gICAgQElucHV0KCkgSGllcmFyY2h5OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIGwnSUQgZGVsIHBhZHJlLiBEYSB1dGlsaXp6YXJlIHNlICoqSGllcmFyY2h5Kiogw6ggaW1wb3N0YXRvICovXHJcbiAgICBASW5wdXQoKSBQYXJlbnRLZXkgPSAnJztcclxuICAgIC8qKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIGwnSUQgZGVsbCdvZ2dldHRvIGF0dHVhbGUuIERhIHV0aWxpenphcmUgc2UgKipIaWVyYXJjaHkqKiDDqCBpbXBvc3RhdG8gKi9cclxuICAgIEBJbnB1dCgpIE93bktleSA9ICcnO1xyXG4gICAgLyoqIEluZGljYSBzZSBwYXJ0aXJlIGNvbiB1biBhbGJlcm8gZXNwYW5zby4gRGEgdXRpbGl6emFyZSBzZSAqKkhpZXJhcmNoeSoqIMOoIGltcG9zdGF0byAqL1xyXG4gICAgQElucHV0KCkgU3RhcnRzRXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgLyoqIEluZGljYSBzZSBlZmZldHR1YXJlIGlsIHNhbHZhdGFnZ2lvIGRlbGxlIHByZWZlcmVuemUgZGkgcmljZXJjYSAqL1xyXG4gICAgQElucHV0KCkgU2F2ZVByZWZlcmVuY2VzOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBBbGxpbmVhbWVudG8gZGkgZGVmYXVsdCBwZXIgY2VsbGUgZSBoZWFkZXJzICovXHJcbiAgICBASW5wdXQoKSBEZWZhdWx0QWxpZ25tZW50OiAnTGVmdCcgfCAnUmlnaHQnIHwgJ0NlbnRlcicgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBkb3ZlIHZpc3VhbGl6emFyZSBsZSBpbmZvcm1hemlvbmkgZGkgcGFnaW5hemlvbmUsIHNlIHNvcHJhLCBzb3R0byBvIGluIGVudHJhbWJpICovXHJcbiAgICBASW5wdXQoKSBQYWdpbmdTdHlsZTogJ2JvdGgnIHwgJ3RvcCcgfCAnYm90dG9tJyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIGRvdmUgdmlzdWFsaXp6YXJlIGxlIGluZm9ybWF6aW9uaSBkaSBwYWdpbmF6aW9uZSwgc2Ugc29wcmEsIHNvdHRvIG8gaW4gZW50cmFtYmkgKi9cclxuICAgIEBJbnB1dCgpIFJvd0dyb3VwaW5nUGFnaW5nU3R5bGU6ICdsZWZ0JyB8ICdyaWdodCcgPSBudWxsO1xyXG4gICAgLyoqIFF1YWxvcmEgcGVyIHF1YWxzaWFzaSBtb3Rpdm8gbm9uIHZlbmlzc2UgdXNhdG8gKippdGVtcyoqIGRlbGwnQXBwU2VhcmNoIHF1ZXN0byBJbnB1dCBpbmRpY2EgcXVhbCDDqCBpbCBub21lIGRlbGxhIHByb3ByaWV0w6AgZGEgdXRpbGl6emFyZSAqL1xyXG4gICAgQElucHV0KCkgSXRlbVNvdXJjZVByb3BlcnR5OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgLyoqIEluZGljYSBzZSB1dGlsaXp6YXJlIGxhIGNhY2hlIGRpIHNlbGV6aW9uZSBjaGUgcGVybWV0dGUgZGkgbWFudGVuZXJlIGdsaSBzdGF0aSBkaSBzZWxlemlvbmUgZGVpIHZhcmkgb2dnZXR0aSBuYXZpZ2FuZG8gZGEgdW5hIHBhZ2luYSBhbGwnYWx0cmEgKi9cclxuICAgIEBJbnB1dCgpIFVzZVNlbGVjdGlvbkNhY2hlID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBkZWNpZGVyZSBzZSwgaW4gbW9kYWxpdMOgIHJhZ2dydXBwYW1lbnRvLCBtb3N0cmFyZSBvIG1lbm8gaWwgdmFsb3JlIGRlbGxlIGNvbG9ubmUgZGkgZ3J1cHBvIG5lZ2xpIG9nZ2V0dGkgZmluYWxpLiBEaSBkZWZhdWx0IHNvbm8gbmFzY29zdGkgKi9cclxuICAgIEBJbnB1dCgpIFNob3dJdGVtR3JvdXBzQ29sdW1ucyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIGNoZSB0dXR0aSBpIGNhbXBpIGNoZSBkZWZpbmlzY29ubyBsZSBtb2RhbGl0w6AgZGkgbW9kaWZpY2EgY2FtcG8gcG9zc29ubyBlc3NlcmUgbW9kaWZpY2F0aSBpbiBiYXNlIGFsbGUgaW1wb3N0YXppb25pICovXHJcbiAgICBASW5wdXQoKSBFZGl0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBzZSDDqCBwb3NzaWJpbGUgZWZmZXR0dWFyZSBzZWxlemlvbmkgYSByYW5nZSBwZXIgcG9pIGZhcmNpIGV2ZW50dWFsbWVudGUgY29waWEgaW5jb2xsYSAqL1xyXG4gICAgQElucHV0KCkgUmFuZ2VTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2EgaWwgbnVtZXJvIGRpIG1pbGxpc2Vjb25kaSBwZXIgY3VpIGRlYm91bmNhcmUgaWwgd3JpdGVWYWx1ZSBwZXIgbGEgbW9kYWxpdMOgICoqRXNUYWJsZUhhbmRsZWRTZWFyY2gqKiAqL1xyXG4gICAgQElucHV0KCkgU2VhcmNoVGhyb3R0bGU6IG51bWJlciA9IDUwO1xyXG4gICAgLyoqIEV2ZW50byBjaGUgdmllbmUgcmljaGlhbWF0byBhbCBjYW1iaW8gZGkgb3JpZG5hbWVudG8gZGkgdW5hIGNvbG9ubmEgKi9cclxuICAgIEBPdXRwdXQoKSBvbk9yZGVyQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFwcE9yZGVyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8QXBwT3JkZXJpbmc+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudG8gY2hlIHZpZW5lIHJpY2hpYW1hdG8gcXVhbmRvIGwnZXMtdGFibGUgcml0aWVuZSBzaWEgbmVjZXNzYXJpbyByaS1lZmZldHR1YXJlIGxhIHJpY2VyY2EuXHJcbiAgICAgKiBJbCBib29sZWFubyBkZWxsJ2V2ZW50byBpbmRpY2Egc2UgdmllbmUgc3VnZ2VyaXRvIGRpIHJlc2V0dGFyZSBsYSBwYWdpbmEgbyBtZW5vLlxyXG4gICAgICogXHJcbiAgICAgKiBTb2xvIGluIGNhc28gdmVuZ2EgdXRpbGl6emF0YSBsYSBtb2RhbGl0w6AgYSByYWdncnVwcGFtZW50aSBkaSByaWdoZSBwdcOyIHN1Y2NlZGVyZSBjaGUgbCdlcy10YWJsZSBwYXNzaSB1biBpbnRlcm8gQXBwU2VhcmNoIGNvbWUgcGFyYW1ldHJvIGRpIHJpY2VyY2EsXHJcbiAgICAgKiBpbiBxdWVsIGNhc28gbCdhcHBsaWNhemlvbmUgcmljZXZlbnRlIGRvdnLDoCBvbm9yYXJlIGxhIHJpY2hpZXN0YSBzcGVkZW5kbyBhbCBiYWNrYW5kIGwnb2dnZXR0byBkaSByaWNlcmNhIEFTLUlTXHJcbiAgICAgKiBcclxuICAgICAqIGlsIHRpcG8gZGVsbCdFbWl0dGVyIGludmVjZSBkaSBlc3NlcmUgW2Jvb2xlYW4gfCBBcHBTZWFyY2g8YW55Pl0gw6ggc3RhdG8gaW1wb3N0YXRvIGEgXCJhbnlcIiBwZXIgZXZpdGFyZSBwcm9ibGVtaSBkaSByZXRyb2NvbXBhdGliaWxpdMOgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBvblNlYXJjaFJlcXVlc3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICAvKiogRXZlbnRvIGNoZSBwYXJ0ZSBhZCBvZ25pIG1vZGlmaWNhIGRpIFwiY2hlY2thZ2dpb1wiIGluIGZvcm1hIGRpIGNvbW9kbyBhcnJheS4gRXNwb25lIGwnb2dnZXR0byBjb24gbG8gc3RhdG8gZGkgY2hlY2sgYXR0dWFsZSAqL1xyXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0aW9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEl0ZW1zU2VsZWN0aW9uPGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxJdGVtc1NlbGVjdGlvbjxhbnk+PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbCdlbGltaW5hemlvbmUgZGkgdW4gb2dnZXR0byAqL1xyXG4gICAgQE91dHB1dCgpIG9uUmVtb3ZhbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBhbGwnYW5udWxsYW1lbnRvIGRpIHVuJ2VsaW1pbmF6aW9uZSAqL1xyXG4gICAgQE91dHB1dCgpIG9uQWJvcnRSZW1vdmFsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbGEgbW9kaWZpY2EgZGVpIG1vZGVsbGkgYmluZGF0aSAqL1xyXG4gICAgQE91dHB1dCgpIG9uTW9kZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxFc1RhYmxlTW9kZWxDaGFuZ2VbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPEVzVGFibGVNb2RlbENoYW5nZVtdPigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbCdhcGVydHVyYSBkZWwgbWVuw7kgY29udGVzdHVhbGUgKi9cclxuICAgIEBPdXRwdXQoKSBvbk9wZW5Db250ZXh0TWVudTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBxdWFuZG8gc2kgY2xpY2NhIHN1IHVuIG9wemlvbmUgZGVmaW5pdGEgbmVsbGUgKipDb3JuZXJNZW51T3B0aW9ucyoqICovXHJcbiAgICBAT3V0cHV0KCkgb25Db3JuZXJBY3Rpb246IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGVzdGFibGU6IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nLCBlc3RhYmxlOiBhbnkgfT4oKTtcclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBxdWFuZG8gc2kgY2xpY2NhIHN1IHVuIG9wemlvbmUgZGVmaW5pdGEgbmVsbGUgKipEeW5hbWljT3BlcmF0aW9ucyoqICovXHJcbiAgICBAT3V0cHV0KCkgb25EeW5hbWljT3BlcmF0aW9uOiBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nLCBpdGVtOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZywgaXRlbTogYW55IH0+KCk7XHJcblxyXG4gICAgLyoqIERhdGkgZXNwb3J0YXRpIGRhIG5neC1jc3YgKi9cclxuICAgIHB1YmxpYyBkYXRhOiBhbnlbXTtcclxuICAgIC8qKiBIZWFkZXIgZGVpIGRhdGkgZXNwb3J0YXRpIGRhIG5neC1jc3YgKi9cclxuICAgIHB1YmxpYyBoZWFkZXJzOiBDc3ZIZWFkZXJzW107XHJcbiAgICAvKiogRWxlbWVudG8gSFRNTCBkYSBjbGljY2FyZSBwZXIgbCdlc3BvcnRhemlvbmUgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2V4cG9ydERvd25sb2FkZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGV4cG9ydERvd25sb2FkZXI6IEVsZW1lbnRSZWY7XHJcbiAgICAvKiogUGxhY2Vob2xkZXIgZGkgbWVuw7kgY29udGVzdHVhbGUgcGVyIHF1YW5kbyBub24gY2kgc29ubyBvcHppb25pIG5lbCBwbGFjZWhvbGRlciBcIlZlcm9cIiAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2VtcHR5TWVudScsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyB0YWJsZUVtcHR5TWVudTogQ29udGV4dE1lbnVDb21wb25lbnQ7XHJcblxyXG4gICAgLyoqIFN1YnNjcmlwdGlvbiBzdWxsJ2FwZXJ0dXJhIGRlbCBjb250ZXh0IG1lbnUgZGEgcmlwdWxpcmUgYWwgZGVzdHJveSBkZWxsYSBjbGFzc2UgKi9cclxuICAgIHByaXZhdGUgY3R4TWVudVN1YnNjcmlwdGlvbjogYW55O1xyXG5cclxuICAgIC8qKiBQYWdpbmEgaW4gdmlzdWFsaXp6YXppb25lIChkdXJhbnRlIGxhIHBhZ2luYXppb25lIGluIG1vZGFsaXTDoCBBcnJheSkgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVQYWdlID0gMTtcclxuICAgIC8qKiBOdW1lcm8gZGkgcGFnaW5lIChkdXJhbnRlIGxhIHBhZ2luYXppb25lIGluIG1vZGFsaXTDoCBBcnJheSkgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVQYWdlcyA9IDE7XHJcbiAgICAvKiogT2dnZXR0aSBwZXIgb2duaSBwYWdpbmEgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgQElucHV0KCkgQXJyYXltb2RlSXRlbXNQZXJQYWdlID0gbnVsbDtcclxuICAgIC8qKiBPZ2dldHRvIGRpIHNlbGV6aW9uZSBwZXIgbGEgbW9kYWxpdMOgIEFycmF5LCBjaGUgZGV2ZSBjb21wb3J0YXJzaSBjb21lIGxhIGNvbnRyb3BhcnRlIGluIG1vZGFsaXTDoCBWaWV3ICovXHJcbiAgICBwdWJsaWMgYXJyYXltb2RlU2VsZWN0aW9uOiBJdGVtc1NlbGVjdGlvbjxhbnk+O1xyXG4gICAgLyoqIENvbG9ubmUgZGEgdmlzdWFsaXp6YXJlIGluIG1vZGFsaXTDoCBhcnJheSAqL1xyXG4gICAgcHVibGljIGFycmF5Q29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBPcmRpbmUgZGVsbGUgY29sb25uZSBkYSB2aXN1YWxpenphcmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlDb2x1bW5PcmRlcmluZzogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBPcmRpbmFtZW50aSBBU0MtREVTQyBzdWxsZSBjb2xvbm5lIGluIG1vZGFsaXTDoCBhcnJheSAqL1xyXG4gICAgcHVibGljIGFycmF5T3JkZXJzOiBBcHBPcmRlcmluZ1tdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYXJpYWJpbGUgY2hlIHNlcnZlIGEgZ2VzdGlyZSBpbCBtb21lbnRvIGluIGN1aSBsJ2VzLXRhYmxlIGFnZ2lvcm5hIGxhIHBhZ2luYXppb25lIChwdWxzYW50aSBlY2MpLlxyXG4gICAgICogRXNzZW5kbyBvcGVyYXppb25pIGNvbXVucXVlIGNvc3Rvc2UgbGUgZWZmZXR0dW8gc29sbyBzdSBiaW5kaW5nIGVzdGVybmksIG5vbiBzdSByZXdyaXRlIGdlbmVyYXRpIGludGVybmFtZW50ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGludGVybmFsV3JpdGVDYWxsID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWNoZSBjaGUgY29udGVycsOgIHR1dHRlIGxlIHJpY2VyY2hlIGVmZmV0dHVhdGUgc3UgZ3J1cHBpIGRpdmVyc2kgZGFsIHByaW1vIGUgc3UgZWxlbWVudGkgY29udGVudXRpIG5laSBncnVwcGkuXHJcbiAgICAgKiBJbiBjYXNvIGRpIGNhbWJpIGRpIG9yZGluYW1lbnRvIGRlbGxlIGNvbG9ubmUgZGl2ZXJzZSBkYWxsYSBwcmltYSB0dXR0ZSBsZSBjaGlhbWF0ZSBmYXR0ZSBkYWwgc2Vjb25kbyBsaXZlbGxvIGluIHBvaSBkZXZvbm8gZXNzZXJlIHJpZXNlZ3VpdGUgc2Vjb25kbyBsYSBzZWd1ZW50ZSBsb2dpY2E6XHJcbiAgICAgKiBcclxuICAgICAqIFxyXG4gICAgICogKipDYW1iaW8gb3JkaW5hbWVudG8gc3VsIHByaW1vIGdydXBwbyoqOiByZWxvYWQgY29tcGxldG8sIG5vbiBtaSBvY2N1cG8gZGkgcmlwdWxpcmUgZ2xpIGVsZW1lbnRpIGJpbmRhdGkgaW4gYWxjdW4gbW9kb1xyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdWxsYSBjb2xvbm5hIHJlbGF0aXZhIGFsbCdOLWVzaW1vIGdydXBwbyoqOiByZWxvYWQgY29tcGxldG8gZGVsIGNvbnRlbnV0byBkZWkgZ3J1cHBpIHByZWNlZGVudGksIHJpcHVsZW5kbyBwcmVjZWRlbnRlbWVudGUgXHJcbiAgICAgKiB0dXR0aSBnbGkgZWxlbWVudGkgY29uICoqX2dyb3VwbGV2ZWwqKiA9IE5cclxuICAgICAqIFxyXG4gICAgICogKipDYW1iaW8gb3JkaW5hbWVudG8gc3UgdW5hIGNvbG9ubmEgbm9uIHJhZ2dydXBwYXRhKio6IHJlbG9hZCBjb21wbGV0byBwZXIgdHV0dGkgaSBncnVwcGkgZmluYWxpIGFwZXJ0aSwgZGV2byBwcmVjZWRlbnRlbWVudGUgcmlwdWxpcmUgdHV0dGkgZ2xpIGVsZW1lbnRpIGNvbiAqKl9pdGVtKiogPSB0cnVlXHJcbiAgICAgKiBcclxuICAgICAqIEFsdHJpIGV2ZW50aSBub24gZG92cmViYmVybyByYXBwcmVzZW50YXJlIHByb2JsZW1pOlxyXG4gICAgICogLSBTZWxlemlvbmU6IG5vbiBjYW1iaWEgbnVsbGFcclxuICAgICAqIC0gUGFnaW5hemlvbmU6IGNhbWJpYSBhIGxpdmVsbG8gcm9vdCBxdWluZGkgdmllbmUgcmljYXJpY2F0byB0dXR0byBjb211bnF1ZSwgc3Rlc3NvIHZhbGUgcGVyIGxlIHBhZ2luYXppb25pIGludGVybmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZTogeyBwYXRoOiBzdHJpbmcsIHJvdXRlOiBHcm91cFJvdXRlRnJhZ21lbnRbXSwgdmlldzogQXBwU2VhcmNoPGFueT4sIGdyb3VwX2NvbHVtbjogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKiBWYXJpYWJpbGUgZCdhcHBvZ2dpbyBwZXIgY2FwaXJlIHNlIGMnw6ggYmlzb2dubyBkaSByaS1lZmZldHR1YXJlIHVuYSByaWNlcmNhIG8gbWVubyAqL1xyXG4gICAgcHJpdmF0ZSBSZXNlYXJjaE5lZWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIENvbG9ubmUgdmlzaWJpbGkgZGVsbGEgdmlzdGEgYXR0dWFsZS4gVmFsb3JpenphdG8gZGkgZGVmYXVsdCBhbCBudW1lcm8gbWFzc2ltbyBkaSBjb2xvbm5lIHN1cHBvcnRhdGUgZGFsbGEgdGFiZWxsYSBwZXIgbGUgY2FzaXN0aWNoZSBpbiBhc3NlbnphIGRpIGN1c3RvbSBjZWxscyAqL1xyXG4gICAgcHVibGljIENvbHVtbnM6IHsgVmlzaWJpbGU6IG51bWJlciwgVmlzaWJsZVVucGlubmVkOiBudW1iZXIsIEdsb2JhbDogbnVtYmVyIH0gPSB7IFZpc2liaWxlOiAxMDAsIFZpc2libGVVbnBpbm5lZDogMTAwLCBHbG9iYWw6IDEwMCB9O1xyXG4gICAgLyoqIEluIGNhc28gZGkgUm93IEdyb3VwaW5nIHF1aSB2aWVuZSBzYWx2YXRhIGxhIHZpc3RhIHByaW5jaXBhbGUgZGVpIGdydXBwaSBiYXNlICovXHJcbiAgICBwdWJsaWMgTWFpbkdyb3VwVmlldzogQXBwU2VhcmNoPGFueT4gPSBudWxsO1xyXG4gICAgLyoqIENvbnRlZ2dpbyBiYXNlIGRlZ2xpIG9nZ2V0dGkuIEluIG1vZGFsaXTDoCBub3JtYWxlIHZpZW5lIHJlc2V0dGF0byBhZCBvZ25pIG51b3ZhIFZpZXcgaW5zZXJpdGEsIGluIG1vZGFsaXTDoCBSb3dHcm91cGluZyB2aWVuZSByZXNldHRhdG8gc29sbyBhZCB1bmEgbnVvdmEgVmlldyBkaSBsaXZlbGxvIFwiMFwiICovXHJcbiAgICBwdWJsaWMgQmFzZUl0ZW1zQ291bnQgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBjaSBzb25vIGRlbGxlIGNvbG9ubmUgcGlubmF0ZSBlIHZpc2liaWxpLiBTZXJ2ZSBwZXIgcG90ZXIgc2V0dGFyZSB0dXR0ZSBsZSBjb2xvbm5lIHByaW1hIGNoZSBhcnJpdmlubyBkYXRpIGEgcGlubmVkKi9cclxuICAgIHB1YmxpYyBIYXNQaW5uZWRDb2x1bW5zOiBib29sZWFuXHJcbiAgICAvKiogTGFyZ2hlenphIGNhbGNvbGF0YSBkZWwgY29udGFpbmVyIGRlbGxlIGNvbG9ubmUgcGlubmF0ZSAqL1xyXG4gICAgcHVibGljIFBpbm5lZENvbnRhaW5lcldpZHRoOiBudW1iZXI7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5vbm9zdGFudGUgc2lhbW8gaW4gbW9kYWxpdMOgIGFycmF5IHNvbm8gc3RhdGkgaW5kaXZpZHVhdGkgZGVpIGdydXBwaS4gSW4gdGFsIGNhc28gZXMtdGFibGUgc2kgY29tcG9ydGEgZGEgcHNldWRvIGJhY2tlbmQgZWQgZWZmZXR0dWEgbGUgYWdncmVnYXppb25pIGUgcmFnZ3J1cHBhbWVudGkgY29tcGxldGFtZW50ZSBsYXRvIGNsaWVudCAqL1xyXG4gICAgcHVibGljIEFycmF5R3JvdXBpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2EgY2hlIGwnZXMtdGFibGUgw6ggYmFzYXRhIHN1bGxlIGRpcmV0dGl2ZSAobnVvdmEgbW9kYWxpdMOgKSAqL1xyXG4gICAgcHVibGljIERpcmVjdGl2ZXNCYXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBsbyBzdGF0byBkaSBzZWxlemlvbmUgcGVyIHNpbmdvbGEgY2VsbGEgKi9cclxuICAgIHB1YmxpYyBzZWxlY3Rpb25TdGF0dXM6IHsgW2luZGV4OiBudW1iZXJdOiB7IFtpbmRleDogbnVtYmVyXTogSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZSB9IH0gPSB7fTtcclxuICAgIC8qKiBDaGlhbWF0YSByZWFsZSBhbCB3cml0ZVZhbHVlIGRvcG8gaWwgcGFzc2FnZ2lvIGRpICoqU2VhcmNoVGhyb3R0bGUqKiBtaWxsaXNlY29uZGkuIFNvbG8gbW9kYWxpdMOgIEVzVGFibGVIYW5kbGVkU2VhcmNoICovXHJcbiAgICBwcml2YXRlIGNhbGxUaW1lb3V0IDogYW55ID0gbnVsbDtcclxuICAgIC8qKiBDYWNoZSBkZWkgdGggcGl1dHRvc3RvIGNoZSByaWNhbGNvbGFyc2VsaSBkaSBjb250aW51byAqL1xyXG4gICAgcHJpdmF0ZSB0aHNDYWNoZTogIHsgW2luZGV4OiBzdHJpbmddOiBFc1RoRGlyZWN0aXZlIH0gPSB7fTtcclxuICAgIC8qKiBJbmRpY2EgcXVhbmRvIGxhIGNhY2hlIGRlaSB0aCDDqCBzdGF0YSBmaWxsYXRhIGFsbWVubyBsYSBwcmltYSB2b2x0YSAqL1xyXG4gICAgcHJpdmF0ZSB0aHNDYWNoZVNldDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIFxyXG4gICAgICogRmxhZyBjaGUsIHNlICoqdHJ1ZSoqLCBwZXIgdW4gZ2lybyBkaSBiaW5kaW5nIG1hbnRpZW5lIGxhIHZpc2liaWxpdMOgIGltcG9zdGF0YSBsb2NhbG1lbnRlLCBwaXV0dG9zdG8gY2hlIGFsbGluZWFyZSBhbGxhIFZpZXcgYmluZGF0YS4gXHJcbiAgICAgKiBVc2F0YSBwZXIgbW9kaWZpY2FyZSBpbiBtYW5pZXJhIHByb2dyYW1tYXRpY2EgbGEgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZSBkYWwgbWV0b2RvICoqc2V0SGVhZGVyVmlzaWJpbGl0eSoqLCBcclxuICAgICAqIFxyXG4gICAgICogRGlzY2xhaW1lcjogKipOT04gTU9ESUZJQ0FSRSoqXHJcbiAgICAgKiovXHJcbiAgICBwdWJsaWMgdXNlTG9jYWxWaXNpYmlsaXR5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogT3B6aW9uaSBkaSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgcHVibGljIFBhZ2VyT3B0aW9uczogUGFnZXJJbmZvcyA9IG5ldyBQYWdlckluZm9zKClcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgICAgIC8vIGNsaWNrIGRlc3RybyBzdSB1bmEgcmlnYSBjb24gc2VsZXppb25lIGF0dGl2YTogVGlybyBmdW9yaSBpbCBjb250ZXh0IG1lbnUgZSBzZWxlemlvbmUgbCdlbGVtZW50byBjb3JyZW50ZVxyXG4gICAgICAgIHRoaXMuY3R4TWVudVN1YnNjcmlwdGlvbiA9ICh0aGlzLkNvbnRleHRNZW51IHx8IHRoaXMudGFibGVFbXB0eU1lbnUpLm9wZW4uc3Vic2NyaWJlKHQgPT4ge1xyXG4gICAgICAgICAgICAvLyBHcnVwcGkgdmEgYmVuZSwgb2dnZXR0aSBwdXJlLCBtYSBzZXBhcmF0b3JpIGZyYSBncnVwcGkgcHJvcHJpbyBuby4uLlxyXG4gICAgICAgICAgICBpZiAodC5pdGVtLl9zZXApIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGxldCBzaG91bGRFbWl0ID0gIXQuaXRlbS5fc2VsZWN0ZWQ7XHJcblxyXG4gICAgICAgICAgICB0Lml0ZW0uX3NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvblN0YXR1c0V4Y2x1ZGluZyhudWxsKTtcclxuICAgICAgICAgICAgdmFyIGl0ZW1TZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbl9ILmhhbmRsZUl0ZW1zU2VsZWN0aW9uKFt0Lml0ZW1dKTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hvdWxkRW1pdClcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgLy8gU2UgdXRpbGl6em8gbGEgbmV3IHNwaWN5IG1vZGUgZGVkdWNvIHR1dHRpIGkgcGFyYW1ldHJpIGRpIGxhdm9ybyBwb3NzaWJpbGkgYWwgY2FyaWNhbWVudG8gZGVsbGEgdGFiZWxsYVxyXG4gICAgICAgIC8vIFZlbmdvbm8gc292cmFzY3JpdHRlIHNvbG8gbGUgcHJvcHJpZXTDoCBub24gaW1wb3N0YXRlIGRhbGwndXRlbnRlXHJcbiAgICAgICAgbGV0IHRkc0QgPSB0aGlzLkVzVGRzRGlyZWN0aXZlLmxlbmd0aCA9PSAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Rkc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUZHNEaXJlY3RpdmUgOiB0aGlzLkVzVGRzRGlyZWN0aXZlIDogdGhpcy5Fc1Rkc0RpcmVjdGl2ZTtcclxuICAgICAgICBsZXQgdGhzRCA9IHRoaXMuRXNUaHNEaXJlY3RpdmUubGVuZ3RoID09IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGhzRGlyZWN0aXZlPy5sZW5ndGggPiAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Roc0RpcmVjdGl2ZSA6IHRoaXMuRXNUaHNEaXJlY3RpdmUgOiB0aGlzLkVzVGhzRGlyZWN0aXZlO1xyXG4gICAgICAgIGxldCB1c2VzVGhzQW5kVGRzRGlyZWN0aXZlcyA9IHRkc0QgJiYgdGRzRC5sZW5ndGggPiAwICYmIHRoc0QgJiYgdGhzRC5sZW5ndGggPiAwO1xyXG4gICAgICAgIGxldCBoYXNOb0NvbnRlbnRQcm9qZWN0aW9uID0gIXRoaXMuYm9keVJlZiAmJiAhdGhpcy5oZWFkZXJSZWYgJiYgIXRoaXMuaGVhZGVyR3JvdXBSZWYgJiYgIXRoaXMuc2Vjb25kYXJ5SGVhZGVyR3JvdXBSZWY7XHJcblxyXG4gICAgICAgIGlmICh1c2VzVGhzQW5kVGRzRGlyZWN0aXZlcyB8fCBoYXNOb0NvbnRlbnRQcm9qZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlVzZUN1c3RvbUNlbGxzID09IG51bGwpIHRoaXMuVXNlQ3VzdG9tQ2VsbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5IaWRkZW5Db2x1bW5zID09IG51bGwgJiYgdGhpcy5Vc2VDdXN0b21DZWxscykgdGhpcy5IaWRkZW5Db2x1bW5zID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuQ29sdW1uc09yZGVyaW5nID09IG51bGwgJiYgdGhpcy5Vc2VDdXN0b21DZWxscykgdGhpcy5Db2x1bW5zT3JkZXJpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5PcmRlckJ5Q29sdW1uID09IG51bGwgJiYgdGhpcy5Vc2VDdXN0b21DZWxscykgdGhpcy5PcmRlckJ5Q29sdW1uID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2VsZWN0QWxsID09IG51bGwgJiYgdGhpcy5TZWxlY3Rpb24pIHRoaXMuU2VsZWN0QWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2hpZnRDbGljayA9PSBudWxsICYmIHRoaXMuU2VsZWN0aW9uKSB0aGlzLlNoaWZ0Q2xpY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLkRpcmVjdGl2ZXNCYXNlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1BlciBwb3RlciBjYW1iaWFyZSBpbCBsYXlvdXQgaW4gYmFzZSBhbCBsaXZlbGxvIGdlcmFyY2hpY28gaWwgY29tcG9uZW50ZSBkZXZhIGF2ZXJlIGlsIHBpZW5vIGNvbnRyb2xsbyBkaSBvZ25pIGNlbGxhLFxyXG4gICAgICAgIC8vY2hlIGNvbiBzb2xvIGxhIHByb2llemlvbmUgKHNlbnphIGNlbGxlIGN1c290bSkgbm9uIMOoIGRpc3BvbmliaWxlXHJcbiAgICAgICAgaWYgKHRoaXMuSGllcmFyY2h5ICYmICF0aGlzLlVzZUN1c3RvbUNlbGxzKVxyXG4gICAgICAgICAgICB0aHJvdyBcIkVzLXRhYmxlIGVycm9yOiBQZXIgcG90ZXIgdXRpbGl6emFyZSBsJ2VzLXRhYmxlIGNvbiBbSGllcmFyY2h5XT1cXFwidHJ1ZVxcXCIgw6ggcmljaGllc3RvIGFuY2hlIFtVc2VDdXN0b21DZWxsc109XFxcInRydWVcXFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBpZiAodGhpcy5jb3B5U3Vic2NyaXB0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLmNvcHlTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGFzdGVTdWJzY3JpcHRpb24pXHJcbiAgICAgICAgICAgIHRoaXMucGFzdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3R4TWVudVN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5jdHhNZW51U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvcHlQYXN0ZURldGVjdG9yLkFjdGl2ZUVzdFJlZmVyZW5jZSA9PSB0aGlzKVxyXG4gICAgICAgICAgICB0aGlzLmNvcHlQYXN0ZURldGVjdG9yLkFjdGl2ZUVzdFJlZmVyZW5jZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgbGV0IG5ld1NlYXJjaFZpZXcgPSBjaGFuZ2VzWydTZWFyY2hWaWV3J107XHJcbiAgICAgICAgaWYgKG5ld1NlYXJjaFZpZXcgJiYgdGhpcy5TZWFyY2hWaWV3KVxyXG4gICAgICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgdGhpcy5TZWFyY2hWaWV3LnBhZ2UsIHRoaXMuU2VhcmNoVmlldy5wYWdlcyB8fCAxLCB0aGlzLlNlYXJjaFZpZXcub2JqZWN0Y291bnQsIHRoaXMuU2VhcmNoVmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuKTogdm9pZCB7IHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47IH1cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm4pOiB2b2lkIHsgfVxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBjaGFuZ2VkKGNsZWFySXRlbXM6IGJvb2xlYW4gPSBmYWxzZSkgeyBcclxuICAgICAgICBpZihjbGVhckl0ZW1zICYmIHRoaXMudmlld01vZGUpXHJcbiAgICAgICAgICAgICg8QXBwU2VhcmNoPGFueT4+dGhpcy5WaWV3KS5pdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLlZpZXcpOyBcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIGFzeW5jIHdyaXRlVmFsdWUob2JqOiBhbnksIHRocm90dGxlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuVmlldyA9IG9iaiA/IG9iaiA6IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLkVzVGFibGVIYW5kbGVkU2VhcmNoICYmIHRocm90dGxlKSB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY2FsbFRpbWVvdXQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jYWxsVGltZW91dCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNhbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7IHRoaXMud3JpdGVWYWx1ZShvYmosIGZhbHNlKTsgfSwgdGhpcy5TZWFyY2hUaHJvdHRsZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICBcclxuICAgICAgICAvLyBNaSDDqCBhcnJpdmF0YSBsJ0FwcFNlYXJjaCBxdWluZGkgZGkgc2ljdXJvIG5vbiBobyB1bmEgcmljZXJjYSBpbiBwcm9ncmVzc1xyXG4gICAgICAgIHRoaXMucmVzZWFyY2hJblByb2dyZXNzID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5WaWV3ICYmICF0aGlzLlNlYXJjaFZpZXcpIHtcclxuICAgICAgICAgICAgLy8gU3UgdmlldyBudWxsYSBldml0byBkaSBmYXJlIHByZXNzb2Now6kgcXVhbHNpYXNpIGNvc2EuIFNlIGFycml2YSB1biBudWxsIGRldm8gYW5jaGUgYXNzaWN1cmFybWkgZGkgbm9uIG1vc3RyYXJlIG51bGxhXHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gUGVyIGVzc2VyZSBzaWN1cm8gY2hlIGRvcG8gdW4gYmluZCBkaSBvZ2dldHRpIGxhIGVzLXRhYmxlIGFnZ2lvcm5pIGxhIGdyYWZpY2FcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNlIHBlciBzYmFnbGlvIGwnb2dnZXR0byBjaGUgbWkgYXJyaXZhIG5vbiDDqCB0aXBpenphdG8gKGluc3RhbmNlb2YgQXBwU2VhcmNoIHJlc3RpdHVpc2NlIGZhbHNlIGFuY2hlIHNlIMOoIGRlbCB0aXBvIGdpdXN0bylcclxuICAgICAgICAvLyBsbyBjb3JyZWdnby0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgaWYgKHRoaXMuVmlldyAmJiB0eXBlb2YgKHRoaXMuVmlldyBhcyBhbnkpLml0ZW1zcGVycGFnZW92ZXJyaWRlICE9ICd1bmRlZmluZWQnICYmICEodGhpcy5WaWV3IGluc3RhbmNlb2YgQXBwU2VhcmNoKSlcclxuICAgICAgICAgICAgKHRoaXMuVmlldyBhcyBhbnkpLl9fcHJvdG9fXyA9IG5ldyBBcHBTZWFyY2goKTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLlNlYXJjaFZpZXcgJiYgdHlwZW9mICh0aGlzLlNlYXJjaFZpZXcgYXMgYW55KS5pdGVtc3BlcnBhZ2VvdmVycmlkZSAhPSAndW5kZWZpbmVkJyAmJiAhKHRoaXMuU2VhcmNoVmlldyBpbnN0YW5jZW9mIEFwcFNlYXJjaCkpXHJcbiAgICAgICAgICAgICh0aGlzLlNlYXJjaFZpZXcgYXMgYW55KS5fX3Byb3RvX18gPSBuZXcgQXBwU2VhcmNoKCk7XHJcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgICAgICBpZiAodGhpcy5WaWV3ICYmIHRoaXMuVmlldyBpbnN0YW5jZW9mIEFwcFNlYXJjaCkge1xyXG4gICAgICAgICAgICAvLyBTZSBjYW1iaWEgbCdvZ2dldHRvIGludGVybyBzaWduaWZpY2EgY2hlIGhvIHJpbWFuZGF0byBsYSByaWNlcmNhXHJcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgndmlldycpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGZpcnN0SXRlbUdyb3VwT3JOb0dyb3VwaW5nID0gKHRoaXMuVmlldy5yZXF1ZXN0ZWRncm91cHM/Lmxlbmd0aCB8fCAwKSA9PSAwO1xyXG5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFNlIHZlbmdvIGRhIHVuYSByaWNlcmNhIGludGVybmEgbWFudGVuZ28gbG8gc3RhdG8gZGkgc2VsZXppb25lIHByZWNlZGVudGUgKHF1aW5kaSBzdSBjYW1iaW8gcGFnaW5hLCBjYW1iaW8gaXBwLCBlY2MuLi4pXHJcbiAgICAgICAgICAgIC8vIHNlIGludmVjZSBsJ3V0ZW50ZSBoYSBmYXR0byB1bmEgcmljZXJjYSBsdWkgKHF1aW5kaSBjYW1iaWFuZG8gZmlsdHJpKSwgc2VjY28gbGUgaW5mbyBkaSBzZWxlemlvbmVcclxuICAgICAgICAgICAgaWYgKCF0aGlzLlZpZXcuc2VsZWN0aW9uIHx8ICghdGhpcy5WaWV3LmludGVybmFsc2VhcmNocmVxdWVzdCAmJiBmaXJzdEl0ZW1Hcm91cE9yTm9Hcm91cGluZykgfHwgIXRoaXMuVXNlU2VsZWN0aW9uQ2FjaGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25DYWNoZXMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVmlldy5zZWxlY3Rpb24gPSBuZXcgSXRlbXNTZWxlY3Rpb24oW10pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdCh0aGlzLlZpZXcuc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5WaWV3LmludGVybmFsc2VhcmNocmVxdWVzdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVjdXBlcm8gUHJlZmVyZW5jZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5TYXZlUHJlZmVyZW5jZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wubmFtZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBhdmVyZSB1biAnbmFtZScgcGVyIHF1ZXN0YSB0YWJlbGxhXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucHJlZlNlcnZpY2UpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgY2hlIGlsIHBhY2NoZXR0byBAZXNmYWVuemEvcHJlZmVyZW5jZXMgc2lhIGluc3RhbGxhdG9cIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZnMgPSBhd2FpdCB0aGlzLnByZWZTZXJ2aWNlLmdldEl0ZW08eyBjb2x1bW5zOiBzdHJpbmdbXSwgY29sdW1uX29yZGVyaW5nOiBzdHJpbmdbXSwgb3JkZXJzOiBBcHBPcmRlcmluZ1tdIH0+KDxzdHJpbmc+dGhpcy5uZ0NvbnRyb2wubmFtZSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzaSBsYSBnZW50ZSBzaSBtZXR0YSBhIHNwYW1tYXJlIHJlZnJlc2ggY29uIG5naWYgc3RyYW5pIHN1bGwnZXN0YWJsZSBjcmVhbmRvbGEgZSBkaXN0cnVnZ2VuZG9sYSBOIHZvbHRlIGFsIHNlY29uZG8gbmVsIHRlbXBvIGNoZSBjaSBtZXR0ZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGlyYXJlIHN1IGxlIHByZWZlcmVuY2UgZGEgcXVpIHNvcHJhIGxhIFZpZXcgcG90cmViYmUgZXNzZXJlIGNhbWJpYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVmlldykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29scyA9IHByZWZzPy5jb2x1bW5zIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZFByZWZzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcG9zaXRvcnk6IHN0cmluZ1tdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlOiBzdHJpbmdbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSB0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMubWFwKHQgPT4gdC5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IGNvbHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0aGlzLlZpZXcuY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gbW9kYWxpdMOgIHJlcG9ydCBkZXZvIGNvbnRyb2xsYXJlIGNoZSB0dXR0ZSBsZSBjb2xvbm5lIHNhbHZhdGUgZmFjY2lhbm8gcGFydGUgZGVsbGEgdmlzdGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gbW9kYWxpdMOgIG5vcm1hbGUgaW52ZWNlIHNlIGxlIHByZWZlcmVuemUgZmFubm8gcmlmZXJpbWVudG8gYSBkZWxsZSBjb2xvbm5lIGNoZSBpbyBub24gaG8gbmVsbGEgVmlldyBhdHR1YWxlIHNpZ25pZmljYSBjaGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvIGZhY2VuZG8gcmlmZXJpbWVudG8gYSB1bmEgdmVyc2lvbmUgdmVjY2hpYSBkZWxsJ2VzLXRhYmxlLCBxdWluZGkgbm9uIGZhY2NpbyBvcGVyYXppb25pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwb3NpdG9yeS5pbmRleE9mKHNvdXJjZVtpXSkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJlZnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgbWkgYmFzbyBzdSBkaXJldHRpdmUgbWEgbmVsbGUgcHJlZmVyZW5jZSDDqCBwcmVzZW50ZSBhbmNoZSBzb2xvIHVuYSBjb2xvbm5hIG5vbiBwcmVzZW50ZSBuZWxsZSBkaXJldHRpdmUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZ1b2wgZGlyZSBjaGUgbCdlcy10YWJsZSDDqCBjYW1iaWF0YSBxdWluZGkgbm9uIGltcG9zdG8gcHJlZmVyZW5jZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRXNUaHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVwb3NpdG9yeS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRoc0NhY2hlU2V0ICYmICF0aGlzLnRoc0NhY2hlW3JlcG9zaXRvcnlbaV1dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQcmVmcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkUHJlZnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5zID0gcHJlZnM/LmNvbHVtbnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcuY29sdW1uX29yZGVyaW5nID0gcHJlZnM/LmNvbHVtbl9vcmRlcmluZyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlIGxlIHByZWYgc29ubyBudWxsZSBub24gc292cmFzY3Jpdm8gZ2xpIG9yZGluaSBkYXRvIGNoZSBwb3RyZWJiZSBzZXJ2aXJlIG1ldHRlcmUgZGVnbGkgb3JkaW5hbWVudGkgZGkgZGVmYXVsdCBsYXRvIHRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwcmVmcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcub3JkZXJzID0gcHJlZnM/Lm9yZGVycyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gTGEgcGFnaW5hemlvbmUgZGV2byBmYXJsYSBzb2xhbWVudGUgcXVhbmRvIHJpY2hpZWRvIG8gdW4gZ3J1cHBvIHByaW5jaXBhbGUgKHNlIHNvbm8gaW4gcm93IGdyb3VwaW5nKSBvIHNlIG5vbiByaWNoaWVkbyBncnVwcGkgKGluIHR1dHRpIGxnaSBhbHRyaSBjYXNpKVxyXG4gICAgICAgICAgICBpZiAoZmlyc3RJdGVtR3JvdXBPck5vR3JvdXBpbmcpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgdGhpcy5WaWV3LnBhZ2UsIHRoaXMuVmlldy5wYWdlcyB8fCAxLCB0aGlzLlZpZXcuaXRlbXMubGVuZ3RoLCB0aGlzLlZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLlZpZXcgJiYgKHRoaXMuVmlldy5sZW5ndGggIT0gbnVsbCAmJiB0aGlzLlZpZXcubGVuZ3RoICE9IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdhcnJheScpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLlVzZVNlbGVjdGlvbkNhY2hlIHx8ICF0aGlzLmFycmF5bW9kZVNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvbkNhY2hlcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcnJheW1vZGVTZWxlY3Rpb24gPSBuZXcgSXRlbXNTZWxlY3Rpb24oW10pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdCh0aGlzLmFycmF5bW9kZVNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFJlY3VwZXJvIFByZWZlcmVuY2VcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2F2ZVByZWZlcmVuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmdDb250cm9sLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgYXZlcmUgdW4gJ25hbWUnIHBlciBxdWVzdGEgdGFiZWxsYVwiKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnByZWZTZXJ2aWNlKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb24gcG9zc28gdXRpbGl6emFyZSBsZSBwcmVmZXJlbmNlIHNlbnphIGNoZSBpbCBwYWNjaGV0dG8gQGVzZmFlbnphL3ByZWZlcmVuY2VzIHNpYSBpbnN0YWxsYXRvXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZWZzID0gYXdhaXQgdGhpcy5wcmVmU2VydmljZS5nZXRJdGVtPHsgY29sdW1uczogc3RyaW5nW10sIGNvbHVtbl9vcmRlcmluZzogc3RyaW5nW10sIG9yZGVyczogQXBwT3JkZXJpbmdbXSB9Pig8c3RyaW5nPnRoaXMubmdDb250cm9sLm5hbWUpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2xzID0gcHJlZnM/LmNvbHVtbnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWRQcmVmcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcG9zaXRvcnk6IHN0cmluZ1tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2U6IHN0cmluZ1tdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5WaWV3LnJlcG9ydF9jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSB0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMubWFwKHQgPT4gdC5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IGNvbHM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gdGhpcy5WaWV3LmNvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6AgcmVwb3J0IGFnZ2lvcm5vIGxlIHByZWZlcmVuemUgc29sbyBzZSBjJ8OoIGFsbWVubyB1bmEgY29sb25uYSwgYWx0cmltZW50aSB2dW9sIGRpcmUgY2hlIHNpIHBhcnRlIGRhIHZ1b3RpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uIHR1dHRlIGxlIGNvbG9ubmUgZGlzcG9uaWJpbGlcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMgJiYgKHNvdXJjZT8ubGVuZ3RoIHx8IDApID09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQcmVmcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6Agbm9ybWFsZSBpbnZlY2Ugc2UgbGUgcHJlZmVyZW56ZSBmYW5ubyByaWZlcmltZW50byBhIGRlbGxlIGNvbG9ubmUgY2hlIGlvIG5vbiBobyBuZWxsYSBWaWV3IGF0dHVhbGUgc2lnbmlmaWNhIGNoZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0byBmYWNlbmRvIHJpZmVyaW1lbnRvIGEgdW5hIHZlcnNpb25lIHZlY2NoaWEgZGVsbCdlcy10YWJsZSwgcXVpbmRpIG5vbiBmb2NjaW8gb3BlcmF6aW9uaVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5LmluZGV4T2Yoc291cmNlW2ldKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcuY29sdW1ucyA9IHByZWZzPy5jb2x1bW5zIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcuY29sdW1uX29yZGVyaW5nID0gcHJlZnM/LmNvbHVtbl9vcmRlcmluZyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlIGxlIHByZWYgc29ubyBudWxsZSBub24gc292cmFzY3Jpdm8gZ2xpIG9yZGluaSBkYXRvIGNoZSBwb3RyZWJiZSBzZXJ2aXJlIG1ldHRlcmUgZGVnbGkgb3JkaW5hbWVudGkgZGkgZGVmYXVsdCBsYXRvIHRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3Lm9yZGVycyA9IHByZWZzPy5vcmRlcnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5TZWFyY2hWaWV3KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hcnJheVB1bHNhbnRpID0gdGhpcy51dGlsaXRpZXNfSC5nZXRQYWdlc0FycmF5KDYsIHRoaXMuU2VhcmNoVmlldy5wYWdlLCB0aGlzLlNlYXJjaFZpZXcucGFnZXMgfHwgMSwgdGhpcy5TZWFyY2hWaWV3Lml0ZW1zLmxlbmd0aCwgdGhpcy5TZWFyY2hWaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmluYWxpemVDb250ZXh0KCk7XHJcblxyXG4gICAgICAgIHRoaXMucG9zdEJvdW5kU291cmNlQ2FsY3VsYXRpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVmlldyAmJiAhdGhpcy5WaWV3LnNlbGZzZWFyY2ggJiYgdGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLlZpZXcuc2VsZnNlYXJjaCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCh0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QuZW1pdChmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5WaWV3ICYmIHRoaXMuVmlldy5zZWxmc2VhcmNoICYmIHRoaXMuRXNUYWJsZUhhbmRsZWRTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBGdW56aW9uZSBkaSB0cmFja2J5IHBlciBpbCBib2R5IGNoZSBkb3ZyZWJiZSBldml0YXJlIGlsIDkwJSBkZWxsZSBjaGFuZ2UgZGV0ZWN0aW9uICovXHJcbiAgICBwdWJsaWMgYm9keVRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0uX2hhc2g7XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgZ2VuZXJpY2EgcGVyIHR1dHRpIGdsaSBvZ2dldHRpIGNoZSBoYW5ubyBpbCBjYW1wbyBpZCAqL1xyXG4gICAgcHVibGljIGlkVHJhY2tCeSA9IChfOiBudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbS5pZDtcclxuXHJcbiAgICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgZ2VuZXJpY2EgcGVyIHR1dHRpIGdsaSBvZ2dldHRpIGNoZSBoYW5ubyBpbCBjYW1wbyBQcm9wZXJ0eU5hbWUgKi9cclxuICAgIHB1YmxpYyBQcm9wZXJ0eU5hbWVUcmFja0J5ID0gKF86IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtLlByb3BlcnR5TmFtZTtcclxuXHJcbiAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBnZW5lcmljYSBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgY2hlIGhhbm5vIGlsIGNhbXBvIElEICovXHJcbiAgICBwdWJsaWMgSURUcmFja0J5ID0gKF86IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtLklEO1xyXG5cclxuICAgIC8qKiBGdW56aW9uZSBkaSB0cmFja2J5IGdlbmVyaWNhIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBjaGUgaGFubm8gaWwgY2FtcG8gSUQgKi9cclxuICAgIHB1YmxpYyB2YWxUcmFja0J5ID0gKF86IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtLnZhbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1Y2Nlc3NpdmFtZW50ZSBhbCBiaW5kIGRlbCBudW92byBpbnB1dCBxdWVzdGEgZnVuemlvbmUgc2kgb2NjdXBhIGRpIGZpbmFsaXp6YXJlIHR1dHRpIGkgcGFyYW1ldHJpIGRpIGZ1bnppb25hbWVudG8gZGVsbCdlcy10YWJsZSBcclxuICAgICAqIGluIGJhc2UgYSBJbnB1dCAtIE1vZGVsbG8sIGUgcXVhbHNpYXNpIGFsdHJhIGNvc2EgcG9zc2Egc2VydmlyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpbmFsaXplQ29udGV4dCgpIHtcclxuICAgICAgICBsZXQgdmlld0Nhc3RlZCA9IHRoaXMuVmlldyBhcyBBcHBTZWFyY2g8YW55PjtcclxuXHJcbiAgICAgICAgbGV0IGhhc1Jvd0dyb3VwcyA9IHZpZXdDYXN0ZWQgJiYgKHZpZXdDYXN0ZWQuZ3JvdXBpbmdzICYmIHZpZXdDYXN0ZWQuZ3JvdXBpbmdzLmZpbHRlcih0ID0+ICF0LmFnZ3JlZ2F0aW9uKS5sZW5ndGggPiAwKSB8fCAodGhpcy5hcnJheU1vZGUgJiYgdGhpcy5Fc1Roc0RpcmVjdGl2ZS5zb21lKHQgPT4gdC50aEdyb3VwKSk7XHJcblxyXG4gICAgICAgIC8vIFNlIGhvIGRlaSBncnVwcGkgaW4gbW9kYWxpdMOgIGFycmF5IGRldm8gc2lzdGVtYXJlIHVuIHBvJyBkaSB2YXJpYWJpbGkgY2hlIGRpdmVudGFubyBpbnNlbnNhdGVcclxuICAgICAgICBpZiAodGhpcy5hcnJheU1vZGUgJiYgaGFzUm93R3JvdXBzKVxyXG4gICAgICAgICAgICB0aGlzLlVzZUFycmF5TW9kZVBhZ2luZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBSaWVtcGltZW50byBkZWxsYSBUTVBCb3VuZFNvdXJjZSBjb24gZ2xpIG9nZ2V0dGkgY2hlIHZlcnJhbm5vIHBvaSBtb3N0cmF0aSBhZCBpbnRlcmZhY2NpYVxyXG4gICAgICAgIHRoaXMuVE1QQm91bmRTb3VyY2UgPSB0aGlzLml0ZW1zX0guZ2V0SXRlbXNCeU1vZGUoZmFsc2UsICF0aGlzLmludGVybmFsV3JpdGVDYWxsKTtcclxuXHJcbiAgICAgICAgLy8gU2UgaG8gdW5hIGdlcmFyY2hpYSwgYXNzZWdubyBpIGxpdmVsbGkgZ2VyYXJjaGljaSBhbGxhIFRNUEJvdW5kU291cmNlXHJcbiAgICAgICAgaWYgKHRoaXMuSGllcmFyY2h5ICYmICFoYXNSb3dHcm91cHMpXHJcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5TW9kZV9ILmFzc2lnbkhpZXJhcmNoeUxldmVscyh0aGlzLlRNUEJvdW5kU291cmNlKTtcclxuXHJcbiAgICAgICAgLy8gTCdoYXNoaW5nIGRlZ2xpIG9nZ2V0dGkgbG8gZmFjY2lvIGEgcHJlc2NpbmRlcmVcclxuICAgICAgICB0aGlzLnV0aWxpdGllc19ILmNhbGN1bGF0ZUhhc2godGhpcy5UTVBCb3VuZFNvdXJjZSk7XHJcblxyXG4gICAgICAgIC8vIEFzc2Vnbm8gYSB1bmEgdmFyaWFiaWxlIG1pYSBsJ2V2ZW50dWFsZSBvdmVycmlkZSBwZXIgbGEgY2xhc3NlIGRlbGxhIHJpZ2FcclxuICAgICAgICAvLyBTZSBwb2kgc29ubyBpbiBtb2RhbGl0w6AgZ2VyYXJjaGljYSBpbmlldHRvIGFuY2hlIGxhIGNsYXNzZSBwZXIgbGEgY29uZmlndXJhemlvbmUgZGVsIGxpdmVsbG8gZGVsbGEgcmlnYVxyXG4gICAgICAgIGlmICgodGhpcy5UTVBCb3VuZFNvdXJjZSAmJiB0aGlzLlJvd0NsYXNzQXNzaWduZXIpIHx8IHRoaXMuSGllcmFyY2h5KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5UTVBCb3VuZFNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLlRNUEJvdW5kU291cmNlW2ldO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5fcm93Q2xhc3MgPSB0aGlzLlJvd0NsYXNzQXNzaWduZXIgPyB0aGlzLlJvd0NsYXNzQXNzaWduZXIoaXRlbSkgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5fcm93Q2xhc3MgKz0gdGhpcy5IaWVyYXJjaHkgPyBcIiBlc3Qtcm93LWx2bC1cIiArIGl0ZW0uX2xldmVsIDogXCJcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogR2VuZXJhIGxlIGluZm9ybXppb25pIGRpIHBhZ2luYXppb25lIHBlciBsYSB2aXN0YSBnbG9iYWxlIGRlbGwnZXMtdGFibGUgKi9cclxuICAgIHByaXZhdGUgc2V0dXBQYWdpbmdJbmZvcm1hdGlvbnMoKSB7XHJcblxyXG4gICAgICAgIC8vIERlZmF1bHQgY2hlIHZhbGdvbm8gZGkgYmFzZSwgcG9pIGV2ZW50dWFsbWVudGUgbW9kZGF0aSBkYWxsZSBmdW56aW9uaSBzb3R0b1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCA9ICF0aGlzLkhpZGVQYWdpbmdDb3VudDtcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9ICF0aGlzLkhpZGVQYWdpbmdCdXR0b25zO1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmcgPSAhdGhpcy5IaWRlUGFnaW5nXHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVXNlc1ZpZXcgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hcnJheU1vZGUgJiYgdGhpcy5Vc2VBcnJheU1vZGVQYWdpbmcgJiYgIXRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5QYWdlckNvdW50ID0gKDxhbnlbXT50aGlzLlZpZXcpLmxlbmd0aCB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmIHRoaXMuVmlldy5sZW5ndGggPiAxMDtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVmlldyA9IHRoaXMuVmlldztcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVXNlc1ZpZXcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZ09wdGlvbnMgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5hcnJheU1vZGUgJiYgKCF0aGlzLlVzZUFycmF5TW9kZVBhZ2luZyB8fCB0aGlzLlNlYXJjaFZpZXcpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlYXJjaFZpZXcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlZpZXcgPSB0aGlzLlNlYXJjaFZpZXdcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSB0aGlzLlNlYXJjaFZpZXcub2JqZWN0Y291bnQgfHwgMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5QYWdlckNvdW50ID0gKDxhbnlbXT50aGlzLlZpZXcpLmxlbmd0aCB8fCAwXHJcblxyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmICh0aGlzLlZpZXcubGVuZ3RoID4gMTAgfHwgKHRoaXMuU2VhcmNoVmlldz8ub2JqZWN0Y291bnQgfHwgMCkgPiAxMCk7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCB8fCAodGhpcy5WaWV3ICYmIHRoaXMuVmlldy5sZW5ndGgpIHx8ICh0aGlzLlNlYXJjaFZpZXcgJiYgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50ICYmIHRoaXMuU2VhcmNoVmlldy5vYmplY3Rjb3VudCAhPSAtMSk7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmcgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nICYmICh0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyB8fCB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLnZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIGxldCB0bXBWaWV3ID0gdGhpcy5NYWluR3JvdXBWaWV3IHx8IHRoaXMuVmlldztcclxuICAgICAgICAgICAgbGV0IGNvdW50ID0gdG1wVmlldz8uZ3JvdXBjb3VudCB8fCB0bXBWaWV3Py5vYmplY3Rjb3VudDtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2VhcmNoZXMgPSB0bXBWaWV3Py5ncm91cGNvdW50ICE9IG51bGwgJiYgdG1wVmlldz8uZ3JvdXBjb3VudCAhPSB1bmRlZmluZWQgPyAnZ3JvdXBzJyA6ICdpdGVtcyc7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSBjb3VudCB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3ID0gdG1wVmlldztcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50IHx8ICh0bXBWaWV3ICYmIGNvdW50ICYmIGNvdW50ICE9IC0xKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyAmJiAodG1wVmlldy5wYWdpbmdhdmFpbGFibGUgfHwgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50KTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZ09wdGlvbnMgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gbGFuY2lhdG8gZG9wbyBjaGUgbGEgc29yZ2VudGUgZGF0aSDDqCBzdGF0YSBjb3JyZXR0YW1lbnRlIGJpbmRhdGEsIHNpIG9jY3VwYSBkaSByaWNhbGNvbGFyZSB0dXR0byBjacOyIGNoZSBzZXJ2ZVxyXG4gICAgICogYWxsJ2VzLXRhYmxlIHBlciByZW5kZXJpenphcmUgaSB2YWxvcmkgZGEgbW9zdHJhcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwb3N0Qm91bmRTb3VyY2VDYWxjdWxhdGlvbigpIHtcclxuICAgICAgICAvLyBSZXNldHRvIHR1dHRvIHRyYW5uZSBSb3dURHMgZSBSb3dUSHMgcGVyIGV2aXRhcmUgZmxpY2tlcmluZy4gUm93VERzIGUgUm93VEhzIHNhcmFubm8gbW9kaWZpY2F0ZSBhbGwnaW50ZXJubyBkZWwgcHJvc3NpbW8gY2ljbG8gZGkgQ0RcclxuICAgICAgICB0aGlzLlJvd0NvbnRleHRzID0gW107XHJcbiAgICAgICAgdGhpcy5PcmRlckRpcmVjdGl2ZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW1JRCA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxQb3N0Qm91bmRTb3VyY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUGVyIHBvdGVyIGRpc3Rpbmd1ZXJlIGxlIGNoaWFtYXRlIGEgcXVlc3RvIG1ldG9kbzogRG9wbyBpbCBzZXRUaW1lb3V0IHNlIHVzbyBnbGkgRXNUZC9Fc1RoIHZlY2NoaSwgc2VuemEgaWwgc2V0VGltZW91dCBzZSB1c28gbGUgbnVvdmUgZGlyZXR0aXZlICovXHJcbiAgICBwcml2YXRlIGludGVybmFsUG9zdEJvdW5kU291cmNlKCkge1xyXG4gICAgICAgIGxldCBWaWV3ID0gdGhpcy5WaWV3O1xyXG5cclxuICAgICAgICBsZXQgdGRzRCA9IHRoaXMuRXNUZHNEaXJlY3RpdmUubGVuZ3RoID09IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGRzRGlyZWN0aXZlPy5sZW5ndGggPiAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Rkc0RpcmVjdGl2ZSA6IHRoaXMuRXNUZHNEaXJlY3RpdmUgOiB0aGlzLkVzVGRzRGlyZWN0aXZlO1xyXG4gICAgICAgIGxldCB0aHNEID0gdGhpcy5Fc1Roc0RpcmVjdGl2ZS5sZW5ndGggPT0gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUaHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGhzRGlyZWN0aXZlIDogdGhpcy5Fc1Roc0RpcmVjdGl2ZSA6IHRoaXMuRXNUaHNEaXJlY3RpdmU7XHJcblxyXG4gICAgICAgIGxldCB0aHMgPSB0aHNEICYmIHRoc0QubGVuZ3RoID4gMCA/IHRoc0QudG9BcnJheSgpIDogW107XHJcbiAgICAgICAgbGV0IHRkcyA9IHRkc0QgJiYgdGRzRC5sZW5ndGggPiAwID8gdGRzRC50b0FycmF5KCkgOiBbXTtcclxuXHJcbiAgICAgICAgLy8gU2Ugbm9uIGhvIGNvbG9ubmUgZGluYW1pY2hlIG1hIHNvbm8gaW4gbW9kYWxpdMOgIGRpbmFtaWNhIChsbyBjYXBpc2NvIHBlcmNow6kgYyfDqCB1bmEgdmlldyBwaWVuYSBkaSBnZW5lcmljaXRlbSkgbWV0dG8gaWwgZGVmYXVsdCBkZWxsZSBjb2xvbm5lXHJcbiAgICAgICAgdGhpcy5keW5hbWljTW9kZV9ILmV2ZW50dWFsbHlSZXZpZXdEeW5hbWljQ29sdW1ucygpO1xyXG5cclxuICAgICAgICAvLyBHZXN0aXNjZSBsYSByaWNoaWVzdGEgcGVyIGdydXBwaSBvIHBlciBzaW5nb2xpIG9nZ2V0dGlcclxuICAgICAgICB0aGlzLmJpbmREaXNwbGF5VG9Mb2FkZWRJdGVtc09yR3JvdXBzKFZpZXcpO1xyXG5cclxuICAgICAgICAvLyBRdWVzdG8gZGV2J2Vzc2VyZSBwZXIgZm9yemEgbGFuY2lhdG8gZG9wbyAqKmJpbmREaXNwbGF5VG9Mb2FkZWRJdGVtc09yR3JvdXBzKiogZGF0byBjaGUgw6ggbMOsIGNoZSBhbGN1bmUgY29zZSB2ZW5nb25vIHZhbG9yaXp6YXRlXHJcbiAgICAgICAgdGhpcy5zZXR1cFBhZ2luZ0luZm9ybWF0aW9ucygpO1xyXG5cclxuICAgICAgICAvLyBNb2x0ZSBjb3NlIHNvbm8gb3Z2aWFtZW50ZSBkaXNwb25pYmlsaSBzb2xvIGluIG1vZGFsaXTDoCBWaWV3XHJcbiAgICAgICAgaWYgKCh0aGlzLnZpZXdNb2RlIHx8IHRoaXMuYXJyYXlNb2RlKSAmJiB0aGlzLlVzZUN1c3RvbUNlbGxzKSB7XHJcbiAgICAgICAgICAgIGxldCB2aWV3ID0gdGhpcy52aWV3TW9kZSA/IFZpZXcgYXMgQXBwU2VhcmNoPGFueT4gOiBudWxsO1xyXG4gICAgICAgICAgICBsZXQgaXRlbXNBbmRHcm91cHMgPSB0aGlzLnZpZXdNb2RlID8gWy4uLih2aWV3Lml0ZW1zIHx8IFtdKSwgLi4uKHZpZXcuZ3JvdXBzIHx8IFtdKV0gOiBWaWV3IGFzIGFueVtdO1xyXG4gICAgICAgICAgICBsZXQgc2kgPSB0aGlzLnZpZXdNb2RlID8gdmlldy5zZWxlY3Rpb24gOiB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbjtcclxuICAgICAgICAgICAgLy8gTi5COiBSaXNwZXR0YXJlIGwnb3JkaW5lIGRpIHF1ZXN0ZSAzIG1hY3JvY2F0ZWdvcmllIMOoIFZJVEFMRVxyXG5cclxuICAgICAgICAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgU2lzdGVtYXppb25pIGRpIFRILCBURCwgZSB2aXNpYmlsaXTDoCB2YXJpZSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIGhvIGRlZmluaXppb25pIGRpbmFtaWNoZSwgcHJpbWEgZGkgcXVhbHNpYXNpIGFsdHJhIGNvc2EgZGV2byB0cmFzZm9ybWFybGUgaW4gdGgvdGQgaW4gbW9kbyBjaGUgcG9pIGlsIGNvZGljZSBxdWkgc290dG8gZmFjY2lhIGxlIHN1ZSBtYWdpZVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuYXJyYXlNb2RlICYmIHRoaXMuRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJHZW5lcmF0aW5nIHRocyBhbmQgdGRzIGZyb20gRHluYW1pYyBkZWZpbml0aW9uXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJldCA9IHRoaXMuZHluYW1pY01vZGVfSC5lbWl0VGhzQW5kVGRzQmFzZWRPbkR5bmFtaWNEZWZpbml0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aHMgPSByZXQudGhzO1xyXG4gICAgICAgICAgICAgICAgdGRzID0gcmV0LnRkcztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gR2VzdGlvbmUgZGVsbGUgdmlldyBpbiBtb2RhbGl0w6AgcmVwb3J0LCBpIHRoIGUgaSB0ZCB2ZW5nb25vIHJpZ2VuZXJhdGkgZGFsbGUgY29uZmlndXJhemlvbmkgZGVsbGEgdmlld1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuYXJyYXlNb2RlICYmIHZpZXcucmVwb3J0X2NvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcIkdlbmVyYXRpbmcgdGhzIGFuZCB0ZHMgZnJvbSByZXBvcnQgcmVzdWx0c1wiKTtcclxuICAgICAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLnJlcG9ydE1vZGVfSC5nZW5lcmF0ZVRoc0FuZFRkc0Zyb21WaWV3KHZpZXcpO1xyXG4gICAgICAgICAgICAgICAgdGhzID0gcmV0LnRocztcclxuICAgICAgICAgICAgICAgIHRkcyA9IHJldC50ZHM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEVzcGFuZG8gaSB0aCBlIGkgdGQgbXVsdGlwbGkgZHVwbGljYW5kb2xpXHJcbiAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZXhwYW5kTXVsdGlUaHNBbmRUZHModGhzLCB0ZHMsIGl0ZW1zQW5kR3JvdXBzKTtcclxuICAgICAgICAgICAgdGhzID0gcmV0LmV4cFRocztcclxuICAgICAgICAgICAgdGRzID0gcmV0LmV4cFRkcztcclxuXHJcbiAgICAgICAgICAgIC8vIEdlbmVybyBsYSBjYWNoZSBkZWkgdGggZGEgdXNhcmUgZGEgcXVpIGluIHBvaSwgZG9wbyBhdmVyZ2xpIGxhc2NpYXRvIGZhcmUgbGUgc3VlIGNvc2UgaW4gY2FzbyBjaSBzaWFubyBkZWkgbXVsdGkgbyBkZWkgcmVwb3J0XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRoc0NhY2hlW3RoLnRoXSA9IHRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudGhzQ2FjaGVTZXQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgLy8gUHJlcGFzc2FnZ2lvIHBlciB0aXJhcmUgZnVvcmkgdHV0dGUgbGUgaW5mbyB1dGlsaSBzdWdsaSBoZWFkZXJzIGluIG1vZG8gZGEgbm9uIHJpY2Fjb2xhcnNlbGkgc2VtcHJlIGRvcG9cclxuICAgICAgICAgICAgbGV0IGhJID0gdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV2YWx1YXRlSGVhZGVyc0dyb3VwaW5nSW5mb3ModGhzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCBhcnJheSBub24gaG8gdW4gYmFja2VuZC4uLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3dHcm91cGluZ19ILmFycmF5TW9kZVJldmlld0dyb3VwaW5ncyhoSS5sZWFmcyk7ICAvLyAuLi4gaSByYWdncnVwcGFtZW50aSBsaSBkZXZvIGZhcmUgbGF0byBjbGllbnRcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5yZXZpZXdDb2x1bW5zTGlzdChoSS5sZWFmcyk7ICAgICAgICAgICAgICAgICAgICAgIC8vIEFnZ2lvcm5hIGxhIGxpc3RhIGRlbGxlIGNvbG9ubmUgZGEgbW9zdHJhcmUgbmVsbGEgZGlhbG9nIHBlciBvcmRpbmFtZW50byBlY2NcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmFsaWduQ29sdW1uc0lmTG9hZGVkVmlldyh2aWV3KTsgICAgICAgICAgICAgICAgICAgLy8gU2Ugc3RvIGNhcmljYW5kbyB1bmEgVmlldyBkYSBob3Rwb3RhdG8gKHF1aW5kaSBjb24gc2F2ZWRzdGF0ZSA9IHRydWUpIHJpYWxsaW5lbyBsYSB2aXNpYmlsaXTDoCBkZWxsZSBjb2xvbm5lIGUgaWwgbG9ybyBvcmRpbmUuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5tb3ZlRml4ZWRDb2x1bW5zQXRUaGVCZWdpbm5pbmcoaEkubGVhZnMsIHRkcyk7ICAgIC8vIFNwb3N0byB0dXR0ZSBsZSBjb3NlIGZpeGVkIGFsbCdpbml6aW8gaW4gbW9kbyBjaGUgbGEgY3JlYXppb25lIGRpIHRoIGUgdGQgc2lhIHBpw7kgc25lbGxhIChVdGlsaXp6YSBsZSBDb2x1bW5zTGlzdCwgcXVpbmRpIGRldidlc3NlcmUgcmljaGlhbWF0YSBQSVJNQSBkaSByZXZpZXdDb2x1bW5zTGlzdClcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmFsaWduSGVhZGVyc09yZGVyaW5nKGhJLmxlYWZzLCB2aWV3KTsgICAgICAgICAgICAgLy8gQWxsaW5lbyBnbGkgb3JkaW5hbWVudGkgYWdsaSBoZWFkZXJcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILnJlZnJlc2hDb2x1bW5zVmlzaWJpbGl0eShoSS5sZWFmcywgdGRzLCB2aWV3KTsgICAgLy8gTGF2b3JvIHN1aSBUSCBlZCBldmVudHVhbG1lbnRlIG1vZGlmaWNvIGxhIHZpc2liaWxpdMOgIGFuY2hlIGRlaSBURC5cclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV2YWx1YXRlUGlubmVkQ29sdW1uc1dpZHRoKCk7ICAgICAgICAgICAgICAgICAgICAgLy8gU2Ugc29ubyBwcmVzZW50aSBjb2xvbm5lIHBpbm5hdGUgdmFsdXRhIGxhIGRpbWVuc2lvbmUgZGVsIGNvbnRlbml0b3JlXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5nZW5lcmF0ZURlZmF1bHRPcmRlcihoSS5sZWFmcywgdmlldyk7ICAgICAgICAgICAgIC8vIEdlbmVybyBsZSBkaXJldHRpdmUgZGkgb3JkaW5hbWVudG8sIGNoZSBzaWFubyBkZWZhdWx0IG8gZGVyaXZhbnRpIGRhbGxhIEFwcFNlYXJjaFxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZXZhbHVhdGVIZWFkZXJHcm91cHMoaEkpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWYWx1dG8gaSByYWdncnVwcGFtZW50aSBkZWdsaSBoZWFkZXIgc2UgcHJlc2VudGlcclxuXHJcbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgIEdlbmVyYXppb25lIGJpbmRpbmcgcGVyIHJpZ2hlIGUgY29sb25uZSAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVSb3dUaHMoaEkubGVhZnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhY2NvbGdvIGkgVEhcclxuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZVJvd1RkcyhoSS5sZWFmcywgdGRzKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmFjY29sZ28gaSBURCBpbiBjb250ZXN0aSBzZXBhcmF0aSwgdW4gY29udGVzdG8gcGVyIG9nbmkgaXRlbSBvIGdydXBwb1xyXG5cclxuICAgICAgICAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgVWx0aW1pIGFnZ2l1c3RtYWVudGkgZGVpIGJpbmRpbmcgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmFwcGx5T3JkZXJpbmcodmlldywgdHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbGljbyBsJ29yZGluYW1lbnRvIHN1bGxlIGNvbG9ubmUgKG5vbiBBU0MgREVTQywgbWEgXCJwcmltYSBxdWVzdGEgbyBxdWVsbGEgY29sb25uYVwiKVxyXG4gICAgICAgICAgICB0aGlzLk1vdmVUZW1wb3JhcnlWYXJpYWJsZXNUb1JlYWxPbmVzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb2xsZWdvIFRIIGUgVEQgYWdnaXVzdGF0aSBmaW5vIGFkIG9yYSBhbGxlIHZhcmlhYmlsaSBkaSBCaW5kaW5nIEhUTUxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5ldmFsdWF0ZVNlbGVjdGlvbihpdGVtc0FuZEdyb3Vwcywgc2kpOyAgICAgICAgICAgICAgICAgLy8gUmlhbGxpbmVvIGxlIGluZm8gZGkgc2VsZXppb25lIGRlZ2xpIGVsZW1lbnRpIGRlbGxhIFZpZXdcclxuXHJcbiAgICAgICAgICAgIC8vIFZhbHV0YSBsbyBzdGF0byBpbml6aWFsZSBkaSBzZWxlemlvbmUgYSByYW5nZVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmV2YWx1YXRlU2luZ2xlQ2VsbFNlbGVjdGlvbihpdGVtc0FuZEdyb3VwcywgaEkubGVhZnMsIHRoaXMuRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlJlc2VhcmNoTmVlZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZXNlYXJjaE5lZWRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCh0aGlzLnZpZXdNb2RlIHx8IHRoaXMuYXJyYXlNb2RlKSAmJiAhdGhpcy5Vc2VDdXN0b21DZWxscykge1xyXG4gICAgICAgICAgICAvLyBSaWFsbGluZW8gbGUgaW5mbyBkaSBzZWxlemlvbmUgZGVnbGkgZWxlbWVudGkgZGVsbGEgVmlld1xyXG4gICAgICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLnZpZXdNb2RlID8gKFZpZXcgYXMgQXBwU2VhcmNoPGFueT4pLml0ZW1zIDogVmlldyBhcyBhbnlbXTtcclxuICAgICAgICAgICAgbGV0IHNpID0gdGhpcy52aWV3TW9kZSA/IChWaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5zZWxlY3Rpb24gOiB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5ldmFsdWF0ZVNlbGVjdGlvbihpdGVtcywgc2kpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUGVyIGVzc2VyZSBzaWN1cm8gY2hlIGRvcG8gdW4gYmluZCBkaSBvZ2dldHRpIGxhIGVzLXRhYmxlIGFnZ2lvcm5pIGxhIGdyYWZpY2FcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB0aGlzLkZpcnN0QmluZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dWEgaWwgYmluZGluZyBkZWdsaSBvZ2dldHRpIHBlcnZlbnV0aSBkYSBxdWVzdGEgY2hpYW1hdGEgY29uIGdsaSBvZ2dldHRpIGVmZmV0dGl2YW1lbnRlIGRhIGdyYWZpY2FyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gdmlldyBWaWV3IGRhIGN1aSBzb25vIGFycml2YXRpIGdsaSBvZ2dldHRpLiBQdcOyIGVzc2VyZSBvIHVuIGFycmF5IHNlIHNvbm8gaW4gKiphcnJheU1vZGUqKiBvIHVuYSBBcHBTZWFyY2g8VD4gc2Ugc29ubyBpbiAqKnZpZXdNb2RlKipcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBiaW5kRGlzcGxheVRvTG9hZGVkSXRlbXNPckdyb3Vwcyh2aWV3OiBhbnkpIHtcclxuICAgICAgICBpZiAoIXRoaXMuVE1QQm91bmRTb3VyY2UgfHwgdGhpcy5UTVBCb3VuZFNvdXJjZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5ib3VuZFNvdXJjZSA9IFtdO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hcnJheU1vZGUgfHwgIXRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHtcclxuICAgICAgICAgICAgdGhpcy5ib3VuZFNvdXJjZSA9IHRoaXMuVE1QQm91bmRTb3VyY2U7XHJcbiAgICAgICAgICAgIHRoaXMuQmFzZUl0ZW1zQ291bnQgPSB2aWV3Py5vYmplY3Rjb3VudCB8fCB2aWV3Py5sZW5ndGggfHwgMDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGdyb3VwaW5nS2V5cyA9IHZpZXc/Lmdyb3VwaW5ncz8uZmlsdGVyKHQgPT4gIXQuYWdncmVnYXRpb24pPy5sZW5ndGggfHwgMDtcclxuICAgICAgICBpZiAoZ3JvdXBpbmdLZXlzID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5ib3VuZFNvdXJjZSA9IHRoaXMuVE1QQm91bmRTb3VyY2U7XHJcbiAgICAgICAgICAgIHRoaXMuQmFzZUl0ZW1zQ291bnQgPSB2aWV3Py5vYmplY3Rjb3VudCB8fCAwO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJvd0dyb3VwaW5nX0guaGFuZGxlTmV3RGF0YU9uUm93R3JvdXBpbmcodmlldywgZ3JvdXBpbmdLZXlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogTWV0b2RvIHJpY2hpYW1hdG8gc29sbyBxdWFuZG8gKipUTVBSb3dURHMqKiBlICoqVE1QUm93VEhzKiogc29ubyBjb21wbGV0YW1lbnRlIGdlbmVyYXRpIGVkIGFnZ2l1c3RhdGkuIFNlcnZlIHBlciBjb2xsZWdhcmxpIGFsbGUgdmFyaWFiaWxpIHVzYXRlIGxhdG8gYmluZGluZyBIVE1MICovXHJcbiAgICBwcml2YXRlIE1vdmVUZW1wb3JhcnlWYXJpYWJsZXNUb1JlYWxPbmVzKCkge1xyXG5cclxuICAgICAgICB0aGlzLlJvd1REcyA9IHRoaXMuVE1QUm93VERzO1xyXG4gICAgICAgIHRoaXMuUm93VEhzID0gdGhpcy5UTVBSb3dUSHM7XHJcbiAgICAgICAgdGhpcy5Sb3dUaEdyb3VwcyA9IHRoaXMuVE1QUm93VGhHcm91cHMgPyB0aGlzLlRNUFJvd1RoR3JvdXBzLnJldmVyc2UoKSA6IG51bGw7XHJcbiAgICAgICAgdGhpcy5FbXB0eVJvd1RkcyA9IHRoaXMuaXNFbXB0eSh0aGlzLlJvd1REcyk7XHJcblxyXG4gICAgICAgIHRoaXMuQ29sdW1ucy5WaXNpYmlsZSA9IHRoaXMuUm93VEhzLmZpbHRlcih0ID0+IHQuVmlzaWJsZSkubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuQ29sdW1ucy5WaXNpYmxlVW5waW5uZWQgPSB0aGlzLlJvd1RIcy5maWx0ZXIodCA9PiB0LlZpc2libGUgJiYgIXQuUGlubmVkKS5sZW5ndGg7XHJcbiAgICAgICAgdGhpcy5Db2x1bW5zLkdsb2JhbCA9IHRoaXMuQ29sdW1ucy5WaXNpYmxlVW5waW5uZWQgKyAodGhpcy5IYXNQaW5uZWRDb2x1bW5zID8gMSA6IDApICsgKHRoaXMuU2VsZWN0aW9uID8gMSA6IDApICsgKHRoaXMuUmVtb3ZhbCA/IDEgOiAwKSArICh0aGlzLkV4cG9ydCB8fCB0aGlzLkhpZGRlbkNvbHVtbnMgfHwgdGhpcy5Db2x1bW5zT3JkZXJpbmcgfHwgdGhpcy5Db3JuZXJNZW51T3B0aW9ucyA/IDEgOiAwKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIE1ldG9kbyBwZXIgY2FwaXJlIHNlIHVuIG9nZ2V0dG8gw6ggY29tcGxldGFtZW50ZSB2dW90byBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IG9iaiBPZ2dldHRvIGRhIGNvbnRyb2xsYXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsJ29nZ2V0dG8gw6ggdnVvdG8sICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIGlzRW1wdHkob2JqOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBmb3IgKHZhciBfIGluIG9iaikgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcm1ldHRlIGRpIHNlbGV6aW9uYXJlIG8gZGVzZWxlemlvbmFyZSBpbiBtYW5pZXJhIGFyYml0cmFyaWEgZGVnbGkgb2dnZXR0aVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBpdGVtcyBPZ2dldHRpIGRhIHNlbGV6aW9uYXJlIG8gZGVzZWxlemlvbmFyZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzZWxlY3QgKip0cnVlKiogcGVyIHNlbGV6aW9uYXJsaSwgKipmYWxzZSoqIHBlciBub24gdG9jY2FybGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFNlbGVjdGlvblN0YXR1cyhpdGVtczogYW55W10sIGFsbDogYm9vbGVhbiwgc2VsZWN0OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKGFsbCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuU2VsZWN0QWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiSW1wb3NzaWJpbGUgaW1wb3N0YXJlIGxhIHNlbGV6aW9uZSBjb24gbCdhbGwgc2VsZWN0aW9uIHF1YW5kbyBsJ0lucHV0IFNlbGVjdEFsbCDDqCBmYWxzZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHNpID0gKHRoaXMuVmlldyBhcyBBcHBTZWFyY2g8YW55Pik/LnNlbGVjdGlvbiB8fCB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbjtcclxuICAgICAgICAgICAgLy9zZSBkZXNlbGV6aW9ubyBjb24gYXR0dWFsZSBzZWxlemlvbmUgYWQgYWxsIG8gc2Ugc2VsZXppb25vIGNvbiBhdHR1YWxlIHNlbGV6aW9uZSBtYW51YWxlIGRldm8gcmljaGlhbWFyZSBsYSAqKnNlbGVjdEFsbE9yUmVzZXRTZWxlY3Rpb24qKlxyXG4gICAgICAgICAgICBpZiAoKHNpLmFsbCAmJiAhc2VsZWN0KSB8fCAoIXNpLmFsbCAmJiBzZWxlY3QpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zZWxlY3RBbGxPclJlc2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5oYW5kbGVJdGVtc1NlbGVjdGlvbihpdGVtcywgc2VsZWN0KTtcclxuXHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hlIGdlc3Rpc2NlIGlsIGNhbWJpbyBkaSBPcmRpbmFtZW50byBkaSB1bmEgY29sb25uYVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBJRCBkZWxsYSBjb2xvbm5hIGlsIGN1aSBvcmlkbmFtZW50byDDqCBjYW1iaWF0b1xyXG4gICAgICogQHBhcmFtIHsnREVTQycgfCAnQVNDJ30gb3JkZXIgTnVvdm8gb3JkaW5lIHNlbGV6aW9uYXRvIHBlciBsYSBjb2xvbm5hXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0aE9yZGVyQ2hhbmdlZChpZDogc3RyaW5nLCBvcmRlcj86ICdERVNDJyB8ICdBU0MnKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdNb2RlICYmICF0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ09yZGVyIGNoYW5nZWQgb24gYSB0YWJsZSBub3QgaW4gdmlld01vZGUgb3IgQXJyYXkgbW9kZS4gT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLk9yZGVyQnlDb2x1bW4pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmhhbmRsZVRIT3JkZXJDaGFuZ2UoaWQsIG9yZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBkYSBjaGlhbWFyZSBvZ25pIHZvbHRhIGNoZSBzaSB2dW9sZSBkYXJlIGV2aWRlbnphIGFsbCdlc3Rlcm5vIGRlbCBiaXNvZ25vIGRpIHJpZWZmZXR0dWFyZSBsYSByaWNlcmNhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVzZXRzUGFnZSBJbmRpY2EgYWwgbGlzdGVuZXIgY2hlIGRldmUgcmVzZXR0YXJlIGlsIG51bWVybyBkaSBwYWdpbmFcclxuICAgICAqIEBwYXJhbSB7QXBwU2VhcmNoPGFueT59IHZpZXdPdmVycmlkZSBPdmVycmlkZSBkZWxsYSB2aWV3IGRhIGVtZXR0ZXJlIHBlciBxdWVzdGEgcmljZXJjYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZW1pdFNlYXJjaFJlcXVlc3QocmVzZXRzUGFnZTogYm9vbGVhbiwgdmlld092ZXJyaWRlPzogQXBwU2VhcmNoPGFueT4pIHtcclxuICAgICAgICBpZiAodGhpcy52aWV3TW9kZSAmJiAhdmlld092ZXJyaWRlKSB7XHJcbiAgICAgICAgICAgICh0aGlzLlZpZXcgYXMgQXBwU2VhcmNoPGFueT4pLmludGVybmFsc2VhcmNocmVxdWVzdCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZpZXdPdmVycmlkZSkge1xyXG4gICAgICAgICAgICBpZiAocmVzZXRzUGFnZSlcclxuICAgICAgICAgICAgICAgIHZpZXdPdmVycmlkZS5wYWdlID0gMTtcclxuICAgICAgICAgICAgdmlld092ZXJyaWRlLmludGVybmFsc2VhcmNocmVxdWVzdCA9IHRydWVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVzZWFyY2hJblByb2dyZXNzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVmlldyAmJiAhdGhpcy5WaWV3LnNlbGZzZWFyY2ggJiYgdGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLlZpZXcuc2VsZnNlYXJjaCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCh0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QuZW1pdChmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoUmVxdWVzdC5lbWl0KHZpZXdPdmVycmlkZSA/IHZpZXdPdmVycmlkZSA6IHJlc2V0c1BhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFydGVuZG8gZGFnbGkgKipFc1RkcyoqIGJpbmRhdGkgZ2VuZXJhLCBhbGwnaW50ZXJubyBkZWwgZGl6aW9uYXJpbyAqKlRNUFJvd1REcyoqIHR1dHRpIGkgY29udGVzdGkgZGVpIHZhcmkgb2dnZXR0aS5cclxuICAgICAqXHJcbiAgICAgKiBWZW5nb25vIGVzY2x1c2kgaSBURCBcIkludGVybmlcIiBpbiBxdWFudG8gdmVuZ29ubyBnZW5lcmF0aSBkYWdsaSBvcmlnaW5hbGkgcXVpbmRpIGluY2x1ZGVybGkgdm9ycmViYmUgZGlyZSByaWVmZmV0dHVhcmUgbGUgb3BlcmF6aW9uaSBkdWUgdm9sdGVcclxuICAgICAqXHJcbiAgICAgKiBDb3N0bzogMiBzY2FuIEVzVGhzLCAxIHNjYW4gRXNUZHNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmVbXX0gdGhzIENvbG9ubmUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICogQHBhcmFtIHtFc1RkRGlyZWN0aXZlW119IHRkcyBDZWxsZSBkZWxsYSB0YWJlbGxhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGVSb3dUZHModGhzOiBFc1RoRGlyZWN0aXZlW10sIHRkczogRXNUZERpcmVjdGl2ZVtdKSB7XHJcbiAgICAgICAgaWYgKHRkcy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgY29sdW1uc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogRXNUYWJsZUNvbHVtbiB9ID0ge307XHJcblxyXG4gICAgICAgIGZvciAobGV0IGNvbGkgPSAwOyBjb2xpIDwgdGhpcy5Db2x1bW5zTGlzdC5sZW5ndGg7IGNvbGkrKykge1xyXG4gICAgICAgICAgICBsZXQgY29sID0gdGhpcy5Db2x1bW5zTGlzdFtjb2xpXTtcclxuICAgICAgICAgICAgY29sdW1uc0NhY2hlW2NvbC5pZF0gPSBjb2w7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLlRNUFJvd1REcyA9IHt9O1xyXG4gICAgICAgIC8vIFZhcmlhYmlsZSBkJ2FwcG9nZ2lvIHBlciBwZXJtZXR0ZXJtaSBkaSBpbnNlcmlyZSB0dXR0ZSBsZSBjb2xvbm5lIFwiRml4ZWRcIiBkYXZhbnRpXHJcbiAgICAgICAgbGV0IGNvbnRleHRGaXhlZHM6IHsgW2NvbnRleHQ6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRkID0gdGRzW2ldO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJvdW5kU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuYm91bmRTb3VyY2VbaV07XHJcbiAgICAgICAgICAgICAgICBsZXQgY3R4ID0gaXRlbS5faGFzaDtcclxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSB0ZC50ZDtcclxuICAgICAgICAgICAgICAgIGxldCB0aCA9IHRoaXMudGhzQ2FjaGVbdGQudGRdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghIXRoKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoLl9yZWZlcmVuY2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTa2lwcGFyZSBzZW56YSB0aCAoY2FzaXN0aWNhIHRhYmVsbGEgZGluYW1pY2EpXHJcbiAgICAgICAgICAgICAgICBpZiAodGggJiYgdGgudGhJZiAmJiAodGQudGRJZiB8fCB0aC50aEdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aENhc3RlZCA9IDxFc1RoRGlyZWN0aXZlPnRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpc0ZpeGVkID0gdGgudGhGaXhlZCB8fCB0aC50aEdyb3VwIHx8IHRoLnRoUGlubmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtVG9BZGQgPSBpdGVtLl9pdGVtID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgPFRkRWxlbWVudD57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWZ0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX2xib3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHRCb3JkZXI6ICg8YW55PnRoQ2FzdGVkKS5fcmJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDoga2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlubmVkOiBjb2x1bW5zQ2FjaGVbdGQudGRdLnBpbm5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbm5lZFdpZHRoOiB0aENhc3RlZC50aFBpbm5lZFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBIZWFkZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBBZ2dyZWdhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXNpYmxlOiBjb2x1bW5zQ2FjaGVbdGQudGRdLnZpc2libGUsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JhcHM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6IHRkLnRkQ2xhc3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJY29uQ2xhc3M6IHRkLnRkSWNvbkNsYXNzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uRmllbGQ6IHRkLnRkQ29uZGl0aW9uRmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25WYWx1ZTogdGQudGRDb25kaXRpb25WYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlOiB0ZC50ZFRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudDogdGQudGRDb250ZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGU6IHRoQ2FzdGVkLnRoR3JvdXAgJiYgIXRoaXMuU2hvd0l0ZW1Hcm91cHNDb2x1bW5zID8gbnVsbCA6IHRkLlRlbXBsYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGk6IHRkLl9tdWx0aSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpUHJvcDogdGQuX211bHRpID8gdGQudGQuc3BsaXQoJ18nKVswXSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUluZGV4OiB0ZC5fbXVsdGkgPyB0ZC50ZC5zcGxpdCgnXycpWzFdIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudDogKHRkLnRkQWxpZ25tZW50IHx8IHRoLnRoQWxpZ25tZW50IHx8IHRoaXMuRGVmYXVsdEFsaWdubWVudCkudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdDogdGQudGRGb3JtYXQgfHwgdGgudGhGb3JtYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eU5hbWU6IHRoLnRoUHJvcGVydHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGU6IHRoLnRoVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5U291cmNlOiB0aC50aFNvdXJjZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BBY2Nlc3NvcjogdGQudGRQcm9wZXJ0eUFjY2Vzc29yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8VGRFbGVtZW50PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZnRCb3JkZXI6ICg8YW55PnRoQ2FzdGVkKS5fbGJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWdodEJvcmRlcjogKDxhbnk+dGhDYXN0ZWQpLl9yYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiBrZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW5uZWQ6IGNvbHVtbnNDYWNoZVt0ZC50ZF0ucGlubmVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlubmVkV2lkdGg6IHRoQ2FzdGVkLnRoUGlubmVkV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cEhlYWRlcjogdGhDYXN0ZWQudGhHcm91cCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwQWdncmVnYXRpb246ICEhdGhDYXN0ZWQudGhBZ2dyZWdhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpc2libGU6IGNvbHVtbnNDYWNoZVt0ZC50ZF0udmlzaWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyYXBzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiB0aENhc3RlZC50aEdyb3VwQ2xhc3MgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50OiB0aGlzLnJvd0dyb3VwaW5nX0guZ2V0R3JvdXBDZWxsRGlzcGxheSg8R3JvdXA+aXRlbSwga2V5LCA8RXNUaERpcmVjdGl2ZT50aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVE1QUm93VERzW2N0eF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UTVBSb3dURHNbY3R4XS5wdXNoKGl0ZW1Ub0FkZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJvd0NvbnRleHRzLnB1c2goY3R4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UTVBSb3dURHNbY3R4XSA9IFtpdGVtVG9BZGRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Rml4ZWRzW2N0eF0gPSBpc0ZpeGVkID8gMSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZSBub24gaG8gb2dnZXR0aSDDqCBpbnV0aWxlIGNoZSBjb250cm9sbG8gZ2xpIGVycm9yaSwgZGF0byBjaGUgZ2xpIGVzLXRkIG5vbiBlc2lzdGVyYW5ubyBkaSBjZXJ0byBlIGRpIGNvbnNlZ3VlbnphIGdsaSBlcy10aCBub24gc2FyYW5ubyByZWZlcmVuemlhdGlcclxuICAgICAgICBpZiAodGhpcy5UTVBCb3VuZFNvdXJjZS5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB2YXIgZXJyczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcbiAgICAgICAgICAgIGlmICghdGguX3JlZmVyZW5jZWQpXHJcbiAgICAgICAgICAgICAgICBlcnJzLnB1c2godGgudGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgZXJySWRzID0gZXJycy5qb2luKCcsICcpO1xyXG4gICAgICAgICAgICB0aHJvdyBcIkwnSUQgZGkgdW5vIG8gcGnDuSBFc1RoIG5vbiBoYW5ubyBhbGN1biBFc1RkIGFzc29jaWF0bzogXCIgKyBlcnJJZHM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFydGVuZG8gZGFnbGkgKipFc1RocyoqIGJpbmRhdGkgZ2VuZXJhLCBhbGwnaW50ZXJubyBkZWwgZGl6aW9uYXJpbyAqKlRNUFJvd1RIcyoqIHR1dHRpIGkgY29udGVzdGkgZGVpIHZhcmkgb2dnZXR0aS5cclxuICAgICAqXHJcbiAgICAgKiBWZW5nb25vIGVzY2x1c2kgaSBUSCBcIkludGVybmlcIiBpbiBxdWFudG8gdmVuZ29ubyBnZW5lcmF0aSBkYWdsaSBvcmlnaW5hbGkgcXVpbmRpIGluY2x1ZGVybGkgdm9ycmViYmUgZGlyZSByaWVmZmV0dHVhcmUgbGUgb3BlcmF6aW9uaSBkdWUgdm9sdGVcclxuICAgICAqXHJcbiAgICAgKiBDb3N0bzogMSBzY2FuIEVzVGhzICsgMSBzY2FuIENvbHVtbnNMaXN0XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlW119IHRocyBDb2xvbm5lIGRlbGxhIHRhYmVsbGFcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZVJvd1Rocyh0aHM6IEVzVGhEaXJlY3RpdmVbXSkge1xyXG4gICAgICAgIGlmICh0aHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbnNMaXN0Q2FjaGU6IHsgW2luZGV4OiBzdHJpbmddOiBFc1RhYmxlQ29sdW1uIH0gPSB7fTtcclxuICAgICAgICBsZXQgY2FzdGVkVmlldyA9IDxBcHBTZWFyY2g8YW55Pj50aGlzLlZpZXc7XHJcbiAgICAgICAgbGV0IGdyb3VwaW5nc1VuZGVmaW5lZCA9IHRoaXMudmlld01vZGUgJiYgKGNhc3RlZFZpZXcgJiYgIWNhc3RlZFZpZXcuZ3JvdXBpbmdzIHx8IGNhc3RlZFZpZXcuZ3JvdXBpbmdzLmxlbmd0aCA9PSAwKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkNvbHVtbnNMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpdG0gPSB0aGlzLkNvbHVtbnNMaXN0W2ldO1xyXG4gICAgICAgICAgICBjb2x1bW5zTGlzdENhY2hlW2l0bS5pZF0gPSBpdG1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuVE1QUm93VEhzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICBsZXQgdG9BZGQ6IFRoRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aC50aElmIHx8IHRoLnRoR3JvdXApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgdGhDbGFzcyA9ICh0aC50aENsYXNzIHx8IFwiXCIpICsgKHRoLnRoU2hyaW5rID8gXCIgYXBwLWNvbC1taW5cIiA6IFwiXCIpICsgKHRoLnRoR3JvdXAgPyBcIiBlc3QtY29sLW1pblwiIDogXCJcIik7XHJcbiAgICAgICAgICAgICAgICB0b0FkZCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBQaW5uZWQ6IGNvbHVtbnNMaXN0Q2FjaGVbdGgudGhdLnBpbm5lZCxcclxuICAgICAgICAgICAgICAgICAgICBGaXhlZDogdGgudGhGaXhlZCxcclxuICAgICAgICAgICAgICAgICAgICBQaW5uZWRXaWR0aDogdGgudGhQaW5uZWRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBJRDogdGgudGgsXHJcbiAgICAgICAgICAgICAgICAgICAgVmlzaWJsZTogdGgudGhWaXNpYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgIENsYXNzOiB0aENsYXNzLFxyXG4gICAgICAgICAgICAgICAgICAgIE9yZGVyOiB0aC50aE9yZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIE9yZGVyYWJsZTogdGgudGhPcmRlcmFibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGU6IHRoLlRlbXBsYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIEFsaWdubWVudDogKHRoLnRoQWxpZ25tZW50IHx8IHRoaXMuRGVmYXVsdEFsaWdubWVudCkudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgICAgICAvLyBTZSBub24gw6ggbmVzc3VuIGNvbnRlbnV0byBuw6kgbmVzc3VuIHRlbXBsYXRlIG1vc3RybyBzZW1wbGljZW1lbnRlIGwnSUQgZGVsbCdoZWFkZXJcclxuICAgICAgICAgICAgICAgICAgICBDb250ZW50OiB0aC50aFN0YXRpY0NvbnRlbnQgIT0gbnVsbCA/IHRoLnRoU3RhdGljQ29udGVudCA6IHRoLlRlbXBsYXRlID8gJycgOiB0aC50aCxcclxuICAgICAgICAgICAgICAgICAgICBXcmFwOiB0aC50aFdyYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgTGVmdEJvcmRlcjogKDxhbnk+dGgpLl9sYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICBSaWdodEJvcmRlcjogKDxhbnk+dGgpLl9yYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICBNdWx0aTogdGguX211bHRpLFxyXG4gICAgICAgICAgICAgICAgICAgIE11bHRpQ29udGVudDogdGguX211bHRpX2NvbnRlbnRcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLlRNUFJvd1RIcy5wdXNoKHRvQWRkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZSBobyB1biBtb2RlbGxvIGNoZSBkZXZlIGZ1bnppb25hcmUgYSByb3dncm91cGluZyBtYSBub24gw6ggYW5jb3JhIHN0YXRhIGVmZmV0dHVhdGEgbmVzc3VuYSByaWNlcmNhIHN1aSBncnVwcGkgcHJpbmNpcGFsaSAoZ3JvdXBpbmdzVW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgLy8gbGkgZ2VuZXJvIGUgbWFuZG8gbGEgcHJpbWEgcmljZXJjYSBjaGUgZGV2J2Vzc2VyZSBzcGVkaXRhIGFsIGJhY2tlbmQgcGVyIGlsIHByaW1vIGNhcmljYW1lbnRvIGRlaSBncnVwcGlcclxuICAgICAgICAgICAgICAgIGlmIChncm91cGluZ3NVbmRlZmluZWQgJiYgKHRoLnRoQWdncmVnYXRpb24gfHwgdGgudGhHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBBZ2dyZWdhdGlvbnM6IEdyb3VwT3JBZ2dyZWdhdGlvbltdID0gdGhpcy5yb3dHcm91cGluZ19ILmdldEdyb3VwQWdncmVnYXRpb25zKHRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhc3RlZFZpZXcuZ3JvdXBpbmdzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXN0ZWRWaWV3Lmdyb3VwaW5ncyA9IGdyb3VwQWdncmVnYXRpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzdGVkVmlldy5ncm91cGluZ3MucHVzaCguLi5ncm91cEFnZ3JlZ2F0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmVzZWFyY2hOZWVkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgZGkgdW5hIHBhZ2luYSBpbiBhdmFudGkgKG8gaW5kaWV0cm8pXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqIEBwYXJhbSB7YW55fSBwYWdlciBFbGVtZW50byBkaSBzZXBhcmF6aW9uZSBzdSBjdWkgw6ggZWZmZXR0dWF0YSBsYSByaWNlcmNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRUb1BhZ2VHcm91cChwYWdlOiBudW1iZXIsIHBhZ2VyOiBHcm91cFBhZ2VyKSB7XHJcbiAgICAgICAgdGhpcy5nb1RvUGFnZUdyb3VwKHBhZ2VyLnZpZXcucGFnZSArIHBhZ2UsIHBhZ2VyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNwb3N0YSBsYSByaWNlcmNhIGFsbGEgcGFnaW5hIHNwZWNpZmljYXRhXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgUGFnaW5hIGEgY3VpIG5hdmlnYXJlXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gcGFnZXIgRWxlbWVudG8gZGkgc2VwYXJhemlvbmUgc3UgY3VpIMOoIGVmZmV0dHVhdGEgbGEgcmljZXJjYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ29Ub1BhZ2VHcm91cChwYWdlOiBudW1iZXIsIHBhZ2VyOiBHcm91cFBhZ2VyKSB7XHJcblxyXG4gICAgICAgIGxldCBhcHBTZWFyY2hFbGVtZW50ID0gcGFnZXIudmlldztcclxuICAgICAgICBpZiAocGFnZSA9PT0gMCB8fCAocGFnZSA+IGFwcFNlYXJjaEVsZW1lbnQucGFnZXMgJiYgYXBwU2VhcmNoRWxlbWVudC5wYWdlcyA+IDApKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGFwcFNlYXJjaEVsZW1lbnQucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgcGFnZXIuYnV0dG9ucyA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCBhcHBTZWFyY2hFbGVtZW50LnBhZ2UsIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMpO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlLCBhcHBTZWFyY2hFbGVtZW50KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAVE9ETyBTcG9zdGFyZSBpbiBTZWxlY3Rpb25IYW5kbGVyXHJcbiAgICAgKiBcclxuICAgICAqIEdlc3Rpc2NlIGkgY2xpY2sgc3VsbGEgdGFiZWxsYSBzb2xvIHBlciBsZSByaWdoZSBhIGdydXBwby4gXHJcbiAgICAgKiBPIHJpbXVvdmUgZ2xpIGVsZW1lbnRpIGF0dHVhbG1lbnRlIHByZXNlbnRpIG8gY2FyaWNhIGlsIGNvbnRlbnV0byBkZWwgZ3J1cHBvXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IGdyb3VwIEdydXBwbyBiaW5kYXRvIHN1IGN1aSBzaSDDqCBlZmZldHR1YXRvIGlsIGNsaWNrXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGwnb3BlcmFpem9uZSDDqCBhbmRhdGEgYSBidW9uIGZpbmUsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVHcm91cENsaWNrKGdyb3VwOiBHcm91cCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjYXN0ZWQgPSB0aGlzLlZpZXcgYXMgQXBwU2VhcmNoPGFueT47XHJcbiAgICAgICAgbGV0IGFueUcgPSAoPGFueT5ncm91cCk7XHJcbiAgICAgICAgYW55Ry5fZXhwYW5kZWQgPSAhYW55Ry5fZXhwYW5kZWQ7XHJcblxyXG4gICAgICAgIC8vIFNvbm8gaW4gbW9kYWxpdMOgIHJhZ2dydXBwYW1lbnRvIHZpcnR1YWxlIGRhIGFycmF5OiBFc3BhbmRlcmUgc2lnbmlmaWNhIHJlbmRlcmUgdmlzaWJpbGkgdHV0dGkgZ2xpIG9nZ2V0dGkgcmVsYXRpdmkgYSBxdWVzdG8gZ3J1cHBvLCB2aWNldmVyc2EgaWwgY29udHJhcnJlXHJcbiAgICAgICAgaWYgKHRoaXMuQXJyYXlHcm91cGluZykge1xyXG4gICAgICAgICAgICBsZXQgYWxsUmVsYXRpdmVzID0gdGhpcy5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PlxyXG4gICAgICAgICAgICAgICAgKHQuX2dyb3VwICYmICgoYW55Ry5fZXhwYW5kZWQgJiYgdC5fcGFyZW50ID09IGFueUcuX3RoaXNLZXkpIHx8ICghYW55Ry5fZXhwYW5kZWQgJiYgdC5fcGFyZW50ICYmIHQuX3BhcmVudC5zdGFydHNXaXRoKGFueUcuX3RoaXNLZXkpKSkpIHx8XHJcbiAgICAgICAgICAgICAgICAodC5faXRlbSAmJiAoKGFueUcuX2V4cGFuZGVkICYmIHQuX3RoaXNLZXkgPT0gYW55Ry5fdGhpc0tleSkgfHwgKCFhbnlHLl9leHBhbmRlZCAmJiB0Ll90aGlzS2V5LnN0YXJ0c1dpdGgoYW55Ry5fdGhpc0tleSkpKSkpXHJcbiAgICAgICAgICAgIGFsbFJlbGF0aXZlcy5mb3JFYWNoKHQgPT4geyB0Ll92aXNpYmxlID0gYW55Ry5fZXhwYW5kZWQ7IGlmICh0Ll9ncm91cCkgdC5fZXhwYW5kZWQgPSBmYWxzZSB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFueUcuX2V4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgIC8vIFJlc2V0dG8gaXBwXHJcbiAgICAgICAgICAgIGNhc3RlZC5pdGVtc3BlcnBhZ2VvdmVycmlkZSA9IDE1O1xyXG4gICAgICAgICAgICBpZiAoIWNhc3RlZC5yZXF1ZXN0ZWRncm91cHMpXHJcbiAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzID0gW25ldyBHcm91cEZpbHRlcihncm91cC5jb2x1bW4sIGdyb3VwLnZhbHVlKV07XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxldmVsID0gYW55Ry5fZ3JvdXBsZXZlbDtcclxuICAgICAgICAgICAgICAgIC8vIHNlIGlsIGdydXBwbyBjbGljY2F0byBub24gaGEgdW4gbGl2ZWxsbyDDqCBpbCBwcmltbyBncnVwcG8sIHF1aW5kaSBvcmRpbmFtZW50byB1bmljb1xyXG4gICAgICAgICAgICAgICAgLy8gYWx0cmltZW50aSBkZXZvIHJpbXVvdmVyZSB0dXR0aSBpIGZpbHRyaSBzdSBsaXZlbGxpIHN1cGVyaW9yaSBhbCBsZXZlbCBjbGljY2F0byBlIGFnZ2l1bmdlcmUgaWwgbGV2ZWwgY2xpY2NhdG9cclxuICAgICAgICAgICAgICAgIGlmICghbGV2ZWwpXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3VwcyA9IFtuZXcgR3JvdXBGaWx0ZXIoZ3JvdXAuY29sdW1uLCBncm91cC52YWx1ZSldO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3VwcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGFueUcuX3BhcmVudFJvdXRlLmZvckVhY2goKHN0ZXA6IEdyb3VwUm91dGVGcmFnbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzLnB1c2gobmV3IEdyb3VwRmlsdGVyKHN0ZXAuY29sdW1uLCBzdGVwLnZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3Vwcy5wdXNoKG5ldyBHcm91cEZpbHRlcihncm91cC5jb2x1bW4sIGdyb3VwLnZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHBhdGggPSAoYW55Ry5fcGFyZW50IHx8ICcnKSArIGdyb3VwLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgLy8gU2UgaG8gY2hpdXNvIHVuIGdydXBwbyBub24gbWkgc2VydmUgcmllZmZldHR1YXJlIHJpY2VyY2UsIG1pIGJhc3RhIGVsaW1pbmFyZSBkYWdsaSBvZ2dldHRpIGJpbmRhdGkgdHV0dGkgZ2xpIGVsZW1lbnRpIHNvdHRvc3RhbnRpIGEgcXVlbCBncnVwcG9cclxuICAgICAgICAgICAgdGhpcy5ib3VuZFNvdXJjZSA9IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gIXQuX3BhcmVudCB8fCAhdC5fcGFyZW50LnN0YXJ0c1dpdGgocGF0aCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gZGV2byBwZXLDsiBhbmNoZSByaW11b3ZlcmUgZXZlbnR1YWxpIGNhY2hlIHJlbGF0aXZlXHJcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlID0gdGhpcy5ncm91cFNlYXJjaFJlcXVlc3RzQ2FjaGUuZmlsdGVyKHQgPT4gdC5wYXRoICE9IHBhdGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VzdGlzY2UgbGEgc2VsZXppb25lIGdsb2JhbGUgZGVnbGkgb2dnZXR0aSwgc2lhIHBlciBwYWdpbmEgY2hlIGEgbGl2ZWxsbyBkaSAqKlNlbGVjdEFsbCoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZWRWYWwgVmFsb3JlIGZvcnphdG8gZGkgY2hlY2sgZGEgYXNzZWduYXJlIGFnbGkgb2dnZXR0aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ2hlY2tDaGFuZ2VkKGZvcmNlZFZhbDogYm9vbGVhbiA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvblN0YXR1c0V4Y2x1ZGluZyhudWxsKTtcclxuXHJcbiAgICAgICAgLy8gUHJlbmRvIHR1dHRpIGdsaSBlbGVtZW50aSBwcmVzZW50aSBpbiBxdWVzdGEgdmlzdGEuIFNlIGhvIGdydXBwaSBwcmVuZG8gc29sbyBpIGdydXBwaSBhIGxpdmVsbG8gMCwgYWx0cmltZW50aSBwcmVuZG8gdHV0dGkgZ2xpIG9nZ2V0dGkgcGVyIHNlbGV6aW9uYXJsaVxyXG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuYm91bmRTb3VyY2UuZmluZCh0ID0+IHQuX2dyb3VwKSA/IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gdC5fZ3JvdXAgJiYgIXQuX3BhcmVudCkgOiB0aGlzLmJvdW5kU291cmNlO1xyXG4gICAgICAgIHZhciBpdGVtU2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25fSC5oYW5kbGVJdGVtc1NlbGVjdGlvbihpdGVtcywgZm9yY2VkVmFsLCB0aGlzLmdsb2JhbENoZWNrKTtcclxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdChpdGVtU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBUT0RPIFNwb3N0YXJlIGluIFNlbGVjdGlvbkhhbmRsZXJcclxuICAgICAqIFxyXG4gICAgICogR2VzdGlzY2UgaSBjbGljayBzdWxsYSB0YWJlbGxhLCBnZXN0ZW5kbyBldmVudHVhbG1lbnRlIGFuY2hlIGdsaSBTaGlmdCArIENsaWNrIHBlciBzZWxlemlvbmFyZSB1biByYW5nZSBkaSBvZ2dldHRpXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IGV2ZW50IEV2ZW50byBuYXRpdm8gSFRNTCBkZWwgY2xpY2tcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gYmluZGF0byBzdSBjdWkgc2kgw6ggZWZmZXR0dWF0byBpbCBjbGlja1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsJ29wZXJhaXpvbmUgw6ggYW5kYXRhIGEgYnVvbiBmaW5lLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlQ2xpY2soZXZlbnQ6IGFueSwgaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclRleHRTZWxlY3Rpb24oZXZlbnQpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXNFeGNsdWRpbmcobnVsbCk7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZGl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiB0aGlzLlNoaWZ0Q2xpY2sgJiYgIXRoaXMuU2luZ2xlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBzdGFydFNlbGVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PiAhdC5fZ3JvdXAgJiYgIXQuX3NlcCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ID0gaXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRTZWxlY3RpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0Ll9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRpdGVtcy5wdXNoKHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCh0ID09IGl0ZW0gfHwgdCA9PSB0aGlzLmxhc3RTZWxlY3RlZCkgJiYgIXN0YXJ0U2VsZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWxlY3RpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHQuX3NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZGl0ZW1zLnB1c2godCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0ID09IGl0ZW0gfHwgdCA9PSB0aGlzLmxhc3RTZWxlY3RlZCkgJiYgc3RhcnRTZWxlY3RpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWxlY3RpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGl0ZW0uX3NlbGVjdGVkID0gIWl0ZW0uX3NlbGVjdGVkO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgIHNlbGVjdGVkaXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpdGVtU2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25fSC5oYW5kbGVJdGVtc1NlbGVjdGlvbihzZWxlY3RlZGl0ZW1zKTtcclxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdChpdGVtU2VsZWN0aW9uKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcG9zdGEgbGEgcmljZXJjYSBkaSB1bmEgcGFnaW5hIGluIGF2YW50aSAobyBpbmRlaXRybylcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBOdW1lcm8gZGkgcGFnaW5lIGRhIGFnZ2l1bmdlcmUgKG8gc290dHJhcnJlLCBzZSBuZWdhdGl2bykgYWxsYSBwYWdpbmEgYXR0dWFsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5NYWluR3JvdXBWaWV3ID8gdGhpcy5NYWluR3JvdXBWaWV3IDogdGhpcy5WaWV3O1xyXG5cclxuICAgICAgICB0aGlzLmdvVG9QYWdlKCgodGhpcy5TZWFyY2hWaWV3IHx8IHZpZXcpPy5wYWdlIHx8IDApICsgcGFnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcG9zdGEgbGEgcmljZXJjYSBhbGxhIHBhZ2luYSBzcGVjaWZpY2F0YVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIFBhZ2luYSBhIGN1aSBuYXZpZ2FyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ29Ub1BhZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHZpZXcgPSB0aGlzLk1haW5Hcm91cFZpZXcgPyB0aGlzLk1haW5Hcm91cFZpZXcgOiAodGhpcy5hcnJheU1vZGUgPyB0aGlzLlNlYXJjaFZpZXcgOiB0aGlzLlZpZXcpO1xyXG4gICAgICAgIGlmICghdmlldy5wYWdlIHx8ICF2aWV3LnBhZ2VzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBhcHBTZWFyY2hFbGVtZW50ID0gdGhpcy5TZWFyY2hWaWV3IHx8IHZpZXc7XHJcbiAgICAgICAgaWYgKHBhZ2UgPT09IDAgfHwgKHBhZ2UgPiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzICYmIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMgPiAwKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBhcHBTZWFyY2hFbGVtZW50LnBhZ2UgPSBwYWdlO1xyXG4gICAgICAgIGxldCBjb3VudCA9ICh2aWV3Lml0ZW1zLmxlbmd0aCB8fCB2aWV3Lmdyb3Vwcz8ubGVuZ3RoIHx8IDApO1xyXG4gICAgICAgIGxldCBpcHAgPSB2aWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlIHx8IDE1O1xyXG4gICAgICAgIHRoaXMuYXJyYXlQdWxzYW50aSA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCBhcHBTZWFyY2hFbGVtZW50LnBhZ2UsIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMsIGNvdW50LCBpcHApO1xyXG5cclxuICAgICAgICBsZXQgaGFzR3JvdXBpbmdzID0gISF0aGlzLk1haW5Hcm91cFZpZXc7XHJcbiAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSwgaGFzR3JvdXBpbmdzID8gdmlldyA6IHRoaXMuU2VhcmNoVmlldyA/IHRoaXMuU2VhcmNoVmlldyA6IG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnRvIHJpY2hpYW1hdG8gc3VsIGNhbWJpbyBkZWxsYSBwYWdpbmF6aW9uZS4gVmVycsOgIHJpY2hpYW1hdG8gbCdldmVudG8gKiplbWl0U2VhcmNoUmVxdWVzdCoqXHJcbiAgICAgKiBwZXIgY29tdW5pY2FyZSBhbCBjb21wb25lbnRlIGNoZSB1dGlsaXp6YSBxdWVzdGEgdGFiZWxsYSBjaGUgaSBkYXRpIHNvbm8gZGEgYWdnaW9ybmFyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25JdGVtc1BlclBhZ2VDaGFuZ2VkKG5ld0lwcCkge1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgPSBuZXdJcHA7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuTWFpbkdyb3VwVmlldylcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlLCB0aGlzLk1haW5Hcm91cFZpZXcpO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICAvLyBRdWVzdG8gc2Vjb25kbyBtZSBzaSBwdcOyIHBvcnRhcmUgYSBsaXZlbGxvIHVuIHBvJyBwacO5IGFsdG9cclxuICAgICAgICAgICAgdGhpcy5TZWFyY2hWaWV3LnBhZ2UgPSAxO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KHRydWUsIHRoaXMuU2VhcmNoVmlldyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gc3VsIGNhbWJpbyBkZWxsYSBwYWdpbmF6aW9uZS4gVmVycsOgIHJpY2hpYW1hdG8gbCdldmVudG8gKiplbWl0U2VhcmNoUmVxdWVzdCoqIGNvbiBsYSB2aXN0YSBkZWwgc2VwYXJhdG9yZSAqL1xyXG4gICAgcHVibGljIG9uR3JvdXBJdGVtc1BlclBhZ2VDaGFuZ2VkKHBhZ2VyOiBHcm91cFBhZ2VyLCBuZXdJcHA6IG51bWJlcikge1xyXG4gICAgICAgIHBhZ2VyLnZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgPSBuZXdJcHA7XHJcbiAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlLCBwYWdlci52aWV3KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIE1ldG9kbyBjaGUgZ2VzdGlzY2UgbGEgbW9kaWZpY2EgZGVsIHRlbXBvIHNwZWNpZmljYXRvIHBlciBsJ2FnZ2lvcm5hbWVudG8gYXV0b21hdGljbyAqL1xyXG4gICAgcHVibGljIGF1dG9VcGRhdGVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICghL15bMS05XVxcZCokLy50ZXN0KHRoaXMuc2Vjb25kcykpXHJcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcyA9ICcxMCc7XHJcblxyXG4gICAgICAgIGxldCBzZWNvbmRzSW5NcyA9IHBhcnNlSW50KHRoaXMuc2Vjb25kcywgbnVsbCkgKiAxMDAwO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hdXRvVXBkYXRlKVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlKTsgfSwgc2Vjb25kc0luTXMpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVRpbWVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGlhbWF0byBkYWwgY2xpY2sgc3UgdW5hIGRlbGxlIGNvbG9ubmUgZ2VuZXJhdGUgZGFsbCdJbnB1dCAqKkR5bmFtaWNPcGVyYXRpb25zKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBMJ29nZ2V0dG8gc3UgY3VpIHZhIGVmZmV0dHVhdGEgbCdvcGVyYXppb25lXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3BpZCBDb2RpY2UgaWRlbnRpZmljYXRpdm8gZGVsbCdvcGVyYXppb25lIGRhIGVmZmV0dHVhcnNpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkeW5hbWljT3BlcmF0aW9uKGl0ZW06IGFueSwgb3BpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vbkR5bmFtaWNPcGVyYXRpb24uZW1pdCh7IGlkOiBvcGlkLCBpdGVtOiBpdGVtIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCBjb250ZW51dG8gZGVsbCdFc1RkIGRhIHV0aWxpenphcmUgcGVyIGxhIGNvbG9ubmEgc3BlY2lmaWNhdGFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbiBDb2xvbm5hIHBlciBjdWkgY2VyY2FyZSBsYSBjZWxsYVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTm9tZSBkaXJldHRvIHBlciBjZXJjYXJlIGlsIFREIGNvbiBsJ0lELiBRdWVzdGEgdmFyaWFiaWxlIGhhIHByaW9yaXTDoCByaXNwZXR0byBhICoqY29sdW1uKipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge1RlbXBsYXRlUmVmPGFueT59IFRlbXBsYXRlIGRhIHVzYXJlIHBlciBsYSBjb2xvbm5hXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5kRXNUZChjb2x1bW46IHN0cmluZywgbmFtZTogc3RyaW5nID0gbnVsbCk6IFRlbXBsYXRlUmVmPGFueT4ge1xyXG4gICAgICAgIHZhciBFc1RkID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5maW5kKChpdGVtKSA9PiBuYW1lID8gaXRlbS50ZCA9PT0gbmFtZSA6IGl0ZW0udGRGb3JQcm9wZXJ0eSA9PT0gY29sdW1uKTtcclxuICAgICAgICAvLyBOYW1lIG5vbiB0cm92YXRvLCBmYWxsYmFjayBhbCBub21lIGRlbGxhIGNvbG9ubmFcclxuICAgICAgICBpZiAobmFtZSAmJiBjb2x1bW4gJiYgIUVzVGQpXHJcbiAgICAgICAgICAgIEVzVGQgPSB0aGlzLkVzVGRzRGlyZWN0aXZlLmZpbmQoKGl0ZW0pID0+IGl0ZW0udGRGb3JQcm9wZXJ0eSA9PT0gY29sdW1uKTtcclxuICAgICAgICByZXR1cm4gRXNUZCA/IEVzVGQuVGVtcGxhdGUgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCBjb250ZW51dG8gZGVsbCdlZGl0b3IgRXNUZCBkYSB1dGlsaXp6YXJlIHBlciBsYSBjb2xvbm5hIHNwZWNpZmljYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gQ29sb25uYSBwZXIgY3VpIGNlcmNhcmUgbCdlZGl0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5vbWUgZGlyZXR0byBwZXIgY2VyY2FyZSBsJ0VkaXRvciBjb24gbCdJRC4gUXVlc3RhIHZhcmlhYmlsZSBoYSBwcmlvcml0w6AgcmlzcGV0dG8gYSAqKmNvbHVtbioqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtUZW1wbGF0ZVJlZjxhbnk+fSBUZW1wbGF0ZSBkYSB1c2FyZSBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZEVkaXRvcihjb2x1bW46IHN0cmluZywgbmFtZTogc3RyaW5nID0gbnVsbCk6IFRlbXBsYXRlUmVmPGFueT4ge1xyXG4gICAgICAgIHZhciBFZGl0b3IgPSB0aGlzLkVzVGRFZGl0b3JEaXJlY3RpdmVzLmZpbmQoKGl0ZW0pID0+IG5hbWUgPyBpdGVtLmVkaXRvciA9PT0gbmFtZSA6IGl0ZW0uZWRpdG9yRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgLy8gTmFtZSBub24gdHJvdmF0bywgZmFsbGJhY2sgYWwgbm9tZSBkZWxsYSBjb2xvbm5hXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgY29sdW1uICYmICFFZGl0b3IpXHJcbiAgICAgICAgICAgIEVkaXRvciA9IHRoaXMuRXNUZEVkaXRvckRpcmVjdGl2ZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5lZGl0b3JGb3JQcm9wZXJ0eSA9PT0gY29sdW1uKTtcclxuICAgICAgICByZXR1cm4gRWRpdG9yID8gRWRpdG9yLlRlbXBsYXRlIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVxdWl2YWxlbnRlIGRlbCBtZXRvZG8gKiphZGRUb1BhZ2UqKiByaWFkYXR0YXRvIHBlciBsYSBtb2RhbGl0w6AgYXJyYXlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBOdW1lcm8gZGkgcGFnaW5lIGRhIGFnZ2l1bmdlcmUgKG8gc290dHJhcnJlLCBzZSBuZWdhdGl2bykgYWxsYSBwYWdpbmEgYXR0dWFsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXJyYXlBZGRUb1BhZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5hcnJheUdvVG9QYWdlKHRoaXMuYXJyYXltb2RlUGFnZSArIHBhZ2UpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFcXVpdmFsZW50ZSBkZWwgbWV0b2RvICoqZ29Ub1BhZ2UqKiByaWFkYXR0YXRvIHBlciBsYSBtb2RhbGl0w6AgYXJyYXlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBQYWdpbmEgYSBjdWkgbmF2aWdhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFycmF5R29Ub1BhZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHBhZ2UgPT09IDAgfHwgcGFnZSA+IHRoaXMuYXJyYXltb2RlUGFnZXMpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB0aGlzLmFycmF5bW9kZVBhZ2UgPSBwYWdlO1xyXG5cclxuICAgICAgICAvLyBSaWZvcnpvIGlsIHdyaXRldmFsdWUgaW4gbW9kbyBjaGUgaWwgY29kaWNlIHBhc3NpIGRhbGxhIGdlc3Rpb25lIGNvbWUgc2UgZm9zc2UgZmF0dGEgcmlwYXJ0aXJlIHVuYSByaWNlcmNhXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFdyaXRlVmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlc3Rpb25lIGRlaSBjbGljayBzdWxsZSBvcHppb25pIGRlbCBtZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhIGdlbmVyYXRvIGRhbGwnSW5wdXQgKipDb3JuZXJNZW51T3B0aW9ucyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvcm5lcmlkIENvZGljZSBkZWxsJ29wZXJhemlvbmUgc2VsZXppb25hdGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcm5lckFjdGlvbkNsaWNrZWQoY29ybmVyaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub25Db3JuZXJBY3Rpb24uZW1pdCh7IGlkOiBjb3JuZXJpZCwgZXN0YWJsZTogdGhpcyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBJbXBvc3RhemlvbmUgbW9kYWxpdMOgIGRlbGwnRXNUYWJsZSBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsnYXJyYXknIHwgJ3ZpZXcnIHwgJ3JlcG9ydCd9IG1vZGUgTW9kYWxpdMOgIGRhIGltcG9zdGFyZVxyXG4gICAgICoqL1xyXG4gICAgcHJpdmF0ZSBzZXRNb2RlKG1vZGU6ICdhcnJheScgfCAndmlldycpIHtcclxuICAgICAgICB0aGlzLnZpZXdNb2RlID0gbW9kZSA9PSAndmlldyc7XHJcbiAgICAgICAgdGhpcy5hcnJheU1vZGUgPSBtb2RlID09ICdhcnJheSc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgcGVyIGVmZmV0dHVhcmUgY2hpYW1hdGUgaW50ZXJuZSBkaSBhbGxpbmVhbWVudG8gYWxsYSBmdW56aW9uZSAqKndyaXRlVmFsdWUqKiwgXHJcbiAgICAgKiBpbXBvc3RhbmRvIHByaW1hICoqaW50ZXJuYWxXcml0ZUNhbGwqKiBpbiBtb2RvIGRhIG5vbiBlZmZldHR1YXJlIG9wZXJhemlvbmkgaW51dGlsaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW50ZXJuYWxXcml0ZVZhbHVlKCkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxXcml0ZUNhbGwgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLlZpZXcpO1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxXcml0ZUNhbGwgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogTWV0b2RvIGV2ZW50dWFsbWVudGUgcmljaGlhbWFiaWxlIGFuY2hlIGRhbCBjb21wb25lbnRlIGVzdGVybm8gY2hlIHBlcm1ldHRlIGRpIGZvcnphcmUgdW4gcmVmcmVzaCBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBwdWJsaWMgZm9yY2VSZWZyZXNoKHJlbGF1bmNoU2VhcmNoOiBib29sZWFuID0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAvLyBTZSBzb25vIGluIG1vZGFsaXTDoCBWaWV3IHZpZW5lIG1hbnRlbnV0byBpbiBhdXRvbWF0aWNvIGlsIG51bWVybyBkaSBwYWdpbmEsIG1hIHBlciBsYSBtb2RhbGl0w6AgYXJyYXkgZGV2byBwcmVuZGVyZSBsZSBpbmZvIGRpIHBhZ2luYXppb25lIHByaW1hIGUgcmlhcHBsaWNhcmxlIGRvcG9cclxuICAgICAgICBsZXQgYXJyYXlQYWdlOiBudW1iZXI7XHJcbiAgICAgICAgbGV0IGFycmF5SXBwOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlKSB7XHJcbiAgICAgICAgICAgIGFycmF5UGFnZSA9IHRoaXMuYXJyYXltb2RlUGFnZTtcclxuICAgICAgICAgICAgYXJyYXlJcHAgPSB0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCFyZWxhdW5jaFNlYXJjaCAmJiB0aGlzLnZpZXdNb2RlKVxyXG4gICAgICAgICAgICB0aGlzLlZpZXcuc2VsZnNlYXJjaCA9IHRydWU7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLlZpZXcpO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQXJyYXltb2RlSXRlbXNQZXJQYWdlID0gYXJyYXlJcHA7XHJcbiAgICAgICAgICAgIHRoaXMuYXJyYXlHb1RvUGFnZShhcnJheVBhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBJbXBvc3RhIGxhIHZpc2liaWxpdMOgIGRpIHVuIGhlYWRlciBlIGRpIGV2ZW50dWFsaSBoZWFkZXIgY29sbGVnYXRpIHNlIHF1ZXN0byBoZWFkZXIgw6ggdW4gZ3J1cHBvLCBkb3BvZGljaMOpIGFnZ2lvcm5hIGwnZXMtdGFibGUgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBncm91cE9ySGVhZGVyIEhlYWRlciBkaSBjdWkgc2V0dGFyZSBsYSB2aXNpYmlsaXTDoFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2aXNpYmlsaXR5IFZpc2liaWxpdMOgIGRhIGltcG9zdGFyZVxyXG4gICAgICoqL1xyXG4gICAgcHVibGljIHNldEhlYWRlclZpc2liaWxpdHkoZ3JvdXBPckhlYWRlcjogc3RyaW5nLCB2aXNpYmlsaXR5OiBib29sZWFuLCByZWZyZXNoOiBib29sZWFuID0gdHJ1ZSwgcmVsYXVuY2hTZWFyY2g6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgbGV0IGdyb3VwT3JIZWFkID0gdGhpcy50aHNDYWNoZVtncm91cE9ySGVhZGVyXTtcclxuICAgICAgICBpZiAoIWdyb3VwT3JIZWFkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGdyb3VwT3JIZWFkLnRoVmlzaWJsZSA9IHZpc2liaWxpdHk7XHJcblxyXG4gICAgICAgIGxldCB0aHNBcnIgPSB0aGlzLkVzVGhzRGlyZWN0aXZlLnRvQXJyYXkoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoc0Fyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNBcnJbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAodGgudGhQYXJlbnQgPT0gZ3JvdXBPckhlYWRlcilcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyVmlzaWJpbGl0eSh0aC50aCwgdmlzaWJpbGl0eSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlZnJlc2gpIHtcclxuICAgICAgICAgICAgdGhpcy51c2VMb2NhbFZpc2liaWxpdHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmZvcmNlUmVmcmVzaChyZWxhdW5jaFNlYXJjaCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuemlvbmUgY2hlIGluIGJhc2UgYWkgY2xpY2sgc3UgdW5hIGNlbGxhIGNhcGlzY2Ugc2Ugc3RvIGVmZmV0dHVhbmRvIHVuJ29wZXJhemlvbmUgZGkgc2VsZXppb25lIG8gc2Ugc3RvIGVudHJhbmRvIG5lbGwnZWRpdCBkaSB1bmEgY2VsbGEgY29uIHVuIGRvcHBpbyBjbGlja1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gJGV2ZW50IEV2ZW50byBuYXRpdm8gamF2YXNjcmlwdFxyXG4gICAgICogQHBhcmFtIHtUZEVsZW1lbnR9IHJvd0l0ZW0gUmlmZXJpbWVudG8gYSBiaW5kZXIgZGVsbGEgcmlnYVxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gSXRlbSBjaGUgcmFwcHJlc2VudGEgaWwgY29udGVzdG8gc3UgY3VpIMOoIHN0YXRvIGVmZmV0dHVhdG8gdW4gY2xpY2tcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRiQ2xpY2tFZGl0T3JTaW5nbGVDbGlja1Jvd1NlbGVjdGlvbigkZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0l0ZW06IFRkRWxlbWVudCwgaXRlbTogYW55KSB7XHJcblxyXG4gICAgICAgIC8vIFByaW1hIGNvc2EgZGEgZmFyZSDDqCBjb250cm9sbGFyZSBzZSBjaSBzb25vIGRlaSByYW5nZSBsYXNjaWF0aSBkYSBvcGVyYXppb25pIHByZWNlZGVudGkgKHNlIGFwcGxpY2FiaWxlKSBlIHJpcHVsaXJsaVxyXG4gICAgICAgIGlmICh0aGlzLnJhbmdlU2VsZWN0ZWQgJiYgISRldmVudC5jdHJsS2V5ICYmIHRoaXMuU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcImNsZWFyaW5nIHByZXZpb3VzbHkgc2VsZWN0ZWQgcmFuZ2VcIik7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXNFeGNsdWRpbmcobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBNb2RhbGl0w6AgRWRpdGFibGUsIGdlc3Rpc2NvIGkgZG9wcGkgY2xpY2sgc2VuemEgcGVyw7IgcmFsbGVudGFyZSBsYSBtb2RhbGl0w6AgZGkgc2VsZXppb25lIGEgcmFuZ2VcclxuICAgICAgICBpZiAodGhpcy5FZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAvLyBTZWNvbmRvIGNsaWNrOiBzZSBpbCB0aW1lciBub24gw6ggc2NhZHV0byDDqCB1biBkb3BwaW8gY2xpY2sgZWQgZXNlZ3VvIGlsIHJlc3RvXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNlbGxEYkNsaWNrVGltZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcImhhbmRsaW5nIGRvdWJsZWNsaWNrIG9uIGVkaXRhYmxlIGNlbGw6IFwiICsgKHJvd0l0ZW0uUHJvcGVydHlOYW1lID8gJ2VkaXQgbW9kZSBmb3IgcHJvcGVydHkgJyArIHJvd0l0ZW0uUHJvcGVydHlOYW1lIDogJ25vIHByb3BlcnR5IHNldCwgZmFsbGJhY2sgdG8gc2ltcGxlIGNsaWNrJykpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJvd0l0ZW0uUHJvcGVydHlOYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBVc2VyRWRpdChyb3dJdGVtLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJvd0NsaWNrKCRldmVudCwgaXRlbSwgdGhpcy5TZWxlY3Rpb24sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckNlbGxDbGlja1RpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBQcmltbyBjbGljazogbm9uIGZhIG5pZW50ZSBlIHNlIGlsIHRlbXBvIHBlciBpbCBzZWNvbmRvIGNsaWNrIHNjYWRlIHJlc2V0dGEgdHV0dG9cclxuICAgICAgICAgICAgdGhpcy5jZWxsRGJDbGlja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyQ2VsbENsaWNrVGltZXIoKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5SYW5nZVNlbGVjdGlvbiB8fCAhdGhpcy5tb3VzZUlzRG93bikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcInRpbWUncyB1cCBmb3Igc2Vjb25kIGNsaWNrLCBoYW5kbGluZyBzaW5nbGUgY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIHRoaXMuU2VsZWN0aW9uLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgdGhpcy5kb3VibGVDbGlja0J1ZmZlck1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEluIG1vZGFsaXTDoCBhIHJhbmdlIGxhIGNyZWF6aW9uZSBkZWwgcmFuZ2Ugw6ggZ2VzdGl0YSBkYWkgbW91c2Vkb3duLCBtb3ZlIGVkIHVwLi4uXHJcbiAgICAgICAgLy8gTGEgc2VsZXppb25lIGRlbGxlIHJpZ2hlIGludmVjZSDDqCBnZXN0aXRhIGRhbGxlIGNhc2VsbGluZSBhIHNpbmlzdHJhXHJcbiAgICAgICAgaWYgKHRoaXMuUmFuZ2VTZWxlY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gU2UgaG8gZmF0dG8gY2xpY2sgY29sIGNvbnRyb2wgYXR0YWNjYXRvIGVzY28gc3ViaXRvIGRhdG8gY2hlIGRldmUgc29sbyBwZXJtZXR0ZXJlIGxhIG5hdmlnYXppb25lIGRlaSBsaW5rXHJcbiAgICAgICAgaWYgKCRldmVudC5jdHJsS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFR1dHRpIGkgY2xpY2sgc3UgdW5hIGNlbGxhIGdpw6AgaW4gZWRpdCBub24gZGV2b25vIGVmZmV0dHVhcmUgbGEgc2VsZXppb25lIGRlbGxhIHJpZ2FcclxuICAgICAgICBpZiAoKDxhbnk+cm93SXRlbSkuX2VkaXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gUGVyIGV2aXRhcmUgZGkgcmFsbGVudGFyZSBhIHByZXNjaW5kZXJlXHJcbiAgICAgICAgaWYgKCF0aGlzLkVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2soJGV2ZW50LCBpdGVtLCB0aGlzLlNlbGVjdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEV2ZW50byBjaGUgZ2VzdGlzY2UgaWwgY29tYW5kbyBcIkNvcGlhXCIgYnV0dGFuZG8gaSB2YWxvcmkgc2VsZXppb25hdGkgbmVsbGEgY2xpcGJvYXJkIGluIGJhc2UgYWwgbG9ybyB0aXBvICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNvcHkoKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuUmFuZ2VTZWxlY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsZXQgc2VsID0gdGhpcy5zZWxlY3Rpb25fSC5nZXRTZWxlY3Rpb25TdGF0dXNTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsLmxlbmd0aCA+IDAgJiYgc2VsWzBdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGlvblRleHQgPSB0aGlzLnNlbGVjdGlvbl9ILmdldENsaXBiYXJkVGV4dEZyb21TZWxlY3Rpb24oc2VsKTtcclxuICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRTZXJ2aWNlLmNvcHlUZXh0VG9DbGlwYm9hcmQoc2VsZWN0aW9uVGV4dCk7XHJcbiAgICAgICAgICAgIHRoaXMubXNnRXh0cy5zaW1wbGVJbmZvKHRoaXMubGMubG9jKFwiVmFsdWVzIGNvcGllZCBpbiB0aGUgY2xpcGJvYXJkXCIpLCBcInRvYXN0clwiLCAxMDAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEV2ZW50byBjaGUgZ2VzdGlzY2UgaWwgY29tYW5kbyBcIkluY29sbGFcIiBwcmVuZGVuZG8gaSBkYXRpIGRlbGxhIGNsaXBib2FyZCBlIGFwcGxpY2FuZG9saSBhbCByYW5nZSBkaSBzZWxlemlvbmUgYXR0dWFsZSBpbiBiYXNlIGFsIHRpcG8gZGVsbGUgY2VsbGUgc290dG8gKi9cclxuICAgIGhhbmRsZVBhc3RlKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGV0IHNlbCA9IHRoaXMuc2VsZWN0aW9uX0guZ2V0U2VsZWN0aW9uU3RhdHVzU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbC5sZW5ndGggPiAwICYmIHNlbFswXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS5nZXRDbGlwYm9hcmQoXCJtYXRyaXhcIiwgKHZhbHVlczogc3RyaW5nW11bXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gRml4IGNsaXBib2FyZCBzZXJ2aWNlIGNoZSBwYXJlIHVuIHBvJyBzdHJvbnphLCByaW11b3ZvIGwndWx0aW1vIGFycmF5IHNlIG1pIGFjY29yZ28gY2hlIMOoIHVuIHNpbmdvbG8gYXJyYXkgY29uIHVuIHNvbG8gZWxlbWVudG8gdnVvdG9cclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCAmJiB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdLmxlbmd0aCA9PSAxICYmIHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV1bMF0gPT0gJycpXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnNwbGljZSh2YWx1ZXMubGVuZ3RoIC0gMSwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwICYmIHZhbHVlc1swXS5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHNlIGxhIG1vZGlmaWNhIMOoIGFiaWxpdGF0YVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5FZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1zZ0V4dHMuc2ltcGxlV2FybmluZyh0aGlzLmxjLmxvYyhcIkRhdGEgZm9yIHRoaXMgdGFibGUgY2Fubm90IGJlIGVkaXRlZFwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsbyBjaGUgcXVlbGxvIGNoZSBzdG8gY29waWFuZG8gc2lhIGRlbGxhIHN0ZXNzYSBkaW1lbnNpb25lIGRlbGxhIHNlbGV6aW9uZSBzdWxsJ2VzLXRhYmxlLCB0cmFubmUgbmVsIGNhc28gaG8gdW4gc2luZ29sbyB2YWxvcmUgZGEgY29waWFyZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoc2VsLmxlbmd0aCAhPSB2YWx1ZXMubGVuZ3RoIHx8IHNlbFswXS5sZW5ndGggIT0gdmFsdWVzWzBdLmxlbmd0aCkgJiYgKHZhbHVlcy5sZW5ndGggIT0gMSB8fCB2YWx1ZXNbMF0ubGVuZ3RoICE9IDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubXNnRXh0cy5zaW1wbGVXYXJuaW5nKHRoaXMubGMubG9jKFwiU2l6ZSBvZiBjb3BpZWQgZGF0YSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc2l6ZSBvZiB0aGUgc2VsZWN0aW9uXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2UgbGUgZGltZW5zaW9uaSBjb2luY2lkb25vIGNvcGlvIGRhIHVuYSBwYXJ0ZSBhbGwnYWx0cmFcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hhbmdlczogRXNUYWJsZU1vZGVsQ2hhbmdlW10gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IHNlbC5sZW5ndGg7IHIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93ID0gc2VsW3JdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHJvdy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNlbGwgPSByb3dbY107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZSBobyB1biBzaW5nb2xvIHZhbG9yZSBsbyBhcHBsaWNvIGEgdHV0dGEgbGEgc2VsZXppb25lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB2YWx1ZXMubGVuZ3RoID09IDEgJiYgdmFsdWVzWzBdLmxlbmd0aCA9PSAxID8gdmFsdWVzWzBdWzBdIDogdmFsdWVzW3JdW2NdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2xkID0gY2VsbC52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuaXUgPSBjZWxsLnZhbF9zZXR0ZXIodmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvbGRkYXRlID0gdGhpcy5kYXRlRXh0cy5nZXREYXRlQ29udmVydGlvbihvbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5pdWRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG5pdSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG9sZGRhdGUgJiYgbml1ZGF0ZSAmJiBvbGRkYXRlLmlzU2FtZSAmJiBvbGRkYXRlLmlzU2FtZShuaXVkYXRlKSkgfHwgb2xkID09PSBuaXUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKG5ldyBFc1RhYmxlTW9kZWxDaGFuZ2UoY2VsbC5pdGVtLCBjZWxsLmhlYWRlciwgY2VsbC5wcm9wZXJ0eSwgb2xkLCBuaXUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlLmVtaXQoY2hhbmdlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogUmlwdWxpc2NlIGlsIHRpbWVyIHV0aWxpenphdG8gcGVyIGNhcGlyZSBzZSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGRvcHBpbyBjbGljayBvIG1lbm8gKi9cclxuICAgIHByaXZhdGUgY2xlYXJDZWxsQ2xpY2tUaW1lcigpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jZWxsRGJDbGlja1RpbWVyKVxyXG4gICAgICAgIHRoaXMuY2VsbERiQ2xpY2tUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVyIGNsaWNrIHNpbmdvbG8gc3UgdW5hIHJpZ2FcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9ICRldmVudCBFdmVudG8gbmF0aXZvIGphdmFzY3JpcHRcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIEl0ZW0gY2hlIHJhcHByZXNlbnRhIGlsIGNvbnRlc3RvIHN1IGN1aSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNlbGVjdGlvbiBJbmRpY2Egc2UgbGEgc2VsZXppb25lIMOoIGF0dGl2YVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpbnRlcm5hbENhbGwgSW5kaWNhIHNlIGxhIGNoaWFtYXRhIGEgcXVlc3RhIGZ1bnppb25lIMOoIGludGVybmE6IHBlcm1ldHRlIGRpIHNraXBwYXJlIGkgY2hlY2sgc3VsbGUgQ3VzdG9tQ2VsbHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZVJvd0NsaWNrKCRldmVudDogYW55LCBpdGVtOiBhbnksIHNlbGVjdGlvbjogYm9vbGVhbiwgaW50ZXJuYWxDYWxsOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICAvLyBTZSBobyB1biBjdHJsIHByZW11dG8gZXNjbyBjb24gdHJ1ZSBpbiBtb2RvIGRhIGZhcmUgYnViYmxpbmcgZGVsbCdldmVudG8gZSBsYXNjaWFybG8gZ2VzdGlyZSBhbCBicm93c2VyIChsaW5rIGVjYy4uLilcclxuICAgICAgICAvLyBTdGVzc2EgY29zYSBzZSBobyBjdXN0b20gY2VsbCBkYXRvIGNoZSBsYSBnZXN0aW9uZSBkZWkgY2xpY2sgdmllbmUgYWZmaWRhdGEgYWkgc2luZ29saSBURFxyXG4gICAgICAgIGlmICgkZXZlbnQuY3RybEtleSB8fCAodGhpcy5Vc2VDdXN0b21DZWxscyAmJiAhaW50ZXJuYWxDYWxsKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3Rpb24pXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXNFeGNsdWRpbmcobnVsbCk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgIWl0ZW0ubG9ja2VkICYmICFpdGVtLl9zZXAgJiYgIWl0ZW0uX2dyb3VwKVxyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNsaWNrKCRldmVudCwgaXRlbSk7XHJcbiAgICAgICAgZWxzZSBpZiAoaXRlbS5fZ3JvdXApXHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlR3JvdXBDbGljayhpdGVtKTtcclxuXHJcbiAgICAgICAgLy8gT3JhIGNoZSBub24gw6ggYXR0YWNjYXRvIGRpcmV0dGFtZW50ZSBhbGwnaHRtbCBkZXZvIGZhcmUgdW4gbWFya2ZvcmNoZWNrIGZpbml0ZSBsZSBvcGVyYXppb25pIHN1aSBncm91cGluZ1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VzdGlvbmUgZGVsIGNsaWNrIGRlc3RybyBzdWxsJ2VzLXRhYmxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblJpZ2h0Q2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLm9uT3BlbkNvbnRleHRNZW51LmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExhIG1vZGlmaWNhIGRlbGwndXRlbnRlIMOoIGluaXppYXRhLiBTaSBpbXBvc3RhIGxhIHZhcmlhYmlsZSByZWxhdGl2YSBhIFwidHJ1ZVwiIGluIG1vZG8gZGEgbW9zdHJhcmUgbCdpbnB1dCBkaSB0ZXN0b1xyXG4gICAgICogXHJcbiAgICAgKiBEb3BvIGNoZSBsJ2lucHV0IMOoIGFwcGFyc28sIGRvcG8gdW4gY2ljbG8gZGkgQ2hhbmdlIERldGVjdGlvbiB2aWVuZSBhdHRpdmF0byBpbCBTdWJqZWN0IGNvbGxlZ2F0byBhbGwnaW5wdXQgY2hlIHNlcnZpcsOgIGEgZWZmZXR0dWFyZSBpbCBmb2N1c1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1RkRWxlbWVudH0gcm93SXRlbSBFbGVtZW50byBkaSByaWdhIHN1IGN1aSDDqCBzdGF0YSBhdHRpdmF0YSBsYSBtb2RpZmljYVxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gT2dnZXR0byBzb3ByYSBpbCBxdWFsZSDDqCBzdGF0YSBhdHRpdmF0YSBsYSBtb2RpZmljYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0dXBVc2VyRWRpdChyb3dJdGVtOiBUZEVsZW1lbnQsIGl0ZW06IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXNFeGNsdWRpbmcobnVsbCk7XHJcbiAgICAgICAgaWYgKHRoaXMuRWRpdGFibGUgJiYgcm93SXRlbS5Qcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgbGV0IGR5bk1vZGUgPSB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMDtcclxuICAgICAgICAgICAgKDxhbnk+cm93SXRlbSkuX2VkaXRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAoPGFueT5yb3dJdGVtKS5vbGRfdmFsdWUgPSBkeW5Nb2RlID8gaXRlbS5wcm9wZXJ0aWVzW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXSA6IGl0ZW1bcm93SXRlbS5Qcm9wZXJ0eU5hbWVdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLkZvY3VzU3ViamVjdC5uZXh0KCk7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGEgbW9kaWZpY2EgZGVsbCd1dGVudGUgw6ggdGVybWluYXRhLiBTaSByZWltcG9zdGEgbGEgdmFyaWFiaWxlIHJlbGF0aXZhIGEgXCJmYWxzZVwiIGluIG1vZG8gZGEgbmFzY29uZGVyZSBsJ2lucHV0IGRpIHRlc3RvIGUgc2kgZW1ldHRlIGxhIG1vZGlmaWNhIGRlbCB2YWxvcmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtUZEVsZW1lbnR9IHJvd0l0ZW0gRWxlbWVudG8gZGkgcmlnYSBzdSBjdWkgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gc29wcmEgaWwgcXVhbGUgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5JbmRleCBJbmRpY2UgZGVsbGEgY29sb25uYSBzdSBjdWkgw6ggYXZ2ZW51dGEgbGEgbW9kaWZpY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbmFsaXplVXNlckVkaXQocm93SXRlbTogVGRFbGVtZW50LCBpdGVtOiBhbnksIGNvbHVtbkluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZHluTW9kZSA9IHRoaXMuRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uPy5sZW5ndGggPiAwO1xyXG4gICAgICAgIGxldCByb3dJdG0gPSA8YW55PnJvd0l0ZW07XHJcbiAgICAgICAgcm93SXRtLl9lZGl0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCBvbGQgPSByb3dJdG0ub2xkX3ZhbHVlO1xyXG4gICAgICAgIGxldCBuaXUgPSBkeW5Nb2RlID8gaXRlbS5wcm9wZXJ0aWVzW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXSA6IGl0ZW1bcm93SXRlbS5Qcm9wZXJ0eU5hbWVdO1xyXG5cclxuICAgICAgICBsZXQgb2xkZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24ob2xkKTtcclxuICAgICAgICBsZXQgbml1ZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24obml1KTtcclxuICAgICAgICBpZiAoKG9sZGRhdGUgJiYgbml1ZGF0ZSAmJiBvbGRkYXRlLmlzU2FtZSAmJiBvbGRkYXRlLmlzU2FtZShuaXVkYXRlKSkgfHwgb2xkID09PSBuaXUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlLmVtaXQoW25ldyBFc1RhYmxlTW9kZWxDaGFuZ2UoaXRlbSwgcm93SXRlbS5JRCwgcm93SXRlbS5Qcm9wZXJ0eU5hbWUsIG9sZCwgbml1KV0pO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2NvbHVtbkluZGV4XS52YWxfc2V0dGVyKG5pdSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmFuZ2Ugc2VsZWN0aW9uIEV4cGVyaW1lbnRhbHNcclxuXHJcbiAgICBwcml2YXRlIG1vdXNlSXNEb3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHJhbmdlU2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgcmFuZ2VTdGFydFdhc0lnbm9yZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgZmlyc3RDb29yZGluYXRlczoge3JvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlcn0gPSBudWxsO1xyXG5cclxuICAgIG1vdXNlZG93bihldmVudDogTW91c2VFdmVudCwgcm93SXRlbTogYW55LCBfOiBhbnkpIHtcclxuXHJcbiAgICAgICAgLy8gVGFzdG8gZGl2ZXJzbyBkYWwgY2xpY2sgc2luaXN0cm8gLT4gY2lhbyDDqCBzdGF0byBiZWxsbyBlIGludGVuc29cclxuICAgICAgICBpZihldmVudC5idXR0b25zICE9IDEgfHwgIXRoaXMuUmFuZ2VTZWxlY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gU3RvIGxhdm9yYW5kbyBzdSBRVUVTVEEgZXMtdGFibGVcclxuICAgICAgICB0aGlzLmNvcHlQYXN0ZURldGVjdG9yLkFjdGl2ZUVzdFJlZmVyZW5jZSA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIFR1dHRpIGkgY2xpY2sgc3UgdW5hIGNlbGxhIGdpw6AgaW4gZWRpdCBub24gZGV2b25vIGVmZmV0dHVhcmUgbGEgc2VsZXppb25lIGRlbGxhIHJpZ2FcclxuICAgICAgICBpZiAoKDxhbnk+cm93SXRlbSkuX2VkaXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5tb3VzZUlzRG93biA9IHRydWU7XHJcblxyXG4gICAgICAgIGxldCBjb29yZHMgPSAoPEhUTUxFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQpLmlkLnNwbGl0KCdfJyk7XHJcbiAgICAgICAgbGV0IHJvdyA9IHBhcnNlSW50KGNvb3Jkc1tjb29yZHMubGVuZ3RoIC0gMl0pO1xyXG4gICAgICAgIGxldCBjb2x1bW4gPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICB0aGlzLmZpcnN0Q29vcmRpbmF0ZXMgPSB7IHJvdywgY29sdW1uIH07XHJcbiAgICAgICAgLy8gU2UgaG8gZ2nDoCB1biByYW5nZSBkaSBzZWxlemlvbmUgaWdub3JvIHRlbXBvcmFuZW1hZW50ZSBxdWVzdGEgc2VsZXppb25lIGluIG1vZG8gZGEgY2FwaXJlIGJlbmUgY29zYSBkZXZvIGZhcmUgZG9wbyAoY2xpY2sgc3VsbGEgcmlnYSAvIGFsdHJhIHNlbGV6aW9uZSlcclxuICAgICAgICAvLyBlIGdlc3RpcmUgbGEgZ3JhZmljYSBpbiBtYW5pZXJhIHVuIHBvJyBwacO5IHByZWNpc2FcclxuICAgICAgICBpZiAoIXRoaXMucmFuZ2VTZWxlY3RlZCB8fCAoZXZlbnQuY3RybEtleSB8fCAhdGhpcy5TZWxlY3Rpb24pKVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogZmFsc2UgfSwgcm93LCBjb2x1bW4pO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5yYW5nZVN0YXJ0V2FzSWdub3JlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKGBtb3VzZSBkb3duIG9uICR7cm93fToke2NvbHVtbn1gKTtcclxuICAgIH1cclxuXHJcbiAgICBtb3VzZWVudGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYoIXRoaXMuUmFuZ2VTZWxlY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbnMgPT0gMClcclxuICAgICAgICAgICAgdGhpcy5tb3VzZUlzRG93biA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tb3VzZUlzRG93biAmJiB0aGlzLmZpcnN0Q29vcmRpbmF0ZXMpIHtcclxuICAgICAgICAgICAgbGV0IGlkID0gKDxIVE1MRWxlbWVudD5ldmVudC5jdXJyZW50VGFyZ2V0KS5pZDtcclxuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IGlkLnNwbGl0KCdfJyk7XHJcbiAgICAgICAgICAgIGxldCByb3cgPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDJdKTtcclxuICAgICAgICAgICAgbGV0IGNvbHVtbiA9IHBhcnNlSW50KGNvb3Jkc1tjb29yZHMubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgICAgICAvLyBTZSBobyBpZ25vcmF0byBsJ2luaXppbyBkZWxsYSBzZWxlemlvbmUgbmVsIG1vdXNlZG93biBsbyByZWN1cGVybyBxdWlcclxuICAgICAgICAgICAgaWYgKHRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guc2luZ2xlQ2VsbFNlbGVjdGlvbih7IHZpZXc6IGV2ZW50LnZpZXcsIHJhbmdlOiBmYWxzZSB9LCB0aGlzLmZpcnN0Q29vcmRpbmF0ZXMucm93LCB0aGlzLmZpcnN0Q29vcmRpbmF0ZXMuY29sdW1uKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogdHJ1ZSB9LCByb3csIGNvbHVtbiwgdGhpcy5maXJzdENvb3JkaW5hdGVzKTtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKGBtb3VzZSBtb3ZlIG92ZXIgJHtyb3d9OiR7Y29sdW1ufWApO1xyXG4gICAgICAgICAgICB0aGlzLnJhbmdlU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtb3VzZXVwKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBpZCA9ICg8SFRNTEVsZW1lbnQ+ZXZlbnQuY3VycmVudFRhcmdldCkuaWQ7XHJcbiAgICAgICAgbGV0IGNvb3JkcyA9IGlkLnNwbGl0KCdfJyk7XHJcbiAgICAgICAgbGV0IHJvdyA9IHBhcnNlSW50KGNvb3Jkc1tjb29yZHMubGVuZ3RoIC0gMl0pO1xyXG4gICAgICAgIGxldCBjb2x1bW4gPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDFdKTtcclxuXHJcbiAgICAgICAgLy8gU2UgaWwgbW91c2V1cCB2aWVuZSBlZmZldHR1YXRvIHN1bGxhIHN0ZXNzYSBjZWxsYSBkZWwgcHJpbW8gbW91c2Vkb3duIGUgc2lhbW8gaW4gbW9kYWxpdMOgIGRpIHNlbGV6aW9uZSBkZXNlbGV6aW9ubyBsYSBjZWxsYSBwZXJjaMOpIMOoIHVuIHNlbXBsaWNlIGNsaWNrXHJcbiAgICAgICAgaWYgKHRoaXMubW91c2VJc0Rvd24gJiYgdGhpcy5maXJzdENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0Q29vcmRpbmF0ZXMucm93ID09IHJvdyAmJiB0aGlzLmZpcnN0Q29vcmRpbmF0ZXMuY29sdW1uID09IGNvbHVtbiAmJiAhZXZlbnQuY3RybEtleSAmJiAhdGhpcy5yYW5nZVN0YXJ0V2FzSWdub3JlZCAmJiB0aGlzLlNlbGVjdGlvbilcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guc2luZ2xlQ2VsbFNlbGVjdGlvbih7IHZpZXc6IGV2ZW50LnZpZXcsIHJhbmdlOiBmYWxzZSB9LCByb3csIGNvbHVtbik7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LmN0cmxLZXkgfHwgIXRoaXMuU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZVNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxvZ2dlci5sb2coYG1vdXNlIGxpZnRlZCB1cGApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vKiBQaWFuZ29cclxuICAgIHByaXZhdGUgRXNUZHNDYWNoZTogeyBbaWQ6IHN0cmluZ106IEVzVGQgfSA9IHt9O1xyXG5cclxuICAgIHB1YmxpYyBnZXRDZWxsUmVmZXJlbmNlKG9iamVjdDogYW55LCBjb2x1bW46IHN0cmluZyk6IEVzVGQge1xyXG4gICAgICAgIGxldCBma1RoaXNTaGl0SW1PdXQgPSB0aGlzLnV0aUV4dHMuZGVlcENsb25lKG9iamVjdCk7XHJcbiAgICAgICAgdGhpcy51dGlsaXRpZXNfSC5jYWxjdWxhdGVIYXNoKFtma1RoaXNTaGl0SW1PdXRdKTtcclxuICAgICAgICBsZXQgcHJvcCA9IGNvbHVtbjtcclxuICAgICAgICBsZXQgaGFzaCA9IGZrVGhpc1NoaXRJbU91dC5faGFzaDtcclxuXHJcbiAgICAgICAgbGV0IHRvUmV0ID0gdGhpcy5Fc1Rkc0NhY2hlW2Ake3Byb3B9XyR7aGFzaH1gXTtcclxuICAgICAgICByZXR1cm4gdG9SZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZ2lzdGVyQ2VsbChldmVudDogRXNUZFJlZmVyZW5jZSkge1xyXG4gICAgICAgIHRoaXMuRXNUZHNDYWNoZVtgJHtldmVudC5pZH1fJHtldmVudC5oYXNofWBdID0gZXZlbnQuc2VsZlxyXG4gICAgfVxyXG4gICAgLy8qIFBpYW5nbyBhbmNvcmFcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEVzVGRSZWZlcmVuY2Uge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIGhhc2g6IHN0cmluZzsgXHJcbiAgICBzZWxmOiBFc1RkO1xyXG59Il19