mmhglobal-dynamicform 1.3.6 → 1.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +7 -3
  2. package/esm2020/lib/directives/fieldelement.directive.mjs +3 -3
  3. package/esm2020/lib/directives/scrollbar.theme.directive.mjs +3 -3
  4. package/esm2020/lib/mmhglobal-dynamicform.module.mjs +4 -4
  5. package/esm2020/lib/services/main.service.mjs +3 -3
  6. package/esm2020/lib/services/zcomponent.debug.service.mjs +3 -3
  7. package/esm2020/lib/services/zcomponent.service.mjs +3 -3
  8. package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +3 -3
  9. package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +3 -3
  10. package/esm2020/lib/uicontent/uicontent.component.mjs +3 -3
  11. package/esm2020/lib/uiheader/uiheader.component.mjs +3 -3
  12. package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +3 -3
  13. package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +3 -3
  14. package/esm2020/lib/uipage/uipage.component.mjs +3 -3
  15. package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +3 -3
  16. package/esm2020/lib/zbullet/zbullet.component.mjs +3 -3
  17. package/esm2020/lib/zbuttons/zbuttons.component.mjs +3 -3
  18. package/esm2020/lib/zcard/zcard.component.mjs +3 -3
  19. package/esm2020/lib/zchart/zchart.component.mjs +3 -3
  20. package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +3 -3
  21. package/esm2020/lib/zchip/zchip.component.mjs +3 -3
  22. package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +3 -3
  23. package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +3 -3
  24. package/esm2020/lib/zdaterange/zdaterange.component.mjs +3 -3
  25. package/esm2020/lib/zdatetime/dateParser.pipe.mjs +3 -3
  26. package/esm2020/lib/zdatetime/zdatetime.component.mjs +3 -3
  27. package/esm2020/lib/zdiv/zdiv.component.mjs +3 -3
  28. package/esm2020/lib/zdiv/zdiv.pipe.mjs +3 -3
  29. package/esm2020/lib/zform/zform.component.mjs +3 -3
  30. package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +3 -3
  31. package/esm2020/lib/zgauge/zgauge.component.mjs +3 -3
  32. package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +3 -3
  33. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +3 -3
  34. package/esm2020/lib/zgrid/zgrid.component.mjs +13 -5
  35. package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +3 -3
  36. package/esm2020/lib/zimg/zimg.component.mjs +3 -3
  37. package/esm2020/lib/zkcard/zkcard.component.mjs +8 -7
  38. package/esm2020/lib/zlabel/zlabel.component.mjs +3 -3
  39. package/esm2020/lib/zmfb/zmfb.component.mjs +3 -3
  40. package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +3 -3
  41. package/esm2020/lib/zmodal/zmodal.component.mjs +3 -3
  42. package/esm2020/lib/znumeric/znumeric.component.mjs +3 -3
  43. package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +3 -3
  44. package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +3 -3
  45. package/esm2020/lib/zreport/zreport.component.mjs +3 -3
  46. package/esm2020/lib/zreport/zreport.config.mjs +3 -3
  47. package/esm2020/lib/zscheduler/zscheduler.component.mjs +3 -3
  48. package/esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs +3 -3
  49. package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +3 -3
  50. package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +3 -3
  51. package/esm2020/lib/ztab/ztab.component.mjs +3 -3
  52. package/esm2020/lib/ztab/ztab.pipe.mjs +3 -3
  53. package/esm2020/lib/ztext/ztext.component.mjs +3 -3
  54. package/esm2020/lib/ztextarea/ztextarea.component.mjs +3 -3
  55. package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +3 -3
  56. package/esm2020/lib/ztree/ztree.component.mjs +3 -3
  57. package/esm2020/lib/ztreelist/ztreelist.component.mjs +3 -3
  58. package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +3 -3
  59. package/esm2020/lib/zudf/zudf.component.mjs +3 -3
  60. package/esm2020/lib/zunknown/zunknown.component.mjs +3 -3
  61. package/esm2020/lib/zupload/zupload.component.mjs +3 -3
  62. package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +3 -3
  63. package/fesm2015/mmhglobal-dynamicform.mjs +200 -192
  64. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
  65. package/fesm2020/mmhglobal-dynamicform.mjs +200 -192
  66. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
  67. package/lib/zgrid/zgrid.component.d.ts +1 -0
  68. package/package.json +1 -1
@@ -166,6 +166,7 @@ export class ZgridComponent {
166
166
  this.zgrid = grid;
167
167
  this._state = this.zgrid.state;
168
168
  this.columns = this.zgrid.gridColumns;
169
+ //this.columns['resizable'] = 'false';
169
170
  if (this.zgrid) {
170
171
  if (this.zgrid.grid.data) {
171
172
  if (!this.zgrid.grid.data.total) {
@@ -478,6 +479,13 @@ export class ZgridComponent {
478
479
  clearData() {
479
480
  this.zgrid.clearData();
480
481
  }
482
+ highlightValue(col, colValue) {
483
+ if (col['ConditionHighlight']) {
484
+ //debugger;
485
+ return true;
486
+ }
487
+ return false;
488
+ }
481
489
  allResults() {
482
490
  const _zgridControl = this.zgrid;
483
491
  const _zgridComponent = this.zgrid.grid;
@@ -830,11 +838,11 @@ export class ZgridComponent {
830
838
  return -1;
831
839
  }
832
840
  }
833
- ZgridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.6", ngImport: i0, type: ZgridComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.FormBuilder }, { token: i3.AuthService }, { token: i3.WebApiService }, { token: i3.ZGridStatePersistingService }, { token: i3.ToastService }, { token: i3.ZCoreService }, { token: i3.StorageSessionService }, { token: i4.MainService }], target: i0.ɵɵFactoryTarget.Component });
834
- ZgridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.6", type: ZgridComponent, selector: "app-zgrid", inputs: { data: "data", group: "group", form: "form" }, viewQueries: [{ propertyName: "tooltipDir", first: true, predicate: TooltipDirective, descendants: true }], ngImport: i0, template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div style=\"margin: 10px 0 6px 0;\">\r\n <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div>\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <div kendoTooltip\r\n showOn=\"none\"\r\n [tooltipTemplate]=\"template\"\r\n filter=\".k-grid td\"\r\n (mouseover)=\"showTooltip($event)\"> \r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject}\" [ngClass]=\"data.Class\"\r\n [data]=\"gridData\"\r\n [pageSize]=\"state.take\"\r\n [pageable]=\"{responsive: true, buttonCount: 3, pageSizes: pageSizes, previousNext: previousNext}\"\r\n [skip]=\"state.skip\"\r\n [sort]=\"state.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"state.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [scrollable]=\"scrollMode\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n (columnReorder)=\"columnsOrderChanged($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [selectedKeys]=\"mySelection\"\r\n [ngStyle]=\"getGridStyle()\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\">\r\n <ng-template kendoGridToolbarTemplate *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.AllowSaveState || data.EnableGridCommand\">\r\n <button type=\"button\" kendoButton (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\"><span class=\"k-icon k-i-refresh-sm\"></span>&nbsp;Refresh</button>\r\n <button type=\"button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\"><span class=\"k-icon k-i-file-excel\"></span>&nbsp;Export Data to Excel</button>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.AllowSaveState\"><span class=\"k-icon k-i-star\"></span>&nbsp;Save Setting</button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"gridDefaultStateExist\"><span class=\"k-icon k-i-star-outline\"></span>&nbsp;Restore Setting</button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand \"><span class=\"k-icon k-i-add\"></span>Add New</button>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\"></kendo-grid-checkbox-column>\r\n <kendo-grid-column *ngFor=\"let col of columns\"\r\n [field]=\"col.field\"\r\n [title]=\"col.title\"\r\n [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\"\r\n [filter]=\"col.filter\"\r\n [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\"\r\n [headerStyle]=\"{'white-space': 'initial'}\"\r\n [hidden]=\"col.hidden\"\r\n [format]=\"col.format\"\r\n [class]=\"col.Class\"\r\n [locked]=\"locked(col)\"\r\n [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\"\r\n [filter]=\"filter\"\r\n [field]=\"col.field\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ dataItem[col.field] | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field]}}\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && inlineEditedFormGroups\" [ngSwitch]=\"col.fieldType\" [formGroup]=\"inlineEditedFormGroups\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <input type=\"number\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n <span *ngSwitchCase=\"'checkbox'\">\r\n <ion-checkbox [disabled]=\"(!!col.ReadOnly ? col.ReadOnly : false)\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" color=\"primary\" (ionChange)=\"inCellCheckBoxOnChange($event, rowIndex, col)\"></ion-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'zuiselectmultiple'\">\r\n <app-zselectmultiple style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zselectmultiple>\r\n </span>\r\n <span *ngSwitchCase=\"'textarea'\">\r\n <app-ztextarea style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-ztextarea>\r\n </span>\r\n <span *ngSwitchCase=\"['zuidatetime','zdate', 'ztime','zdatetime','zshortdate'].includes(col.fieldType) ? col.fieldType : ''\">\r\n <app-zdatetime style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zdatetime>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <input style=\"width: 100%;\" type=\"text\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <div *ngIf=\"isLoading\" class=\"k-i-loading\"></div>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-grid .k-toolbar{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-grid-header{background-color:#e3ecf8;font-weight:600}:host ::ng-deep kendo-grid .k-button{border-radius:5px;box-shadow:0 2px 2px #0000001a;background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid-header .k-grid-filter:hover,:host ::ng-deep kendo-grid .k-grid-header .k-header-column-menu:hover,:host ::ng-deep kendo-grid .k-grid-header .k-hierarchy-cell .k-icon:hover{background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid .k-grid-filter,:host ::ng-deep kendo-grid .k-grid .k-header-column-menu,:host ::ng-deep kendo-grid .k-grid .k-hierarchy-cell .k-icon{color:#132842}:host ::ng-deep kendo-grid .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid .k-dropdowntree .k-dropdown-wrap{border-radius:2px;background-color:#d6e0ef80}:host ::ng-deep kendo-grid tr.k-alt{background-color:#e8eef680}:host ::ng-deep kendo-grid tbody tr:hover,:host ::ng-deep kendo-grid tbody tr.k-state-hover{background-color:#d6e0ef80}:host ::ng-deep kendo-grid .k-pager-wrap{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-selected{color:#ff5e5b;background-color:#ff5e5b66}:host ::ng-deep kendo-grid .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-hover{color:#ff5e5b;background-color:#ff5e5b26}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right}.centerAligned{text-align:center}.gridTitle{margin:20px 10px 5px;font-size:18px;font-weight:700}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-secondary)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;top:100px;left:0;right:0;bottom:0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"], components: [{ type: i5.GridComponent, selector: "kendo-grid", inputs: ["data", "scrollable", "selectable", "trackBy", "virtualColumns", "filterable", "sortable", "pageable", "groupable", "navigable", "autoSize", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "skip", "sort", "group", "navigatable", "rowClass", "rowSticky", "rowSelected", "cellSelected", "isDetailExpanded", "isGroupExpanded", "pageSize", "height", "rowHeight", "detailRowHeight", "filter"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "dataStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { type: i5.CheckboxColumnComponent, selector: "kendo-grid-checkbox-column", inputs: ["showSelectAll"] }, { type: i5.ColumnComponent, selector: "kendo-grid-column", inputs: ["sortable", "groupable", "editor", "filter", "filterable", "editable", "field", "format"] }, { type: i5.NumericFilterCellComponent, selector: "kendo-grid-numeric-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i5.EqualFilterOperatorComponent, selector: "kendo-filter-eq-operator" }, { type: i5.NotEqualFilterOperatorComponent, selector: "kendo-filter-neq-operator" }, { type: i5.LessFilterOperatorComponent, selector: "kendo-filter-lt-operator" }, { type: i5.LessOrEqualToFilterOperatorComponent, selector: "kendo-filter-lte-operator" }, { type: i5.GreaterFilterOperatorComponent, selector: "kendo-filter-gt-operator" }, { type: i5.GreaterOrEqualToFilterOperatorComponent, selector: "kendo-filter-gte-operator" }, { type: i5.IsNullFilterOperatorComponent, selector: "kendo-filter-isnull-operator" }, { type: i5.IsNotNullFilterOperatorComponent, selector: "kendo-filter-isnotnull-operator" }, { type: i6.DateRangeFilterCellComponent, selector: "date-range-filter-cell", inputs: ["filter", "field"] }, { type: i5.DateFilterCellComponent, selector: "kendo-grid-date-filter-cell", inputs: ["showOperators"] }, { type: i5.StringFilterCellComponent, selector: "kendo-grid-string-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i5.ContainsFilterOperatorComponent, selector: "kendo-filter-contains-operator" }, { type: i5.StartsWithFilterOperatorComponent, selector: "kendo-filter-startswith-operator" }, { type: i5.EndsWithFilterOperatorComponent, selector: "kendo-filter-endswith-operator" }, { type: i7.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "decimals", "step", "spinners", "rangeValidation", "tabindex", "changeValueOnScroll", "selectOnFocus", "value", "format", "tabIndex", "size", "rounded", "fillMode", "max", "min", "placeholder", "maxlength"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i8.PopupComponent, selector: "kendo-popup", inputs: ["animate", "anchorAlign", "collision", "popupAlign", "copyAnchorStyles", "positionMode", "offset", "anchor", "popupClass", "margin"], outputs: ["anchorViewportLeave", "close", "open", "positionChange"], exportAs: ["kendo-popup"] }, { type: i9.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i7.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "size", "rounded", "fillMode", "tabIndex", "successIcon", "errorIcon", "clearButtonIcon", "placeholder", "maxlength"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { type: i9.IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "indeterminate", "mode", "name", "value"] }, { type: i10.ZselectmultipleComponent, selector: "app-zselectmultiple", inputs: ["data", "group", "form", "iconList", "buttonList"] }, { type: i11.ZtextareaComponent, selector: "app-ztextarea", inputs: ["data", "group", "form"] }, { type: i12.ZdatetimeComponent, selector: "app-zdatetime", inputs: ["data", "group", "form"] }, { type: i13.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i5.CommandColumnComponent, selector: "kendo-grid-command-column" }, { type: i5.ExcelComponent, selector: "kendo-grid-excel", inputs: ["fileName", "filterable", "creator", "date", "forceProxy", "proxyURL", "fetchData", "paddingCellOptions", "headerPaddingCellOptions", "collapsible"] }], directives: [{ type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i15.TooltipDirective, selector: "[kendoTooltip]", inputs: ["filter", "position", "showAfter", "callout", "closable", "offset", "tooltipTemplate", "showOn", "titleTemplate", "tooltipWidth", "tooltipHeight", "tooltipClass", "collision", "closeTitle"], exportAs: ["kendoTooltip"] }, { type: i16.ZGridBindingDirective, selector: "[zgridbinding]", inputs: ["zgridbinding"] }, { type: i14.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.SelectionDirective, selector: "[kendoGridSelectBy]" }, { type: i14.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.ToolbarTemplateDirective, selector: "[kendoGridToolbarTemplate]", inputs: ["position"] }, { type: i17.ButtonDirective, selector: "button[kendoButton], span[kendoButton]", inputs: ["toggleable", "role", "togglable", "selected", "tabIndex", "icon", "iconClass", "imageUrl", "disabled", "size", "rounded", "fillMode", "themeColor", "shape", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { type: i5.ExcelCommandDirective, selector: "[kendoGridExcelCommand]" }, { type: i5.AddCommandDirective, selector: "[kendoGridAddCommand]" }, { type: i14.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i14.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i5.FilterCellTemplateDirective, selector: "[kendoGridFilterCellTemplate]" }, { type: i14.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i5.EditTemplateDirective, selector: "[kendoGridEditTemplate]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i5.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i9.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { type: i5.FooterTemplateDirective, selector: "[kendoGridFooterTemplate]" }, { type: i5.FocusableDirective, selector: "[kendoGridFocusable], [kendoGridEditCommand], [kendoGridRemoveCommand], [kendoGridSaveCommand], [kendoGridCancelCommand], [kendoGridSelectionCheckbox] ", inputs: ["kendoGridFocusable"] }, { type: i5.SaveCommandDirective, selector: "[kendoGridSaveCommand]" }, { type: i5.CancelCommandDirective, selector: "[kendoGridCancelCommand]" }, { type: i5.EditCommandDirective, selector: "[kendoGridEditCommand]" }, { type: i5.RemoveCommandDirective, selector: "[kendoGridRemoveCommand]" }], pipes: { "date": i14.DatePipe, "number": i14.DecimalPipe } });
835
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.6", ngImport: i0, type: ZgridComponent, decorators: [{
841
+ ZgridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZgridComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.FormBuilder }, { token: i3.AuthService }, { token: i3.WebApiService }, { token: i3.ZGridStatePersistingService }, { token: i3.ToastService }, { token: i3.ZCoreService }, { token: i3.StorageSessionService }, { token: i4.MainService }], target: i0.ɵɵFactoryTarget.Component });
842
+ ZgridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZgridComponent, selector: "app-zgrid", inputs: { data: "data", group: "group", form: "form" }, viewQueries: [{ propertyName: "tooltipDir", first: true, predicate: TooltipDirective, descendants: true }], ngImport: i0, template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div style=\"margin: 10px 0 6px 0;\">\r\n <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div>\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <div kendoTooltip\r\n showOn=\"none\"\r\n [tooltipTemplate]=\"template\"\r\n filter=\".k-grid td\"\r\n (mouseover)=\"showTooltip($event)\"> \r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject}\" [ngClass]=\"data.Class\"\r\n [data]=\"gridData\"\r\n [pageSize]=\"state.take\"\r\n [pageable]=\"{responsive: true, buttonCount: 3, pageSizes: pageSizes, previousNext: previousNext}\"\r\n [skip]=\"state.skip\"\r\n [sort]=\"state.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"state.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n (columnReorder)=\"columnsOrderChanged($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [(selectedKeys)]=\"mySelection\"\r\n [ngStyle]=\"getGridStyle()\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\">\r\n <!--[scrollable]=\"scrollMode\" temp remove. causing some bug on pagination-->\r\n <ng-template kendoGridToolbarTemplate *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.AllowSaveState || data.EnableGridCommand\">\r\n <button type=\"button\" kendoButton (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\"><span class=\"k-icon k-i-refresh-sm\"></span>&nbsp;Refresh</button>\r\n <button type=\"button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\"><span class=\"k-icon k-i-file-excel\"></span>&nbsp;Export Data to Excel</button>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.AllowSaveState\"><span class=\"k-icon k-i-star\"></span>&nbsp;Save Setting</button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"gridDefaultStateExist\"><span class=\"k-icon k-i-star-outline\"></span>&nbsp;Restore Setting</button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand \"><span class=\"k-icon k-i-add\"></span>Add New</button>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\"></kendo-grid-checkbox-column>\r\n <kendo-grid-column *ngFor=\"let col of columns\"\r\n [field]=\"col.field\"\r\n [title]=\"col.title\"\r\n [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\"\r\n [filter]=\"col.filter\"\r\n [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\"\r\n [headerStyle]=\"{'white-space': 'initial'}\"\r\n [hidden]=\"col.hidden\"\r\n [format]=\"col.format\"\r\n [class]=\"col.Class\"\r\n [locked]=\"locked(col)\"\r\n [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\"\r\n [filter]=\"filter\"\r\n [field]=\"col.field\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ dataItem[col.field] | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field] }}\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && inlineEditedFormGroups\" [ngSwitch]=\"col.fieldType\" [formGroup]=\"inlineEditedFormGroups\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <input type=\"number\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n <span *ngSwitchCase=\"'checkbox'\">\r\n <ion-checkbox [disabled]=\"(!!col.ReadOnly ? col.ReadOnly : false)\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" color=\"primary\" (ionChange)=\"inCellCheckBoxOnChange($event, rowIndex, col)\"></ion-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'zuiselectmultiple'\">\r\n <app-zselectmultiple style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zselectmultiple>\r\n </span>\r\n <span *ngSwitchCase=\"'textarea'\">\r\n <app-ztextarea style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-ztextarea>\r\n </span>\r\n <span *ngSwitchCase=\"['zuidatetime','zdate', 'ztime','zdatetime','zshortdate'].includes(col.fieldType) ? col.fieldType : ''\">\r\n <app-zdatetime style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zdatetime>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <input style=\"width: 100%;\" type=\"text\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <div *ngIf=\"isLoading\" class=\"k-i-loading\"></div>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-grid .k-toolbar{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-grid-header{background-color:#e3ecf8;font-weight:600}:host ::ng-deep kendo-grid .k-button{border-radius:5px;box-shadow:0 2px 2px #0000001a;background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid-header .k-grid-filter:hover,:host ::ng-deep kendo-grid .k-grid-header .k-header-column-menu:hover,:host ::ng-deep kendo-grid .k-grid-header .k-hierarchy-cell .k-icon:hover{background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid .k-grid-filter,:host ::ng-deep kendo-grid .k-grid .k-header-column-menu,:host ::ng-deep kendo-grid .k-grid .k-hierarchy-cell .k-icon{color:#132842}:host ::ng-deep kendo-grid .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid .k-dropdowntree .k-dropdown-wrap{border-radius:2px;background-color:#d6e0ef80}:host ::ng-deep kendo-grid tr.k-alt{background-color:#e8eef680}:host ::ng-deep kendo-grid tbody tr:hover,:host ::ng-deep kendo-grid tbody tr.k-state-hover{background-color:#d6e0ef80}:host ::ng-deep kendo-grid .k-pager-wrap{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-selected{color:#ff5e5b;background-color:#ff5e5b66}:host ::ng-deep kendo-grid .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-hover{color:#ff5e5b;background-color:#ff5e5b26}.cellContent{background-color:#28a745;color:#fff;border-radius:5px;text-align:center}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right}.centerAligned{text-align:center}.gridTitle{margin:20px 10px 5px;font-size:18px;font-weight:700}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-secondary)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;top:100px;left:0;right:0;bottom:0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"], components: [{ type: i5.GridComponent, selector: "kendo-grid", inputs: ["data", "scrollable", "selectable", "trackBy", "virtualColumns", "filterable", "sortable", "pageable", "groupable", "navigable", "autoSize", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "skip", "sort", "group", "navigatable", "rowClass", "rowSticky", "rowSelected", "cellSelected", "isDetailExpanded", "isGroupExpanded", "pageSize", "height", "rowHeight", "detailRowHeight", "filter"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "dataStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { type: i5.CheckboxColumnComponent, selector: "kendo-grid-checkbox-column", inputs: ["showSelectAll"] }, { type: i5.ColumnComponent, selector: "kendo-grid-column", inputs: ["sortable", "groupable", "editor", "filter", "filterable", "editable", "field", "format"] }, { type: i5.NumericFilterCellComponent, selector: "kendo-grid-numeric-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i5.EqualFilterOperatorComponent, selector: "kendo-filter-eq-operator" }, { type: i5.NotEqualFilterOperatorComponent, selector: "kendo-filter-neq-operator" }, { type: i5.LessFilterOperatorComponent, selector: "kendo-filter-lt-operator" }, { type: i5.LessOrEqualToFilterOperatorComponent, selector: "kendo-filter-lte-operator" }, { type: i5.GreaterFilterOperatorComponent, selector: "kendo-filter-gt-operator" }, { type: i5.GreaterOrEqualToFilterOperatorComponent, selector: "kendo-filter-gte-operator" }, { type: i5.IsNullFilterOperatorComponent, selector: "kendo-filter-isnull-operator" }, { type: i5.IsNotNullFilterOperatorComponent, selector: "kendo-filter-isnotnull-operator" }, { type: i6.DateRangeFilterCellComponent, selector: "date-range-filter-cell", inputs: ["filter", "field"] }, { type: i5.DateFilterCellComponent, selector: "kendo-grid-date-filter-cell", inputs: ["showOperators"] }, { type: i5.StringFilterCellComponent, selector: "kendo-grid-string-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i5.ContainsFilterOperatorComponent, selector: "kendo-filter-contains-operator" }, { type: i5.StartsWithFilterOperatorComponent, selector: "kendo-filter-startswith-operator" }, { type: i5.EndsWithFilterOperatorComponent, selector: "kendo-filter-endswith-operator" }, { type: i7.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "decimals", "step", "spinners", "rangeValidation", "tabindex", "changeValueOnScroll", "selectOnFocus", "value", "format", "tabIndex", "size", "rounded", "fillMode", "max", "min", "placeholder", "maxlength"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i8.PopupComponent, selector: "kendo-popup", inputs: ["animate", "anchorAlign", "collision", "popupAlign", "copyAnchorStyles", "positionMode", "offset", "anchor", "popupClass", "margin"], outputs: ["anchorViewportLeave", "close", "open", "positionChange"], exportAs: ["kendo-popup"] }, { type: i9.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i7.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "size", "rounded", "fillMode", "tabIndex", "successIcon", "errorIcon", "clearButtonIcon", "placeholder", "maxlength"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { type: i9.IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "indeterminate", "mode", "name", "value"] }, { type: i10.ZselectmultipleComponent, selector: "app-zselectmultiple", inputs: ["data", "group", "form", "iconList", "buttonList"] }, { type: i11.ZtextareaComponent, selector: "app-ztextarea", inputs: ["data", "group", "form"] }, { type: i12.ZdatetimeComponent, selector: "app-zdatetime", inputs: ["data", "group", "form"] }, { type: i13.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i5.CommandColumnComponent, selector: "kendo-grid-command-column" }, { type: i5.ExcelComponent, selector: "kendo-grid-excel", inputs: ["fileName", "filterable", "creator", "date", "forceProxy", "proxyURL", "fetchData", "paddingCellOptions", "headerPaddingCellOptions", "collapsible"] }], directives: [{ type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i15.TooltipDirective, selector: "[kendoTooltip]", inputs: ["filter", "position", "showAfter", "callout", "closable", "offset", "tooltipTemplate", "showOn", "titleTemplate", "tooltipWidth", "tooltipHeight", "tooltipClass", "collision", "closeTitle"], exportAs: ["kendoTooltip"] }, { type: i16.ZGridBindingDirective, selector: "[zgridbinding]", inputs: ["zgridbinding"] }, { type: i14.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.SelectionDirective, selector: "[kendoGridSelectBy]" }, { type: i14.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.ToolbarTemplateDirective, selector: "[kendoGridToolbarTemplate]", inputs: ["position"] }, { type: i17.ButtonDirective, selector: "button[kendoButton], span[kendoButton]", inputs: ["toggleable", "role", "togglable", "selected", "tabIndex", "icon", "iconClass", "imageUrl", "disabled", "size", "rounded", "fillMode", "themeColor", "shape", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { type: i5.ExcelCommandDirective, selector: "[kendoGridExcelCommand]" }, { type: i5.AddCommandDirective, selector: "[kendoGridAddCommand]" }, { type: i14.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i14.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i5.FilterCellTemplateDirective, selector: "[kendoGridFilterCellTemplate]" }, { type: i14.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i5.EditTemplateDirective, selector: "[kendoGridEditTemplate]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i5.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i9.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { type: i5.FooterTemplateDirective, selector: "[kendoGridFooterTemplate]" }, { type: i5.FocusableDirective, selector: "[kendoGridFocusable], [kendoGridEditCommand], [kendoGridRemoveCommand], [kendoGridSaveCommand], [kendoGridCancelCommand], [kendoGridSelectionCheckbox] ", inputs: ["kendoGridFocusable"] }, { type: i5.SaveCommandDirective, selector: "[kendoGridSaveCommand]" }, { type: i5.CancelCommandDirective, selector: "[kendoGridCancelCommand]" }, { type: i5.EditCommandDirective, selector: "[kendoGridEditCommand]" }, { type: i5.RemoveCommandDirective, selector: "[kendoGridRemoveCommand]" }], pipes: { "date": i14.DatePipe, "number": i14.DecimalPipe } });
843
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZgridComponent, decorators: [{
836
844
  type: Component,
837
- args: [{ selector: "app-zgrid", template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div style=\"margin: 10px 0 6px 0;\">\r\n <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div>\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <div kendoTooltip\r\n showOn=\"none\"\r\n [tooltipTemplate]=\"template\"\r\n filter=\".k-grid td\"\r\n (mouseover)=\"showTooltip($event)\"> \r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject}\" [ngClass]=\"data.Class\"\r\n [data]=\"gridData\"\r\n [pageSize]=\"state.take\"\r\n [pageable]=\"{responsive: true, buttonCount: 3, pageSizes: pageSizes, previousNext: previousNext}\"\r\n [skip]=\"state.skip\"\r\n [sort]=\"state.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"state.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [scrollable]=\"scrollMode\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n (columnReorder)=\"columnsOrderChanged($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [selectedKeys]=\"mySelection\"\r\n [ngStyle]=\"getGridStyle()\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\">\r\n <ng-template kendoGridToolbarTemplate *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.AllowSaveState || data.EnableGridCommand\">\r\n <button type=\"button\" kendoButton (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\"><span class=\"k-icon k-i-refresh-sm\"></span>&nbsp;Refresh</button>\r\n <button type=\"button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\"><span class=\"k-icon k-i-file-excel\"></span>&nbsp;Export Data to Excel</button>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.AllowSaveState\"><span class=\"k-icon k-i-star\"></span>&nbsp;Save Setting</button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"gridDefaultStateExist\"><span class=\"k-icon k-i-star-outline\"></span>&nbsp;Restore Setting</button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand \"><span class=\"k-icon k-i-add\"></span>Add New</button>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\"></kendo-grid-checkbox-column>\r\n <kendo-grid-column *ngFor=\"let col of columns\"\r\n [field]=\"col.field\"\r\n [title]=\"col.title\"\r\n [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\"\r\n [filter]=\"col.filter\"\r\n [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\"\r\n [headerStyle]=\"{'white-space': 'initial'}\"\r\n [hidden]=\"col.hidden\"\r\n [format]=\"col.format\"\r\n [class]=\"col.Class\"\r\n [locked]=\"locked(col)\"\r\n [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\"\r\n [filter]=\"filter\"\r\n [field]=\"col.field\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ dataItem[col.field] | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field]}}\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && inlineEditedFormGroups\" [ngSwitch]=\"col.fieldType\" [formGroup]=\"inlineEditedFormGroups\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <input type=\"number\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n <span *ngSwitchCase=\"'checkbox'\">\r\n <ion-checkbox [disabled]=\"(!!col.ReadOnly ? col.ReadOnly : false)\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" color=\"primary\" (ionChange)=\"inCellCheckBoxOnChange($event, rowIndex, col)\"></ion-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'zuiselectmultiple'\">\r\n <app-zselectmultiple style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zselectmultiple>\r\n </span>\r\n <span *ngSwitchCase=\"'textarea'\">\r\n <app-ztextarea style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-ztextarea>\r\n </span>\r\n <span *ngSwitchCase=\"['zuidatetime','zdate', 'ztime','zdatetime','zshortdate'].includes(col.fieldType) ? col.fieldType : ''\">\r\n <app-zdatetime style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zdatetime>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <input style=\"width: 100%;\" type=\"text\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <div *ngIf=\"isLoading\" class=\"k-i-loading\"></div>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-grid .k-toolbar{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-grid-header{background-color:#e3ecf8;font-weight:600}:host ::ng-deep kendo-grid .k-button{border-radius:5px;box-shadow:0 2px 2px #0000001a;background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid-header .k-grid-filter:hover,:host ::ng-deep kendo-grid .k-grid-header .k-header-column-menu:hover,:host ::ng-deep kendo-grid .k-grid-header .k-hierarchy-cell .k-icon:hover{background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid .k-grid-filter,:host ::ng-deep kendo-grid .k-grid .k-header-column-menu,:host ::ng-deep kendo-grid .k-grid .k-hierarchy-cell .k-icon{color:#132842}:host ::ng-deep kendo-grid .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid .k-dropdowntree .k-dropdown-wrap{border-radius:2px;background-color:#d6e0ef80}:host ::ng-deep kendo-grid tr.k-alt{background-color:#e8eef680}:host ::ng-deep kendo-grid tbody tr:hover,:host ::ng-deep kendo-grid tbody tr.k-state-hover{background-color:#d6e0ef80}:host ::ng-deep kendo-grid .k-pager-wrap{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-selected{color:#ff5e5b;background-color:#ff5e5b66}:host ::ng-deep kendo-grid .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-hover{color:#ff5e5b;background-color:#ff5e5b26}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right}.centerAligned{text-align:center}.gridTitle{margin:20px 10px 5px;font-size:18px;font-weight:700}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-secondary)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;top:100px;left:0;right:0;bottom:0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"] }]
845
+ args: [{ selector: "app-zgrid", template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div style=\"margin: 10px 0 6px 0;\">\r\n <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div>\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <div kendoTooltip\r\n showOn=\"none\"\r\n [tooltipTemplate]=\"template\"\r\n filter=\".k-grid td\"\r\n (mouseover)=\"showTooltip($event)\"> \r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject}\" [ngClass]=\"data.Class\"\r\n [data]=\"gridData\"\r\n [pageSize]=\"state.take\"\r\n [pageable]=\"{responsive: true, buttonCount: 3, pageSizes: pageSizes, previousNext: previousNext}\"\r\n [skip]=\"state.skip\"\r\n [sort]=\"state.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"state.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n (columnReorder)=\"columnsOrderChanged($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [(selectedKeys)]=\"mySelection\"\r\n [ngStyle]=\"getGridStyle()\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\">\r\n <!--[scrollable]=\"scrollMode\" temp remove. causing some bug on pagination-->\r\n <ng-template kendoGridToolbarTemplate *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.AllowSaveState || data.EnableGridCommand\">\r\n <button type=\"button\" kendoButton (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\"><span class=\"k-icon k-i-refresh-sm\"></span>&nbsp;Refresh</button>\r\n <button type=\"button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\"><span class=\"k-icon k-i-file-excel\"></span>&nbsp;Export Data to Excel</button>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.AllowSaveState\"><span class=\"k-icon k-i-star\"></span>&nbsp;Save Setting</button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"gridDefaultStateExist\"><span class=\"k-icon k-i-star-outline\"></span>&nbsp;Restore Setting</button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand \"><span class=\"k-icon k-i-add\"></span>Add New</button>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\"></kendo-grid-checkbox-column>\r\n <kendo-grid-column *ngFor=\"let col of columns\"\r\n [field]=\"col.field\"\r\n [title]=\"col.title\"\r\n [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\"\r\n [filter]=\"col.filter\"\r\n [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\"\r\n [headerStyle]=\"{'white-space': 'initial'}\"\r\n [hidden]=\"col.hidden\"\r\n [format]=\"col.format\"\r\n [class]=\"col.Class\"\r\n [locked]=\"locked(col)\"\r\n [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\"\r\n [filter]=\"filter\"\r\n [field]=\"col.field\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ dataItem[col.field] | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field] }}\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && inlineEditedFormGroups\" [ngSwitch]=\"col.fieldType\" [formGroup]=\"inlineEditedFormGroups\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <input type=\"number\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n <span *ngSwitchCase=\"'checkbox'\">\r\n <ion-checkbox [disabled]=\"(!!col.ReadOnly ? col.ReadOnly : false)\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" color=\"primary\" (ionChange)=\"inCellCheckBoxOnChange($event, rowIndex, col)\"></ion-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'zuiselectmultiple'\">\r\n <app-zselectmultiple style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zselectmultiple>\r\n </span>\r\n <span *ngSwitchCase=\"'textarea'\">\r\n <app-ztextarea style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-ztextarea>\r\n </span>\r\n <span *ngSwitchCase=\"['zuidatetime','zdate', 'ztime','zdatetime','zshortdate'].includes(col.fieldType) ? col.fieldType : ''\">\r\n <app-zdatetime style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zdatetime>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <input style=\"width: 100%;\" type=\"text\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <div *ngIf=\"isLoading\" class=\"k-i-loading\"></div>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-grid .k-toolbar{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-grid-header{background-color:#e3ecf8;font-weight:600}:host ::ng-deep kendo-grid .k-button{border-radius:5px;box-shadow:0 2px 2px #0000001a;background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid-header .k-grid-filter:hover,:host ::ng-deep kendo-grid .k-grid-header .k-header-column-menu:hover,:host ::ng-deep kendo-grid .k-grid-header .k-hierarchy-cell .k-icon:hover{background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid .k-grid-filter,:host ::ng-deep kendo-grid .k-grid .k-header-column-menu,:host ::ng-deep kendo-grid .k-grid .k-hierarchy-cell .k-icon{color:#132842}:host ::ng-deep kendo-grid .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid .k-dropdowntree .k-dropdown-wrap{border-radius:2px;background-color:#d6e0ef80}:host ::ng-deep kendo-grid tr.k-alt{background-color:#e8eef680}:host ::ng-deep kendo-grid tbody tr:hover,:host ::ng-deep kendo-grid tbody tr.k-state-hover{background-color:#d6e0ef80}:host ::ng-deep kendo-grid .k-pager-wrap{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-selected{color:#ff5e5b;background-color:#ff5e5b66}:host ::ng-deep kendo-grid .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-hover{color:#ff5e5b;background-color:#ff5e5b26}.cellContent{background-color:#28a745;color:#fff;border-radius:5px;text-align:center}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right}.centerAligned{text-align:center}.gridTitle{margin:20px 10px 5px;font-size:18px;font-weight:700}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-secondary)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;top:100px;left:0;right:0;bottom:0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"] }]
838
846
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.FormBuilder }, { type: i3.AuthService }, { type: i3.WebApiService }, { type: i3.ZGridStatePersistingService }, { type: i3.ToastService }, { type: i3.ZCoreService }, { type: i3.StorageSessionService }, { type: i4.MainService }]; }, propDecorators: { data: [{
839
847
  type: Input
840
848
  }], group: [{
@@ -845,4 +853,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.6", ngImpor
845
853
  type: ViewChild,
846
854
  args: [TooltipDirective]
847
855
  }] } });
848
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFHekcsNkJBQTZCO0FBRTdCLDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBUyxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3ZFLE9BQU8sRUFBeUIsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFlbkUsT0FBTyxFQUV1QixvQkFBb0IsRUFBRSxnQkFBZ0IsRUFFbkUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCekIsTUFBTSxPQUFPLGNBQWM7SUF3RHpCLFlBQ1UsY0FBOEIsRUFDOUIsTUFBYyxFQUNkLFdBQXdCLEVBQ3hCLFdBQXdCLEVBQ3hCLGFBQTRCLEVBQzVCLDJCQUF3RCxFQUN4RCxZQUEwQixFQUMxQixZQUEwQixFQUMxQixjQUFxQyxFQUNyQyxXQUF3QjtRQVR4QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIs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U0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBUyxFQUFFLElBQVcsRUFBRSxHQUFXO1FBQ3RELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxHQUFHLENBQUM7YUFDWjtTQUNGO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7OzJHQXAvQlUsY0FBYzsrRkFBZCxjQUFjLHFKQUlkLGdCQUFnQixnREM1RDdCLHlrbkJBbVVBOzJGRDNRYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFdBQVc7d1dBS1osSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQzhCLFVBQVU7c0JBQTdDLFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSwgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgRm9ybUNvbnRyb2wsIEZvcm1BcnJheSwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyB0YXAsIGRlbGF5LCBtYXAsIHN3aXRjaE1hcCwgY29uY2F0TWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IEV4Y2VsRXhwb3J0RGF0YSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWV4Y2VsLWV4cG9ydCc7XHJcbmltcG9ydCB7IEdyaWRJdGVtLCBTY3JvbGxNb2RlLCBTZWxlY3RhYmxlU2V0dGluZ3MgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkJztcclxuaW1wb3J0IHsgU29ydERlc2NyaXB0b3IsIFN0YXRlLCBwcm9jZXNzIH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1kYXRhLXF1ZXJ5XCI7XHJcbmltcG9ydCB7IFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci10b29sdGlwJztcclxuaW1wb3J0IHtcclxuICBHcmlkRGF0YVJlc3VsdCxcclxuICBEYXRhU3RhdGVDaGFuZ2VFdmVudCxcclxuICBQYWdlQ2hhbmdlRXZlbnQsXHJcbiAgQ2VsbENsaWNrRXZlbnQsXHJcbiAgR3JpZENvbXBvbmVudCxcclxuICBSb3dBcmdzLFxyXG4gIENvbHVtblJlb3JkZXJFdmVudFxyXG59IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkXCI7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbi8vIGltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSBcInNyYy9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRcIjtcclxuaW1wb3J0IHsgTWFpblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvbWFpbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFpHcmlkQmluZGluZ0RpcmVjdGl2ZSB9IGZyb20gXCIuL3pncmlkLmJpbmRpbmcuZGlyZWN0aXZlXCI7XHJcbmltcG9ydCB7XHJcbiAgQXV0aFNlcnZpY2UsIFdlYkFwaVNlcnZpY2UsIFRvYXN0U2VydmljZSwgR3JpZENhY2hpbmcsXHJcbiAgWkZpZWxkLCBaR3JvdXAsIFpDb21wb25lbnQsIFpDb21wb25lbnRQcm9wZXJ0aWVzLCBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIFpDb3JlU2VydmljZSxcclxuICBaR3JpZFN0YXRlUGVyc2lzdGluZ1NlcnZpY2UsIFpHcmlkUG9zdEFwaVBhcmFtcywgWkdyaWRTZXR0aW5ncywgWkdyaWRDb2x1bW5TZXR0aW5ncywgWkdyaWRDdXN0b21Db2x1bW4sIFN0b3JhZ2VTZXNzaW9uU2VydmljZVxyXG59IGZyb20gJ21taGdsb2JhbC16Y29yZSc7XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBaR3JpZCB7XHJcbiAgcGFyYW1zOiBaR3JpZFBvc3RBcGlQYXJhbXM7XHJcbiAgc3RhdGU6IFN0YXRlO1xyXG4gIGNvbHVtbnM6IGFueVtdO1xyXG4gIHBhZ2luYXRpb25BcGlQb3N0VXJsOiBzdHJpbmc7XHJcbiAgZGF0YTogWkZpZWxkO1xyXG4gIGdyb3VwOiBaR3JvdXA7XHJcbiAgemdyaWQ6IFpHcmlkQmluZGluZ0RpcmVjdGl2ZTtcclxuICBpbmxpbmVFZGl0ZWRGb3JtR3JvdXBzOiBGb3JtR3JvdXA7XHJcbiAgZ2V0R3JpZERhdGE6ICgpID0+IGFueVtdO1xyXG4gIGdldERhdGE6ICgpID0+IHZvaWQ7XHJcbiAgY2xlYXJEYXRhOiAoKSA9PiB2b2lkO1xyXG4gIHNldERhdGE6IChkYXRhOiBhbnkpID0+IHZvaWQ7XHJcbiAgc2V0Q29sdW1uczogKGNvbHVtbkZpZWxkc05hbWU6IHN0cmluZywgY29sdW1uczogQXJyYXk8WkdyaWRDdXN0b21Db2x1bW4+KSA9PiB2b2lkO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtemdyaWRcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3pncmlkLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3pncmlkLmNvbXBvbmVudC5zY3NzXCJdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaZ3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIFpDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBkYXRhOiBaRmllbGQ7XHJcbiAgQElucHV0KCkgZ3JvdXA6IFpHcm91cDtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgQFZpZXdDaGlsZChUb29sdGlwRGlyZWN0aXZlKSBwdWJsaWMgdG9vbHRpcERpcjogVG9vbHRpcERpcmVjdGl2ZTtcclxuICAvLyBAVmlld0NoaWxkKFpHcmlkQmluZGluZ0RpcmVjdGl2ZSwgeyBzdGF0aWM6IGZhbHNlIH0pIHpncmlkOiBaR3JpZEJpbmRpbmdEaXJlY3RpdmU7XHJcbiAgemdyaWQ6IGFueSA9IG51bGw7XHJcbiAgb2F1dGhVcmw6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxNb2RlOiBTY3JvbGxNb2RlO1xyXG4gIGdyaWREYXRhOiBHcmlkRGF0YVJlc3VsdDtcclxuICBzZWxlY3RhYmxlU2V0dGluZ3M6IFNlbGVjdGFibGVTZXR0aW5ncztcclxuICBteVNlbGVjdGlvbjogYW55W10gPSBbXTtcclxuICBpbmxpbmVFZGl0ZWRGb3JtR3JvdXBzOiBGb3JtR3JvdXA7XHJcbiAgcHVibGljIGZvcm1Hcm91cDogRm9ybUdyb3VwOyAvLyBmb3Iga2VuZG8gZ3JpZCBidWlsdC1pblxyXG4gIHB1YmxpYyBwcmV2aW91c05leHQ6IGJvb2xlYW47XHJcblxyXG4gIGNvbXBvbmVudFByb3BlcnRpZXMgPSBuZXcgWkNvbXBvbmVudFByb3BlcnRpZXMoKTtcclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiwgbm8tdW5kZXJzY29yZS1kYW5nbGUsIGlkLWJsYWNrbGlzdCwgaWQtbWF0Y2hcclxuICBfc3RhdGU6IFN0YXRlID0ge1xyXG4gICAgc2tpcDogMCxcclxuICAgIHRha2U6IDEwXHJcbiAgfTtcclxuXHJcbiAgcGFyYW1zOiBaR3JpZFBvc3RBcGlQYXJhbXMgPSB7XHJcbiAgICByZWZlcklkOiBudWxsLFxyXG4gICAgcGFnZU5vOiAwLFxyXG4gICAgcGFnZVNpemU6IDIwLFxyXG4gICAgc29ydENvbHVtbk5hbWU6IFwiXCIsXHJcbiAgICBzb3J0T3JkZXI6IFwiXCIsXHJcbiAgICBzb3J0Q29sdW1uTmFtZXM6IFtdLFxyXG4gICAgc29ydE9yZGVyczogW10sXHJcbiAgICBmaWx0ZXJQYXJhbXM6IFtdLFxyXG4gICAgcGFyYW1ldGVyczogXCJcIixcclxuICAgIGZpbHRlcnM6IFwiXCIsXHJcbiAgICBjb2x1bW5zOiBcIlwiLFxyXG4gICAgZ3JhbnRUeXBlOiA0XHJcbiAgfTtcclxuXHJcbiAgZ3JpZFN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHJcbiAgcHJpdmF0ZSB3aWR0aFJlZHVjZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgaGVpZ2h0UmVkdWNlOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBnRGF0YTogYW55O1xyXG5cclxuICBjb2x1bW5zOiBhbnlbXTtcclxuICBlZGl0YWJsZUNvbHVtbnM6IGFueVtdO1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHBhZ2VTaXplczogYm9vbGVhbiB8IGFueVtdO1xyXG4gIGlzTG9hZGluZzogYm9vbGVhbjtcclxuICBncmlkU3RvcmFnZUtleTogc3RyaW5nO1xyXG4gIGdyaWREZWZhdWx0U3RhdGVFeGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzTmV3OiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGVkaXRlZFJvd0luZGV4OiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgekdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlOiBaR3JpZFN0YXRlUGVyc2lzdGluZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB6Y29yZVNlcnZpY2U6IFpDb3JlU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgbWFpblNlcnZpY2U6IE1haW5TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLm9hdXRoVXJsID0gdGhpcy56Y29yZVNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKS5lMU9hdXRoVXJsICsgXCIvXCI7XHJcbiAgICB0aGlzLmFsbFJlc3VsdHMgPSB0aGlzLmFsbFJlc3VsdHMuYmluZCh0aGlzKTtcclxuICAgIHRoaXMucmVmcmVzaERhdGEgPSB0aGlzLnJlZnJlc2hEYXRhLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLmNsZWFyRGF0YSA9IHRoaXMuY2xlYXJEYXRhLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLnNhdmVHcmlkU2V0dGluZ3MgPSB0aGlzLnNhdmVHcmlkU2V0dGluZ3MuYmluZCh0aGlzKTtcclxuICAgIHRoaXMucmVzdG9yZUdyaWRTZXR0aW5ncyA9IHRoaXMucmVzdG9yZUdyaWRTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRDb21wb25lbnRQcm9wZXJ0aWVzKHRoaXMpO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5yZWdpc3RlckNvbXBvbmVudCh0aGlzKTtcclxuXHJcbiAgICAvLyBHcmlkIHNhdmVkIHNldHRpbmcga2V5KFVzZWQgaW4gQ29va2llU3RvcmUgJiBMb2NhbFN0b3JhZ2UpXHJcbiAgICB0aGlzLmdyaWRTdG9yYWdlS2V5ID0gJ2lvbmljLWZpZWxkOjonICsgdGhpcy5hdXRoU2VydmljZS5lMVRva2VuLnVzZXJOYW1lICsgJzo6JyArIHRoaXMuZGF0YS5OYW1lICsgJzo6JyArIHRoaXMucm91dGVyLnVybDtcclxuXHJcbiAgICBvZih0cnVlKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICAvL2NvbmNhdE1hcCgoKSA9PiB7XHJcbiAgICAgICAgLy8gIC8vIHRyeSBnZXQgZ3JpZHNldHRpbmcgZnJvbSBjb29raWVzdG9yZVxyXG4gICAgICAgIC8vICByZXR1cm4gdGhpcy5tYWluU2VydmljZS5jb29raWVTdG9yZUdldCh0aGlzLmdyaWRTdG9yYWdlS2V5LCB0aGlzLmF1dGhTZXJ2aWNlLmUxVG9rZW4uYWNjZXNzX3Rva2VuKTtcclxuICAgICAgICAvL30pLFxyXG4gICAgICAgIC8vc3dpdGNoTWFwKHNhdmVkR3JpZENhY2hlID0+IHtcclxuICAgICAgICAvLyAgaWYgKHNhdmVkR3JpZENhY2hlKSB7ICBcclxuICAgICAgICAvLyAgICAvLyBLZWVwIHRoZSBncmlkU2V0dGluZyBmcm9tIGNvb2tpZXN0b3JlIHRvIGxvY2FsU3RvcmFnZVxyXG4gICAgICAgIC8vICAgIHRoaXMuekdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLnNldCh0aGlzLmdyaWRTdG9yYWdlS2V5LCBzYXZlZEdyaWRDYWNoZSk7XHJcbiAgICAgICAgLy8gICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgIC8vICB9XHJcbiAgICAgICAgLy8gIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgLy99KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gR3JpZCBkZWZhdWx0IHNldHRpbmdcclxuICAgICAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy53aWR0aFJlZHVjZSA9IHRoaXMuZGF0YS5XaWR0aFJlZHVjZSB8fCA2MDtcclxuICAgICAgICAgIHRoaXMuaGVpZ2h0UmVkdWNlID0gdGhpcy5kYXRhLkhlaWdodFJlZHVjZSB8fCA1NjA7XHJcbiAgICAgICAgICB0aGlzLl9zdGF0ZS50YWtlID0gdGhpcy5kYXRhLlBhZ2VTaXplIHx8IDIwO1xyXG4gICAgICAgICAgdGhpcy5wYWdlU2l6ZXMgPSBbMjAsIDUwLCAxMDAsIDIwMCwgNTAwXTtcclxuICAgICAgICAgIHRoaXMucHJldmlvdXNOZXh0ID0gdGhpcy5kYXRhWydFbmFibGVQcmV2aW91c05leHRCdXR0b24nXSB8fCBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2Nyb2xsTW9kZSA9IHRoaXMuZGF0YVsnU2Nyb2xsTW9kZSddID8gdGhpcy5kYXRhWydTY3JvbGxNb2RlJ10gOiAndmlydHVhbCc7XHJcblxyXG4gICAgICAgICAgLy8gW01vYmlsZV0gRGlzYWJsZSBQYWdlU2l6ZVxyXG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS5QYWdlU2l6ZXMgPT09IGZhbHNlIHx8IFpDb21wb25lbnRIZWxwZXIuaXNNb2JpbGVTY3JlZW4oKSkge1xyXG4gICAgICAgICAgICB0aGlzLnBhZ2VTaXplcyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIEdyaWQgU2VsZWN0aW9uIGNvbHVtblxyXG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0YWJsZVNldHRpbmdzID0ge1xyXG4gICAgICAgICAgICAgIC8vIGNoZWNrYm94T25seTogdGhpcy5jaGVja2JveE9ubHksXHJcbiAgICAgICAgICAgICAgbW9kZTogdGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMgPT09ICdzaW5nbGUnID8gJ3NpbmdsZScgOiAnbXVsdGlwbGUnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gYmluZCB0aGlzIHRvIGdyb3VwIHVzaW5nIEdyaWQgdmFsdWVcclxuICAgICAgICAgIGlmICh0aGlzLmRhdGEuVmFsdWUuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgICAgICAgY29uc3QgZ3JpZFZhbHVlID0gdGhpcy5kYXRhLlZhbHVlLnNsaWNlKDYpO1xyXG4gICAgICAgICAgICB0aGlzLmdyb3VwW2dyaWRWYWx1ZV0gPSB0aGlzO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGNsZWFyIGFueSBTdWJzY3JpcHRpb25cclxuICAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGlmIG5vIFJlc291cmNlVVJMLCBzdGlsbCBnZW5lcmF0ZSBDb2x1bW4gZmlyc3QsIHRoZW4gaW5zZXJ0IGdyaWQgZGF0YSB1c2luZyBEYXRhU291cmNlXHJcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5SZXNvdXJjZVVSTCkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlR3JpZENvbHVtbnMoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuRGF0YVNvdXJjZSAmJiB0aGlzLmRhdGEuU2tpcERpcmVjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5EYXRhU291cmNlLFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhKGRzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHN1YnNjcmliZSB0byBzZXQgZ3JpZCBzZXR0aW5nIGZyb20gZGlyZWN0aXZlIHRvIGNvbXBvbmVudFxyXG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmdyaWRTdWJqZWN0LnN1YnNjcmliZShncmlkID0+IHtcclxuICAgICAgICAgICAgdGhpcy56Z3JpZCA9IGdyaWQ7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gdGhpcy56Z3JpZC5zdGF0ZTtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy56Z3JpZC5ncmlkQ29sdW1ucztcclxuICAgICAgICAgICAgaWYgKHRoaXMuemdyaWQpIHsgXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuemdyaWQuZ3JpZC5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuemdyaWQuZ3JpZC5kYXRhLnRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuemdyaWQuZ3JpZC5kYXRhLnRvdGFsID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnpncmlkLmdyaWQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9scygpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnpncmlkLmdyaWRbJ3BhZ2VTaXplJ10pIHtcclxuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gMCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cclxuICAgICAgICAgICAgICAgIHRoaXMuemdyaWQuZ3JpZFsncGFnZVNpemUnXSA9IDIwO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gQ2hlY2sgR3JpZCBzZXR0aW5nIGV4aXN0IGluIGxvY2Fsc3RvcmFnZVxyXG4gICAgICAgICAgdGhpcy5zdGF0ZUV4aXN0KCk7XHJcblxyXG4gICAgICAgICAgLy8gU2V0IEZpbHRlciBTZXNzaW9uS2V5XHJcbiAgICAgICAgICBpZiAodGhpcy5kYXRhWydTYXZlRmlsdGVyJ10pIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRHcmlkU2Vzc2lvbktleSh0aGlzLmdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ncmlkQ2FsbGJhY2sodGhpcy5ncm91cCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogU3RhcnQgR3JpZCBTdGF0ZSAocGFnaW5hdGlvbiwgc29ydGFibGUsIGZpbHRlciwgb3JkZXJpbmcpICovXHJcbiAgZ2V0IHN0YXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0ZUV4aXN0KCkge1xyXG4gICAgY29uc3QgdXNlckdyaWRTdGF0ZSA9IHRoaXMuekdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLmdldCh0aGlzLmdyaWRTdG9yYWdlS2V5KTtcclxuXHJcbiAgICBpZiAodXNlckdyaWRTdGF0ZSkge1xyXG4gICAgICB0aGlzLmdyaWREZWZhdWx0U3RhdGVFeGlzdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkRGVmYXVsdFN0YXRlRXhpc3QgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkYXRhU3RhdGVDaGFuZ2Uoc3RhdGU6IERhdGFTdGF0ZUNoYW5nZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy56Z3JpZCkge1xyXG4gICAgICB0aGlzLnpncmlkLmRhdGFTdGF0ZUNoYW5nZShzdGF0ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyaWREYXRhID0gcHJvY2Vzcyh0aGlzLmdEYXRhLCBzdGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlsdGVyYWJsZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNvcnRhYmxlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9ja2VkKGNvbFNldHRpbmc6IGFueSkge1xyXG4gICAgaWYgKGNvbFNldHRpbmdbJ3Bpbm5lZExlZnQnXSA9PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyogRW5kIEdyaWQgU3RhdGUgKHBhZ2luYXRpb24sIHNvcnRhYmxlLCBmaWx0ZXIsIG9yZGVyaW5nKSAqL1xyXG5cclxuICAvKiBTdGFydCBHcmlkIFN0eWxpbmcsIERpc3BsYXkgKi9cclxuICBwdWJsaWMgZ2V0R3JpZFN0eWxlKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgXCJoZWlnaHQucHhcIjogdGhpcy5nZXRHcmlkSGVpZ2h0KCksIC8vIHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuaGVpZ2h0UmVkdWNlLCAvLyA0NTAsXHJcbiAgICAgIFwid2lkdGgucHhcIjogd2luZG93LmlubmVyV2lkdGggLSB0aGlzLndpZHRoUmVkdWNlXHJcbiAgICB9OyAvLyBcIndpZHRoLnB4XCI6IHRoaXMuaW5uZXJXaWR0aCAtIDM1XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEdyaWRIZWlnaHQoKSB7XHJcbiAgICBjb25zdCBncmlkSGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gdGhpcy5oZWlnaHRSZWR1Y2U7XHJcbiAgICByZXR1cm4gKGdyaWRIZWlnaHQgPCAyNTApID8gMjUwIDogZ3JpZEhlaWdodDtcclxuICAgIC8vIGNvbnN0IHYgPSBaQ29tcG9uZW50SGVscGVyLmlzTW9iaWxlU2NyZWVuKCk7XHJcbiAgICAvLyBpZih2KXtcclxuICAgIC8vICAgY29uc3QgaCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuaGVpZ2h0UmVkdWNlO1xyXG4gICAgLy8gICByZXR1cm4gKGggPCAyNTApID8gMjUwIDogaDtcclxuICAgIC8vIH1lbHNle1xyXG4gICAgLy8gICByZXR1cm4gXCJhdXRvXCI7XHJcbiAgICAvLyB9IFxyXG4gIH1cclxuICAvKiBFbmQgR3JpZCBTdHlsaW5nLCBEaXNwbGF5ICovXHJcblxyXG5cclxuICAvKiBTdGFydCBHcmlkIENvbHVtbnMgKi9cclxuICBwdWJsaWMgaXNTZWxlY3RPcHRpb24oKSB7XHJcbiAgICBsZXQgc2VsZWN0T3B0aW9uRXhpc3QgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykge1xyXG4gICAgICB0aGlzLnNlbGVjdGFibGVTZXR0aW5ncyA9IHtcclxuICAgICAgICBjaGVja2JveE9ubHk6IGZhbHNlLFxyXG4gICAgICAgIG1vZGU6ICh0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucyA9PSBcIm11bHRpcGxlXCIpID8gXCJtdWx0aXBsZVwiIDogXCJzaW5nbGVcIlxyXG4gICAgICB9O1xyXG4gICAgICBzZWxlY3RPcHRpb25FeGlzdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2VsZWN0T3B0aW9uRXhpc3Q7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q29sdW1ucyhjb2x1bW5OYW1lOiBzdHJpbmcsIGNvbHVtbnM6IEFycmF5PFpHcmlkQ3VzdG9tQ29sdW1uPikge1xyXG4gICAgdGhpcy5ncm91cFtjb2x1bW5OYW1lXSA9IHRoaXMud3JhcENvbHVtbk5hbWVzSW5GaWVsZEVsZW1lbnQoY29sdW1ucyk7XHJcbiAgICB0aGlzLmdlbmVyYXRlR3JpZENvbHVtbnMoKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgd3JhcENvbHVtbk5hbWVzSW5GaWVsZEVsZW1lbnQoY29sdW1uTGlzdDogQXJyYXk8WkdyaWRDdXN0b21Db2x1bW4+KSB7XHJcbiAgICByZXR1cm4gb2YoY29sdW1uTGlzdC5tYXAoYyA9PiB7XHJcbiAgICAgIGNvbnN0IGlzSGlkZGVuOiBib29sZWFuID0gYy5IaWRkZW47XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgTmFtZTogYy5OYW1lLFxyXG4gICAgICAgIFZhbHVlOiBjLkNvZGUsXHJcbiAgICAgICAgVHlwZTogYy5UeXBlLFxyXG4gICAgICAgIGdyaWRDb2xWaXNpYmxlOiAhaXNIaWRkZW4sXHJcbiAgICAgICAgd2lkdGg6IDEwMCArIGMuTmFtZS5sZW5ndGggKiA0LFxyXG4gICAgICAgIGVuYWJsZUZpbHRlcmluZzogZmFsc2UsXHJcbiAgICAgICAgZW5hYmxlU29ydGluZzogdHJ1ZSxcclxuICAgICAgICBlbmFibGVQaW5uaW5nOiB0cnVlLFxyXG4gICAgICAgIERpdkNsYXNzOiBcImNvbC14cy0xMiBjb2wtc20tNlwiLFxyXG4gICAgICAgIElzRWRpdGFibGVJbkdyaWQ6IGMuRWRpdGFibGVcclxuICAgICAgfTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVHcmlkQ29sdW1ucygpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgZ3JpZFNldHRpbmcgPSB0aGlzLmdldEdyaWRTZXR0aW5ncygpO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbkZpZWxkcyQ6IE9ic2VydmFibGU8YW55PiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgdGhpcy5kYXRhLkNvbHVtbkZpZWxkcyxcclxuICAgICAgdGhpcy5ncm91cFxyXG4gICAgKTtcclxuICAgIGlmICghdGhpcy5kYXRhLkNvbHVtbkZpZWxkcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQvRW1wdHkgZ3JpZCgnICsgdGhpcy5kYXRhLk5hbWUgKyAnKSBjb2x1bW5GaWVsZCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbHVtbkZpZWxkcyQucGlwZShcclxuICAgICAgdGFwKGRhdGEgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkL0VtcHR5IGdyaWQoJyArIHRoaXMuZGF0YS5OYW1lICsgJykgZGF0YSB0byBnZW5lcmF0ZSBjb2x1bW4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gdGhpcy5kYXRhWydGaWVsZEVsZW1lbnROYW1lJ107XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XHJcbiAgICAgICAgWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1ucyhkYXRhLFxyXG4gICAgICAgICAgdGhpcy5jb2x1bW5zLFxyXG4gICAgICAgICAgdGhpcy5ncm91cCxcclxuICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UsXHJcbiAgICAgICAgICBmaWVsZE5hbWUsXHJcbiAgICAgICAgICBncmlkU2V0dGluZyxcclxuICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICB0aGlzLmRhdGEpO1xyXG4gICAgICB9KSxcclxuICAgICAgLy9zd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAvLyAgLy9HZXQgU2Vzc2lvblxyXG4gICAgICAvLyAgcmV0dXJuIHRoaXMuZ2V0R3JpZFNlc3Npb25GaWx0ZXIodGhpcy5ncnAsIHRoaXMpO1xyXG4gICAgICAvL30pLFxyXG4gICAgICAvL3N3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgIC8vICAvL0JlZm9yZSBnZXQgZ3JpZCBkYXRhXHJcbiAgICAgIC8vICByZXR1cm4gdGhpcy5iZWZvcmVHcmlkR2V0RGF0YSh0aGlzLmdycCwgdGhpcyk7XHJcbiAgICAgIC8vfSksXHJcbiAgICAgIC8vc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgLy8gIC8vU2V0IGdyaWQgZGF0YVxyXG4gICAgICAvLyAgcmV0dXJuIHRoaXMuc2V0R3JpZFNlc3Npb25GaWx0ZXIodGhpcy5ncnAsIHRoaXMpO1xyXG4gICAgICAvL30pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyogRW5kIEdyaWQgQ29sdW1ucyAqL1xyXG5cclxuICBwcml2YXRlIGVkaXRNb2RlbChkYXRhSXRlbTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkVkaXRDbGlja1VSTCkge1xyXG4gICAgICAvLyBFZGl0IGluY2VsbCBmaWVsZFxyXG4gICAgICBjb25zdCBjb2xGaWVsZHMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLkNvbHVtbkZpZWxkcywgdGhpcy5ncm91cCk7XHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcInpncmlkLWNlbGxDbGlja1wiLFxyXG4gICAgICAgIHRhcmdldDogdGhpcy5kYXRhLkVkaXRDbGlja1VSTCxcclxuICAgICAgICBkYXRhOiBkYXRhSXRlbSxcclxuICAgICAgICBjb2x1bW5GaWVsZHMkOiBjb2xGaWVsZHNcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIFdoZW4gY2xpY2tlZCByb3V0ZSB0byBwYWdlXHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmdyb3VwLmVkaXRNb2RlbFVSTCwgZGF0YUl0ZW0uSWQsICdlZGl0J10sIHtcclxuICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdyaWRDYWxsYmFjayhncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhWydBZnRlcmxvYWRDYWxsYmFjayddKSB7XHJcbiAgICAgIGNvbnN0IG1lID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcyk7XHJcblxyXG4gICAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogXCJ6Z3JpZC1BZnRlcmxvYWRDYWxsYmFja1wiLFxyXG4gICAgICAgIHRhcmdldDogdGhpcy5kYXRhWydBZnRlcmxvYWRDYWxsYmFjayddLFxyXG4gICAgICAgIGRhdGE6IG1lXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREYXRhID0gKGdEYXRhOiBhbnkpID0+IHtcclxuICAgIHRoaXMuZ3JpZERhdGEgPSB7XHJcbiAgICAgIGRhdGE6IGdEYXRhLFxyXG4gICAgICB0b3RhbDogKGdEYXRhID8gZ0RhdGEubGVuZ3RoIDogMClcclxuICAgIH07XHJcbiAgICB0aGlzLmdEYXRhID0gZ0RhdGE7XHJcblxyXG4gICAgaWYgKHRoaXMuemdyaWQpIHtcclxuICAgICAgdGhpcy56Z3JpZC5ncmlkWydwYWdlU2l6ZSddID0gZ0RhdGEubGVuZ3RoOyAvLyBzZXQgZ3JpZCBzaXplXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEhdGhpcy5kYXRhLlNob3dSZWNvcmROdW1iZXIpIHtcclxuICAgICAgaWYgKHRoaXMuZ3JpZERhdGEuZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZERhdGEuZGF0YS5mb3JFYWNoKChkLCBpKSA9PiB7XHJcbiAgICAgICAgICBkLkdyaWRObyA9IGkgKyAxO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ0RhdGEpIHtcclxuICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuemdyaWQpIHtcclxuICAgICAgdGhpcy56Z3JpZC5nZXREYXRhQmluZGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGEuU2tpcERpcmVjdGl2ZSkge1xyXG4gICAgICB0aGlzLmdyaWREYXRhID0gcHJvY2Vzcyh0aGlzLmdEYXRhLCB0aGlzLnN0YXRlKTtcclxuICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRHcmlkRGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLmdEYXRhO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBnZXRGb3JtQ29udHJvbChyb3dJbmRleDogbnVtYmVyLCBwcm9wZXJ0eTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBmb3JtQXJyYXk6IEZvcm1BcnJheSA9IHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3Vwcy5nZXQoJ2l0ZW1zJykgYXMgRm9ybUFycmF5O1xyXG4gICAgY29uc3QgZm9ybUl0ZW0gPSBmb3JtQXJyYXkuYXQocm93SW5kZXgpO1xyXG5cclxuICAgIGlmIChmb3JtSXRlbSkge1xyXG4gICAgICByZXR1cm4gZm9ybUl0ZW0uZ2V0KHByb3BlcnR5KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRm9ybUNvbnRyb2xzKCkge1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICAvLyBvbmx5IGNyZWF0ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCAxIGVkaXRhYmxlIGNvbHVtblxyXG4gICAgICBpZiAodGhpcy5jb2x1bW5zLmZpbmQoYyA9PiBjLmlzRWRpdGFibGVJbkdyaWQpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3VwcyA9IG5ldyBGb3JtR3JvdXAoeyBpdGVtczogbmV3IEZvcm1BcnJheShbXSkgfSk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmdyaWREYXRhLmRhdGEpKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkRGF0YS5kYXRhLmZvckVhY2goZCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHt9O1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW1zW2MuZmllbGRdID0gbmV3IEZvcm1Db250cm9sKGRbYy5maWVsZF0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKGl0ZW1zKTtcclxuICAgICAgICAgICg8Rm9ybUFycmF5PnRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3Vwcy5nZXQoXCJpdGVtc1wiKSkucHVzaChmb3JtR3JvdXApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlRm9ybUdyb3VwKGRhdGFJdGVtOiBhbnksIGZpZWxkTmFtZTogYW55KTogRm9ybUdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgW2ZpZWxkTmFtZV06IGRhdGFJdGVtW2ZpZWxkTmFtZV1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEdyb3VwVmFsdWUodmFsdWU6IHN0cmluZywgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmRhdGEuVmFsdWUsIHRoaXMuZ3JvdXApO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBwdWJsaWMgb25CdG5DbGljayhldmVudDogYW55LCBjb2xTZXR0aW5nOiBhbnksIHJvd0RhdGE6IGFueSwgY2VsbERhdGE6IHN0cmluZykge1xyXG4gICAgdGhpcy5vbk5hdmlnYXRlVG8oZXZlbnQsIGNvbFNldHRpbmcsIHJvd0RhdGEsIGNlbGxEYXRhKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjZWxsQ2xpY2tIYW5kbGVyKGV2ZW50OiBDZWxsQ2xpY2tFdmVudCkge1xyXG4gICAgY29uc3QgZGlzYWJsZUFsbENvbHVtbkNlbGxDbGlja0hhbmRsZXIgPSB0aGlzLmRhdGEuRGlzYWJsZUNlbGxDbGlja0hhbmRsZXIgPyB0aGlzLmRhdGEuRGlzYWJsZUNlbGxDbGlja0hhbmRsZXIgOiBmYWxzZTtcclxuICAgIGNvbnN0IGlzQ29tbWFuZENvbHVtbiA9IGV2ZW50LmNvbHVtbi5jb25zdHJ1Y3Rvci5uYW1lID09ICdDb21tYW5kQ29sdW1uQ29tcG9uZW50JyA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICBpZiAoIWRpc2FibGVBbGxDb2x1bW5DZWxsQ2xpY2tIYW5kbGVyICYmICFpc0NvbW1hbmRDb2x1bW4pIHtcclxuICAgICAgY29uc3QgaW5DZWxsRWRpdGFibGUgPSB0aGlzLmRhdGEuSW5DZWxsRWRpdGFibGUgPyB0aGlzLmRhdGEuSW5DZWxsRWRpdGFibGUgOiBmYWxzZTtcclxuICAgICAgaWYgKGluQ2VsbEVkaXRhYmxlKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKHMgPT4gcy5pc0VkaXRhYmxlSW5EYXRhSXRlbSA9PT0gdHJ1ZSk7XHJcbiAgICAgICAgaWYgKCEhdGhpcy5lZGl0YWJsZUNvbHVtbnMpIHtcclxuICAgICAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5zLm1hcChzID0+IGV2ZW50LnNlbmRlci5lZGl0Q2VsbChldmVudC5yb3dJbmRleCwgZXZlbnQuY29sdW1uSW5kZXgsIHRoaXMuY3JlYXRlRm9ybUdyb3VwKGV2ZW50LmRhdGFJdGVtLCBzLmZpZWxkKSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImNlbGxDbGljayBldmVudDogXCIsIGV2ZW50KTtcclxuICAgICAgICBpZiAodGhpcy5kYXRhLk9uSXRlbUNsaWNrKSB7XHJcbiAgICAgICAgICBjb25zdCBmdW5jID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YS5Pbkl0ZW1DbGljayk7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbEZ1bmMgPSBmdW5jLmJpbmQodGhpcy5ncm91cC5jdHJsU2NvcGUpO1xyXG4gICAgICAgICAgICBjYWxsRnVuYyhldmVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVkaXRNb2RlbChldmVudC5kYXRhSXRlbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0Q2VsbENsb3NlSGFuZGxlcihhcmdzOiBhbnkpIHtcclxuICAgIGNvbnN0IHsgZm9ybUdyb3VwLCBkYXRhSXRlbSB9ID0gYXJncztcclxuICAgIGlmICghZm9ybUdyb3VwLnZhbGlkKSB7XHJcbiAgICAgIGFyZ3MucHJldmVudERlZmF1bHQoKTtcclxuICAgIH0gZWxzZSBpZiAoZm9ybUdyb3VwLmRpcnR5KSB7XHJcbiAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihzID0+IHMuaXNFZGl0YWJsZUluRGF0YUl0ZW0gPT09IHRydWUpO1xyXG4gICAgICB0aGlzLmVkaXRhYmxlQ29sdW1ucy5tYXAocyA9PlxyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZGF0YUl0ZW0sIHsgW3MuZmllbGRdOiBmb3JtR3JvdXAudmFsdWVbcy5maWVsZF0gfSkpO1xyXG4gICAgICB0aGlzLm15U2VsZWN0aW9uLm1hcChzID0+IChzLklkID09PSBkYXRhSXRlbS5JZCkgPyBPYmplY3QuYXNzaWduKHMsIGRhdGFJdGVtKSA6IG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBvbk5hdmlnYXRlVG8oZXZlbnQ6IGFueSwgY2xpY2tBY3Rpb246IGFueSwgcm93RGF0YTogYW55LCBjZWxsRGF0YTogc3RyaW5nKSB7XHJcbiAgICAvLyBkZWJ1Z2dlcjtcclxuICAgIC8vIGNvbnN0IG4gPSBjb2xTZXR0aW5nLm5hdmlnYXRlVG8ucmVwbGFjZSgnLzppZCcsIGNlbGxEYXRhKTtcclxuICAgIGNvbnN0IG4gPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgY2xpY2tBY3Rpb24uQ2xpY2spO1xyXG4gICAgaWYgKG4pIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiAnemdyaWQtb25OYXZpZ2F0ZVRvJyxcclxuICAgICAgICB0YXJnZXQ6IGNsaWNrQWN0aW9uLkNsaWNrLFxyXG4gICAgICAgIHJvd0RhdGE6IHJvd0RhdGEsXHJcbiAgICAgICAgZGF0YTogY2VsbERhdGFcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dUb29sdGlwKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBsZXQgaXNDb21tYW5kQ29sdW1uID0gZmFsc2U7XHJcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICBpZiAoZGF0YSA9PSAnay1jb21tYW5kLWNlbGwnKSB7XHJcbiAgICAgICAgaXNDb21tYW5kQ29sdW1uID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCgoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1REJyB8fCBlbGVtZW50Lm5vZGVOYW1lID09PSAnVEgnKSAmJiBlbGVtZW50Lm9mZnNldFdpZHRoIDwgZWxlbWVudC5zY3JvbGxXaWR0aCkgJiYgIWlzQ29tbWFuZENvbHVtbikge1xyXG4gICAgICB0aGlzLnRvb2x0aXBEaXIudG9nZ2xlKGVsZW1lbnQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcERpci5oaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcm93U2VsZWN0aW9uS2V5KGNvbnRleHQ6IFJvd0FyZ3MpOiBhbnkge1xyXG4gICAgcmV0dXJuIGNvbnRleHQuZGF0YUl0ZW07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRWYWx1ZXMoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm15U2VsZWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hHcmlkKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGNvbnN0IF9ncmlkT3B0aW9uU2VnbWVudCA9IGV2ZW50LnRhcmdldC50cmltKCkuc3BsaXQoJy4nKTtcclxuICAgIGNvbnN0IF9ncmlkT3B0aW9uID0gX2dyaWRPcHRpb25TZWdtZW50WzFdO1xyXG4gICAgaWYgKF9ncmlkT3B0aW9uKSB7XHJcbiAgICAgIGNvbnN0IHpncmlkQ29udHJvbCA9IGdyb3VwW19ncmlkT3B0aW9uXSBhcyBaR3JpZDtcclxuICAgICAgaWYgKHpncmlkQ29udHJvbCkge1xyXG4gICAgICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1VuYWJsZSB0byBmaW5kIGdyaWQgdmFsdWU6ICcgKyBfZ3JpZE9wdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdJbnZhbGlkIHJlZnJlc2hHcmlkIGV2ZW50OiAnLCBldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaERhdGEoKSB7XHJcbiAgICB0aGlzLmdldERhdGEoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckRhdGEoKSB7XHJcbiAgICB0aGlzLnpncmlkLmNsZWFyRGF0YSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBhbGxSZXN1bHRzKCk6IE9ic2VydmFibGU8RXhjZWxFeHBvcnREYXRhPiB7XHJcbiAgICBjb25zdCBfemdyaWRDb250cm9sID0gdGhpcy56Z3JpZCBhcyBaR3JpZDtcclxuICAgIGNvbnN0IF96Z3JpZENvbXBvbmVudCA9IHRoaXMuemdyaWQuZ3JpZCBhcyBHcmlkQ29tcG9uZW50O1xyXG4gICAgY29uc3QgX2RhdGEgPSBfemdyaWRDb21wb25lbnQuZGF0YSBhcyBHcmlkRGF0YVJlc3VsdDtcclxuXHJcbiAgICBjb25zdCBwYWdpbmF0aW9uQXBpUG9zdFVybCA9IF96Z3JpZENvbnRyb2wucGFnaW5hdGlvbkFwaVBvc3RVcmw7XHJcblxyXG4gICAgLy8gTmVlZCB0byBjbG9uZSwgaWYgbm90IHdpbGwgYWZmZWN0IHRoZSBncmlkIHBhcmFtcy5cclxuICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucGFyYW1zKTtcclxuICAgIHBhcmFtcy5wYWdlTm8gPSAwO1xyXG4gICAgcGFyYW1zLnBhZ2VTaXplID0gX2RhdGEudG90YWw7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQocGFnaW5hdGlvbkFwaVBvc3RVcmwsIHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IEV4Y2VsRXhwb3J0RGF0YSA9IHtcclxuICAgICAgICAgIGRhdGE6IHByb2Nlc3MoZGF0YS5kYXRhU2V0LCB7fSkuZGF0YVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENsYXNzKGRhdGFJdGVtOiBhbnksIGNvbDogYW55KSB7XHJcbiAgICBsZXQgbmdDbGFzcyA9IFwiZ3JpZENlbGwgXCI7XHJcbiAgICBpZiAoY29sLmZpZWxkVHlwZSA9PT0gJ251bWJlcicgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ2N1cnJlbmN5JyB8fCBjb2wuZmllbGRUeXBlID09PSAnem51bWVyaWMnKSB7XHJcbiAgICAgIG5nQ2xhc3MgKz0gXCJyaWdodEFsaWduZWQgXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGFJdGVtW2NvbC5maWVsZCArICdfQ2xhc3MnXSkge1xyXG4gICAgICBuZ0NsYXNzICs9IGRhdGFJdGVtW2NvbC5maWVsZCArICdfQ2xhc3MnXSArIFwiIFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb2wuQ2xhc3MpIHtcclxuICAgICAgbmdDbGFzcyArPSBjb2wuQ2xhc3MgKyBcIiBcIjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmdDbGFzcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JtYXQoY29sOiBhbnksIGRlZmF1bHRGb3JtYXQ/OiBhbnkpIHtcclxuICAgIGxldCBmb3JtYXQgPSBcIlwiO1xyXG4gICAgaWYgKGNvbC5Gb3JtYXRPcHRpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9ybWF0ID0gZGVmYXVsdEZvcm1hdCA/IGRlZmF1bHRGb3JtYXQgOiBcIlwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZm9ybWF0QXJyID0gY29sLkZvcm1hdE9wdGlvbnMuc3BsaXQoXCIuXCIpXHJcbiAgICAgIGxldCBkcCA9IDA7XHJcblxyXG4gICAgICBpZiAoZm9ybWF0QXJyLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICBkcCA9IGZvcm1hdEFyclsxXS5sZW5ndGg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkcCAhPT0gMCkge1xyXG4gICAgICAgIGZvcm1hdCA9IFwiMS5cIiArIGRwICsgXCItXCIgKyBkcDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZvcm1hdDtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgc2V0SGVhZGVyVGV4dChjb2x1bW5OYW1lOiBzdHJpbmcsIG5ld0hlYWRlclRpdGxlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGdyaWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xyXG4gICAgZ3JpZENvbHVtbnMuZm9yRWFjaCgoY29sOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGNvbC5OYW1lID09PSBjb2x1bW5OYW1lKSB7XHJcbiAgICAgICAgY29sLnRpdGxlID0gbmV3SGVhZGVyVGl0bGU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEdyaWRJc0xvYWRpbmcodHJpZ2dlcmVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRyaWdnZXJlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRHcmlkU2Vzc2lvbktleShncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXBbXCJHcmlkU3RvcmFnZUtleVwiXSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZ3JvdXBbXCJHcmlkU3RvcmFnZUtleVwiXSA9ICd6Z3JpZF8nICsgZ3JvdXAucmVzb3VyY2VVUkwgKyAnXycgKyB0aGlzLmRhdGEuVmFsdWUgKyAnOjonICsgdGhpcy5hdXRoU2VydmljZS5lMVRva2VuLnVzZXJOYW1lO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmFja0J5KGluZGV4OiBudW1iZXIsIGl0ZW06IEdyaWRJdGVtKTogYW55IHtcclxuICAgIC8vY29uc29sZS5sb2coaXRlbS5kYXRhWydJZCddIHx8IGluZGV4KTtcclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcblxyXG4gIC8qIEdyaWQgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAqL1xyXG4gIHB1YmxpYyBzYXZlR3JpZFNldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgX3pncmlkQ29tcG9uZW50ID0gdGhpcy56Z3JpZC5ncmlkIGFzIEdyaWRDb21wb25lbnQ7XHJcbiAgICBjb25zdCBfY29sdW1ucyA9IF96Z3JpZENvbXBvbmVudC5jb2x1bW5zO1xyXG5cclxuICAgIG9mKHRoaXMuY29sdW1ucylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvbmZpZ1ZhbHVlOiBaR3JpZENvbHVtblNldHRpbmdzW10gPSBfY29sdW1ucy50b0FycmF5KCkubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBfekdyaWRDb2x1bW5TZXR0aW5nczogWkdyaWRDb2x1bW5TZXR0aW5ncyA9IE9iamVjdC5rZXlzKGl0ZW0pXHJcbiAgICAgICAgICAgICAgLmZpbHRlcihwcm9wTmFtZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gIXByb3BOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RlbXBsYXRlJylcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgY3VycikgPT4gKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAuLi5hY2MsXHJcbiAgICAgICAgICAgICAgICAgIC4uLnsgW2N1cnJdOiBpdGVtW2N1cnJdIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAsIHt9IGFzIFpHcmlkQ29sdW1uU2V0dGluZ3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gX3pHcmlkQ29sdW1uU2V0dGluZ3M7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAvLyByZW1vdmUgZXh0cmEgZWxlbWVudCBmb3JtIGFycmF5XHJcbiAgICAgICAgICBjb25maWdWYWx1ZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgaXRlbVsnaGVhZGVyU3R5bGUnXTtcclxuICAgICAgICAgICAgZGVsZXRlIGl0ZW1bJ19fbmdDb250ZXh0X18nXTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGdyaWRTZXR0aW5nOiBaR3JpZFNldHRpbmdzID0ge1xyXG4gICAgICAgICAgICAvLyBzdGF0ZTogdGhpcy5zdGF0ZSxcclxuICAgICAgICAgICAgY29sdW1uc0NvbmZpZzogY29uZmlnVmFsdWVcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgLy8gRmluZCBhbnkgc2V0dGluZyBmcm9tIGxvY2Fsc3RvcmFnZSBhbmQgdXBkYXRlLCBpZiBub3QganVzdCBhZGQgaW4uXHJcbiAgICAgICAgICBsZXQgX2FyckdyaWRDYWNoaW5nOiBHcmlkQ2FjaGluZ1tdID0gdGhpcy56R3JpZFN0YXRlUGVyc2lzdGluZ1NlcnZpY2UuZ2V0KHRoaXMuZ3JpZFN0b3JhZ2VLZXkpO1xyXG4gICAgICAgICAgbGV0IF9ncmlkQ29uZmlnOiBHcmlkQ2FjaGluZyA9IG51bGw7XHJcbiAgICAgICAgICBpZiAoX2FyckdyaWRDYWNoaW5nICYmIF9hcnJHcmlkQ2FjaGluZ1swXSkge1xyXG4gICAgICAgICAgICBfZ3JpZENvbmZpZyA9IF9hcnJHcmlkQ2FjaGluZy5maW5kKHggPT4geFsnZGF0YUZvcm1GaWVsZHMnXSA9PT0gdGhpcy5ncmlkU3RvcmFnZUtleSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoX2dyaWRDb25maWcpIHtcclxuICAgICAgICAgICAgICBfZ3JpZENvbmZpZy5ncmlkU2V0dGluZ3MgPSBncmlkU2V0dGluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIF9hcnJHcmlkQ2FjaGluZyA9IFtdO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICghX2dyaWRDb25maWcpIHtcclxuICAgICAgICAgICAgX2dyaWRDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgZGF0YUZvcm1GaWVsZHM6IHRoaXMuZ3JpZFN0b3JhZ2VLZXksXHJcbiAgICAgICAgICAgICAgZ3JpZFNldHRpbmdzOiBncmlkU2V0dGluZ1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgX2FyckdyaWRDYWNoaW5nLnB1c2goX2dyaWRDb25maWcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIF9hcnJHcmlkQ2FjaGluZztcclxuICAgICAgICB9KSxcclxuICAgICAgICBjb25jYXRNYXAoZ3JpZENhY2hlID0+IHtcclxuICAgICAgICAgIC8vIFNhdmUgZ3JpZCBjYWNoaW5nIHRvIGxvY2Fsc3RvcmFnZVxyXG4gICAgICAgICAgdGhpcy56R3JpZFN0YXRlUGVyc2lzdGluZ1NlcnZpY2Uuc2V0KHRoaXMuZ3JpZFN0b3JhZ2VLZXksIGdyaWRDYWNoZSk7XHJcbiAgICAgICAgICAvLyBTYXZlIHRvIENvb2tpZVN0b3JlXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5tYWluU2VydmljZS5jb29raWVTdG9yZVBvc3QodGhpcy5ncmlkU3RvcmFnZUtleSwgZ3JpZENhY2hlKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoc2F2ZWRHcmlkQ2FjaGUgPT4ge1xyXG4gICAgICAgICAgLy8gY2hlY2sgaXMgc2F2ZWQgc3RhdGUgZXhpc3QgdG8gZW5hYmxlL2hpZGUgcmVzdG9yZSBidXR0b25cclxuICAgICAgICAgIHRoaXMuc3RhdGVFeGlzdCgpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAvLyBBbGVydFxyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdygnR3JpZCBTZXR0aW5nIFNhdmVkJywgXCJ0b3BcIiwgdHJ1ZSwgMjAwMCwgJ3N1Y2Nlc3MnKTtcclxuICAgICAgICB9KVxyXG4gICAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc3RvcmVHcmlkU2V0dGluZ3MoKSB7XHJcbiAgICBvZih0cnVlKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gQ2xlYXIgbG9jYWxzdG9yYWdlIGdyaWQgc2V0dGluZ1xyXG4gICAgICAgICAgdGhpcy56R3JpZFN0YXRlUGVyc2lzdGluZ1NlcnZpY2UucmVtb3ZlKHRoaXMuZ3JpZFN0b3JhZ2VLZXkpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKHRydWUpXHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIC8vIGRlbGV0ZSBjb29raWVzdG9yZSBncmlkU2V0dGluZyBieSBzdG9yYWdla2V5IGFzIG5hbWVcclxuICAgICAgICAgIHJldHVybiB0aGlzLm1haW5TZXJ2aWNlLmNvb2tpZVN0b3JlRGVsZXRlTXVsdGlwbGUodGhpcy5ncmlkU3RvcmFnZUtleSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY29uY2F0TWFwKCgpID0+IHtcclxuICAgICAgICAgIC8vIFVzZSBvcmlnaW5hbCBjb2x1bW4gc2V0dGluZ1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVHcmlkQ29sdW1ucygpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAvLyBjaGVjayBpcyBzYXZlZCBzdGF0ZSBleGlzdFxyXG4gICAgICAgICAgdGhpcy5zdGF0ZUV4aXN0KCk7XHJcbiAgICAgICAgICAvLyBBbGVydFxyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdygnR3JpZCBTZXR0aW5nIFJlc3RvcmVkJywgXCJ0b3BcIiwgdHJ1ZSwgMjAwMCwgJ3N1Y2Nlc3MnKTtcclxuICAgICAgICB9KVxyXG4gICAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRHcmlkU2V0dGluZ3MoKTogWkdyaWRDb2x1bW5TZXR0aW5nc1tdIHtcclxuICAgIGNvbnN0IF9zdG9yYWdlS2V5ID0gJ2lvbmljLWZpZWxkOjonICsgdGhpcy5hdXRoU2VydmljZS5lMVRva2VuLnVzZXJOYW1lICsgJzo6JyArIHRoaXMuZGF0YS5OYW1lICsgJzo6JyArIHRoaXMucm91dGVyLnVybDtcclxuXHJcbiAgICAvLyBGaW5kIGFueSBzZXR0aW5nIGZyb20gbG9jYWxzdG9yYWdlLi5cclxuICAgIGxldCBfYXJyR3JpZENhY2hpbmc6IEdyaWRDYWNoaW5nW10gPSB0aGlzLnpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZS5nZXQoX3N0b3JhZ2VLZXkpO1xyXG4gICAgaWYgKF9hcnJHcmlkQ2FjaGluZykge1xyXG4gICAgICBjb25zdCBfZ3JpZENhY2hpbmc6IEdyaWRDYWNoaW5nID0gSlNPTi5wYXJzZShfYXJyR3JpZENhY2hpbmdbJ1ZhbHVlJ10pO1xyXG4gICAgICBpZiAoX2dyaWRDYWNoaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIF9ncmlkQ2FjaGluZy5ncmlkU2V0dGluZ3MuY29sdW1uc0NvbmZpZy5zb3J0KChhLCBiKSA9PiBhLm9yZGVySW5kZXggLSBiLm9yZGVySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiBJbmxpbmUgc2V0dGluZyAqL1xyXG4gIHB1YmxpYyBnZXRJbmxpbmVGaWVsZCh2YWx1ZTogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbmQoeCA9PiB4LlZhbHVlID09PSB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SW5saW5lRm9ybShyb3dJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBmb3JtQXJyYXk6IEZvcm1BcnJheSA9IHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3Vwcy5nZXQoJ2l0ZW1zJykgYXMgRm9ybUFycmF5O1xyXG4gICAgcmV0dXJuIGZvcm1BcnJheS5hdChyb3dJbmRleClcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JtQ29udHJvbERhdGEodmFsdWU6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3Vwcy52YWx1ZS5pdGVtcztcclxuICB9XHJcblxyXG5cclxuICAvKiBFdmVudCAqL1xyXG4gIHB1YmxpYyBiZWZvcmVHcmlkR2V0RGF0YShncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICBjb25zb2xlLndhcm4oXCJiZWZvcmVEYXRhQmluZGluZyB0cmlnZ2VyZWRcIik7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZUdyaWRHZXREYXRhKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZURhdGFCaW5kaW5nIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZUdyaWRHZXREYXRhKGdyb3VwLCBtZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0R3JpZFNlc3Npb25GaWx0ZXIoZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgaWYgKCFncm91cFtcIkdyaWRTdG9yYWdlS2V5XCJdKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgU3RvcmFnZUtleSA9IGdyb3VwW1wiR3JpZFN0b3JhZ2VLZXlcIl07XHJcblxyXG4gICAgaWYgKHRoaXMuc3RvcmFnZVNlcnZpY2UpIHtcclxuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoU3RvcmFnZUtleSlcclxuICAgICAgICAudGhlbihkYXRhID0+IHtcclxuICAgICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS52YWx1ZSB8fCBkYXRhLnZhbHVlID09PSBcIm51bGxcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKGRhdGEudmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmZpbHRlciA9IEpTT04ucGFyc2UocmVzdWx0W1wiU3RhdGVGaWx0ZXJcIl0pO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBKU09OLnBhcnNlKHJlc3VsdFtcIkZpbHRlclBhcmFtc1wiXSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmZpbHRlci5maWx0ZXJzLmZvckVhY2goKHN0YXRlRmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoc3RhdGVGaWx0ZXIuZmllbGQuaW5jbHVkZXMoJ1VUQycpKSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZUZpbHRlci52YWx1ZSA9IG5ldyBEYXRlKHN0YXRlRmlsdGVyLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0R3JpZFNlc3Npb25GaWx0ZXIoZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgaWYgKCFncm91cFtcIkdyaWRTdG9yYWdlS2V5XCJdKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgU3RvcmFnZUtleSA9IGdyb3VwW1wiR3JpZFN0b3JhZ2VLZXlcIl07XHJcblxyXG4gICAgbGV0IGxzdEdyaWRGaWx0ZXI6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcclxuXHJcbiAgICBpZiAobWUuc3RhdGUuZmlsdGVyICYmIHRoaXMuc3RvcmFnZVNlcnZpY2UgJiYgdGhpcy5kYXRhWydTYXZlRmlsdGVyJ10pIHtcclxuICAgICAgLy9saXN0IG9mIGRhdGEgZm9yIFN0YXRlRmlsdGVyIGFuZCBGaWx0ZXJQYXJhbXNcclxuICAgICAgbHN0R3JpZEZpbHRlciA9IHsgXCJTdGF0ZUZpbHRlclwiOiBKU09OLnN0cmluZ2lmeShtZS5zdGF0ZS5maWx0ZXIpLCBcIkZpbHRlclBhcmFtc1wiOiBKU09OLnN0cmluZ2lmeShtZS5wYXJhbXMuZmlsdGVyUGFyYW1zKSB9XHJcbiAgICAgIC8vY3JlYXRlIHNlc3Npb24gc3RvcmFnZVxyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldChTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShsc3RHcmlkRmlsdGVyKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiBBdmFpbGFibGUgRnVuY3Rpb25zICovXHJcbiAgcHVibGljIHNldEVuYWJsZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5ID0gIXN0YXR1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaXNpYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSA9IHN0YXR1cztcclxuICAgIHRoaXMuZGF0YS5WaXNpYmxlID0gc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJlcXVpcmUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZCA9IHN0YXR1cztcclxuICAgIFpDb21wb25lbnRIZWxwZXIuY2hhbmdlVmFsaWRhdG9yKHN0YXR1cywgdGhpcy5ncm91cCwgdGhpcy5kYXRhLlZhbHVlLCB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qIG9uY2hhbmdlIEV2ZW50cyAqL1xyXG4gIHB1YmxpYyBmaWx0ZXJDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuemdyaWQpIHtcclxuICAgICAgdGhpcy56Z3JpZC5maWx0ZXJDaGFuZ2UoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHBhZ2VDaGFuZ2UoZXZlbnQ6IFBhZ2VDaGFuZ2VFdmVudCk6IHZvaWQgeyBcclxuICAgIGlmICh0aGlzLnpncmlkKSB7XHJcbiAgICAgIHRoaXMuemdyaWQucGFnZUNoYW5nZShldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc29ydENoYW5nZShzb3J0OiBTb3J0RGVzY3JpcHRvcltdKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy56Z3JpZCkge1xyXG4gICAgICB0aGlzLnpncmlkLnNvcnRDaGFuZ2Uoc29ydCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5DZWxsQ2hlY2tCb3hPbkNoYW5nZShldmVudDogYW55LCByb3dJbmRleDogYW55LCBjb2x1bW46IGFueSkge1xyXG4gICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQuZGV0YWlsLmNoZWNrZWQ7XHJcbiAgICB0aGlzLmdEYXRhW3Jvd0luZGV4XVtjb2x1bW4uVmFsdWVdID0gaXNDaGVja2VkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbHVtbnNPcmRlckNoYW5nZWQoZXZlbnQ6IENvbHVtblJlb3JkZXJFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgX3pncmlkQ29udHJvbCA9IHRoaXMuemdyaWQgYXMgWkdyaWQ7XHJcbiAgICBjb25zdCBfemdyaWRDb21wb25lbnQgPSB0aGlzLnpncmlkLmdyaWQgYXMgR3JpZENvbXBvbmVudDtcclxuICAgIGNvbnN0IF9kYXRhID0gX3pncmlkQ29tcG9uZW50LmRhdGEgYXMgR3JpZERhdGFSZXN1bHQ7XHJcblxyXG4gICAgaWYgKHRoaXMuemdyaWQpIHtcclxuICAgICAgY29uc3QgX3pncmlkID0gdGhpcy56Z3JpZDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKiBncmlkIGNvbW1hbmQgaGFuZGxlciAqL1xyXG4gIHB1YmxpYyBhZGRIYW5kbGVyKHsgc2VuZGVyIH0pIHtcclxuICAgIHRoaXMuaXNOZXcgPSB0cnVlO1xyXG5cclxuICAgIC8vIGNsb3NlIGFueSBleGlzdGluZyBlZGl0b3JcclxuICAgIHRoaXMuY2xvc2VFZGl0b3Ioc2VuZGVyKTtcclxuXHJcbiAgICAvLyBsb29wIGFsbCBjb2x1bW4gdG8gZ2V0IHZhbGlkYXRpb24gYW5kIGNyZWF0ZSBmb3JtIGNvbnRyb2xcclxuICAgIGNvbnN0IGNvbEZvcm1Db250cm9sID0ge307XHJcbiAgICB0aGlzLnpncmlkLmdyaWRDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gICAgICBpZiAoY29sLklzUmVxdWlyZWQpIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbC5WYWxpZGF0b3JQYXR0ZXJuKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihjb2wuVmFsaWRhdG9yUGF0dGVybikpO1xyXG4gICAgICB9IFxyXG5cclxuICAgICAgY29sRm9ybUNvbnRyb2xbY29sLlZhbHVlXSA9IG5ldyBGb3JtQ29udHJvbChudWxsLCB2YWxpZGF0b3JzKTsgXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzZXQgZm9ybSBjb250cm9sIG9iamVjdCB0byBmb3JtIGdyb3VwXHJcbiAgICB0aGlzLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoY29sRm9ybUNvbnRyb2wpO1xyXG5cclxuICAgIC8vIGFkZCB0byBncmlkIHJvd1xyXG4gICAgc2VuZGVyLmFkZFJvdyh0aGlzLmZvcm1Hcm91cCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZUhhbmRsZXIoeyBzZW5kZXIsIHJvd0luZGV4LCBmb3JtR3JvdXAsIGlzTmV3IH0pOiB2b2lkIHtcclxuICAgIC8vIGdldCBncmlkIGRhdGEuXHJcbiAgICBjb25zdCBncmlkRXhpc3RpbmdEYXRhID0gdGhpcy5nRGF0YSA/IHRoaXMuZ0RhdGEgOiB0aGlzLmdyaWREYXRhID8gdGhpcy5ncmlkRGF0YS5kYXRhIDogW107XHJcblxyXG4gICAgLy8gaWYgdmFsaWRcclxuICAgIGlmIChmb3JtR3JvdXAudmFsaWQpIHtcclxuICAgICAgLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBVbmlxdWVLZXlcclxuICAgICAgbGV0IHVuaXF1ZUtleUV4aXN0OiBib29sZWFuO1xyXG4gICAgICBjb25zdCB1bmlxdWVLZXkgPSB0aGlzLmRhdGFbJ1VuaXF1ZUtleSddO1xyXG4gICAgICBpZiAodW5pcXVlS2V5KSB7IFxyXG4gICAgICAgIGNvbnN0IGZvcm1VbmlxdWVLZXlWYWx1ZSA9IGZvcm1Hcm91cC52YWx1ZVt1bmlxdWVLZXldO1xyXG5cclxuICAgICAgICBpZiAoaXNOZXcgfHwgKCFpc05ldyAmJiAoZ3JpZEV4aXN0aW5nRGF0YVtyb3dJbmRleF1bdW5pcXVlS2V5XSAhPSBmb3JtVW5pcXVlS2V5VmFsdWUpKSkge1xyXG4gICAgICAgICAgLy8gaWYgbmV3Li4uXHJcbiAgICAgICAgICAvLyBpZiBlZGl0Li4uIGlmIGN1cnJlbnQgZmllbGQsIHVuaXF1ZWtleSB2YWx1ZSBjaGFuZ2VkLiBuZWVkIHRvIGNoZWNrLiAgXHJcbiAgICAgICAgICBncmlkRXhpc3RpbmdEYXRhLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhW3VuaXF1ZUtleV0gPT09IGZvcm1VbmlxdWVLZXlWYWx1ZSkge1xyXG4gICAgICAgICAgICAgIHVuaXF1ZUtleUV4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF1bmlxdWVLZXlFeGlzdCkge1xyXG4gICAgICAgIGlmIChpc05ldykge1xyXG4gICAgICAgICAgLy8gaWYgbmV3LCBwdXNoIHRvIGRhdGFcclxuICAgICAgICAgIGdyaWRFeGlzdGluZ0RhdGEucHVzaChmb3JtR3JvdXAudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGlmIGVkaXQsIHVwZGF0ZSBkYXRhXHJcbiAgICAgICAgICBncmlkRXhpc3RpbmdEYXRhW3Jvd0luZGV4XSA9IGZvcm1Hcm91cC52YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0RGF0YShncmlkRXhpc3RpbmdEYXRhKTtcclxuXHJcbiAgICAgICAgc2VuZGVyLmNsb3NlUm93KHJvd0luZGV4KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KCdFcnJvciBvY2N1cjogRHVwbGljYXRlZCB1bmlxdWUgZmllbGQgZW50cnkuJywgJ3RvcCcsIHRydWUsIDMwMDAsICdkYW5nZXInKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbEhhbmRsZXIoeyBzZW5kZXIsIHJvd0luZGV4IH0pIHtcclxuICAgIC8vIGNhbmNlbCBhbnkgZXhpc3RpbmcgZWRpdG9yXHJcbiAgICBzZW5kZXIuY2xvc2VSb3cocm93SW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRIYW5kbGVyKHsgc2VuZGVyLCByb3dJbmRleCwgZGF0YUl0ZW0gfSkge1xyXG4gICAgdGhpcy5pc05ldyA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGNsb3NlIGFueSBleGlzdGluZyBlZGl0b3JcclxuICAgIHRoaXMuY2xvc2VFZGl0b3Ioc2VuZGVyKTtcclxuICAgICBcclxuICAgIC8vIGxvb3AgYWxsIGNvbHVtbiB0byBnZXQgdmFsaWRhdGlvbiBhbmQgY3JlYXRlIGZvcm0gY29udHJvbCwgYXBwZW5kIGN1cnJlbnQgcm93IHZhbHVlXHJcbiAgICBjb25zdCBjb2xGb3JtQ29udHJvbCA9IHt9O1xyXG4gICAgdGhpcy56Z3JpZC5ncmlkQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcclxuICAgICAgaWYgKGNvbC5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2wuVmFsaWRhdG9yUGF0dGVybikge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oY29sLlZhbGlkYXRvclBhdHRlcm4pKTtcclxuICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgIGNvbEZvcm1Db250cm9sW2NvbC5WYWx1ZV0gPSBuZXcgRm9ybUNvbnRyb2woZGF0YUl0ZW1bY29sLlZhbHVlXSwgdmFsaWRhdG9ycyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzZXQgZm9ybSBjb250cm9sIG9iamVjdCB0byBmb3JtIGdyb3VwXHJcbiAgICB0aGlzLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoY29sRm9ybUNvbnRyb2wpO1xyXG5cclxuICAgIC8vIHNldCBncmlkIHJvdyB0byBlZGl0XHJcbiAgICB0aGlzLmVkaXRlZFJvd0luZGV4ID0gcm93SW5kZXg7IFxyXG4gICAgc2VuZGVyLmVkaXRSb3cocm93SW5kZXgsIHRoaXMuZm9ybUdyb3VwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVIYW5kbGVyKHsgc2VuZGVyLCBkYXRhSXRlbSB9KSB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0SXRlbUluZGV4KGRhdGFJdGVtLCB0aGlzLmdEYXRhLCB0aGlzLmRhdGFbJ1VuaXF1ZUtleSddKTtcclxuICAgIHRoaXMuZ0RhdGEuc3BsaWNlKGluZGV4LCAxKTtcclxuXHJcbiAgICBzZW5kZXIuY2FuY2VsQ2VsbCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZUVkaXRvcihncmlkLCByb3dJbmRleCA9IHRoaXMuZWRpdGVkUm93SW5kZXgpIHtcclxuICAgIGdyaWQuY2xvc2VSb3cocm93SW5kZXgpO1xyXG4gICAgdGhpcy5lZGl0ZWRSb3dJbmRleCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZm9ybUdyb3VwID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJdGVtSW5kZXgoaXRlbTogYW55LCBkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgZGF0YS5sZW5ndGg7IGlkeCsrKSB7XHJcbiAgICAgIGlmIChkYXRhW2lkeF1ba2V5XSA9PT0gaXRlbVtrZXldKSB7XHJcbiAgICAgICAgcmV0dXJuIGlkeDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAtMTtcclxuICB9XHJcbn1cclxuIiwiPCEtLVxyXG48ZGl2IHN0eWxlPVwibWFyZ2luOiAxMHB4XCI+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgay1mb3JtXCI+XHJcbiAgICAgICAgICA8ZmllbGRzZXQ+XHJcbiAgICAgICAgICAgIDxsZWdlbmQ+QmluZGluZyB0eXBlczwvbGVnZW5kPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiay1mb3JtLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5CaW5kIHRoZSBkYXRhIHRvOjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImJpbmRpbmdUeXBlXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm1vZGVcIiBpZD1cImFycmF5XCIgdmFsdWU9XCJhcnJheVwiIGNsYXNzPVwiay1yYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUJpbmRpbmdUeXBlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImstcmFkaW8tbGFiZWxcIiBmb3I9XCJhcnJheVwiPkFycmF5IG9iamVjdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJiaW5kaW5nVHlwZVwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJtb2RlXCIgaWQ9XCJncmlkRGF0YVJlc3VsdFwiIHZhbHVlPVwiZ3JpZERhdGFSZXN1bHRcIiBjbGFzcz1cImstcmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VCaW5kaW5nVHlwZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJrLXJhZGlvLWxhYmVsXCIgZm9yPVwiZ3JpZERhdGFSZXN1bHRcIj5HcmlkRGF0YVJlc3VsdCBvYmplY3Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiYmluZGluZ1R5cGVcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwibW9kZVwiIGlkPVwiYXN5bmNcIiB2YWx1ZT1cImFzeW5jXCIgY2xhc3M9XCJrLXJhZGlvXCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlQmluZGluZ1R5cGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiay1yYWRpby1sYWJlbFwiIGZvcj1cImFzeW5jXCI+QXN5bmNocm9ub3VzIHNvdXJjZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9maWVsZHNldD5cclxuICAgICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiAtLT5cclxuPGRpdiBzdHlsZT1cIm1hcmdpbjogMTBweCAwIDZweCAwO1wiPlxyXG4gIDxkaXYgKm5nSWY9XCJkYXRhLlRpdGxlXCIgY2xhc3M9XCJncmlkVGl0bGVcIj57e2RhdGEuVGl0bGV9fTwvZGl2PlxyXG4gIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgbGV0LWFuY2hvcj5cclxuICAgIDxzcGFuPnt7IGFuY2hvci5uYXRpdmVFbGVtZW50LmlubmVyVGV4dCB9fTwvc3Bhbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDxkaXYga2VuZG9Ub29sdGlwXHJcbiAgICAgICBzaG93T249XCJub25lXCJcclxuICAgICAgIFt0b29sdGlwVGVtcGxhdGVdPVwidGVtcGxhdGVcIlxyXG4gICAgICAgZmlsdGVyPVwiLmstZ3JpZCB0ZFwiXHJcbiAgICAgICAobW91c2VvdmVyKT1cInNob3dUb29sdGlwKCRldmVudClcIj4gXHJcbiAgICA8a2VuZG8tZ3JpZCBbemdyaWRiaW5kaW5nXT1cIntkYXRhOiBkYXRhLCBncm91cDogZ3JvdXAsIHBhcmFtczogcGFyYW1zLCBncmlkU3ViamVjdDogZ3JpZFN1YmplY3R9XCIgW25nQ2xhc3NdPVwiZGF0YS5DbGFzc1wiXHJcbiAgICAgICAgICAgICAgICBbZGF0YV09XCJncmlkRGF0YVwiXHJcbiAgICAgICAgICAgICAgICBbcGFnZVNpemVdPVwic3RhdGUudGFrZVwiXHJcbiAgICAgICAgICAgICAgICBbcGFnZWFibGVdPVwie3Jlc3BvbnNpdmU6IHRydWUsIGJ1dHRvbkNvdW50OiAzLCBwYWdlU2l6ZXM6IHBhZ2VTaXplcywgcHJldmlvdXNOZXh0OiBwcmV2aW91c05leHR9XCJcclxuICAgICAgICAgICAgICAgIFtza2lwXT1cInN0YXRlLnNraXBcIlxyXG4gICAgICAgICAgICAgICAgW3NvcnRdPVwic3RhdGUuc29ydFwiXHJcbiAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwie2FsbG93VW5zb3J0OiB0cnVlLG1vZGU6ICdtdWx0aXBsZSd9XCJcclxuICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwic3RhdGUuZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cImRhdGEuZW5hYmxlRmlsdGVyaW5nICE9PSBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICBbcmVzaXphYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW3Jlb3JkZXJhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwic2Nyb2xsTW9kZVwiXHJcbiAgICAgICAgICAgICAgICBbY29sdW1uTWVudV09XCJkYXRhLkRpc2FibGVHcmlkQ29sdW1uTWVudSA/IGZhbHNlIDogeyBmaWx0ZXI6IHRydWUgfVwiXHJcbiAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSlcIlxyXG4gICAgICAgICAgICAgICAgKGNlbGxDbGljayk9XCJjZWxsQ2xpY2tIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGNlbGxDbG9zZSk9XCJlZGl0Q2VsbENsb3NlSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChkYXRhU3RhdGVDaGFuZ2UpPVwiZGF0YVN0YXRlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwicGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChzb3J0Q2hhbmdlKT1cInNvcnRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoZmlsdGVyQ2hhbmdlKT1cImZpbHRlckNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChjb2x1bW5SZW9yZGVyKT1cImNvbHVtbnNPcmRlckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBba2VuZG9HcmlkU2VsZWN0QnldPVwicm93U2VsZWN0aW9uS2V5XCJcclxuICAgICAgICAgICAgICAgIFtzZWxlY3RhYmxlXT1cInNlbGVjdGFibGVTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRLZXlzXT1cIm15U2VsZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldEdyaWRTdHlsZSgpXCJcclxuICAgICAgICAgICAgICAgIFt0cmFja0J5XT1cInRyYWNrQnlcIlxyXG4gICAgICAgICAgICAgICAgKGNhbmNlbCk9XCJjYW5jZWxIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKHNhdmUpPVwic2F2ZUhhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAocmVtb3ZlKT1cInJlbW92ZUhhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoZWRpdCk9XCJlZGl0SGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChhZGQpPVwiYWRkSGFuZGxlcigkZXZlbnQpXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRUb29sYmFyVGVtcGxhdGUgKm5nSWY9XCJkYXRhLkFsbG93UmVmcmVzaEJ1dHRvbiB8fCBkYXRhLkFsbG93RXhwb3J0IHx8IGRhdGEuQWxsb3dTYXZlU3RhdGUgfHwgZGF0YS5FbmFibGVHcmlkQ29tbWFuZFwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvQnV0dG9uIChjbGljayk9XCJyZWZyZXNoRGF0YSgpXCIgKm5nSWY9XCJkYXRhLkFsbG93UmVmcmVzaEJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1yZWZyZXNoLXNtXCI+PC9zcGFuPiZuYnNwO1JlZnJlc2g8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0dyaWRFeGNlbENvbW1hbmQgKm5nSWY9XCJkYXRhLkFsbG93RXhwb3J0XCI+PHNwYW4gY2xhc3M9XCJrLWljb24gay1pLWZpbGUtZXhjZWxcIj48L3NwYW4+Jm5ic3A7RXhwb3J0IERhdGEgdG8gRXhjZWw8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0J1dHRvbiAoY2xpY2spPVwic2F2ZUdyaWRTZXR0aW5ncygpXCIgKm5nSWY9XCJkYXRhLkFsbG93U2F2ZVN0YXRlXCI+PHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXN0YXJcIj48L3NwYW4+Jm5ic3A7U2F2ZSBTZXR0aW5nPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIga2VuZG9CdXR0b24gKGNsaWNrKT1cInJlc3RvcmVHcmlkU2V0dGluZ3MoKVwiICpuZ0lmPVwiZ3JpZERlZmF1bHRTdGF0ZUV4aXN0XCI+PHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXN0YXItb3V0bGluZVwiPjwvc3Bhbj4mbmJzcDtSZXN0b3JlIFNldHRpbmc8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0dyaWRBZGRDb21tYW5kICpuZ0lmPVwiZGF0YS5FbmFibGVHcmlkQ29tbWFuZCBcIj48c3BhbiBjbGFzcz1cImstaWNvbiBrLWktYWRkXCI+PC9zcGFuPkFkZCBOZXc8L2J1dHRvbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPGtlbmRvLWdyaWQtY2hlY2tib3gtY29sdW1uICpuZ0lmPVwiISFkYXRhLlNlbGVjdE9wdGlvbnNcIiBbd2lkdGhdPVwiNjBcIiBzaG93U2VsZWN0QWxsPVwidHJ1ZVwiIFtjb2x1bW5NZW51XT1cInRydWVcIj48L2tlbmRvLWdyaWQtY2hlY2tib3gtY29sdW1uPlxyXG4gICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImNvbC50aXRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiY29sLndpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5SZXNpemFibGVXaWR0aF09XCJjb2wubWluUmVzaXphYmxlV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJjb2wuZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cImZpbHRlcmFibGUoY29sLmVuYWJsZUZpbHRlcmluZylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cInNvcnRhYmxlKGNvbC5lbmFibGVTb3J0aW5nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGVhZGVyU3R5bGVdPVwieyd3aGl0ZS1zcGFjZSc6ICdpbml0aWFsJ31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJjb2wuaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwiY29sLmZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLkNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtsb2NrZWRdPVwibG9ja2VkKGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbk1lbnVdPVwiIWNvbC5kaXNhYmxlQ29sdW1uTWVudVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZWRpdG9yXT1cImNvbC5lZGl0b3JUeXBlXCI+XHJcbiAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiY29sLmZpZWxkVHlwZSA9PT0gJ251bWJlcidcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ2N1cnJlbmN5J1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnem51bWVyaWMnXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtbnVtZXJpYy1maWx0ZXItY2VsbCBbY29sdW1uXT1cImNvbHVtblwiIFtmaWx0ZXJdPVwiZmlsdGVyXCIgb3BlcmF0b3I9XCJlcVwiPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbmVxLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLW5lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1udW1lcmljLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJjb2wuZmllbGRUeXBlID09ICd6ZGF0ZSdcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ3p0aW1lJ1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnemRhdGV0aW1lJ1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnenVpZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZmlsdGVyQnlEYXRlUmFuZ2UgPT09IHRydWVcIj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiIG9wZXJhdG9yPVwibHRlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGF0ZS1yYW5nZS1maWx0ZXItY2VsbCBjbGFzcz1cImRhdGUtcmFuZ2UtZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuZmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1sdC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPC9kYXRlLXJhbmdlLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLmZpbHRlckJ5RGF0ZVJhbmdlID09PSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiBvcGVyYXRvcj1cImx0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtZGF0ZS1maWx0ZXItY2VsbD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxyXG4gICAgICAgICAgICAgIDxrZW5kby1ncmlkLXN0cmluZy1maWx0ZXItY2VsbCBbY29sdW1uXT1cImNvbHVtblwiIFtmaWx0ZXJdPVwiZmlsdGVyXCIgb3BlcmF0b3I9XCJjb250YWluc1wiPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1jb250YWlucy1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1jb250YWlucy1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZXEtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZXEtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLW5lcS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1uZXEtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLXN0YXJ0c3dpdGgtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItc3RhcnRzd2l0aC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZW5kc3dpdGgtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZW5kc3dpdGgtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLXN0cmluZy1maWx0ZXItY2VsbD5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gR3JpZCBFZGl0IFRlbXBsYXRlIC0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRFZGl0VGVtcGxhdGUgKm5nSWY9XCJkYXRhLkVuYWJsZUdyaWRDb21tYW5kIFwiIGxldC1kYXRhSXRlbT1cImRhdGFJdGVtXCIgbGV0LWNvbHVtbj1cImNvbFwiIGxldC1mb3JtR3JvdXA9XCJmb3JtR3JvdXBcIiBsZXQtaXNOZXc9XCJpc05ld1wiPlxyXG4gICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICAgIDxrZW5kby1udW1lcmljdGV4dGJveCAjY2VsbEFuY2hvciBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpXCI+PC9rZW5kby1udW1lcmljdGV4dGJveD5cclxuICAgICAgICAgICAgICA8a2VuZG8tcG9wdXAgW2FuY2hvcl09XCJjZWxsQW5jaG9yLm51bWVyaWNJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIShpc05ldyAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwQ2xhc3M9XCJrLXdpZGdldCBrLXRvb2x0aXAgay10b29sdGlwLXZhbGlkYXRpb24gay1pbnZhbGlkLW1zZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAycHg7IG9wYWNpdHk6IDAuNTtcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS13YXJuaW5nXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIWZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS51bnRvdWNoZWQgJiYgZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmVycm9ycz8ucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAge3sgY29sLk5hbWUgfX0gcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgc3R5bGU9XCJwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWxlZnQ6IDNweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5pbnZhbGlkICYmICFmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkICYmIGZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5lcnJvcnM/LnBhdHRlcm5cIj5cclxuICAgICAgICAgICAgICAgICAge3sgY29sLlZhbGlkYXRvck1lc3NhZ2UgPyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA6IFwiUGxlYXNlIGNoZWNrIHRoZSBpbnB1dCB2YWx1ZS5cIiB9fVxyXG4gICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9rZW5kby1wb3B1cD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICA8a2VuZG8tdGV4dGJveCAjY2VsbEFuY2hvciBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpXCI+PC9rZW5kby10ZXh0Ym94PlxyXG4gICAgICAgICAgICAgIDxrZW5kby1wb3B1cCBbYW5jaG9yXT1cImNlbGxBbmNob3IuaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5pbnZhbGlkICYmICEoaXNOZXcgJiYgZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLnVudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cENsYXNzPVwiay13aWRnZXQgay10b29sdGlwIGstdG9vbHRpcC12YWxpZGF0aW9uIGstaW52YWxpZC1tc2dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctbGVmdDogMnB4OyBvcGFjaXR5OiAwLjU7XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWktd2FybmluZ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwhLS08aW9uLWxhYmVsIHN0eWxlPVwicGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1sZWZ0OiAzcHg7XCI+e3sgY29sLk5hbWUgfX0gaXMgcmVxdWlyZWQuPC9pb24tbGFiZWw+LS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIWZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS51bnRvdWNoZWQgJiYgZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmVycm9ycz8ucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAge3sgY29sLk5hbWUgfX0gcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgc3R5bGU9XCJwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWxlZnQ6IDNweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5pbnZhbGlkICYmICFmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkICYmIGZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5lcnJvcnM/LnBhdHRlcm5cIj5cclxuICAgICAgICAgICAgICAgICAge3sgY29sLlZhbGlkYXRvck1lc3NhZ2UgPyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA6IFwiUGxlYXNlIGNoZWNrIHRoZSBpbnB1dCB2YWx1ZS5cIiB9fVxyXG4gICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9rZW5kby1wb3B1cD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDZWxsVGVtcGxhdGUgbGV0LWRhdGFJdGVtIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOiAxcHggMDtcIiAqbmdJZj1cIiFjb2wuY2xpY2thYmxlSWNvbnMgJiYgY29sLmlzRWRpdGFibGVJbkdyaWQgIT09IHRydWVcIiBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiXHJcbiAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldENsYXNzKGRhdGFJdGVtLCBjb2wpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInemRhdGUnXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IGRhdGU6ICdkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenRpbWUnXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IGRhdGU6ICdISDptbScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pzaG9ydGRhdGUnXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IGRhdGU6ICdNTU0geXl5eScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6dWlkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IG51bWJlciB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCwgJzEuMi0yJykgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pudW1lcmljJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBudW1iZXI6IGdldEZvcm1hdChjb2wpIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid1cmwnXCIgc3R5bGU9XCJjb2xvcjogYmx1ZTsgY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wiPlxyXG4gICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF19fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCIhIWNvbC5uYXZpZ2F0ZVRvXCIgKGNsaWNrKT1cIm9uTmF2aWdhdGVUbygkZXZlbnQsIGNvbCwgZGF0YUl0ZW0sIGRhdGFJdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgIDxpb24tYnV0dG9uIGNvbG9yPVwibGlnaHRcIiBzaXplPVwic21hbGxcIj5cclxuICAgICAge3sgY29sLkNsaWNrYWJsZUljb25zIH19XHJcbiAgICAgIDxpb24taWNvbiBzbG90PSBcImVuZFwiIG5hbWU9XCJhcnJvdy1mb3J3YXJkXCI+PC9pb24taWNvbj5cclxuICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+IC0tPlxyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbjogNXB4IDA7XCIgKm5nSWY9XCJjb2wuaXNFZGl0YWJsZUluR3JpZCA9PT0gdHJ1ZSAmJiBpbmxpbmVFZGl0ZWRGb3JtR3JvdXBzXCIgW25nU3dpdGNoXT1cImNvbC5maWVsZFR5cGVcIiBbZm9ybUdyb3VwXT1cImlubGluZUVkaXRlZEZvcm1Hcm91cHNcIlxyXG4gICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRDbGFzcyhkYXRhSXRlbSwgY29sKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIFtmb3JtQ29udHJvbF09XCJ0aGlzLmdldEZvcm1Db250cm9sKHJvd0luZGV4LCBjb2wuZmllbGQpXCIgLz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxyXG4gICAgICAgICAgICAgIDxpb24tY2hlY2tib3ggW2Rpc2FibGVkXT1cIighIWNvbC5SZWFkT25seSA/IGNvbC5SZWFkT25seSA6IGZhbHNlKVwiIFtmb3JtQ29udHJvbF09XCJ0aGlzLmdldEZvcm1Db250cm9sKHJvd0luZGV4LCBjb2wuZmllbGQpXCIgY29sb3I9XCJwcmltYXJ5XCIgKGlvbkNoYW5nZSk9XCJpbkNlbGxDaGVja0JveE9uQ2hhbmdlKCRldmVudCwgcm93SW5kZXgsIGNvbClcIj48L2lvbi1jaGVja2JveD5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3p1aXNlbGVjdG11bHRpcGxlJ1wiPlxyXG4gICAgICAgICAgICAgIDxhcHAtenNlbGVjdG11bHRpcGxlIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgW2RhdGFdPVwiZ2V0SW5saW5lRmllbGQoY29sLlZhbHVlKVwiIFtncm91cF09XCJncm91cFwiIFtmb3JtXT1cImdldElubGluZUZvcm0ocm93SW5kZXgpXCI+PC9hcHAtenNlbGVjdG11bHRpcGxlPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCIndGV4dGFyZWEnXCI+XHJcbiAgICAgICAgICAgICAgPGFwcC16dGV4dGFyZWEgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbZGF0YV09XCJnZXRJbmxpbmVGaWVsZChjb2wuVmFsdWUpXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZ2V0SW5saW5lRm9ybShyb3dJbmRleClcIj48L2FwcC16dGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIlsnenVpZGF0ZXRpbWUnLCd6ZGF0ZScsICd6dGltZScsJ3pkYXRldGltZScsJ3pzaG9ydGRhdGUnXS5pbmNsdWRlcyhjb2wuZmllbGRUeXBlKSA/IGNvbC5maWVsZFR5cGUgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgIDxhcHAtemRhdGV0aW1lIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgW2RhdGFdPVwiZ2V0SW5saW5lRmllbGQoY29sLlZhbHVlKVwiIFtncm91cF09XCJncm91cFwiIFtmb3JtXT1cImdldElubGluZUZvcm0ocm93SW5kZXgpXCI+PC9hcHAtemRhdGV0aW1lPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgdHlwZT1cInRleHRcIiBbZm9ybUNvbnRyb2xdPVwidGhpcy5nZXRGb3JtQ29udHJvbChyb3dJbmRleCwgY29sLmZpZWxkKVwiIC8+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbC5jbGlja2FibGVJY29uc1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJpY29uLkNsYXNzID8gaWNvbi5DbGFzcyA6ICcnXCIgKm5nSWY9XCIhIWljb24gJiYgKCEhZGF0YUl0ZW0uV0ZTX1N0YXR1c0NvZGUgJiYgISFpY29uKVxyXG4gICAgICAgICAgICAgID8gZGF0YUl0ZW0uV0ZTX1N0YXR1c0NvZGUgIT09IGljb24uV0ZTX1N0YXR1c0NvZGVcclxuICAgICAgICAgICAgICA6IHRydWU7XHJcbiAgICAgICAgICAgIGVsc2UgZGlzYWJsZWRCdXR0b25cIiAoY2xpY2spPVwib25CdG5DbGljaygkZXZlbnQsIGljb24sIGRhdGFJdGVtLCBkYXRhSXRlbVtjb2wuZmllbGRdKVwiPlxyXG4gICAgICAgICAgICAgIHt7aWNvbi5OYW1lIHx8IGRhdGFJdGVtW2NvbC5maWVsZF19fSA8ZmEtaWNvbiBbaWNvbl09XCJpY29uLkljb25cIiBzdHlsZT1cInBhZGRpbmc6IDRweCA2cHg7XCI+XHJcbiAgICAgICAgICAgICAgPC9mYS1pY29uPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzYWJsZWRCdXR0b24+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8IS0tIDxzdHJvbmc+e3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fTwvc3Ryb25nPiAtLT5cclxuICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJ7e2RhdGFJdGVtLkRpc2NvbnRpbnVlZCA/ICdkaXNjb250aW51ZWQnIDogJ2FjdGl2ZSd9fVwiPlxyXG4gICAgICAgIHt7ZGF0YUl0ZW0uRGlzY29udGludWVkID8gXCJkaXNjb250aW51ZWRcIiA6IFwiYWN0aXZlXCJ9fVxyXG4gICAgICA8L3NwYW4+IC0tPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEZvb3RlclRlbXBsYXRlIGxldC1jb2x1bW4gbGV0LWNvbHVtbkluZGV4PVwiY29sdW1uSW5kZXhcIiAqbmdJZj1cImRhdGEuRW5hYmxlQWdncmVnYXRlXCI+XHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOiA1cHggMDtcIiBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiPlxyXG4gICAgICAgICAgICB7e2NvbC5hZ2dyZWdhdGVUeXBlfX1cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6ZGF0ZSdcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBkYXRlOiAnZGQvTU0veXl5eScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3p0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IGRhdGU6ICdISDptbScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pzaG9ydGRhdGUnXCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgZGF0ZTogJ01NTSB5eXl5JyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInemRhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IGRhdGU6ICdkZC9NTS95eXl5IGhoOm1tOnNzIGFhJyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenVpZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgbnVtYmVyIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBudW1iZXI6IGdldEZvcm1hdChjb2wsICcxLjIuMicpIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6bnVtZXJpYydcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBudW1iZXI6IGdldEZvcm1hdChjb2wpIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid1cmwnXCIgc3R5bGU9XCJjb2xvcjogYmx1ZTsgY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XHJcbiAgICAgIDxrZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uICpuZ0lmPVwiZGF0YS5FbmFibGVHcmlkQ29tbWFuZFwiIHdpZHRoPVwiMTgwXCIgW2NvbHVtbk1lbnVdPVwiZmFsc2VcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ2VsbFRlbXBsYXRlIGxldC1pc05ldz1cImlzTmV3XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGtlbmRvR3JpZFNhdmVDb21tYW5kPlxyXG4gICAgICAgICAgICB7eyBpc05ldyA/ICdTYXZlJyA6ICdVcGRhdGUnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkQ2FuY2VsQ29tbWFuZCBbcHJpbWFyeV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgIHt7IGlzTmV3ID8gJ0Rpc2NhcmQgY2hhbmdlcycgOiAnQ2FuY2VsJyB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGtlbmRvR3JpZEVkaXRDb21tYW5kPlxyXG4gICAgICAgICAgICB7eyBcIkVkaXRcIiB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGtlbmRvR3JpZFJlbW92ZUNvbW1hbmQ+XHJcbiAgICAgICAgICAgIHt7IFwiUmVtb3ZlXCIgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwva2VuZG8tZ3JpZC1jb21tYW5kLWNvbHVtbj5cclxuICAgICAgPGtlbmRvLWdyaWQtZXhjZWwgZmlsZU5hbWU9XCJFeHBvcnQueGxzeFwiIFtmZXRjaERhdGFdPVwiYWxsUmVzdWx0c1wiPjwva2VuZG8tZ3JpZC1leGNlbD5cclxuICAgIDwva2VuZG8tZ3JpZD5cclxuICAgIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImstaS1sb2FkaW5nXCI+PC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
856
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFHekcsNkJBQTZCO0FBRTdCLDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBUyxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3ZFLE9BQU8sRUFBeUIsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFlbkUsT0FBTyxFQUV1QixvQkFBb0IsRUFBRSxnQkFBZ0IsRUFFbkUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCekIsTUFBTSxPQUFPLGNBQWM7SUF3RHpCLFlBQ1UsY0FBOEIsRUFDOUIsTUFBYyxFQUNkLFdBQXdCLEVBQ3hCLFdBQXdCLEVBQ3hCLGFBQTRCLEVBQzVCLDJCQUF3RCxFQUN4RCxZQUEwQixFQUMxQixZQUEwQixFQUMxQixjQUFxQyxFQUNyQyxXQUF3QjtRQVR4QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIs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Q0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU8sV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVMsRUFBRSxJQUFXLEVBQUUsR0FBVztRQUN0RCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUMxQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hDLE9BQU8sR0FBRyxDQUFDO2FBQ1o7U0FDRjtRQUVELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDOzsyR0E1L0JVLGNBQWM7K0ZBQWQsY0FBYyxxSkFJZCxnQkFBZ0IsZ0RDNUQ3Qixxbm5CQW1VQTsyRkQzUWEsY0FBYztrQkFMMUIsU0FBUzsrQkFDRSxXQUFXO3dXQUtaLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUM4QixVQUFVO3NCQUE3QyxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEZvcm1Db250cm9sLCBGb3JtQXJyYXksIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFwLCBkZWxheSwgbWFwLCBzd2l0Y2hNYXAsIGNvbmNhdE1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBFeGNlbEV4cG9ydERhdGEgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1leGNlbC1leHBvcnQnO1xyXG5pbXBvcnQgeyBHcmlkSXRlbSwgU2Nyb2xsTW9kZSwgU2VsZWN0YWJsZVNldHRpbmdzIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZ3JpZCc7XHJcbmltcG9ydCB7IFNvcnREZXNjcmlwdG9yLCBTdGF0ZSwgcHJvY2VzcyB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeVwiO1xyXG5pbXBvcnQgeyBUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItdG9vbHRpcCc7XHJcbmltcG9ydCB7XHJcbiAgR3JpZERhdGFSZXN1bHQsXHJcbiAgRGF0YVN0YXRlQ2hhbmdlRXZlbnQsXHJcbiAgUGFnZUNoYW5nZUV2ZW50LFxyXG4gIENlbGxDbGlja0V2ZW50LFxyXG4gIEdyaWRDb21wb25lbnQsXHJcbiAgUm93QXJncyxcclxuICBDb2x1bW5SZW9yZGVyRXZlbnRcclxufSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZ3JpZFwiO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG4vLyBpbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gXCJzcmMvZW52aXJvbm1lbnRzL2Vudmlyb25tZW50XCI7XHJcbmltcG9ydCB7IE1haW5TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL21haW4uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBaR3JpZEJpbmRpbmdEaXJlY3RpdmUgfSBmcm9tIFwiLi96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQge1xyXG4gIEF1dGhTZXJ2aWNlLCBXZWJBcGlTZXJ2aWNlLCBUb2FzdFNlcnZpY2UsIEdyaWRDYWNoaW5nLFxyXG4gIFpGaWVsZCwgWkdyb3VwLCBaQ29tcG9uZW50LCBaQ29tcG9uZW50UHJvcGVydGllcywgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50LCBaQ29yZVNlcnZpY2UsXHJcbiAgWkdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLCBaR3JpZFBvc3RBcGlQYXJhbXMsIFpHcmlkU2V0dGluZ3MsIFpHcmlkQ29sdW1uU2V0dGluZ3MsIFpHcmlkQ3VzdG9tQ29sdW1uLCBTdG9yYWdlU2Vzc2lvblNlcnZpY2VcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgWkdyaWQge1xyXG4gIHBhcmFtczogWkdyaWRQb3N0QXBpUGFyYW1zO1xyXG4gIHN0YXRlOiBTdGF0ZTtcclxuICBjb2x1bW5zOiBhbnlbXTtcclxuICBwYWdpbmF0aW9uQXBpUG9zdFVybDogc3RyaW5nO1xyXG4gIGRhdGE6IFpGaWVsZDtcclxuICBncm91cDogWkdyb3VwO1xyXG4gIHpncmlkOiBaR3JpZEJpbmRpbmdEaXJlY3RpdmU7XHJcbiAgaW5saW5lRWRpdGVkRm9ybUdyb3VwczogRm9ybUdyb3VwO1xyXG4gIGdldEdyaWREYXRhOiAoKSA9PiBhbnlbXTtcclxuICBnZXREYXRhOiAoKSA9PiB2b2lkO1xyXG4gIGNsZWFyRGF0YTogKCkgPT4gdm9pZDtcclxuICBzZXREYXRhOiAoZGF0YTogYW55KSA9PiB2b2lkO1xyXG4gIHNldENvbHVtbnM6IChjb2x1bW5GaWVsZHNOYW1lOiBzdHJpbmcsIGNvbHVtbnM6IEFycmF5PFpHcmlkQ3VzdG9tQ29sdW1uPikgPT4gdm9pZDtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXpncmlkXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi96Z3JpZC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi96Z3JpZC5jb21wb25lbnQuc2Nzc1wiXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgWmdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgZGF0YTogWkZpZWxkO1xyXG4gIEBJbnB1dCgpIGdyb3VwOiBaR3JvdXA7XHJcbiAgQElucHV0KCkgZm9ybTogRm9ybUdyb3VwO1xyXG4gIEBWaWV3Q2hpbGQoVG9vbHRpcERpcmVjdGl2ZSkgcHVibGljIHRvb2x0aXBEaXI6IFRvb2x0aXBEaXJlY3RpdmU7XHJcbiAgLy8gQFZpZXdDaGlsZChaR3JpZEJpbmRpbmdEaXJlY3RpdmUsIHsgc3RhdGljOiBmYWxzZSB9KSB6Z3JpZDogWkdyaWRCaW5kaW5nRGlyZWN0aXZlO1xyXG4gIHpncmlkOiBhbnkgPSBudWxsO1xyXG4gIG9hdXRoVXJsOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBwdWJsaWMgc2Nyb2xsTW9kZTogU2Nyb2xsTW9kZTtcclxuICBncmlkRGF0YTogR3JpZERhdGFSZXN1bHQ7XHJcbiAgc2VsZWN0YWJsZVNldHRpbmdzOiBTZWxlY3RhYmxlU2V0dGluZ3M7XHJcbiAgbXlTZWxlY3Rpb246IGFueVtdID0gW107XHJcbiAgaW5saW5lRWRpdGVkRm9ybUdyb3VwczogRm9ybUdyb3VwO1xyXG4gIHB1YmxpYyBmb3JtR3JvdXA6IEZvcm1Hcm91cDsgLy8gZm9yIGtlbmRvIGdyaWQgYnVpbHQtaW5cclxuICBwdWJsaWMgcHJldmlvdXNOZXh0OiBib29sZWFuO1xyXG5cclxuICBjb21wb25lbnRQcm9wZXJ0aWVzID0gbmV3IFpDb21wb25lbnRQcm9wZXJ0aWVzKCk7XHJcblxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24sIG5vLXVuZGVyc2NvcmUtZGFuZ2xlLCBpZC1ibGFja2xpc3QsIGlkLW1hdGNoXHJcbiAgX3N0YXRlOiBTdGF0ZSA9IHtcclxuICAgIHNraXA6IDAsXHJcbiAgICB0YWtlOiAxMFxyXG4gIH07XHJcblxyXG4gIHBhcmFtczogWkdyaWRQb3N0QXBpUGFyYW1zID0ge1xyXG4gICAgcmVmZXJJZDogbnVsbCxcclxuICAgIHBhZ2VObzogMCxcclxuICAgIHBhZ2VTaXplOiAyMCxcclxuICAgIHNvcnRDb2x1bW5OYW1lOiBcIlwiLFxyXG4gICAgc29ydE9yZGVyOiBcIlwiLFxyXG4gICAgc29ydENvbHVtbk5hbWVzOiBbXSxcclxuICAgIHNvcnRPcmRlcnM6IFtdLFxyXG4gICAgZmlsdGVyUGFyYW1zOiBbXSxcclxuICAgIHBhcmFtZXRlcnM6IFwiXCIsXHJcbiAgICBmaWx0ZXJzOiBcIlwiLFxyXG4gICAgY29sdW1uczogXCJcIixcclxuICAgIGdyYW50VHlwZTogNFxyXG4gIH07XHJcblxyXG4gIGdyaWRTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcblxyXG4gIHByaXZhdGUgd2lkdGhSZWR1Y2U6IG51bWJlcjtcclxuICBwcml2YXRlIGhlaWdodFJlZHVjZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgZ0RhdGE6IGFueTtcclxuXHJcbiAgY29sdW1uczogYW55W107XHJcbiAgZWRpdGFibGVDb2x1bW5zOiBhbnlbXTtcclxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwYWdlU2l6ZXM6IGJvb2xlYW4gfCBhbnlbXTtcclxuICBpc0xvYWRpbmc6IGJvb2xlYW47XHJcbiAgZ3JpZFN0b3JhZ2VLZXk6IHN0cmluZztcclxuICBncmlkRGVmYXVsdFN0YXRlRXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc05ldzogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBlZGl0ZWRSb3dJbmRleDogbnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHdlYkFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZTogWkdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgemNvcmVTZXJ2aWNlOiBaQ29yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1haW5TZXJ2aWNlOiBNYWluU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5vYXV0aFVybCA9IHRoaXMuemNvcmVTZXJ2aWNlLmdldEVudmlyb25tZW50KCkuZTFPYXV0aFVybCArIFwiL1wiO1xyXG4gICAgdGhpcy5hbGxSZXN1bHRzID0gdGhpcy5hbGxSZXN1bHRzLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLnJlZnJlc2hEYXRhID0gdGhpcy5yZWZyZXNoRGF0YS5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5jbGVhckRhdGEgPSB0aGlzLmNsZWFyRGF0YS5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5zYXZlR3JpZFNldHRpbmdzID0gdGhpcy5zYXZlR3JpZFNldHRpbmdzLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLnJlc3RvcmVHcmlkU2V0dGluZ3MgPSB0aGlzLnJlc3RvcmVHcmlkU2V0dGluZ3MuYmluZCh0aGlzKTtcclxuICB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0Q29tcG9uZW50UHJvcGVydGllcyh0aGlzKTtcclxuICAgIFpDb21wb25lbnRIZWxwZXIucmVnaXN0ZXJDb21wb25lbnQodGhpcyk7XHJcblxyXG4gICAgLy8gR3JpZCBzYXZlZCBzZXR0aW5nIGtleShVc2VkIGluIENvb2tpZVN0b3JlICYgTG9jYWxTdG9yYWdlKVxyXG4gICAgdGhpcy5ncmlkU3RvcmFnZUtleSA9ICdpb25pYy1maWVsZDo6JyArIHRoaXMuYXV0aFNlcnZpY2UuZTFUb2tlbi51c2VyTmFtZSArICc6OicgKyB0aGlzLmRhdGEuTmFtZSArICc6OicgKyB0aGlzLnJvdXRlci51cmw7XHJcblxyXG4gICAgb2YodHJ1ZSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgLy9jb25jYXRNYXAoKCkgPT4ge1xyXG4gICAgICAgIC8vICAvLyB0cnkgZ2V0IGdyaWRzZXR0aW5nIGZyb20gY29va2llc3RvcmVcclxuICAgICAgICAvLyAgcmV0dXJuIHRoaXMubWFpblNlcnZpY2UuY29va2llU3RvcmVHZXQodGhpcy5ncmlkU3RvcmFnZUtleSwgdGhpcy5hdXRoU2VydmljZS5lMVRva2VuLmFjY2Vzc190b2tlbik7XHJcbiAgICAgICAgLy99KSxcclxuICAgICAgICAvL3N3aXRjaE1hcChzYXZlZEdyaWRDYWNoZSA9PiB7XHJcbiAgICAgICAgLy8gIGlmIChzYXZlZEdyaWRDYWNoZSkgeyAgXHJcbiAgICAgICAgLy8gICAgLy8gS2VlcCB0aGUgZ3JpZFNldHRpbmcgZnJvbSBjb29raWVzdG9yZSB0byBsb2NhbFN0b3JhZ2VcclxuICAgICAgICAvLyAgICB0aGlzLnpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZS5zZXQodGhpcy5ncmlkU3RvcmFnZUtleSwgc2F2ZWRHcmlkQ2FjaGUpO1xyXG4gICAgICAgIC8vICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAvLyAgfVxyXG4gICAgICAgIC8vICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgICAgIC8vfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIC8vIEdyaWQgZGVmYXVsdCBzZXR0aW5nXHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcclxuICAgICAgICAgIHRoaXMud2lkdGhSZWR1Y2UgPSB0aGlzLmRhdGEuV2lkdGhSZWR1Y2UgfHwgNjA7XHJcbiAgICAgICAgICB0aGlzLmhlaWdodFJlZHVjZSA9IHRoaXMuZGF0YS5IZWlnaHRSZWR1Y2UgfHwgNTYwO1xyXG4gICAgICAgICAgdGhpcy5fc3RhdGUudGFrZSA9IHRoaXMuZGF0YS5QYWdlU2l6ZSB8fCAyMDtcclxuICAgICAgICAgIHRoaXMucGFnZVNpemVzID0gWzIwLCA1MCwgMTAwLCAyMDAsIDUwMF07XHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzTmV4dCA9IHRoaXMuZGF0YVsnRW5hYmxlUHJldmlvdXNOZXh0QnV0dG9uJ10gfHwgZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnNjcm9sbE1vZGUgPSB0aGlzLmRhdGFbJ1Njcm9sbE1vZGUnXSA/IHRoaXMuZGF0YVsnU2Nyb2xsTW9kZSddIDogJ3ZpcnR1YWwnO1xyXG5cclxuICAgICAgICAgIC8vIFtNb2JpbGVdIERpc2FibGUgUGFnZVNpemVcclxuICAgICAgICAgIGlmICh0aGlzLmRhdGEuUGFnZVNpemVzID09PSBmYWxzZSB8fCBaQ29tcG9uZW50SGVscGVyLmlzTW9iaWxlU2NyZWVuKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZXMgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBHcmlkIFNlbGVjdGlvbiBjb2x1bW5cclxuICAgICAgICAgIGlmICh0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGFibGVTZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgICAvLyBjaGVja2JveE9ubHk6IHRoaXMuY2hlY2tib3hPbmx5LFxyXG4gICAgICAgICAgICAgIG1vZGU6IHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zID09PSAnc2luZ2xlJyA/ICdzaW5nbGUnIDogJ211bHRpcGxlJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGJpbmQgdGhpcyB0byBncm91cCB1c2luZyBHcmlkIHZhbHVlXHJcbiAgICAgICAgICBpZiAodGhpcy5kYXRhLlZhbHVlLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyaWRWYWx1ZSA9IHRoaXMuZGF0YS5WYWx1ZS5zbGljZSg2KTtcclxuICAgICAgICAgICAgdGhpcy5ncm91cFtncmlkVmFsdWVdID0gdGhpcztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBjbGVhciBhbnkgU3Vic2NyaXB0aW9uXHJcbiAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBpZiBubyBSZXNvdXJjZVVSTCwgc3RpbGwgZ2VuZXJhdGUgQ29sdW1uIGZpcnN0LCB0aGVuIGluc2VydCBncmlkIGRhdGEgdXNpbmcgRGF0YVNvdXJjZVxyXG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuUmVzb3VyY2VVUkwpIHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLkRhdGFTb3VyY2UgJiYgdGhpcy5kYXRhLlNraXBEaXJlY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuRGF0YVNvdXJjZSxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YShkcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBzdWJzY3JpYmUgdG8gc2V0IGdyaWQgc2V0dGluZyBmcm9tIGRpcmVjdGl2ZSB0byBjb21wb25lbnRcclxuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5ncmlkU3ViamVjdC5zdWJzY3JpYmUoZ3JpZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuemdyaWQgPSBncmlkO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHRoaXMuemdyaWQuc3RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuemdyaWQuZ3JpZENvbHVtbnM7XHJcbiAgICAgICAgICAgIC8vdGhpcy5jb2x1bW5zWydyZXNpemFibGUnXSA9ICdmYWxzZSc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnpncmlkKSB7IFxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLnpncmlkLmdyaWQuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnpncmlkLmdyaWQuZGF0YS50b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnpncmlkLmdyaWQuZGF0YS50b3RhbCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy56Z3JpZC5ncmlkLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHMoKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy56Z3JpZC5ncmlkWydwYWdlU2l6ZSddKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIDAgaW5zdGVhZCBvZiB1bmRlZmluZWQuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnpncmlkLmdyaWRbJ3BhZ2VTaXplJ10gPSAyMDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIENoZWNrIEdyaWQgc2V0dGluZyBleGlzdCBpbiBsb2NhbHN0b3JhZ2VcclxuICAgICAgICAgIHRoaXMuc3RhdGVFeGlzdCgpO1xyXG5cclxuICAgICAgICAgIC8vIFNldCBGaWx0ZXIgU2Vzc2lvbktleVxyXG4gICAgICAgICAgaWYgKHRoaXMuZGF0YVsnU2F2ZUZpbHRlciddKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0R3JpZFNlc3Npb25LZXkodGhpcy5ncm91cCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZ3JpZENhbGxiYWNrKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qIFN0YXJ0IEdyaWQgU3RhdGUgKHBhZ2luYXRpb24sIHNvcnRhYmxlLCBmaWx0ZXIsIG9yZGVyaW5nKSAqL1xyXG4gIGdldCBzdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGVFeGlzdCgpIHtcclxuICAgIGNvbnN0IHVzZXJHcmlkU3RhdGUgPSB0aGlzLnpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZS5nZXQodGhpcy5ncmlkU3RvcmFnZUtleSk7XHJcblxyXG4gICAgaWYgKHVzZXJHcmlkU3RhdGUpIHtcclxuICAgICAgdGhpcy5ncmlkRGVmYXVsdFN0YXRlRXhpc3QgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZ3JpZERlZmF1bHRTdGF0ZUV4aXN0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGF0YVN0YXRlQ2hhbmdlKHN0YXRlOiBEYXRhU3RhdGVDaGFuZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuemdyaWQpIHtcclxuICAgICAgdGhpcy56Z3JpZC5kYXRhU3RhdGVDaGFuZ2Uoc3RhdGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YSA9IHByb2Nlc3ModGhpcy5nRGF0YSwgc3RhdGUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9scygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbHRlcmFibGUodmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzb3J0YWJsZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvY2tlZChjb2xTZXR0aW5nOiBhbnkpIHtcclxuICAgIGlmIChjb2xTZXR0aW5nWydwaW5uZWRMZWZ0J10gPT0gdHJ1ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qIEVuZCBHcmlkIFN0YXRlIChwYWdpbmF0aW9uLCBzb3J0YWJsZSwgZmlsdGVyLCBvcmRlcmluZykgKi9cclxuXHJcbiAgLyogU3RhcnQgR3JpZCBTdHlsaW5nLCBEaXNwbGF5ICovXHJcbiAgcHVibGljIGdldEdyaWRTdHlsZSgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIFwiaGVpZ2h0LnB4XCI6IHRoaXMuZ2V0R3JpZEhlaWdodCgpLCAvLyB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLmhlaWdodFJlZHVjZSwgLy8gNDUwLFxyXG4gICAgICBcIndpZHRoLnB4XCI6IHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy53aWR0aFJlZHVjZVxyXG4gICAgfTsgLy8gXCJ3aWR0aC5weFwiOiB0aGlzLmlubmVyV2lkdGggLSAzNVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRHcmlkSGVpZ2h0KCkge1xyXG4gICAgY29uc3QgZ3JpZEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuaGVpZ2h0UmVkdWNlO1xyXG4gICAgcmV0dXJuIChncmlkSGVpZ2h0IDwgMjUwKSA/IDI1MCA6IGdyaWRIZWlnaHQ7XHJcbiAgICAvLyBjb25zdCB2ID0gWkNvbXBvbmVudEhlbHBlci5pc01vYmlsZVNjcmVlbigpO1xyXG4gICAgLy8gaWYodil7XHJcbiAgICAvLyAgIGNvbnN0IGggPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLmhlaWdodFJlZHVjZTtcclxuICAgIC8vICAgcmV0dXJuIChoIDwgMjUwKSA/IDI1MCA6IGg7XHJcbiAgICAvLyB9ZWxzZXtcclxuICAgIC8vICAgcmV0dXJuIFwiYXV0b1wiO1xyXG4gICAgLy8gfSBcclxuICB9XHJcbiAgLyogRW5kIEdyaWQgU3R5bGluZywgRGlzcGxheSAqL1xyXG5cclxuXHJcbiAgLyogU3RhcnQgR3JpZCBDb2x1bW5zICovXHJcbiAgcHVibGljIGlzU2VsZWN0T3B0aW9uKCkge1xyXG4gICAgbGV0IHNlbGVjdE9wdGlvbkV4aXN0ID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5zZWxlY3RhYmxlU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgY2hlY2tib3hPbmx5OiBmYWxzZSxcclxuICAgICAgICBtb2RlOiAodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMgPT0gXCJtdWx0aXBsZVwiKSA/IFwibXVsdGlwbGVcIiA6IFwic2luZ2xlXCJcclxuICAgICAgfTtcclxuICAgICAgc2VsZWN0T3B0aW9uRXhpc3QgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdE9wdGlvbkV4aXN0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENvbHVtbnMoY29sdW1uTmFtZTogc3RyaW5nLCBjb2x1bW5zOiBBcnJheTxaR3JpZEN1c3RvbUNvbHVtbj4pIHtcclxuICAgIHRoaXMuZ3JvdXBbY29sdW1uTmFtZV0gPSB0aGlzLndyYXBDb2x1bW5OYW1lc0luRmllbGRFbGVtZW50KGNvbHVtbnMpO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdyYXBDb2x1bW5OYW1lc0luRmllbGRFbGVtZW50KGNvbHVtbkxpc3Q6IEFycmF5PFpHcmlkQ3VzdG9tQ29sdW1uPikge1xyXG4gICAgcmV0dXJuIG9mKGNvbHVtbkxpc3QubWFwKGMgPT4ge1xyXG4gICAgICBjb25zdCBpc0hpZGRlbjogYm9vbGVhbiA9IGMuSGlkZGVuO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIE5hbWU6IGMuTmFtZSxcclxuICAgICAgICBWYWx1ZTogYy5Db2RlLFxyXG4gICAgICAgIFR5cGU6IGMuVHlwZSxcclxuICAgICAgICBncmlkQ29sVmlzaWJsZTogIWlzSGlkZGVuLFxyXG4gICAgICAgIHdpZHRoOiAxMDAgKyBjLk5hbWUubGVuZ3RoICogNCxcclxuICAgICAgICBlbmFibGVGaWx0ZXJpbmc6IGZhbHNlLFxyXG4gICAgICAgIGVuYWJsZVNvcnRpbmc6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlUGlubmluZzogdHJ1ZSxcclxuICAgICAgICBEaXZDbGFzczogXCJjb2wteHMtMTIgY29sLXNtLTZcIixcclxuICAgICAgICBJc0VkaXRhYmxlSW5HcmlkOiBjLkVkaXRhYmxlXHJcbiAgICAgIH07XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlR3JpZENvbHVtbnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGdyaWRTZXR0aW5nID0gdGhpcy5nZXRHcmlkU2V0dGluZ3MoKTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5GaWVsZHMkOiBPYnNlcnZhYmxlPGFueT4gPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgIHRoaXMuZGF0YS5Db2x1bW5GaWVsZHMsXHJcbiAgICAgIHRoaXMuZ3JvdXBcclxuICAgICk7XHJcbiAgICBpZiAoIXRoaXMuZGF0YS5Db2x1bW5GaWVsZHMpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkL0VtcHR5IGdyaWQoJyArIHRoaXMuZGF0YS5OYW1lICsgJykgY29sdW1uRmllbGQnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb2x1bW5GaWVsZHMkLnBpcGUoXHJcbiAgICAgIHRhcChkYXRhID0+IHtcclxuICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZC9FbXB0eSBncmlkKCcgKyB0aGlzLmRhdGEuTmFtZSArICcpIGRhdGEgdG8gZ2VuZXJhdGUgY29sdW1uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHRoaXMuZGF0YVsnRmllbGRFbGVtZW50TmFtZSddO1xyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xyXG4gICAgICAgIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JpZENvbHVtbnMoZGF0YSxcclxuICAgICAgICAgIHRoaXMuY29sdW1ucyxcclxuICAgICAgICAgIHRoaXMuZ3JvdXAsXHJcbiAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLFxyXG4gICAgICAgICAgZmllbGROYW1lLFxyXG4gICAgICAgICAgZ3JpZFNldHRpbmcsXHJcbiAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgdGhpcy5kYXRhKTtcclxuICAgICAgfSksXHJcbiAgICAgIC8vc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgLy8gIC8vR2V0IFNlc3Npb25cclxuICAgICAgLy8gIHJldHVybiB0aGlzLmdldEdyaWRTZXNzaW9uRmlsdGVyKHRoaXMuZ3JwLCB0aGlzKTtcclxuICAgICAgLy99KSxcclxuICAgICAgLy9zd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAvLyAgLy9CZWZvcmUgZ2V0IGdyaWQgZGF0YVxyXG4gICAgICAvLyAgcmV0dXJuIHRoaXMuYmVmb3JlR3JpZEdldERhdGEodGhpcy5ncnAsIHRoaXMpO1xyXG4gICAgICAvL30pLFxyXG4gICAgICAvL3N3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgIC8vICAvL1NldCBncmlkIGRhdGFcclxuICAgICAgLy8gIHJldHVybiB0aGlzLnNldEdyaWRTZXNzaW9uRmlsdGVyKHRoaXMuZ3JwLCB0aGlzKTtcclxuICAgICAgLy99KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qIEVuZCBHcmlkIENvbHVtbnMgKi9cclxuXHJcbiAgcHJpdmF0ZSBlZGl0TW9kZWwoZGF0YUl0ZW06IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5FZGl0Q2xpY2tVUkwpIHtcclxuICAgICAgLy8gRWRpdCBpbmNlbGwgZmllbGRcclxuICAgICAgY29uc3QgY29sRmllbGRzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZGF0YS5Db2x1bW5GaWVsZHMsIHRoaXMuZ3JvdXApO1xyXG4gICAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogXCJ6Z3JpZC1jZWxsQ2xpY2tcIixcclxuICAgICAgICB0YXJnZXQ6IHRoaXMuZGF0YS5FZGl0Q2xpY2tVUkwsXHJcbiAgICAgICAgZGF0YTogZGF0YUl0ZW0sXHJcbiAgICAgICAgY29sdW1uRmllbGRzJDogY29sRmllbGRzXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBXaGVuIGNsaWNrZWQgcm91dGUgdG8gcGFnZVxyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5ncm91cC5lZGl0TW9kZWxVUkwsIGRhdGFJdGVtLklkLCAnZWRpdCddLCB7XHJcbiAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBncmlkQ2FsbGJhY2soZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YVsnQWZ0ZXJsb2FkQ2FsbGJhY2snXSkge1xyXG4gICAgICBjb25zdCBtZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMpO1xyXG5cclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiemdyaWQtQWZ0ZXJsb2FkQ2FsbGJhY2tcIixcclxuICAgICAgICB0YXJnZXQ6IHRoaXMuZGF0YVsnQWZ0ZXJsb2FkQ2FsbGJhY2snXSxcclxuICAgICAgICBkYXRhOiBtZVxyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGF0YSA9IChnRGF0YTogYW55KSA9PiB7XHJcbiAgICB0aGlzLmdyaWREYXRhID0ge1xyXG4gICAgICBkYXRhOiBnRGF0YSxcclxuICAgICAgdG90YWw6IChnRGF0YSA/IGdEYXRhLmxlbmd0aCA6IDApXHJcbiAgICB9O1xyXG4gICAgdGhpcy5nRGF0YSA9IGdEYXRhO1xyXG5cclxuICAgIGlmICh0aGlzLnpncmlkKSB7XHJcbiAgICAgIHRoaXMuemdyaWQuZ3JpZFsncGFnZVNpemUnXSA9IGdEYXRhLmxlbmd0aDsgLy8gc2V0IGdyaWQgc2l6ZVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghIXRoaXMuZGF0YS5TaG93UmVjb3JkTnVtYmVyKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWREYXRhLmRhdGEpIHtcclxuICAgICAgICB0aGlzLmdyaWREYXRhLmRhdGEuZm9yRWFjaCgoZCwgaSkgPT4ge1xyXG4gICAgICAgICAgZC5HcmlkTm8gPSBpICsgMTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdEYXRhKSB7XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpIHtcclxuICAgIGlmICh0aGlzLnpncmlkKSB7XHJcbiAgICAgIHRoaXMuemdyaWQuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLlNraXBEaXJlY3RpdmUpIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YSA9IHByb2Nlc3ModGhpcy5nRGF0YSwgdGhpcy5zdGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0R3JpZERhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nRGF0YTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybUNvbnRyb2wocm93SW5kZXg6IG51bWJlciwgcHJvcGVydHk6IHN0cmluZykge1xyXG4gICAgY29uc3QgZm9ybUFycmF5OiBGb3JtQXJyYXkgPSB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcclxuICAgIGNvbnN0IGZvcm1JdGVtID0gZm9ybUFycmF5LmF0KHJvd0luZGV4KTtcclxuXHJcbiAgICBpZiAoZm9ybUl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGZvcm1JdGVtLmdldChwcm9wZXJ0eSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZvcm1Db250cm9scygpIHtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgLy8gb25seSBjcmVhdGUgaWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBlZGl0YWJsZSBjb2x1bW5cclxuICAgICAgaWYgKHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5pc0VkaXRhYmxlSW5HcmlkKSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMgPSBuZXcgRm9ybUdyb3VwKHsgaXRlbXM6IG5ldyBGb3JtQXJyYXkoW10pIH0pO1xyXG5cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5ncmlkRGF0YS5kYXRhKSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZERhdGEuZGF0YS5mb3JFYWNoKGQgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB7fTtcclxuICAgICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgICAgICBpdGVtc1tjLmZpZWxkXSA9IG5ldyBGb3JtQ29udHJvbChkW2MuZmllbGRdKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChpdGVtcyk7XHJcbiAgICAgICAgICAoPEZvcm1BcnJheT50aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMuZ2V0KFwiaXRlbXNcIikpLnB1c2goZm9ybUdyb3VwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZUZvcm1Hcm91cChkYXRhSXRlbTogYW55LCBmaWVsZE5hbWU6IGFueSk6IEZvcm1Hcm91cCB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIFtmaWVsZE5hbWVdOiBkYXRhSXRlbVtmaWVsZE5hbWVdXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRHcm91cFZhbHVlKHZhbHVlOiBzdHJpbmcsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIHJldHVybiBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLlZhbHVlLCB0aGlzLmdyb3VwKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgcHVibGljIG9uQnRuQ2xpY2soZXZlbnQ6IGFueSwgY29sU2V0dGluZzogYW55LCByb3dEYXRhOiBhbnksIGNlbGxEYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMub25OYXZpZ2F0ZVRvKGV2ZW50LCBjb2xTZXR0aW5nLCByb3dEYXRhLCBjZWxsRGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2VsbENsaWNrSGFuZGxlcihldmVudDogQ2VsbENsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGRpc2FibGVBbGxDb2x1bW5DZWxsQ2xpY2tIYW5kbGVyID0gdGhpcy5kYXRhLkRpc2FibGVDZWxsQ2xpY2tIYW5kbGVyID8gdGhpcy5kYXRhLkRpc2FibGVDZWxsQ2xpY2tIYW5kbGVyIDogZmFsc2U7XHJcbiAgICBjb25zdCBpc0NvbW1hbmRDb2x1bW4gPSBldmVudC5jb2x1bW4uY29uc3RydWN0b3IubmFtZSA9PSAnQ29tbWFuZENvbHVtbkNvbXBvbmVudCcgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgaWYgKCFkaXNhYmxlQWxsQ29sdW1uQ2VsbENsaWNrSGFuZGxlciAmJiAhaXNDb21tYW5kQ29sdW1uKSB7XHJcbiAgICAgIGNvbnN0IGluQ2VsbEVkaXRhYmxlID0gdGhpcy5kYXRhLkluQ2VsbEVkaXRhYmxlID8gdGhpcy5kYXRhLkluQ2VsbEVkaXRhYmxlIDogZmFsc2U7XHJcbiAgICAgIGlmIChpbkNlbGxFZGl0YWJsZSkge1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihzID0+IHMuaXNFZGl0YWJsZUluRGF0YUl0ZW0gPT09IHRydWUpO1xyXG4gICAgICAgIGlmICghIXRoaXMuZWRpdGFibGVDb2x1bW5zKSB7XHJcbiAgICAgICAgICB0aGlzLmVkaXRhYmxlQ29sdW1ucy5tYXAocyA9PiBldmVudC5zZW5kZXIuZWRpdENlbGwoZXZlbnQucm93SW5kZXgsIGV2ZW50LmNvbHVtbkluZGV4LCB0aGlzLmNyZWF0ZUZvcm1Hcm91cChldmVudC5kYXRhSXRlbSwgcy5maWVsZCkpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJjZWxsQ2xpY2sgZXZlbnQ6IFwiLCBldmVudCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5Pbkl0ZW1DbGljaykge1xyXG4gICAgICAgICAgY29uc3QgZnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuT25JdGVtQ2xpY2spO1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGxGdW5jID0gZnVuYy5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgICAgICAgY2FsbEZ1bmMoZXZlbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lZGl0TW9kZWwoZXZlbnQuZGF0YUl0ZW0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZWRpdENlbGxDbG9zZUhhbmRsZXIoYXJnczogYW55KSB7XHJcbiAgICBjb25zdCB7IGZvcm1Hcm91cCwgZGF0YUl0ZW0gfSA9IGFyZ3M7XHJcbiAgICBpZiAoIWZvcm1Hcm91cC52YWxpZCkge1xyXG4gICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9IGVsc2UgaWYgKGZvcm1Hcm91cC5kaXJ0eSkge1xyXG4gICAgICB0aGlzLmVkaXRhYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIocyA9PiBzLmlzRWRpdGFibGVJbkRhdGFJdGVtID09PSB0cnVlKTtcclxuICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbnMubWFwKHMgPT5cclxuICAgICAgICBPYmplY3QuYXNzaWduKGRhdGFJdGVtLCB7IFtzLmZpZWxkXTogZm9ybUdyb3VwLnZhbHVlW3MuZmllbGRdIH0pKTtcclxuICAgICAgdGhpcy5teVNlbGVjdGlvbi5tYXAocyA9PiAocy5JZCA9PT0gZGF0YUl0ZW0uSWQpID8gT2JqZWN0LmFzc2lnbihzLCBkYXRhSXRlbSkgOiBudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgb25OYXZpZ2F0ZVRvKGV2ZW50OiBhbnksIGNsaWNrQWN0aW9uOiBhbnksIHJvd0RhdGE6IGFueSwgY2VsbERhdGE6IHN0cmluZykge1xyXG4gICAgLy8gZGVidWdnZXI7XHJcbiAgICAvLyBjb25zdCBuID0gY29sU2V0dGluZy5uYXZpZ2F0ZVRvLnJlcGxhY2UoJy86aWQnLCBjZWxsRGF0YSk7XHJcbiAgICBjb25zdCBuID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGNsaWNrQWN0aW9uLkNsaWNrKTtcclxuICAgIGlmIChuKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogJ3pncmlkLW9uTmF2aWdhdGVUbycsXHJcbiAgICAgICAgdGFyZ2V0OiBjbGlja0FjdGlvbi5DbGljayxcclxuICAgICAgICByb3dEYXRhOiByb3dEYXRhLFxyXG4gICAgICAgIGRhdGE6IGNlbGxEYXRhXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93VG9vbHRpcChlOiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgbGV0IGlzQ29tbWFuZENvbHVtbiA9IGZhbHNlO1xyXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgaWYgKGRhdGEgPT0gJ2stY29tbWFuZC1jZWxsJykge1xyXG4gICAgICAgIGlzQ29tbWFuZENvbHVtbiA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICgoKGVsZW1lbnQubm9kZU5hbWUgPT09ICdURCcgfHwgZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1RIJykgJiYgZWxlbWVudC5vZmZzZXRXaWR0aCA8IGVsZW1lbnQuc2Nyb2xsV2lkdGgpICYmICFpc0NvbW1hbmRDb2x1bW4pIHtcclxuICAgICAgdGhpcy50b29sdGlwRGlyLnRvZ2dsZShlbGVtZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnRvb2x0aXBEaXIuaGlkZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJvd1NlbGVjdGlvbktleShjb250ZXh0OiBSb3dBcmdzKTogYW55IHtcclxuICAgIHJldHVybiBjb250ZXh0LmRhdGFJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlbGVjdGVkVmFsdWVzKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5teVNlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoR3JpZChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICBjb25zdCBfZ3JpZE9wdGlvblNlZ21lbnQgPSBldmVudC50YXJnZXQudHJpbSgpLnNwbGl0KCcuJyk7XHJcbiAgICBjb25zdCBfZ3JpZE9wdGlvbiA9IF9ncmlkT3B0aW9uU2VnbWVudFsxXTtcclxuICAgIGlmIChfZ3JpZE9wdGlvbikge1xyXG4gICAgICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtfZ3JpZE9wdGlvbl0gYXMgWkdyaWQ7XHJcbiAgICAgIGlmICh6Z3JpZENvbnRyb2wpIHtcclxuICAgICAgICB6Z3JpZENvbnRyb2wuZ2V0RGF0YSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdVbmFibGUgdG8gZmluZCBncmlkIHZhbHVlOiAnICsgX2dyaWRPcHRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmxvZygnSW52YWxpZCByZWZyZXNoR3JpZCBldmVudDogJywgZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hEYXRhKCkge1xyXG4gICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJEYXRhKCkge1xyXG4gICAgdGhpcy56Z3JpZC5jbGVhckRhdGEoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWdobGlnaHRWYWx1ZShjb2wsIGNvbFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChjb2xbJ0NvbmRpdGlvbkhpZ2hsaWdodCddKSB7XHJcbiAgICAgIC8vZGVidWdnZXI7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWxsUmVzdWx0cygpOiBPYnNlcnZhYmxlPEV4Y2VsRXhwb3J0RGF0YT4ge1xyXG4gICAgY29uc3QgX3pncmlkQ29udHJvbCA9IHRoaXMuemdyaWQgYXMgWkdyaWQ7XHJcbiAgICBjb25zdCBfemdyaWRDb21wb25lbnQgPSB0aGlzLnpncmlkLmdyaWQgYXMgR3JpZENvbXBvbmVudDtcclxuICAgIGNvbnN0IF9kYXRhID0gX3pncmlkQ29tcG9uZW50LmRhdGEgYXMgR3JpZERhdGFSZXN1bHQ7XHJcblxyXG4gICAgY29uc3QgcGFnaW5hdGlvbkFwaVBvc3RVcmwgPSBfemdyaWRDb250cm9sLnBhZ2luYXRpb25BcGlQb3N0VXJsO1xyXG5cclxuICAgIC8vIE5lZWQgdG8gY2xvbmUsIGlmIG5vdCB3aWxsIGFmZmVjdCB0aGUgZ3JpZCBwYXJhbXMuXHJcbiAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnBhcmFtcyk7XHJcbiAgICBwYXJhbXMucGFnZU5vID0gMDtcclxuICAgIHBhcmFtcy5wYWdlU2l6ZSA9IF9kYXRhLnRvdGFsO1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKHBhZ2luYXRpb25BcGlQb3N0VXJsLCBwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBFeGNlbEV4cG9ydERhdGEgPSB7XHJcbiAgICAgICAgICBkYXRhOiBwcm9jZXNzKGRhdGEuZGF0YVNldCwge30pLmRhdGFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDbGFzcyhkYXRhSXRlbTogYW55LCBjb2w6IGFueSkge1xyXG4gICAgbGV0IG5nQ2xhc3MgPSBcImdyaWRDZWxsIFwiO1xyXG4gICAgaWYgKGNvbC5maWVsZFR5cGUgPT09ICdudW1iZXInIHx8IGNvbC5maWVsZFR5cGUgPT09ICdjdXJyZW5jeScgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ3pudW1lcmljJykge1xyXG4gICAgICBuZ0NsYXNzICs9IFwicmlnaHRBbGlnbmVkIFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhSXRlbVtjb2wuZmllbGQgKyAnX0NsYXNzJ10pIHtcclxuICAgICAgbmdDbGFzcyArPSBkYXRhSXRlbVtjb2wuZmllbGQgKyAnX0NsYXNzJ10gKyBcIiBcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sLkNsYXNzKSB7XHJcbiAgICAgIG5nQ2xhc3MgKz0gY29sLkNsYXNzICsgXCIgXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5nQ2xhc3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybWF0KGNvbDogYW55LCBkZWZhdWx0Rm9ybWF0PzogYW55KSB7XHJcbiAgICBsZXQgZm9ybWF0ID0gXCJcIjtcclxuICAgIGlmIChjb2wuRm9ybWF0T3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZvcm1hdCA9IGRlZmF1bHRGb3JtYXQgPyBkZWZhdWx0Rm9ybWF0IDogXCJcIjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGZvcm1hdEFyciA9IGNvbC5Gb3JtYXRPcHRpb25zLnNwbGl0KFwiLlwiKVxyXG4gICAgICBsZXQgZHAgPSAwO1xyXG5cclxuICAgICAgaWYgKGZvcm1hdEFyci5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgZHAgPSBmb3JtYXRBcnJbMV0ubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZHAgIT09IDApIHtcclxuICAgICAgICBmb3JtYXQgPSBcIjEuXCIgKyBkcCArIFwiLVwiICsgZHA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtYXQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIHNldEhlYWRlclRleHQoY29sdW1uTmFtZTogc3RyaW5nLCBuZXdIZWFkZXJUaXRsZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBncmlkQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcclxuICAgIGdyaWRDb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChjb2wuTmFtZSA9PT0gY29sdW1uTmFtZSkge1xyXG4gICAgICAgIGNvbC50aXRsZSA9IG5ld0hlYWRlclRpdGxlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRHcmlkSXNMb2FkaW5nKHRyaWdnZXJlZDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cmlnZ2VyZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0R3JpZFNlc3Npb25LZXkoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKGdyb3VwW1wiR3JpZFN0b3JhZ2VLZXlcIl0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGdyb3VwW1wiR3JpZFN0b3JhZ2VLZXlcIl0gPSAnemdyaWRfJyArIGdyb3VwLnJlc291cmNlVVJMICsgJ18nICsgdGhpcy5kYXRhLlZhbHVlICsgJzo6JyArIHRoaXMuYXV0aFNlcnZpY2UuZTFUb2tlbi51c2VyTmFtZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBHcmlkSXRlbSk6IGFueSB7XHJcbiAgICAvL2NvbnNvbGUubG9nKGl0ZW0uZGF0YVsnSWQnXSB8fCBpbmRleCk7XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICAvKiBHcmlkIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKi9cclxuICBwdWJsaWMgc2F2ZUdyaWRTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIGNvbnN0IF96Z3JpZENvbXBvbmVudCA9IHRoaXMuemdyaWQuZ3JpZCBhcyBHcmlkQ29tcG9uZW50O1xyXG4gICAgY29uc3QgX2NvbHVtbnMgPSBfemdyaWRDb21wb25lbnQuY29sdW1ucztcclxuXHJcbiAgICBvZih0aGlzLmNvbHVtbnMpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb25maWdWYWx1ZTogWkdyaWRDb2x1bW5TZXR0aW5nc1tdID0gX2NvbHVtbnMudG9BcnJheSgpLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgY29uc3QgX3pHcmlkQ29sdW1uU2V0dGluZ3M6IFpHcmlkQ29sdW1uU2V0dGluZ3MgPSBPYmplY3Qua2V5cyhpdGVtKVxyXG4gICAgICAgICAgICAgIC5maWx0ZXIocHJvcE5hbWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFwcm9wTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0ZW1wbGF0ZScpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAucmVkdWNlKChhY2MsIGN1cnIpID0+IChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgLi4uYWNjLFxyXG4gICAgICAgICAgICAgICAgICAuLi57IFtjdXJyXTogaXRlbVtjdXJyXSB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLCB7fSBhcyBaR3JpZENvbHVtblNldHRpbmdzKTtcclxuICAgICAgICAgICAgcmV0dXJuIF96R3JpZENvbHVtblNldHRpbmdzO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gcmVtb3ZlIGV4dHJhIGVsZW1lbnQgZm9ybSBhcnJheVxyXG4gICAgICAgICAgY29uZmlnVmFsdWUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIGl0ZW1bJ2hlYWRlclN0eWxlJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtWydfX25nQ29udGV4dF9fJ107XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBjb25zdCBncmlkU2V0dGluZzogWkdyaWRTZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgLy8gc3RhdGU6IHRoaXMuc3RhdGUsXHJcbiAgICAgICAgICAgIGNvbHVtbnNDb25maWc6IGNvbmZpZ1ZhbHVlXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIC8vIEZpbmQgYW55IHNldHRpbmcgZnJvbSBsb2NhbHN0b3JhZ2UgYW5kIHVwZGF0ZSwgaWYgbm90IGp1c3QgYWRkIGluLlxyXG4gICAgICAgICAgbGV0IF9hcnJHcmlkQ2FjaGluZzogR3JpZENhY2hpbmdbXSA9IHRoaXMuekdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLmdldCh0aGlzLmdyaWRTdG9yYWdlS2V5KTtcclxuICAgICAgICAgIGxldCBfZ3JpZENvbmZpZzogR3JpZENhY2hpbmcgPSBudWxsO1xyXG4gICAgICAgICAgaWYgKF9hcnJHcmlkQ2FjaGluZyAmJiBfYXJyR3JpZENhY2hpbmdbMF0pIHtcclxuICAgICAgICAgICAgX2dyaWRDb25maWcgPSBfYXJyR3JpZENhY2hpbmcuZmluZCh4ID0+IHhbJ2RhdGFGb3JtRmllbGRzJ10gPT09IHRoaXMuZ3JpZFN0b3JhZ2VLZXkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKF9ncmlkQ29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgX2dyaWRDb25maWcuZ3JpZFNldHRpbmdzID0gZ3JpZFNldHRpbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBfYXJyR3JpZENhY2hpbmcgPSBbXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIV9ncmlkQ29uZmlnKSB7XHJcbiAgICAgICAgICAgIF9ncmlkQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgIGRhdGFGb3JtRmllbGRzOiB0aGlzLmdyaWRTdG9yYWdlS2V5LFxyXG4gICAgICAgICAgICAgIGdyaWRTZXR0aW5nczogZ3JpZFNldHRpbmdcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIF9hcnJHcmlkQ2FjaGluZy5wdXNoKF9ncmlkQ29uZmlnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBfYXJyR3JpZENhY2hpbmc7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY29uY2F0TWFwKGdyaWRDYWNoZSA9PiB7XHJcbiAgICAgICAgICAvLyBTYXZlIGdyaWQgY2FjaGluZyB0byBsb2NhbHN0b3JhZ2VcclxuICAgICAgICAgIHRoaXMuekdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLnNldCh0aGlzLmdyaWRTdG9yYWdlS2V5LCBncmlkQ2FjaGUpO1xyXG4gICAgICAgICAgLy8gU2F2ZSB0byBDb29raWVTdG9yZVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWFpblNlcnZpY2UuY29va2llU3RvcmVQb3N0KHRoaXMuZ3JpZFN0b3JhZ2VLZXksIGdyaWRDYWNoZSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKHNhdmVkR3JpZENhY2hlID0+IHtcclxuICAgICAgICAgIC8vIGNoZWNrIGlzIHNhdmVkIHN0YXRlIGV4aXN0IHRvIGVuYWJsZS9oaWRlIHJlc3RvcmUgYnV0dG9uXHJcbiAgICAgICAgICB0aGlzLnN0YXRlRXhpc3QoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gQWxlcnRcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coJ0dyaWQgU2V0dGluZyBTYXZlZCcsIFwidG9wXCIsIHRydWUsIDIwMDAsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXN0b3JlR3JpZFNldHRpbmdzKCkge1xyXG4gICAgb2YodHJ1ZSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIC8vIENsZWFyIGxvY2Fsc3RvcmFnZSBncmlkIHNldHRpbmdcclxuICAgICAgICAgIHRoaXMuekdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLnJlbW92ZSh0aGlzLmdyaWRTdG9yYWdlS2V5KTtcclxuICAgICAgICAgIHJldHVybiBvZih0cnVlKVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAvLyBkZWxldGUgY29va2llc3RvcmUgZ3JpZFNldHRpbmcgYnkgc3RvcmFnZWtleSBhcyBuYW1lXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5tYWluU2VydmljZS5jb29raWVTdG9yZURlbGV0ZU11bHRpcGxlKHRoaXMuZ3JpZFN0b3JhZ2VLZXkpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNvbmNhdE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAvLyBVc2Ugb3JpZ2luYWwgY29sdW1uIHNldHRpbmdcclxuICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlR3JpZENvbHVtbnMoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gY2hlY2sgaXMgc2F2ZWQgc3RhdGUgZXhpc3RcclxuICAgICAgICAgIHRoaXMuc3RhdGVFeGlzdCgpO1xyXG4gICAgICAgICAgLy8gQWxlcnRcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coJ0dyaWQgU2V0dGluZyBSZXN0b3JlZCcsIFwidG9wXCIsIHRydWUsIDIwMDAsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0R3JpZFNldHRpbmdzKCk6IFpHcmlkQ29sdW1uU2V0dGluZ3NbXSB7XHJcbiAgICBjb25zdCBfc3RvcmFnZUtleSA9ICdpb25pYy1maWVsZDo6JyArIHRoaXMuYXV0aFNlcnZpY2UuZTFUb2tlbi51c2VyTmFtZSArICc6OicgKyB0aGlzLmRhdGEuTmFtZSArICc6OicgKyB0aGlzLnJvdXRlci51cmw7XHJcblxyXG4gICAgLy8gRmluZCBhbnkgc2V0dGluZyBmcm9tIGxvY2Fsc3RvcmFnZS4uXHJcbiAgICBsZXQgX2FyckdyaWRDYWNoaW5nOiBHcmlkQ2FjaGluZ1tdID0gdGhpcy56R3JpZFN0YXRlUGVyc2lzdGluZ1NlcnZpY2UuZ2V0KF9zdG9yYWdlS2V5KTtcclxuICAgIGlmIChfYXJyR3JpZENhY2hpbmcpIHtcclxuICAgICAgY29uc3QgX2dyaWRDYWNoaW5nOiBHcmlkQ2FjaGluZyA9IEpTT04ucGFyc2UoX2FyckdyaWRDYWNoaW5nWydWYWx1ZSddKTtcclxuICAgICAgaWYgKF9ncmlkQ2FjaGluZykge1xyXG4gICAgICAgIHJldHVybiBfZ3JpZENhY2hpbmcuZ3JpZFNldHRpbmdzLmNvbHVtbnNDb25maWcuc29ydCgoYSwgYikgPT4gYS5vcmRlckluZGV4IC0gYi5vcmRlckluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogSW5saW5lIHNldHRpbmcgKi9cclxuICBwdWJsaWMgZ2V0SW5saW5lRmllbGQodmFsdWU6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maW5kKHggPT4geC5WYWx1ZSA9PT0gdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldElubGluZUZvcm0ocm93SW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgZm9ybUFycmF5OiBGb3JtQXJyYXkgPSB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcclxuICAgIHJldHVybiBmb3JtQXJyYXkuYXQocm93SW5kZXgpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybUNvbnRyb2xEYXRhKHZhbHVlOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMudmFsdWUuaXRlbXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyogRXZlbnQgKi9cclxuICBwdWJsaWMgYmVmb3JlR3JpZEdldERhdGEoZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgY29uc29sZS53YXJuKFwiYmVmb3JlRGF0YUJpbmRpbmcgdHJpZ2dlcmVkXCIpO1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVHcmlkR2V0RGF0YSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVEYXRhQmluZGluZyBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVHcmlkR2V0RGF0YShncm91cCwgbWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEdyaWRTZXNzaW9uRmlsdGVyKGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGlmICghZ3JvdXBbXCJHcmlkU3RvcmFnZUtleVwiXSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IFN0b3JhZ2VLZXkgPSBncm91cFtcIkdyaWRTdG9yYWdlS2V5XCJdO1xyXG5cclxuICAgIGlmICh0aGlzLnN0b3JhZ2VTZXJ2aWNlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KFN0b3JhZ2VLZXkpXHJcbiAgICAgICAgLnRoZW4oZGF0YSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEudmFsdWUgfHwgZGF0YS52YWx1ZSA9PT0gXCJudWxsXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShkYXRhLnZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5maWx0ZXIgPSBKU09OLnBhcnNlKHJlc3VsdFtcIlN0YXRlRmlsdGVyXCJdKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gSlNPTi5wYXJzZShyZXN1bHRbXCJGaWx0ZXJQYXJhbXNcIl0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5maWx0ZXIuZmlsdGVycy5mb3JFYWNoKChzdGF0ZUZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHN0YXRlRmlsdGVyLmZpZWxkLmluY2x1ZGVzKCdVVEMnKSkge1xyXG4gICAgICAgICAgICAgICAgc3RhdGVGaWx0ZXIudmFsdWUgPSBuZXcgRGF0ZShzdGF0ZUZpbHRlci52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEdyaWRTZXNzaW9uRmlsdGVyKGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGlmICghZ3JvdXBbXCJHcmlkU3RvcmFnZUtleVwiXSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IFN0b3JhZ2VLZXkgPSBncm91cFtcIkdyaWRTdG9yYWdlS2V5XCJdO1xyXG5cclxuICAgIGxldCBsc3RHcmlkRmlsdGVyOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcblxyXG4gICAgaWYgKG1lLnN0YXRlLmZpbHRlciAmJiB0aGlzLnN0b3JhZ2VTZXJ2aWNlICYmIHRoaXMuZGF0YVsnU2F2ZUZpbHRlciddKSB7XHJcbiAgICAgIC8vbGlzdCBvZiBkYXRhIGZvciBTdGF0ZUZpbHRlciBhbmQgRmlsdGVyUGFyYW1zXHJcbiAgICAgIGxzdEdyaWRGaWx0ZXIgPSB7IFwiU3RhdGVGaWx0ZXJcIjogSlNPTi5zdHJpbmdpZnkobWUuc3RhdGUuZmlsdGVyKSwgXCJGaWx0ZXJQYXJhbXNcIjogSlNPTi5zdHJpbmdpZnkobWUucGFyYW1zLmZpbHRlclBhcmFtcykgfVxyXG4gICAgICAvL2NyZWF0ZSBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoU3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkobHN0R3JpZEZpbHRlcikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogQXZhaWxhYmxlIEZ1bmN0aW9ucyAqL1xyXG4gIHB1YmxpYyBzZXRFbmFibGUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSA9ICFzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUgPSBzdGF0dXM7XHJcbiAgICB0aGlzLmRhdGEuVmlzaWJsZSA9IHN0YXR1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRSZXF1aXJlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWQgPSBzdGF0dXM7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLmNoYW5nZVZhbGlkYXRvcihzdGF0dXMsIHRoaXMuZ3JvdXAsIHRoaXMuZGF0YS5WYWx1ZSwgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICB9XHJcblxyXG5cclxuICAvKiBvbmNoYW5nZSBFdmVudHMgKi9cclxuICBwdWJsaWMgZmlsdGVyQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnpncmlkKSB7XHJcbiAgICAgIHRoaXMuemdyaWQuZmlsdGVyQ2hhbmdlKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlKGV2ZW50OiBQYWdlQ2hhbmdlRXZlbnQpOiB2b2lkIHsgXHJcbiAgICBpZiAodGhpcy56Z3JpZCkge1xyXG4gICAgICB0aGlzLnpncmlkLnBhZ2VDaGFuZ2UoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNvcnRDaGFuZ2Uoc29ydDogU29ydERlc2NyaXB0b3JbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuemdyaWQpIHtcclxuICAgICAgdGhpcy56Z3JpZC5zb3J0Q2hhbmdlKHNvcnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGluQ2VsbENoZWNrQm94T25DaGFuZ2UoZXZlbnQ6IGFueSwgcm93SW5kZXg6IGFueSwgY29sdW1uOiBhbnkpIHtcclxuICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LmRldGFpbC5jaGVja2VkO1xyXG4gICAgdGhpcy5nRGF0YVtyb3dJbmRleF1bY29sdW1uLlZhbHVlXSA9IGlzQ2hlY2tlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb2x1bW5zT3JkZXJDaGFuZ2VkKGV2ZW50OiBDb2x1bW5SZW9yZGVyRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IF96Z3JpZENvbnRyb2wgPSB0aGlzLnpncmlkIGFzIFpHcmlkO1xyXG4gICAgY29uc3QgX3pncmlkQ29tcG9uZW50ID0gdGhpcy56Z3JpZC5ncmlkIGFzIEdyaWRDb21wb25lbnQ7XHJcbiAgICBjb25zdCBfZGF0YSA9IF96Z3JpZENvbXBvbmVudC5kYXRhIGFzIEdyaWREYXRhUmVzdWx0O1xyXG5cclxuICAgIGlmICh0aGlzLnpncmlkKSB7XHJcbiAgICAgIGNvbnN0IF96Z3JpZCA9IHRoaXMuemdyaWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyogZ3JpZCBjb21tYW5kIGhhbmRsZXIgKi9cclxuICBwdWJsaWMgYWRkSGFuZGxlcih7IHNlbmRlciB9KSB7XHJcbiAgICB0aGlzLmlzTmV3ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBjbG9zZSBhbnkgZXhpc3RpbmcgZWRpdG9yXHJcbiAgICB0aGlzLmNsb3NlRWRpdG9yKHNlbmRlcik7XHJcblxyXG4gICAgLy8gbG9vcCBhbGwgY29sdW1uIHRvIGdldCB2YWxpZGF0aW9uIGFuZCBjcmVhdGUgZm9ybSBjb250cm9sXHJcbiAgICBjb25zdCBjb2xGb3JtQ29udHJvbCA9IHt9O1xyXG4gICAgdGhpcy56Z3JpZC5ncmlkQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcclxuICAgICAgaWYgKGNvbC5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2wuVmFsaWRhdG9yUGF0dGVybikge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oY29sLlZhbGlkYXRvclBhdHRlcm4pKTtcclxuICAgICAgfSBcclxuXHJcbiAgICAgIGNvbEZvcm1Db250cm9sW2NvbC5WYWx1ZV0gPSBuZXcgRm9ybUNvbnRyb2wobnVsbCwgdmFsaWRhdG9ycyk7IFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc2V0IGZvcm0gY29udHJvbCBvYmplY3QgdG8gZm9ybSBncm91cFxyXG4gICAgdGhpcy5mb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKGNvbEZvcm1Db250cm9sKTtcclxuXHJcbiAgICAvLyBhZGQgdG8gZ3JpZCByb3dcclxuICAgIHNlbmRlci5hZGRSb3codGhpcy5mb3JtR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmVIYW5kbGVyKHsgc2VuZGVyLCByb3dJbmRleCwgZm9ybUdyb3VwLCBpc05ldyB9KTogdm9pZCB7XHJcbiAgICAvLyBnZXQgZ3JpZCBkYXRhLlxyXG4gICAgY29uc3QgZ3JpZEV4aXN0aW5nRGF0YSA9IHRoaXMuZ0RhdGEgPyB0aGlzLmdEYXRhIDogdGhpcy5ncmlkRGF0YSA/IHRoaXMuZ3JpZERhdGEuZGF0YSA6IFtdO1xyXG5cclxuICAgIC8vIGlmIHZhbGlkXHJcbiAgICBpZiAoZm9ybUdyb3VwLnZhbGlkKSB7XHJcbiAgICAgIC8vIGNoZWNrIGZvciBkdXBsaWNhdGUgVW5pcXVlS2V5XHJcbiAgICAgIGxldCB1bmlxdWVLZXlFeGlzdDogYm9vbGVhbjtcclxuICAgICAgY29uc3QgdW5pcXVlS2V5ID0gdGhpcy5kYXRhWydVbmlxdWVLZXknXTtcclxuICAgICAgaWYgKHVuaXF1ZUtleSkgeyBcclxuICAgICAgICBjb25zdCBmb3JtVW5pcXVlS2V5VmFsdWUgPSBmb3JtR3JvdXAudmFsdWVbdW5pcXVlS2V5XTtcclxuXHJcbiAgICAgICAgaWYgKGlzTmV3IHx8ICghaXNOZXcgJiYgKGdyaWRFeGlzdGluZ0RhdGFbcm93SW5kZXhdW3VuaXF1ZUtleV0gIT0gZm9ybVVuaXF1ZUtleVZhbHVlKSkpIHtcclxuICAgICAgICAgIC8vIGlmIG5ldy4uLlxyXG4gICAgICAgICAgLy8gaWYgZWRpdC4uLiBpZiBjdXJyZW50IGZpZWxkLCB1bmlxdWVrZXkgdmFsdWUgY2hhbmdlZC4gbmVlZCB0byBjaGVjay4gIFxyXG4gICAgICAgICAgZ3JpZEV4aXN0aW5nRGF0YS5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZGF0YVt1bmlxdWVLZXldID09PSBmb3JtVW5pcXVlS2V5VmFsdWUpIHtcclxuICAgICAgICAgICAgICB1bmlxdWVLZXlFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdW5pcXVlS2V5RXhpc3QpIHtcclxuICAgICAgICBpZiAoaXNOZXcpIHtcclxuICAgICAgICAgIC8vIGlmIG5ldywgcHVzaCB0byBkYXRhXHJcbiAgICAgICAgICBncmlkRXhpc3RpbmdEYXRhLnB1c2goZm9ybUdyb3VwLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBpZiBlZGl0LCB1cGRhdGUgZGF0YVxyXG4gICAgICAgICAgZ3JpZEV4aXN0aW5nRGF0YVtyb3dJbmRleF0gPSBmb3JtR3JvdXAudmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldERhdGEoZ3JpZEV4aXN0aW5nRGF0YSk7XHJcblxyXG4gICAgICAgIHNlbmRlci5jbG9zZVJvdyhyb3dJbmRleCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdygnRXJyb3Igb2NjdXI6IER1cGxpY2F0ZWQgdW5pcXVlIGZpZWxkIGVudHJ5LicsICd0b3AnLCB0cnVlLCAzMDAwLCAnZGFuZ2VyJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYW5jZWxIYW5kbGVyKHsgc2VuZGVyLCByb3dJbmRleCB9KSB7XHJcbiAgICAvLyBjYW5jZWwgYW55IGV4aXN0aW5nIGVkaXRvclxyXG4gICAgc2VuZGVyLmNsb3NlUm93KHJvd0luZGV4KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0SGFuZGxlcih7IHNlbmRlciwgcm93SW5kZXgsIGRhdGFJdGVtIH0pIHtcclxuICAgIHRoaXMuaXNOZXcgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBjbG9zZSBhbnkgZXhpc3RpbmcgZWRpdG9yXHJcbiAgICB0aGlzLmNsb3NlRWRpdG9yKHNlbmRlcik7XHJcbiAgICAgXHJcbiAgICAvLyBsb29wIGFsbCBjb2x1bW4gdG8gZ2V0IHZhbGlkYXRpb24gYW5kIGNyZWF0ZSBmb3JtIGNvbnRyb2wsIGFwcGVuZCBjdXJyZW50IHJvdyB2YWx1ZVxyXG4gICAgY29uc3QgY29sRm9ybUNvbnRyb2wgPSB7fTtcclxuICAgIHRoaXMuemdyaWQuZ3JpZENvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcbiAgICAgIGlmIChjb2wuSXNSZXF1aXJlZCkge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sLlZhbGlkYXRvclBhdHRlcm4pIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKGNvbC5WYWxpZGF0b3JQYXR0ZXJuKSk7XHJcbiAgICAgIH1cclxuICAgICAgIFxyXG4gICAgICBjb2xGb3JtQ29udHJvbFtjb2wuVmFsdWVdID0gbmV3IEZvcm1Db250cm9sKGRhdGFJdGVtW2NvbC5WYWx1ZV0sIHZhbGlkYXRvcnMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc2V0IGZvcm0gY29udHJvbCBvYmplY3QgdG8gZm9ybSBncm91cFxyXG4gICAgdGhpcy5mb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKGNvbEZvcm1Db250cm9sKTtcclxuXHJcbiAgICAvLyBzZXQgZ3JpZCByb3cgdG8gZWRpdFxyXG4gICAgdGhpcy5lZGl0ZWRSb3dJbmRleCA9IHJvd0luZGV4OyBcclxuICAgIHNlbmRlci5lZGl0Um93KHJvd0luZGV4LCB0aGlzLmZvcm1Hcm91cCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlSGFuZGxlcih7IHNlbmRlciwgZGF0YUl0ZW0gfSkge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmdldEl0ZW1JbmRleChkYXRhSXRlbSwgdGhpcy5nRGF0YSwgdGhpcy5kYXRhWydVbmlxdWVLZXknXSk7XHJcbiAgICB0aGlzLmdEYXRhLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgc2VuZGVyLmNhbmNlbENlbGwoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvc2VFZGl0b3IoZ3JpZCwgcm93SW5kZXggPSB0aGlzLmVkaXRlZFJvd0luZGV4KSB7XHJcbiAgICBncmlkLmNsb3NlUm93KHJvd0luZGV4KTtcclxuICAgIHRoaXMuZWRpdGVkUm93SW5kZXggPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmZvcm1Hcm91cCA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXRlbUluZGV4KGl0ZW06IGFueSwgZGF0YTogYW55W10sIGtleTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGRhdGEubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBpZiAoZGF0YVtpZHhdW2tleV0gPT09IGl0ZW1ba2V5XSkge1xyXG4gICAgICAgIHJldHVybiBpZHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG59XHJcbiIsIjwhLS1cclxuPGRpdiBzdHlsZT1cIm1hcmdpbjogMTBweFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIGstZm9ybVwiPlxyXG4gICAgICAgICAgPGZpZWxkc2V0PlxyXG4gICAgICAgICAgICA8bGVnZW5kPkJpbmRpbmcgdHlwZXM8L2xlZ2VuZD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImstZm9ybS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+QmluZCB0aGUgZGF0YSB0bzo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJiaW5kaW5nVHlwZVwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJtb2RlXCIgaWQ9XCJhcnJheVwiIHZhbHVlPVwiYXJyYXlcIiBjbGFzcz1cImstcmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VCaW5kaW5nVHlwZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJrLXJhZGlvLWxhYmVsXCIgZm9yPVwiYXJyYXlcIj5BcnJheSBvYmplY3Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiYmluZGluZ1R5cGVcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwibW9kZVwiIGlkPVwiZ3JpZERhdGFSZXN1bHRcIiB2YWx1ZT1cImdyaWREYXRhUmVzdWx0XCIgY2xhc3M9XCJrLXJhZGlvXCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlQmluZGluZ1R5cGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiay1yYWRpby1sYWJlbFwiIGZvcj1cImdyaWREYXRhUmVzdWx0XCI+R3JpZERhdGFSZXN1bHQgb2JqZWN0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImJpbmRpbmdUeXBlXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm1vZGVcIiBpZD1cImFzeW5jXCIgdmFsdWU9XCJhc3luY1wiIGNsYXNzPVwiay1yYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUJpbmRpbmdUeXBlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImstcmFkaW8tbGFiZWxcIiBmb3I9XCJhc3luY1wiPkFzeW5jaHJvbm91cyBzb3VyY2U8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZmllbGRzZXQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4gLS0+XHJcbjxkaXYgc3R5bGU9XCJtYXJnaW46IDEwcHggMCA2cHggMDtcIj5cclxuICA8ZGl2ICpuZ0lmPVwiZGF0YS5UaXRsZVwiIGNsYXNzPVwiZ3JpZFRpdGxlXCI+e3tkYXRhLlRpdGxlfX08L2Rpdj5cclxuICA8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGxldC1hbmNob3I+XHJcbiAgICA8c3Bhbj57eyBhbmNob3IubmF0aXZlRWxlbWVudC5pbm5lclRleHQgfX08L3NwYW4+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuICA8ZGl2IGtlbmRvVG9vbHRpcFxyXG4gICAgICAgc2hvd09uPVwibm9uZVwiXHJcbiAgICAgICBbdG9vbHRpcFRlbXBsYXRlXT1cInRlbXBsYXRlXCJcclxuICAgICAgIGZpbHRlcj1cIi5rLWdyaWQgdGRcIlxyXG4gICAgICAgKG1vdXNlb3Zlcik9XCJzaG93VG9vbHRpcCgkZXZlbnQpXCI+IFxyXG4gICAgPGtlbmRvLWdyaWQgW3pncmlkYmluZGluZ109XCJ7ZGF0YTogZGF0YSwgZ3JvdXA6IGdyb3VwLCBwYXJhbXM6IHBhcmFtcywgZ3JpZFN1YmplY3Q6IGdyaWRTdWJqZWN0fVwiIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgW2RhdGFdPVwiZ3JpZERhdGFcIlxyXG4gICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cInN0YXRlLnRha2VcIlxyXG4gICAgICAgICAgICAgICAgW3BhZ2VhYmxlXT1cIntyZXNwb25zaXZlOiB0cnVlLCBidXR0b25Db3VudDogMywgcGFnZVNpemVzOiBwYWdlU2l6ZXMsIHByZXZpb3VzTmV4dDogcHJldmlvdXNOZXh0fVwiXHJcbiAgICAgICAgICAgICAgICBbc2tpcF09XCJzdGF0ZS5za2lwXCJcclxuICAgICAgICAgICAgICAgIFtzb3J0XT1cInN0YXRlLnNvcnRcIlxyXG4gICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cInthbGxvd1Vuc29ydDogdHJ1ZSxtb2RlOiAnbXVsdGlwbGUnfVwiXHJcbiAgICAgICAgICAgICAgICBbZmlsdGVyXT1cInN0YXRlLmZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJkYXRhLmVuYWJsZUZpbHRlcmluZyAhPT0gZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW3Jlc2l6YWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtyZW9yZGVyYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtjb2x1bW5NZW51XT1cImRhdGEuRGlzYWJsZUdyaWRDb2x1bW5NZW51ID8gZmFsc2UgOiB7IGZpbHRlcjogdHJ1ZSB9XCJcclxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiISghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKVwiXHJcbiAgICAgICAgICAgICAgICAoY2VsbENsaWNrKT1cImNlbGxDbGlja0hhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoY2VsbENsb3NlKT1cImVkaXRDZWxsQ2xvc2VIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGRhdGFTdGF0ZUNoYW5nZSk9XCJkYXRhU3RhdGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJwYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKHNvcnRDaGFuZ2UpPVwic29ydENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChmaWx0ZXJDaGFuZ2UpPVwiZmlsdGVyQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGNvbHVtblJlb3JkZXIpPVwiY29sdW1uc09yZGVyQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtrZW5kb0dyaWRTZWxlY3RCeV09XCJyb3dTZWxlY3Rpb25LZXlcIlxyXG4gICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVNldHRpbmdzXCJcclxuICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWRLZXlzKV09XCJteVNlbGVjdGlvblwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRHcmlkU3R5bGUoKVwiXHJcbiAgICAgICAgICAgICAgICBbdHJhY2tCeV09XCJ0cmFja0J5XCJcclxuICAgICAgICAgICAgICAgIChjYW5jZWwpPVwiY2FuY2VsSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChzYXZlKT1cInNhdmVIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKHJlbW92ZSk9XCJyZW1vdmVIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGVkaXQpPVwiZWRpdEhhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoYWRkKT1cImFkZEhhbmRsZXIoJGV2ZW50KVwiPlxyXG4gICAgICA8IS0tW3Njcm9sbGFibGVdPVwic2Nyb2xsTW9kZVwiIHRlbXAgcmVtb3ZlLiBjYXVzaW5nIHNvbWUgYnVnIG9uIHBhZ2luYXRpb24tLT5cclxuICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZFRvb2xiYXJUZW1wbGF0ZSAqbmdJZj1cImRhdGEuQWxsb3dSZWZyZXNoQnV0dG9uIHx8IGRhdGEuQWxsb3dFeHBvcnQgfHwgZGF0YS5BbGxvd1NhdmVTdGF0ZSB8fCBkYXRhLkVuYWJsZUdyaWRDb21tYW5kXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIga2VuZG9CdXR0b24gKGNsaWNrKT1cInJlZnJlc2hEYXRhKClcIiAqbmdJZj1cImRhdGEuQWxsb3dSZWZyZXNoQnV0dG9uXCI+PHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXJlZnJlc2gtc21cIj48L3NwYW4+Jm5ic3A7UmVmcmVzaDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvR3JpZEV4Y2VsQ29tbWFuZCAqbmdJZj1cImRhdGEuQWxsb3dFeHBvcnRcIj48c3BhbiBjbGFzcz1cImstaWNvbiBrLWktZmlsZS1leGNlbFwiPjwvc3Bhbj4mbmJzcDtFeHBvcnQgRGF0YSB0byBFeGNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvQnV0dG9uIChjbGljayk9XCJzYXZlR3JpZFNldHRpbmdzKClcIiAqbmdJZj1cImRhdGEuQWxsb3dTYXZlU3RhdGVcIj48c3BhbiBjbGFzcz1cImstaWNvbiBrLWktc3RhclwiPjwvc3Bhbj4mbmJzcDtTYXZlIFNldHRpbmc8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0J1dHRvbiAoY2xpY2spPVwicmVzdG9yZUdyaWRTZXR0aW5ncygpXCIgKm5nSWY9XCJncmlkRGVmYXVsdFN0YXRlRXhpc3RcIj48c3BhbiBjbGFzcz1cImstaWNvbiBrLWktc3Rhci1vdXRsaW5lXCI+PC9zcGFuPiZuYnNwO1Jlc3RvcmUgU2V0dGluZzwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvR3JpZEFkZENvbW1hbmQgKm5nSWY9XCJkYXRhLkVuYWJsZUdyaWRDb21tYW5kIFwiPjxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1hZGRcIj48L3NwYW4+QWRkIE5ldzwvYnV0dG9uPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8a2VuZG8tZ3JpZC1jaGVja2JveC1jb2x1bW4gKm5nSWY9XCIhIWRhdGEuU2VsZWN0T3B0aW9uc1wiIFt3aWR0aF09XCI2MFwiIHNob3dTZWxlY3RBbGw9XCJ0cnVlXCIgW2NvbHVtbk1lbnVdPVwidHJ1ZVwiPjwva2VuZG8tZ3JpZC1jaGVja2JveC1jb2x1bW4+XHJcbiAgICAgIDxrZW5kby1ncmlkLWNvbHVtbiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiY29sLnRpdGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCJjb2wud2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW21pblJlc2l6YWJsZVdpZHRoXT1cImNvbC5taW5SZXNpemFibGVXaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImNvbC5maWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwiZmlsdGVyYWJsZShjb2wuZW5hYmxlRmlsdGVyaW5nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwic29ydGFibGUoY29sLmVuYWJsZVNvcnRpbmcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWFkZXJTdHlsZV09XCJ7J3doaXRlLXNwYWNlJzogJ2luaXRpYWwnfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImNvbC5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdF09XCJjb2wuZm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wuQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2xvY2tlZF09XCJsb2NrZWQoY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uTWVudV09XCIhY29sLmRpc2FibGVDb2x1bW5NZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0b3JdPVwiY29sLmVkaXRvclR5cGVcIj5cclxuICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJ0cnVlXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJjb2wuZmllbGRUeXBlID09PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnY3VycmVuY3knXHJcbiAgICAgICAgICAgICAgIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6bnVtZXJpYydcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEZpbHRlckNlbGxUZW1wbGF0ZSBsZXQtZmlsdGVyIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1udW1lcmljLWZpbHRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiBvcGVyYXRvcj1cImVxXCI+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWVxLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWVxLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1uZXEtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbmVxLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1sdC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLW51bWVyaWMtZmlsdGVyLWNlbGw+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImNvbC5maWVsZFR5cGUgPT0gJ3pkYXRlJ1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnenRpbWUnXHJcbiAgICAgICAgICAgICAgIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6ZGF0ZXRpbWUnXHJcbiAgICAgICAgICAgICAgIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6dWlkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5maWx0ZXJCeURhdGVSYW5nZSA9PT0gdHJ1ZVwiPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCIgb3BlcmF0b3I9XCJsdGVcIj5cclxuICAgICAgICAgICAgICAgIDxkYXRlLXJhbmdlLWZpbHRlci1jZWxsIGNsYXNzPVwiZGF0ZS1yYW5nZS1maWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbC5maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8L2RhdGUtcmFuZ2UtZmlsdGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZmlsdGVyQnlEYXRlUmFuZ2UgPT09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEZpbHRlckNlbGxUZW1wbGF0ZSBsZXQtZmlsdGVyIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1ncmlkLWRhdGUtZmlsdGVyLWNlbGwgW2NvbHVtbl09XCJjb2x1bW5cIiBbZmlsdGVyXT1cImZpbHRlclwiIG9wZXJhdG9yPVwibHRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1ndC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1ndC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtc3RyaW5nLWZpbHRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiBvcGVyYXRvcj1cImNvbnRhaW5zXCI+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWNvbnRhaW5zLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWNvbnRhaW5zLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbmVxLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLW5lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItc3RhcnRzd2l0aC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1zdGFydHN3aXRoLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1lbmRzd2l0aC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1lbmRzd2l0aC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtc3RyaW5nLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBHcmlkIEVkaXQgVGVtcGxhdGUgLS0+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEVkaXRUZW1wbGF0ZSAqbmdJZj1cImRhdGEuRW5hYmxlR3JpZENvbW1hbmQgXCIgbGV0LWRhdGFJdGVtPVwiZGF0YUl0ZW1cIiBsZXQtY29sdW1uPVwiY29sXCIgbGV0LWZvcm1Hcm91cD1cImZvcm1Hcm91cFwiIGxldC1pc05ldz1cImlzTmV3XCI+XHJcbiAgICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJjb2wuZmllbGRUeXBlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgPGtlbmRvLW51bWVyaWN0ZXh0Ym94ICNjZWxsQW5jaG9yIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZClcIj48L2tlbmRvLW51bWVyaWN0ZXh0Ym94PlxyXG4gICAgICAgICAgICAgIDxrZW5kby1wb3B1cCBbYW5jaG9yXT1cImNlbGxBbmNob3IubnVtZXJpY0lucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuaW52YWxpZCAmJiAhKGlzTmV3ICYmIGZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS51bnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBDbGFzcz1cImstd2lkZ2V0IGstdG9vbHRpcCBrLXRvb2x0aXAtdmFsaWRhdGlvbiBrLWludmFsaWQtbXNnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDJweDsgb3BhY2l0eTogMC41O1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXdhcm5pbmdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHN0eWxlPVwicGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1sZWZ0OiAzcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuaW52YWxpZCAmJiAhZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLnVudG91Y2hlZCAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuZXJyb3JzPy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjb2wuTmFtZSB9fSByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIWZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS51bnRvdWNoZWQgJiYgZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmVycm9ycz8ucGF0dGVyblwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA/IGNvbC5WYWxpZGF0b3JNZXNzYWdlIDogXCJQbGVhc2UgY2hlY2sgdGhlIGlucHV0IHZhbHVlLlwiIH19XHJcbiAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICA8L2tlbmRvLXBvcHVwPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgIDxrZW5kby10ZXh0Ym94ICNjZWxsQW5jaG9yIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZClcIj48L2tlbmRvLXRleHRib3g+XHJcbiAgICAgICAgICAgICAgPGtlbmRvLXBvcHVwIFthbmNob3JdPVwiY2VsbEFuY2hvci5pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIShpc05ldyAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwQ2xhc3M9XCJrLXdpZGdldCBrLXRvb2x0aXAgay10b29sdGlwLXZhbGlkYXRpb24gay1pbnZhbGlkLW1zZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAycHg7IG9wYWNpdHk6IDAuNTtcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS13YXJuaW5nXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPCEtLTxpb24tbGFiZWwgc3R5bGU9XCJwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWxlZnQ6IDNweDtcIj57eyBjb2wuTmFtZSB9fSBpcyByZXF1aXJlZC48L2lvbi1sYWJlbD4tLT5cclxuXHJcbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHN0eWxlPVwicGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1sZWZ0OiAzcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuaW52YWxpZCAmJiAhZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLnVudG91Y2hlZCAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuZXJyb3JzPy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjb2wuTmFtZSB9fSByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIWZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS51bnRvdWNoZWQgJiYgZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmVycm9ycz8ucGF0dGVyblwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA/IGNvbC5WYWxpZGF0b3JNZXNzYWdlIDogXCJQbGVhc2UgY2hlY2sgdGhlIGlucHV0IHZhbHVlLlwiIH19XHJcbiAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICA8L2tlbmRvLXBvcHVwPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENlbGxUZW1wbGF0ZSBsZXQtZGF0YUl0ZW0gbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIj5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46IDFweCAwO1wiICpuZ0lmPVwiIWNvbC5jbGlja2FibGVJY29ucyAmJiBjb2wuaXNFZGl0YWJsZUluR3JpZCAhPT0gdHJ1ZVwiIFtuZ1N3aXRjaF09XCJjb2wuZmllbGRUeXBlXCJcclxuICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0Q2xhc3MoZGF0YUl0ZW0sIGNvbClcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6ZGF0ZSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ2RkL01NL3l5eXknIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6dGltZSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ0hIOm1tJyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenNob3J0ZGF0ZSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ01NTSB5eXl5JyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInemRhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBkYXRlOiAnZGQvTU0veXl5eSBoaDptbTpzcyBhYScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3p1aWRhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBkYXRlOiAnZGQvTU0veXl5eSBoaDptbTpzcyBhYScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgbnVtYmVyIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgbnVtYmVyOiBnZXRGb3JtYXQoY29sLCAnMS4yLTInKSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInem51bWVyaWMnXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCkgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3VybCdcIiBzdHlsZT1cImNvbG9yOiBibHVlOyBjdXJzb3I6IHBvaW50ZXI7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCIhIWNvbC5uYXZpZ2F0ZVRvXCIgKGNsaWNrKT1cIm9uTmF2aWdhdGVUbygkZXZlbnQsIGNvbCwgZGF0YUl0ZW0sIGRhdGFJdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgIDxpb24tYnV0dG9uIGNvbG9yPVwibGlnaHRcIiBzaXplPVwic21hbGxcIj5cclxuICAgICAge3sgY29sLkNsaWNrYWJsZUljb25zIH19XHJcbiAgICAgIDxpb24taWNvbiBzbG90PSBcImVuZFwiIG5hbWU9XCJhcnJvdy1mb3J3YXJkXCI+PC9pb24taWNvbj5cclxuICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+IC0tPlxyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbjogNXB4IDA7XCIgKm5nSWY9XCJjb2wuaXNFZGl0YWJsZUluR3JpZCA9PT0gdHJ1ZSAmJiBpbmxpbmVFZGl0ZWRGb3JtR3JvdXBzXCIgW25nU3dpdGNoXT1cImNvbC5maWVsZFR5cGVcIiBbZm9ybUdyb3VwXT1cImlubGluZUVkaXRlZEZvcm1Hcm91cHNcIlxyXG4gICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRDbGFzcyhkYXRhSXRlbSwgY29sKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIFtmb3JtQ29udHJvbF09XCJ0aGlzLmdldEZvcm1Db250cm9sKHJvd0luZGV4LCBjb2wuZmllbGQpXCIgLz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxyXG4gICAgICAgICAgICAgIDxpb24tY2hlY2tib3ggW2Rpc2FibGVkXT1cIighIWNvbC5SZWFkT25seSA/IGNvbC5SZWFkT25seSA6IGZhbHNlKVwiIFtmb3JtQ29udHJvbF09XCJ0aGlzLmdldEZvcm1Db250cm9sKHJvd0luZGV4LCBjb2wuZmllbGQpXCIgY29sb3I9XCJwcmltYXJ5XCIgKGlvbkNoYW5nZSk9XCJpbkNlbGxDaGVja0JveE9uQ2hhbmdlKCRldmVudCwgcm93SW5kZXgsIGNvbClcIj48L2lvbi1jaGVja2JveD5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3p1aXNlbGVjdG11bHRpcGxlJ1wiPlxyXG4gICAgICAgICAgICAgIDxhcHAtenNlbGVjdG11bHRpcGxlIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgW2RhdGFdPVwiZ2V0SW5saW5lRmllbGQoY29sLlZhbHVlKVwiIFtncm91cF09XCJncm91cFwiIFtmb3JtXT1cImdldElubGluZUZvcm0ocm93SW5kZXgpXCI+PC9hcHAtenNlbGVjdG11bHRpcGxlPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCIndGV4dGFyZWEnXCI+XHJcbiAgICAgICAgICAgICAgPGFwcC16dGV4dGFyZWEgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbZGF0YV09XCJnZXRJbmxpbmVGaWVsZChjb2wuVmFsdWUpXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZ2V0SW5saW5lRm9ybShyb3dJbmRleClcIj48L2FwcC16dGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIlsnenVpZGF0ZXRpbWUnLCd6ZGF0ZScsICd6dGltZScsJ3pkYXRldGltZScsJ3pzaG9ydGRhdGUnXS5pbmNsdWRlcyhjb2wuZmllbGRUeXBlKSA/IGNvbC5maWVsZFR5cGUgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgIDxhcHAtemRhdGV0aW1lIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgW2RhdGFdPVwiZ2V0SW5saW5lRmllbGQoY29sLlZhbHVlKVwiIFtncm91cF09XCJncm91cFwiIFtmb3JtXT1cImdldElubGluZUZvcm0ocm93SW5kZXgpXCI+PC9hcHAtemRhdGV0aW1lPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgdHlwZT1cInRleHRcIiBbZm9ybUNvbnRyb2xdPVwidGhpcy5nZXRGb3JtQ29udHJvbChyb3dJbmRleCwgY29sLmZpZWxkKVwiIC8+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbC5jbGlja2FibGVJY29uc1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJpY29uLkNsYXNzID8gaWNvbi5DbGFzcyA6ICcnXCIgKm5nSWY9XCIhIWljb24gJiYgKCEhZGF0YUl0ZW0uV0ZTX1N0YXR1c0NvZGUgJiYgISFpY29uKVxyXG4gICAgICAgICAgICAgID8gZGF0YUl0ZW0uV0ZTX1N0YXR1c0NvZGUgIT09IGljb24uV0ZTX1N0YXR1c0NvZGVcclxuICAgICAgICAgICAgICA6IHRydWU7XHJcbiAgICAgICAgICAgIGVsc2UgZGlzYWJsZWRCdXR0b25cIiAoY2xpY2spPVwib25CdG5DbGljaygkZXZlbnQsIGljb24sIGRhdGFJdGVtLCBkYXRhSXRlbVtjb2wuZmllbGRdKVwiPlxyXG4gICAgICAgICAgICAgIHt7aWNvbi5OYW1lIHx8IGRhdGFJdGVtW2NvbC5maWVsZF19fSA8ZmEtaWNvbiBbaWNvbl09XCJpY29uLkljb25cIiBzdHlsZT1cInBhZGRpbmc6IDRweCA2cHg7XCI+XHJcbiAgICAgICAgICAgICAgPC9mYS1pY29uPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzYWJsZWRCdXR0b24+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8IS0tIDxzdHJvbmc+e3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fTwvc3Ryb25nPiAtLT5cclxuICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJ7e2RhdGFJdGVtLkRpc2NvbnRpbnVlZCA/ICdkaXNjb250aW51ZWQnIDogJ2FjdGl2ZSd9fVwiPlxyXG4gICAgICAgIHt7ZGF0YUl0ZW0uRGlzY29udGludWVkID8gXCJkaXNjb250aW51ZWRcIiA6IFwiYWN0aXZlXCJ9fVxyXG4gICAgICA8L3NwYW4+IC0tPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEZvb3RlclRlbXBsYXRlIGxldC1jb2x1bW4gbGV0LWNvbHVtbkluZGV4PVwiY29sdW1uSW5kZXhcIiAqbmdJZj1cImRhdGEuRW5hYmxlQWdncmVnYXRlXCI+XHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOiA1cHggMDtcIiBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiPlxyXG4gICAgICAgICAgICB7e2NvbC5hZ2dyZWdhdGVUeXBlfX1cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6ZGF0ZSdcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBkYXRlOiAnZGQvTU0veXl5eScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3p0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IGRhdGU6ICdISDptbScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pzaG9ydGRhdGUnXCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgZGF0ZTogJ01NTSB5eXl5JyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInemRhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IGRhdGU6ICdkZC9NTS95eXl5IGhoOm1tOnNzIGFhJyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenVpZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgbnVtYmVyIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBudW1iZXI6IGdldEZvcm1hdChjb2wsICcxLjIuMicpIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6bnVtZXJpYydcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBudW1iZXI6IGdldEZvcm1hdChjb2wpIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid1cmwnXCIgc3R5bGU9XCJjb2xvcjogYmx1ZTsgY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwva2VuZG8tZ3JpZC1jb2x1bW4+XHJcbiAgICAgIDxrZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uICpuZ0lmPVwiZGF0YS5FbmFibGVHcmlkQ29tbWFuZFwiIHdpZHRoPVwiMTgwXCIgW2NvbHVtbk1lbnVdPVwiZmFsc2VcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkQ2VsbFRlbXBsYXRlIGxldC1pc05ldz1cImlzTmV3XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGtlbmRvR3JpZFNhdmVDb21tYW5kPlxyXG4gICAgICAgICAgICB7eyBpc05ldyA/ICdTYXZlJyA6ICdVcGRhdGUnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkQ2FuY2VsQ29tbWFuZCBbcHJpbWFyeV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgIHt7IGlzTmV3ID8gJ0Rpc2NhcmQgY2hhbmdlcycgOiAnQ2FuY2VsJyB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGtlbmRvR3JpZEVkaXRDb21tYW5kPlxyXG4gICAgICAgICAgICB7eyBcIkVkaXRcIiB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGtlbmRvR3JpZFJlbW92ZUNvbW1hbmQ+XHJcbiAgICAgICAgICAgIHt7IFwiUmVtb3ZlXCIgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwva2VuZG8tZ3JpZC1jb21tYW5kLWNvbHVtbj5cclxuICAgICAgPGtlbmRvLWdyaWQtZXhjZWwgZmlsZU5hbWU9XCJFeHBvcnQueGxzeFwiIFtmZXRjaERhdGFdPVwiYWxsUmVzdWx0c1wiPjwva2VuZG8tZ3JpZC1leGNlbD5cclxuICAgIDwva2VuZG8tZ3JpZD5cclxuICAgIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImstaS1sb2FkaW5nXCI+PC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=