@yibozhang/pro-table 16.1.8 → 16.1.9

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 (62) hide show
  1. package/esm2022/lib/components/colmuns-setting/colmuns-setting.component.mjs +9 -12
  2. package/esm2022/lib/components/dynamic-search-field/dynamic-search-field.component.mjs +9 -12
  3. package/esm2022/lib/directives/trim-input.directive.mjs +3 -5
  4. package/esm2022/lib/directives/trim-input.module.mjs +4 -4
  5. package/esm2022/lib/page-container/page-container.component.mjs +7 -8
  6. package/esm2022/lib/page-container/page-container.module.mjs +6 -6
  7. package/esm2022/lib/page-public/antd-form.mjs +23 -25
  8. package/esm2022/lib/page-public/array-form.mjs +6 -5
  9. package/esm2022/lib/plate-input/plate-input.component.mjs +11 -15
  10. package/esm2022/lib/plate-input/plate-input.module.mjs +6 -6
  11. package/esm2022/lib/plate-input/plate-prefix-load.service.mjs +4 -5
  12. package/esm2022/lib/pro-table.component.mjs +74 -82
  13. package/esm2022/lib/pro-table.module.mjs +6 -6
  14. package/esm2022/lib/table-search-bar/table-search-bar-module.mjs +6 -6
  15. package/esm2022/lib/table-search-bar/table-search-bar.component.mjs +11 -13
  16. package/fesm2022/yibozhang-pro-table.mjs +170 -195
  17. package/fesm2022/yibozhang-pro-table.mjs.map +1 -1
  18. package/index.d.ts +0 -1
  19. package/lib/components/colmuns-setting/colmuns-setting.component.d.ts +0 -1
  20. package/lib/components/dynamic-search-field/dynamic-search-field.component.d.ts +0 -1
  21. package/lib/constants.d.ts +0 -1
  22. package/lib/directives/trim-input.directive.d.ts +0 -1
  23. package/lib/directives/trim-input.module.d.ts +0 -1
  24. package/lib/page-container/page-container.component.d.ts +0 -1
  25. package/lib/page-container/page-container.module.d.ts +0 -1
  26. package/lib/page-public/antd-form.d.ts +0 -1
  27. package/lib/page-public/array-form.d.ts +0 -1
  28. package/lib/plate-input/plate-input.component.d.ts +0 -1
  29. package/lib/plate-input/plate-input.module.d.ts +0 -1
  30. package/lib/plate-input/plate-prefix-load.service.d.ts +0 -1
  31. package/lib/pro-table.component.d.ts +0 -1
  32. package/lib/pro-table.module.d.ts +0 -1
  33. package/lib/table-search-bar/table-search-bar-module.d.ts +0 -1
  34. package/lib/table-search-bar/table-search-bar.component.d.ts +0 -1
  35. package/lib/tokens.d.ts +0 -1
  36. package/lib/type.d.ts +0 -1
  37. package/lib/utils/modal-width-detector.d.ts +0 -1
  38. package/lib/utils/select-width-detector.d.ts +0 -1
  39. package/package.json +1 -1
  40. package/public-api.d.ts +0 -1
  41. package/lib/components/colmuns-setting/colmuns-setting.component.d.ts.map +0 -1
  42. package/lib/components/dynamic-search-field/dynamic-search-field.component.d.ts.map +0 -1
  43. package/lib/constants.d.ts.map +0 -1
  44. package/lib/directives/trim-input.directive.d.ts.map +0 -1
  45. package/lib/directives/trim-input.module.d.ts.map +0 -1
  46. package/lib/page-container/page-container.component.d.ts.map +0 -1
  47. package/lib/page-container/page-container.module.d.ts.map +0 -1
  48. package/lib/page-public/antd-form.d.ts.map +0 -1
  49. package/lib/page-public/array-form.d.ts.map +0 -1
  50. package/lib/plate-input/plate-input.component.d.ts.map +0 -1
  51. package/lib/plate-input/plate-input.module.d.ts.map +0 -1
  52. package/lib/plate-input/plate-prefix-load.service.d.ts.map +0 -1
  53. package/lib/pro-table.component.d.ts.map +0 -1
  54. package/lib/pro-table.module.d.ts.map +0 -1
  55. package/lib/table-search-bar/table-search-bar-module.d.ts.map +0 -1
  56. package/lib/table-search-bar/table-search-bar.component.d.ts.map +0 -1
  57. package/lib/tokens.d.ts.map +0 -1
  58. package/lib/type.d.ts.map +0 -1
  59. package/lib/utils/modal-width-detector.d.ts.map +0 -1
  60. package/lib/utils/select-width-detector.d.ts.map +0 -1
  61. package/public-api.d.ts.map +0 -1
  62. package/yibozhang-pro-table.d.ts.map +0 -1
@@ -26,85 +26,6 @@ import * as i19 from "ng-zorro-antd/tooltip";
26
26
  import * as i20 from "./components/colmuns-setting/colmuns-setting.component";
27
27
  import * as i21 from "./components/dynamic-search-field/dynamic-search-field.component";
28
28
  export class ProTableComponent {
29
- columnRemote;
30
- showSearchBtn = true;
31
- showClearBtn = true;
32
- title = null;
33
- tableName = "";
34
- multiRow = false;
35
- columns = [];
36
- showSearchBar = true;
37
- showActionBar = true;
38
- confirmBtnText = "查询";
39
- clearBtnText = "清空";
40
- labelWidth = "90px";
41
- labelAlign = "right";
42
- formItemWidth = "330px";
43
- dataSource = [];
44
- bordered = true;
45
- outerBordered = true;
46
- showPagination = true;
47
- frontPagination = false;
48
- scroll = null;
49
- request;
50
- summaryData = null;
51
- // 排序模式:local 本地排序;server 在线排序(提交给接口)
52
- sortMode = "local";
53
- showColumnSetting = false;
54
- // 是否开启多列排序(默认单列)
55
- multipleSort = false;
56
- showCheckbox = false;
57
- // 判断行是否禁用的函数
58
- rowDisabled = () => false;
59
- rerenderOnResize = true;
60
- // 是否自动触发请求
61
- autoTriggerRequest = true;
62
- customTableRender;
63
- onRowClick = new EventEmitter();
64
- onRowDbClick = new EventEmitter();
65
- onValuesChange = new EventEmitter();
66
- onResetFormBeforeReload = new EventEmitter();
67
- actionBarTpl;
68
- imgActionBarTpl;
69
- allTemplates;
70
- _savedSearchParams = {};
71
- // 存储所有自定义模板的引用
72
- customTemplates = new Map();
73
- // 记录各列排序状态:'ascend' | 'descend' | null
74
- _sortMap = {};
75
- // 记录多列排序的优先级(后设置的优先)
76
- _sortPriority = [];
77
- // 存储每个 autoComplete 字段的防抖函数
78
- _autoCompleteDebounceMap = new Map();
79
- _columns = [];
80
- // 筛选表单数据存储
81
- _searchParams = {};
82
- // 筛选表单list渲染数据
83
- _searchFiledColumns = [];
84
- _pageInfo = {
85
- pageIndex: 1,
86
- pageSize: 15,
87
- total: 100,
88
- pageSizeOptions: [10, 15, 20, 50, 100, 500, 1000],
89
- };
90
- _loading = false;
91
- _selectedTableRow = null;
92
- // 选中的行数据(用于复选框选择)- 保留用于兼容性
93
- _selectedRows = [];
94
- // 全选状态
95
- _checkedAll = false;
96
- // 半选状态(部分选中)
97
- _indeterminate = false;
98
- // 远程columns
99
- _serverColumns = [];
100
- // 存储 autoComplete 字段的数据源
101
- _autoCompleteDataSources = {};
102
- // 控制表格显示状态,用于重新挂载
103
- _showTable = true;
104
- // 动态列加载完成标志,默认 true(无动态列时直接显示)
105
- _columnsReady = true;
106
- // 防抖定时器,用于窗口大小调整
107
- resizeDebounce;
108
29
  onWindowResize() {
109
30
  if (!this.rerenderOnResize)
110
31
  return;
@@ -121,6 +42,77 @@ export class ProTableComponent {
121
42
  }
122
43
  constructor(columnRemote) {
123
44
  this.columnRemote = columnRemote;
45
+ this.showSearchBtn = true;
46
+ this.showClearBtn = true;
47
+ this.title = null;
48
+ this.tableName = "";
49
+ this.multiRow = false;
50
+ this.columns = [];
51
+ this.showSearchBar = true;
52
+ this.showActionBar = true;
53
+ this.confirmBtnText = "查询";
54
+ this.clearBtnText = "清空";
55
+ this.labelWidth = "90px";
56
+ this.labelAlign = "right";
57
+ this.formItemWidth = "330px";
58
+ this.dataSource = [];
59
+ this.bordered = true;
60
+ this.outerBordered = true;
61
+ this.showPagination = true;
62
+ this.frontPagination = false;
63
+ this.scroll = null;
64
+ this.summaryData = null;
65
+ // 排序模式:local 本地排序;server 在线排序(提交给接口)
66
+ this.sortMode = "local";
67
+ this.showColumnSetting = false;
68
+ // 是否开启多列排序(默认单列)
69
+ this.multipleSort = false;
70
+ this.showCheckbox = false;
71
+ // 判断行是否禁用的函数
72
+ this.rowDisabled = () => false;
73
+ this.rerenderOnResize = true;
74
+ // 是否自动触发请求
75
+ this.autoTriggerRequest = true;
76
+ this.onRowClick = new EventEmitter();
77
+ this.onRowDbClick = new EventEmitter();
78
+ this.onValuesChange = new EventEmitter();
79
+ this.onResetFormBeforeReload = new EventEmitter();
80
+ this._savedSearchParams = {};
81
+ // 存储所有自定义模板的引用
82
+ this.customTemplates = new Map();
83
+ // 记录各列排序状态:'ascend' | 'descend' | null
84
+ this._sortMap = {};
85
+ // 记录多列排序的优先级(后设置的优先)
86
+ this._sortPriority = [];
87
+ // 存储每个 autoComplete 字段的防抖函数
88
+ this._autoCompleteDebounceMap = new Map();
89
+ this._columns = [];
90
+ // 筛选表单数据存储
91
+ this._searchParams = {};
92
+ // 筛选表单list渲染数据
93
+ this._searchFiledColumns = [];
94
+ this._pageInfo = {
95
+ pageIndex: 1,
96
+ pageSize: 15,
97
+ total: 100,
98
+ pageSizeOptions: [10, 15, 20, 50, 100, 500, 1000],
99
+ };
100
+ this._loading = false;
101
+ this._selectedTableRow = null;
102
+ // 选中的行数据(用于复选框选择)- 保留用于兼容性
103
+ this._selectedRows = [];
104
+ // 全选状态
105
+ this._checkedAll = false;
106
+ // 半选状态(部分选中)
107
+ this._indeterminate = false;
108
+ // 远程columns
109
+ this._serverColumns = [];
110
+ // 存储 autoComplete 字段的数据源
111
+ this._autoCompleteDataSources = {};
112
+ // 控制表格显示状态,用于重新挂载
113
+ this._showTable = true;
114
+ // 动态列加载完成标志,默认 true(无动态列时直接显示)
115
+ this._columnsReady = true;
124
116
  }
125
117
  async fetchRemoteColumns() {
126
118
  if (!this.columnRemote?.getCol || !this.tableName) {
@@ -987,8 +979,8 @@ export class ProTableComponent {
987
979
  const fieldName = this.getFieldProps(column).name || column.prop;
988
980
  return `pro-table-${fieldName}-form-item`;
989
981
  }
990
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProTableComponent, deps: [{ token: PRO_TABLE_COLUMN_REMOTE, optional: true }], target: i0.ɵɵFactoryTarget.Component });
991
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProTableComponent, selector: "app-pro-table", inputs: { showSearchBtn: "showSearchBtn", showClearBtn: "showClearBtn", title: "title", tableName: "tableName", multiRow: "multiRow", columns: "columns", showSearchBar: "showSearchBar", showActionBar: "showActionBar", confirmBtnText: "confirmBtnText", clearBtnText: "clearBtnText", labelWidth: "labelWidth", labelAlign: "labelAlign", formItemWidth: "formItemWidth", dataSource: "dataSource", bordered: "bordered", outerBordered: "outerBordered", showPagination: "showPagination", frontPagination: "frontPagination", scroll: "scroll", request: "request", summaryData: "summaryData", sortMode: "sortMode", showColumnSetting: "showColumnSetting", multipleSort: "multipleSort", showCheckbox: "showCheckbox", rowDisabled: "rowDisabled", rerenderOnResize: "rerenderOnResize", autoTriggerRequest: "autoTriggerRequest", customTableRender: "customTableRender" }, outputs: { onRowClick: "onRowClick", onRowDbClick: "onRowDbClick", onValuesChange: "onValuesChange", onResetFormBeforeReload: "onResetFormBeforeReload" }, host: { listeners: { "window:resize": "onWindowResize()" } }, queries: [{ propertyName: "actionBarTpl", first: true, predicate: ["actionBar"], descendants: true }, { propertyName: "imgActionBarTpl", first: true, predicate: ["ImgActionBar"], descendants: true }, { propertyName: "allTemplates", predicate: TemplateRef }], ngImport: i0, template: "<app-page-container\r\n [title]=\"title\"\r\n [showHeader]=\"showSearchBar\"\r\n ngClass=\"pro-table-container\"\r\n>\r\n <ng-template #header>\r\n <app-table-search-bar\r\n *ngIf=\"showSearchBar\"\r\n [labelWidth]=\"labelWidth\"\r\n [labelAlign]=\"labelAlign\"\r\n [formItemWidth]=\"formItemWidth\"\r\n >\r\n <ng-template #leftContent>\r\n <nz-form-item\r\n *ngFor=\"let column of _searchFiledColumns\"\r\n [ngClass]=\"getFormItemClassName(column)\"\r\n >\r\n <nz-form-label *ngIf=\"!getFieldProps(column).hideLabel\" nzNoColon>\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49label\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customLabelRender &&\r\n getLabelTemplate(column.customLabelRender);\r\n else defaultLabel\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"getLabelTemplate(column.customLabelRender)\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: column,\r\n column: column,\r\n fieldProps: getFieldProps(column)\r\n }\"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultLabel>\r\n {{ getFieldProps(column).label || column.title }}\r\n </ng-template>\r\n </nz-form-label>\r\n <nz-form-control *ngIf=\"column.valueType === 'input'\">\r\n <input\r\n nz-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [placeholder]=\"getFieldProps(column).placeHolder\"\r\n [disabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n />\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputPlate'\">\r\n <app-plate-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n ></app-plate-input>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'select'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n >\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'selectMultiple'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n nzMode=\"multiple\"\r\n [nzMaxTagCount]=\"2\"\r\n [nzMaxTagPlaceholder]=\"nzMaxTagPlaceholder\"\r\n [nzCustomTemplate]=\"defaultTemplate\"\r\n >\r\n <ng-template #nzMaxTagPlaceholder>\r\n +\r\n {{\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n ?.length\r\n }}\r\n </ng-template>\r\n <ng-template #defaultTemplate let-selected>\r\n {{ selected.nzLabel.length > 4 ? selected.nzLabel.substring(0, 4) + '...' : selected.nzLabel }}\r\n </ng-template>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'date'\">\r\n <nz-date-picker\r\n [nzShowTime]=\"getFieldProps(column).showTime\"\r\n [nzFormat]=\"getFieldProps(column).format\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzMode]=\"getFieldProps(column).mode\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'checkbox'\">\r\n <nz-checkbox-group\r\n [class]=\"\r\n getFieldProps(column).noStyle\r\n ? 'pro-table-checkboxgroup-nostyle'\r\n : ''\r\n \"\r\n [(ngModel)]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n (ngModelChange)=\"\r\n handleFieldCheckBoxChange(\r\n $event,\r\n getFieldProps(column).name || column.prop\r\n )\r\n \"\r\n ></nz-checkbox-group>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'autoComplete'\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column)?.name || column.prop]\r\n \"\r\n (input)=\"handleAutoCompleteInput($event, column)\"\r\n [nzAutocomplete]=\"auto\"\r\n [disabled]=\"getFieldProps(column)?.disabled\"\r\n [placeholder]=\"getFieldProps(column)?.placeHolder\"\r\n />\r\n <nz-autocomplete\r\n [nzBackfill]=\"getFieldProps(column).backFill\"\r\n [nzDefaultActiveFirstOption]=\"\r\n getFieldProps(column).defaultActiveFirstOption\r\n \"\r\n [nzWidth]=\"getFieldProps(column).width\"\r\n #auto\r\n >\r\n <nz-auto-option\r\n *ngFor=\"let option of getAutoCompleteDataSource(column)\"\r\n [nzValue]=\"\r\n getFieldProps(column).returnFullData ? option : option.value\r\n \"\r\n [nzLabel]=\"option.label\"\r\n [nzDisabled]=\"option.disabled\"\r\n >\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'custom'\">\r\n <app-dynamic-search-field\r\n [component]=\"getFieldProps(column).component\"\r\n [value]=\"_searchParams[getFieldProps(column).name || column.prop]\"\r\n [props]=\"getFieldProps(column)\"\r\n (valueChange)=\"\r\n setFieldValue(getFieldProps(column).name || column.prop, $event)\r\n \"\r\n ></app-dynamic-search-field>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputNumber'\">\r\n <nz-input-number\r\n [style.width]=\"'100%'\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzFormatter]=\"getFieldProps(column).formatterPercent\"\r\n [nzParser]=\"getFieldProps(column).parserPercent\"\r\n ></nz-input-number>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-template>\r\n <ng-template #actionTextBtn>\r\n <nz-space [nzSize]=\"4\">\r\n <ng-template nzSpaceItem *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </ng-template>\r\n <ng-template nzSpaceItem *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n <ng-template #actionImgBtn>\r\n <nz-space>\r\n <ng-container *ngTemplateOutlet=\"imgActionBarTpl\"></ng-container>\r\n <ng-template nzSpaceItem class=\"setting-space-item\" *ngIf=\"showColumnSetting\">\r\n <span nz-tooltip nzTooltipTitle=\"\u8BBE\u7F6E\u5B57\u6BB5\">\r\n <app-colmuns-setting\r\n [columns]=\"columns\"\r\n [selectedColumns]=\"_serverColumns\"\r\n [tableName]=\"tableName\"\r\n (afterConfirm)=\"handleColumnsSettingConfirm()\"\r\n ></app-colmuns-setting>\r\n </span>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n </app-table-search-bar>\r\n </ng-template>\r\n\r\n <ng-template #body>\r\n <div class=\"mb-4\">\r\n <ng-container *ngIf=\"showActionBar\">\r\n <ng-container *ngTemplateOutlet=\"actionBarTpl\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"customTableRender\">\r\n <ng-container *ngTemplateOutlet=\"customTableRender\"></ng-container>\r\n </ng-container>\r\n <nz-table\r\n *ngIf=\"!customTableRender && _showTable && _columnsReady\"\r\n #dynamicTable\r\n nzSize=\"small\"\r\n nzShowSizeChanger\r\n [nzBordered]=\"bordered\"\r\n [nzOuterBordered]=\"outerBordered\"\r\n [nzData]=\"dataSource\"\r\n [nzPageIndex]=\"_pageInfo.pageIndex\"\r\n [nzPageSize]=\"_pageInfo.pageSize\"\r\n [nzTotal]=\"_pageInfo.total\"\r\n [nzPageSizeOptions]=\"_pageInfo.pageSizeOptions\"\r\n [nzShowPagination]=\"showPagination\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n [nzLoading]=\"_loading\"\r\n [nzFrontPagination]=\"frontPagination\"\r\n [nzScroll]=\"scroll\"\r\n (nzPageIndexChange)=\"handlePageIndexChange($event)\"\r\n (nzPageSizeChange)=\"handlePageSizeChange($event)\"\r\n >\r\n <thead>\r\n <tr>\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <th\r\n *ngIf=\"showCheckbox\"\r\n [nzWidth]=\"'50px'\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center\"\r\n [(nzChecked)]=\"_checkedAll\"\r\n [nzIndeterminate]=\"_indeterminate\"\r\n (nzCheckedChange)=\"toggleCheckAll($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></th>\r\n <th\r\n *ngFor=\"let column of _columns\"\r\n [nzWidth]=\"column.width\"\r\n [nzAlign]=\"column.align\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzShowSort]=\"!!column.sorter\"\r\n [nzSortOrder]=\"getSortOrder(column.prop)\"\r\n (nzSortOrderChange)=\"onSortChange(column.prop, $event)\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr\r\n style=\"cursor: pointer\"\r\n *ngFor=\"let data; let i = index; of: dynamicTable.data\"\r\n [ngClass]=\"{\r\n 'ant-table-custom-row-selected': !!getTableRowChecked(data),\r\n 'ant-table-custom-row-even': i % 2 === 0,\r\n 'ant-table-custom-row-odd': i % 2 !== 0\r\n }\"\r\n (click)=\"handleTableRowClick(data)\"\r\n (dblclick)=\"handleTableRowDbClick(data)\"\r\n >\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center; width: 50px\"\r\n [(nzChecked)]=\"data.checked\"\r\n [nzDisabled]=\"isRowDisabled(data)\"\r\n (nzCheckedChange)=\"handleRowCheckedChange(data, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column of _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzAlign]=\"column.align\"\r\n [ngClass]=\"{\r\n 'pro-nowrap': true\r\n }\"\r\n >\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customRender && getTemplate(column.customRender);\r\n let template\r\n \"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: data,\r\n data: data,\r\n column: column,\r\n index: i,\r\n pageInfo: _pageInfo\r\n }\"\r\n >\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- \u9ED8\u8BA4\u6E32\u67D3\u903B\u8F91 -->\r\n <ng-container\r\n *ngIf=\"!column.customRender || !getTemplate(column.customRender)\"\r\n >\r\n <ng-container *ngIf=\"column.ellipsis\">\r\n <div\r\n class=\"pro-ellipsis\"\r\n [title]=\"data[column.prop]\"\r\n [ngStyle]=\"{\r\n width: 'calc(' + column.width + ' - 25px)'\r\n }\"\r\n >\r\n {{ data[column.prop] }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!column.ellipsis\">\r\n {{ data[column.prop] }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"summaryData && _pageInfo.total > 0\">\r\n <!-- \u6C47\u603B\u884C\u7684\u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF0C\u4F46\u4E3A\u7A7A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column; let i = index; of: _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n [nzAlign]=\"column.align\"\r\n >\r\n <span *ngIf=\"i === 0\">\u603B\u8BA1</span>\r\n <ng-container *ngIf=\"i !== 0 && column.summary\">\r\n {{\r\n column.summary?.format\r\n ? column.summary?.format(\r\n summaryData[column.summary?.name || column.prop]\r\n )\r\n : summaryData[column.summary?.name || column.prop]\r\n }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <ng-template #totalTemplate let-total\r\n >\u5171 {{ _pageInfo.total }} \u6761\u8BB0\u5F55</ng-template\r\n >\r\n </nz-table>\r\n </ng-template>\r\n</app-page-container>\r\n", styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important;white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:first-child{border-left:none!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th{border-top:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:last-child{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr:last-child>td{border-bottom:1px solid #e8e8e8!important}::ng-deep .table-search-bar-left .ant-form-item{margin-bottom:4px}::ng-deep .table-search-bar-left .ant-form-item .ant-form-item-label>label{color:#5a5a5a}::ng-deep .pro-table-container .page-container-body{padding:8px 0 0!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", 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]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i3.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "component", type: i4.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i4.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i4.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "component", type: i5.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "component", type: i6.NzSpaceComponent, selector: "nz-space, [nz-space]", inputs: ["nzDirection", "nzAlign", "nzSplit", "nzWrap", "nzSize"], exportAs: ["NzSpace"] }, { kind: "directive", type: i6.NzSpaceItemDirective, selector: "[nzSpaceItem]" }, { kind: "directive", type: i7.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i8.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i9.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i10.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i11.PageContainerComponent, selector: "app-page-container", inputs: ["title", "showHeader"] }, { kind: "component", type: i12.TableSearchBarComponent, selector: "app-table-search-bar", inputs: ["leftColSpan", "rightColSpan", "labelWidth", "labelAlign", "formItemWidth"] }, { kind: "component", type: i13.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i13.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i13.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i13.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i13.NzTdAddOnComponent, selector: "td[nzChecked], td[nzDisabled], td[nzIndeterminate], td[nzIndentSize], td[nzExpand], td[nzShowExpand], td[nzShowCheckbox]", inputs: ["nzChecked", "nzDisabled", "nzIndeterminate", "nzIndentSize", "nzShowExpand", "nzShowCheckbox", "nzExpand"], outputs: ["nzCheckedChange", "nzExpandChange"] }, { kind: "component", type: i13.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i13.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i13.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i13.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "directive", type: i13.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "component", type: i13.NzThSelectionComponent, selector: "th[nzSelections],th[nzChecked],th[nzShowCheckbox],th[nzShowRowSelection]", inputs: ["nzSelections", "nzChecked", "nzDisabled", "nzIndeterminate", "nzShowCheckbox", "nzShowRowSelection"], outputs: ["nzCheckedChange"] }, { kind: "component", type: i14.PlateInputComponent, selector: "app-plate-input" }, { kind: "component", type: i15.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzOpen", "nzDisabledDate", "nzLocale", "nzPlaceHolder", "nzPopupStyle", "nzDropdownClassName", "nzSize", "nzStatus", "nzFormat", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzShowToday", "nzMode", "nzShowNow", "nzRanges", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzPlacement", "nzShowWeekNumber", "nzShowTime"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { kind: "component", type: i16.NzCheckboxGroupComponent, selector: "nz-checkbox-group", inputs: ["nzDisabled"], exportAs: ["nzCheckboxGroup"] }, { kind: "component", type: i17.NzAutocompleteComponent, selector: "nz-autocomplete", inputs: ["nzWidth", "nzOverlayClassName", "nzOverlayStyle", "nzDefaultActiveFirstOption", "nzBackfill", "compareWith", "nzDataSource"], outputs: ["selectionChange"], exportAs: ["nzAutocomplete"] }, { kind: "component", type: i17.NzAutocompleteOptionComponent, selector: "nz-auto-option", inputs: ["nzValue", "nzLabel", "nzDisabled"], outputs: ["selectionChange", "mouseEntered"], exportAs: ["nzAutoOption"] }, { kind: "directive", type: i17.NzAutocompleteTriggerDirective, selector: "input[nzAutocomplete], textarea[nzAutocomplete]", inputs: ["nzAutocomplete"], exportAs: ["nzAutocompleteTrigger"] }, { kind: "component", type: i18.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { kind: "directive", type: i19.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "component", type: i20.ColmunsSettingComponent, selector: "app-colmuns-setting", inputs: ["columns", "selectedColumns", "tableName"], outputs: ["afterConfirm"] }, { kind: "component", type: i21.DynamicSearchFieldComponent, selector: "app-dynamic-search-field", inputs: ["component", "value", "props"], outputs: ["valueChange"] }] });
982
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProTableComponent, deps: [{ token: PRO_TABLE_COLUMN_REMOTE, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
983
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProTableComponent, selector: "app-pro-table", inputs: { showSearchBtn: "showSearchBtn", showClearBtn: "showClearBtn", title: "title", tableName: "tableName", multiRow: "multiRow", columns: "columns", showSearchBar: "showSearchBar", showActionBar: "showActionBar", confirmBtnText: "confirmBtnText", clearBtnText: "clearBtnText", labelWidth: "labelWidth", labelAlign: "labelAlign", formItemWidth: "formItemWidth", dataSource: "dataSource", bordered: "bordered", outerBordered: "outerBordered", showPagination: "showPagination", frontPagination: "frontPagination", scroll: "scroll", request: "request", summaryData: "summaryData", sortMode: "sortMode", showColumnSetting: "showColumnSetting", multipleSort: "multipleSort", showCheckbox: "showCheckbox", rowDisabled: "rowDisabled", rerenderOnResize: "rerenderOnResize", autoTriggerRequest: "autoTriggerRequest", customTableRender: "customTableRender" }, outputs: { onRowClick: "onRowClick", onRowDbClick: "onRowDbClick", onValuesChange: "onValuesChange", onResetFormBeforeReload: "onResetFormBeforeReload" }, host: { listeners: { "window:resize": "onWindowResize()" } }, queries: [{ propertyName: "actionBarTpl", first: true, predicate: ["actionBar"], descendants: true }, { propertyName: "imgActionBarTpl", first: true, predicate: ["ImgActionBar"], descendants: true }, { propertyName: "allTemplates", predicate: TemplateRef }], ngImport: i0, template: "<app-page-container\r\n [title]=\"title\"\r\n [showHeader]=\"showSearchBar\"\r\n ngClass=\"pro-table-container\"\r\n>\r\n <ng-template #header>\r\n <app-table-search-bar\r\n *ngIf=\"showSearchBar\"\r\n [labelWidth]=\"labelWidth\"\r\n [labelAlign]=\"labelAlign\"\r\n [formItemWidth]=\"formItemWidth\"\r\n >\r\n <ng-template #leftContent>\r\n <nz-form-item\r\n *ngFor=\"let column of _searchFiledColumns\"\r\n [ngClass]=\"getFormItemClassName(column)\"\r\n >\r\n <nz-form-label *ngIf=\"!getFieldProps(column).hideLabel\" nzNoColon>\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49label\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customLabelRender &&\r\n getLabelTemplate(column.customLabelRender);\r\n else defaultLabel\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"getLabelTemplate(column.customLabelRender)\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: column,\r\n column: column,\r\n fieldProps: getFieldProps(column)\r\n }\"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultLabel>\r\n {{ getFieldProps(column).label || column.title }}\r\n </ng-template>\r\n </nz-form-label>\r\n <nz-form-control *ngIf=\"column.valueType === 'input'\">\r\n <input\r\n nz-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [placeholder]=\"getFieldProps(column).placeHolder\"\r\n [disabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n />\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputPlate'\">\r\n <app-plate-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n ></app-plate-input>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'select'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n >\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'selectMultiple'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n nzMode=\"multiple\"\r\n [nzMaxTagCount]=\"2\"\r\n [nzMaxTagPlaceholder]=\"nzMaxTagPlaceholder\"\r\n [nzCustomTemplate]=\"defaultTemplate\"\r\n >\r\n <ng-template #nzMaxTagPlaceholder>\r\n +\r\n {{\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n ?.length\r\n }}\r\n </ng-template>\r\n <ng-template #defaultTemplate let-selected>\r\n {{ selected.nzLabel.length > 4 ? selected.nzLabel.substring(0, 4) + '...' : selected.nzLabel }}\r\n </ng-template>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'date'\">\r\n <nz-date-picker\r\n [nzShowTime]=\"getFieldProps(column).showTime\"\r\n [nzFormat]=\"getFieldProps(column).format\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzMode]=\"getFieldProps(column).mode\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'checkbox'\">\r\n <nz-checkbox-group\r\n [class]=\"\r\n getFieldProps(column).noStyle\r\n ? 'pro-table-checkboxgroup-nostyle'\r\n : ''\r\n \"\r\n [(ngModel)]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n (ngModelChange)=\"\r\n handleFieldCheckBoxChange(\r\n $event,\r\n getFieldProps(column).name || column.prop\r\n )\r\n \"\r\n ></nz-checkbox-group>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'autoComplete'\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column)?.name || column.prop]\r\n \"\r\n (input)=\"handleAutoCompleteInput($event, column)\"\r\n [nzAutocomplete]=\"auto\"\r\n [disabled]=\"getFieldProps(column)?.disabled\"\r\n [placeholder]=\"getFieldProps(column)?.placeHolder\"\r\n />\r\n <nz-autocomplete\r\n [nzBackfill]=\"getFieldProps(column).backFill\"\r\n [nzDefaultActiveFirstOption]=\"\r\n getFieldProps(column).defaultActiveFirstOption\r\n \"\r\n [nzWidth]=\"getFieldProps(column).width\"\r\n #auto\r\n >\r\n <nz-auto-option\r\n *ngFor=\"let option of getAutoCompleteDataSource(column)\"\r\n [nzValue]=\"\r\n getFieldProps(column).returnFullData ? option : option.value\r\n \"\r\n [nzLabel]=\"option.label\"\r\n [nzDisabled]=\"option.disabled\"\r\n >\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'custom'\">\r\n <app-dynamic-search-field\r\n [component]=\"getFieldProps(column).component\"\r\n [value]=\"_searchParams[getFieldProps(column).name || column.prop]\"\r\n [props]=\"getFieldProps(column)\"\r\n (valueChange)=\"\r\n setFieldValue(getFieldProps(column).name || column.prop, $event)\r\n \"\r\n ></app-dynamic-search-field>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputNumber'\">\r\n <nz-input-number\r\n [style.width]=\"'100%'\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzFormatter]=\"getFieldProps(column).formatterPercent\"\r\n [nzParser]=\"getFieldProps(column).parserPercent\"\r\n ></nz-input-number>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-template>\r\n <ng-template #actionTextBtn>\r\n <nz-space [nzSize]=\"4\">\r\n <ng-template nzSpaceItem *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </ng-template>\r\n <ng-template nzSpaceItem *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n <ng-template #actionImgBtn>\r\n <nz-space>\r\n <ng-container *ngTemplateOutlet=\"imgActionBarTpl\"></ng-container>\r\n <ng-template nzSpaceItem class=\"setting-space-item\" *ngIf=\"showColumnSetting\">\r\n <span nz-tooltip nzTooltipTitle=\"\u8BBE\u7F6E\u5B57\u6BB5\">\r\n <app-colmuns-setting\r\n [columns]=\"columns\"\r\n [selectedColumns]=\"_serverColumns\"\r\n [tableName]=\"tableName\"\r\n (afterConfirm)=\"handleColumnsSettingConfirm()\"\r\n ></app-colmuns-setting>\r\n </span>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n </app-table-search-bar>\r\n </ng-template>\r\n\r\n <ng-template #body>\r\n <div class=\"mb-4\">\r\n <ng-container *ngIf=\"showActionBar\">\r\n <ng-container *ngTemplateOutlet=\"actionBarTpl\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"customTableRender\">\r\n <ng-container *ngTemplateOutlet=\"customTableRender\"></ng-container>\r\n </ng-container>\r\n <nz-table\r\n *ngIf=\"!customTableRender && _showTable && _columnsReady\"\r\n #dynamicTable\r\n nzSize=\"small\"\r\n nzShowSizeChanger\r\n [nzBordered]=\"bordered\"\r\n [nzOuterBordered]=\"outerBordered\"\r\n [nzData]=\"dataSource\"\r\n [nzPageIndex]=\"_pageInfo.pageIndex\"\r\n [nzPageSize]=\"_pageInfo.pageSize\"\r\n [nzTotal]=\"_pageInfo.total\"\r\n [nzPageSizeOptions]=\"_pageInfo.pageSizeOptions\"\r\n [nzShowPagination]=\"showPagination\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n [nzLoading]=\"_loading\"\r\n [nzFrontPagination]=\"frontPagination\"\r\n [nzScroll]=\"scroll\"\r\n (nzPageIndexChange)=\"handlePageIndexChange($event)\"\r\n (nzPageSizeChange)=\"handlePageSizeChange($event)\"\r\n >\r\n <thead>\r\n <tr>\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <th\r\n *ngIf=\"showCheckbox\"\r\n [nzWidth]=\"'50px'\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center\"\r\n [(nzChecked)]=\"_checkedAll\"\r\n [nzIndeterminate]=\"_indeterminate\"\r\n (nzCheckedChange)=\"toggleCheckAll($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></th>\r\n <th\r\n *ngFor=\"let column of _columns\"\r\n [nzWidth]=\"column.width\"\r\n [nzAlign]=\"column.align\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzShowSort]=\"!!column.sorter\"\r\n [nzSortOrder]=\"getSortOrder(column.prop)\"\r\n (nzSortOrderChange)=\"onSortChange(column.prop, $event)\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr\r\n style=\"cursor: pointer\"\r\n *ngFor=\"let data; let i = index; of: dynamicTable.data\"\r\n [ngClass]=\"{\r\n 'ant-table-custom-row-selected': !!getTableRowChecked(data),\r\n 'ant-table-custom-row-even': i % 2 === 0,\r\n 'ant-table-custom-row-odd': i % 2 !== 0\r\n }\"\r\n (click)=\"handleTableRowClick(data)\"\r\n (dblclick)=\"handleTableRowDbClick(data)\"\r\n >\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center; width: 50px\"\r\n [(nzChecked)]=\"data.checked\"\r\n [nzDisabled]=\"isRowDisabled(data)\"\r\n (nzCheckedChange)=\"handleRowCheckedChange(data, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column of _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzAlign]=\"column.align\"\r\n [ngClass]=\"{\r\n 'pro-nowrap': true\r\n }\"\r\n >\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customRender && getTemplate(column.customRender);\r\n let template\r\n \"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: data,\r\n data: data,\r\n column: column,\r\n index: i,\r\n pageInfo: _pageInfo\r\n }\"\r\n >\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- \u9ED8\u8BA4\u6E32\u67D3\u903B\u8F91 -->\r\n <ng-container\r\n *ngIf=\"!column.customRender || !getTemplate(column.customRender)\"\r\n >\r\n <ng-container *ngIf=\"column.ellipsis\">\r\n <div\r\n class=\"pro-ellipsis\"\r\n [title]=\"data[column.prop]\"\r\n [ngStyle]=\"{\r\n width: 'calc(' + column.width + ' - 25px)'\r\n }\"\r\n >\r\n {{ data[column.prop] }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!column.ellipsis\">\r\n {{ data[column.prop] }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"summaryData && _pageInfo.total > 0\">\r\n <!-- \u6C47\u603B\u884C\u7684\u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF0C\u4F46\u4E3A\u7A7A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column; let i = index; of: _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n [nzAlign]=\"column.align\"\r\n >\r\n <span *ngIf=\"i === 0\">\u603B\u8BA1</span>\r\n <ng-container *ngIf=\"i !== 0 && column.summary\">\r\n {{\r\n column.summary?.format\r\n ? column.summary?.format(\r\n summaryData[column.summary?.name || column.prop]\r\n )\r\n : summaryData[column.summary?.name || column.prop]\r\n }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <ng-template #totalTemplate let-total\r\n >\u5171 {{ _pageInfo.total }} \u6761\u8BB0\u5F55</ng-template\r\n >\r\n </nz-table>\r\n </ng-template>\r\n</app-page-container>\r\n", styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important;white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:first-child{border-left:none!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th{border-top:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:last-child{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr:last-child>td{border-bottom:1px solid #e8e8e8!important}::ng-deep .table-search-bar-left .ant-form-item{margin-bottom:4px}::ng-deep .table-search-bar-left .ant-form-item .ant-form-item-label>label{color:#5a5a5a}::ng-deep .pro-table-container .page-container-body{padding:8px 0 0!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", 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]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i3.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "component", type: i4.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i4.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i4.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "component", type: i5.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "component", type: i6.NzSpaceComponent, selector: "nz-space, [nz-space]", inputs: ["nzDirection", "nzAlign", "nzSplit", "nzWrap", "nzSize"], exportAs: ["NzSpace"] }, { kind: "directive", type: i6.NzSpaceItemDirective, selector: "[nzSpaceItem]" }, { kind: "directive", type: i7.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i8.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i9.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i10.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i11.PageContainerComponent, selector: "app-page-container", inputs: ["title", "showHeader"] }, { kind: "component", type: i12.TableSearchBarComponent, selector: "app-table-search-bar", inputs: ["leftColSpan", "rightColSpan", "labelWidth", "labelAlign", "formItemWidth"] }, { kind: "component", type: i13.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i13.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i13.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i13.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i13.NzTdAddOnComponent, selector: "td[nzChecked], td[nzDisabled], td[nzIndeterminate], td[nzIndentSize], td[nzExpand], td[nzShowExpand], td[nzShowCheckbox]", inputs: ["nzChecked", "nzDisabled", "nzIndeterminate", "nzIndentSize", "nzShowExpand", "nzShowCheckbox", "nzExpand"], outputs: ["nzCheckedChange", "nzExpandChange"] }, { kind: "component", type: i13.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i13.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i13.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i13.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "directive", type: i13.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "component", type: i13.NzThSelectionComponent, selector: "th[nzSelections],th[nzChecked],th[nzShowCheckbox],th[nzShowRowSelection]", inputs: ["nzSelections", "nzChecked", "nzDisabled", "nzIndeterminate", "nzShowCheckbox", "nzShowRowSelection"], outputs: ["nzCheckedChange"] }, { kind: "component", type: i14.PlateInputComponent, selector: "app-plate-input" }, { kind: "component", type: i15.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzOpen", "nzDisabledDate", "nzLocale", "nzPlaceHolder", "nzPopupStyle", "nzDropdownClassName", "nzSize", "nzStatus", "nzFormat", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzShowToday", "nzMode", "nzShowNow", "nzRanges", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzPlacement", "nzShowWeekNumber", "nzShowTime"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { kind: "component", type: i16.NzCheckboxGroupComponent, selector: "nz-checkbox-group", inputs: ["nzDisabled"], exportAs: ["nzCheckboxGroup"] }, { kind: "component", type: i17.NzAutocompleteComponent, selector: "nz-autocomplete", inputs: ["nzWidth", "nzOverlayClassName", "nzOverlayStyle", "nzDefaultActiveFirstOption", "nzBackfill", "compareWith", "nzDataSource"], outputs: ["selectionChange"], exportAs: ["nzAutocomplete"] }, { kind: "component", type: i17.NzAutocompleteOptionComponent, selector: "nz-auto-option", inputs: ["nzValue", "nzLabel", "nzDisabled"], outputs: ["selectionChange", "mouseEntered"], exportAs: ["nzAutoOption"] }, { kind: "directive", type: i17.NzAutocompleteTriggerDirective, selector: "input[nzAutocomplete], textarea[nzAutocomplete]", inputs: ["nzAutocomplete"], exportAs: ["nzAutocompleteTrigger"] }, { kind: "component", type: i18.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { kind: "directive", type: i19.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "component", type: i20.ColmunsSettingComponent, selector: "app-colmuns-setting", inputs: ["columns", "selectedColumns", "tableName"], outputs: ["afterConfirm"] }, { kind: "component", type: i21.DynamicSearchFieldComponent, selector: "app-dynamic-search-field", inputs: ["component", "value", "props"], outputs: ["valueChange"] }] }); }
992
984
  }
993
985
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProTableComponent, decorators: [{
994
986
  type: Component,
@@ -1077,4 +1069,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1077
1069
  type: HostListener,
1078
1070
  args: ["window:resize"]
1079
1071
  }] } });
1080
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byby10YWJsZS9zcmMvbGliL3Byby10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm8tdGFibGUvc3JjL2xpYi9wcm8tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFXLE1BQU0sV0FBVyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVdoRixPQUFPLEVBQUUsdUJBQXVCLEVBQStCLE1BQU0sVUFBVSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9uRCxNQUFNLE9BQU8saUJBQWlCO0lBNEpsQjtJQTNKRCxhQUFhLEdBQVksSUFBSSxDQUFDO0lBRTlCLFlBQVksR0FBWSxJQUFJLENBQUM7SUFFN0IsS0FBSyxHQUFrQixJQUFJLENBQUM7SUFFNUIsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUV2QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBRTFCLE9BQU8sR0FBcUIsRUFBRSxDQUFDO0lBRS9CLGFBQWEsR0FBWSxJQUFJLENBQUM7SUFFOUIsYUFBYSxHQUFZLElBQUksQ0FBQztJQUU5QixjQUFjLEdBQVcsSUFBSSxDQUFDO0lBRTlCLFlBQVksR0FBVyxJQUFJLENBQUM7SUFFNUIsVUFBVSxHQUFXLE1BQU0sQ0FBQztJQUU1QixVQUFVLEdBQVcsT0FBTyxDQUFDO0lBRTdCLGFBQWEsR0FBVyxPQUFPLENBQUM7SUFFaEMsVUFBVSxHQUFVLEVBQUUsQ0FBQztJQUV2QixRQUFRLEdBQVksSUFBSSxDQUFDO0lBRXpCLGFBQWEsR0FBWSxJQUFJLENBQUM7SUFFOUIsY0FBYyxHQUFZLElBQUksQ0FBQztJQUUvQixlQUFlLEdBQVksS0FBSyxDQUFDO0lBRWpDLE1BQU0sR0FBd0QsSUFBSSxDQUFDO0lBRW5FLE9BQU8sQ0FBa0Q7SUFFekQsV0FBVyxHQUErQixJQUFJLENBQUM7SUFFeEQscUNBQXFDO0lBQzVCLFFBQVEsR0FBdUIsT0FBTyxDQUFDO0lBRXZDLGlCQUFpQixHQUFZLEtBQUssQ0FBQztJQUU1QyxpQkFBaUI7SUFDUixZQUFZLEdBQVksS0FBSyxDQUFDO0lBRTlCLFlBQVksR0FBWSxLQUFLLENBQUM7SUFFdkMsYUFBYTtJQUNKLFdBQVcsR0FBMkIsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBRWxELGdCQUFnQixHQUFZLElBQUksQ0FBQztJQUUxQyxXQUFXO0lBQ0Ysa0JBQWtCLEdBQVksSUFBSSxDQUFDO0lBRW5DLGlCQUFpQixDQUFvQjtJQUVwQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUVyQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUV2QyxjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXdCLENBQUM7SUFFMUQsdUJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUVqQyxZQUFZLENBQW9CO0lBRTdCLGVBQWUsQ0FBb0I7SUFFbkMsWUFBWSxDQUErQjtJQUVqRSxrQkFBa0IsR0FBUSxFQUFFLENBQUM7SUFFckMsZUFBZTtJQUNQLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztJQUU5RCx1Q0FBdUM7SUFFL0IsUUFBUSxHQUFnRCxFQUFFLENBQUM7SUFFbkUscUJBQXFCO0lBQ2IsYUFBYSxHQUFhLEVBQUUsQ0FBQztJQUVyQyw0QkFBNEI7SUFDcEIsd0JBQXdCLEdBQzlCLElBQUksR0FBRyxFQUFFLENBQUM7SUFHWixRQUFRLEdBQXFCLEVBQUUsQ0FBQztJQUVoQyxXQUFXO0lBQ1gsYUFBYSxHQUFRLEVBQUUsQ0FBQztJQUV4QixlQUFlO0lBQ2YsbUJBQW1CLEdBQXFCLEVBQUUsQ0FBQztJQUUzQyxTQUFTLEdBQXFCO1FBQzVCLFNBQVMsRUFBRSxDQUFDO1FBQ1osUUFBUSxFQUFFLEVBQUU7UUFDWixLQUFLLEVBQUUsR0FBRztRQUNWLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQztLQUNsRCxDQUFDO0lBRUYsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUUxQixpQkFBaUIsR0FBUSxJQUFJLENBQUM7SUFFOUIsMkJBQTJCO0lBQzNCLGFBQWEsR0FBVSxFQUFFLENBQUM7SUFFMUIsT0FBTztJQUNQLFdBQVcsR0FBWSxLQUFLLENBQUM7SUFFN0IsYUFBYTtJQUNiLGNBQWMsR0FBWSxLQUFLLENBQUM7SUFFaEMsWUFBWTtJQUNaLGNBQWMsR0FBcUIsRUFBRSxDQUFDO0lBRXRDLHlCQUF5QjtJQUN6Qix3QkFBd0IsR0FBMEIsRUFBRSxDQUFDO0lBRXJELGtCQUFrQjtJQUNsQixVQUFVLEdBQVksSUFBSSxDQUFDO0lBRTNCLCtCQUErQjtJQUMvQixhQUFhLEdBQVksSUFBSSxDQUFDO0lBRTlCLGlCQUFpQjtJQUNULGNBQWMsQ0FBTTtJQUc1QixjQUFjO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPO1FBRW5DLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3BDLGlCQUFpQjtZQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFDRCxZQUdVLFlBQWdEO1FBQWhELGlCQUFZLEdBQVosWUFBWSxDQUFvQztJQUN2RCxDQUFDO0lBRUksS0FBSyxDQUFDLGtCQUFrQjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2pELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJO1lBQ0YsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxRSxPQUFPLEdBQUcsQ0FBQztTQUNaO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxPQUFjO1FBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDakQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQUk7WUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDckMsSUFBSSxDQUFDLFNBQVMsRUFDZCxPQUFPLEVBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FDZCxDQUFDO1lBQ0YsSUFBSSxNQUFNLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNsQyxPQUFPLE1BQU0sYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3BDO1lBQ0QsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6Qyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RFLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixjQUFjO1FBQ2QsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPO1FBQ2xELElBQUk7WUFDRixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxHQUFHO2dCQUFFLE9BQU87WUFDakIsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtnQkFDbEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ2pELE9BQU87d0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO3dCQUNsQixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUs7d0JBQ2hCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTt3QkFDdkIsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU07cUJBQzFCLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxDQUM1RCxDQUFDO2dCQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDOUM7aUJBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLEVBQUUsRUFBRTtnQkFDMUIsOEJBQThCO2dCQUM5QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTztxQkFDN0IsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7cUJBQ3JDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDaEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUNsQixNQUFNLEVBQUUsSUFBSTtvQkFDWixNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7b0JBQ3BCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUk7aUJBQ2xDLENBQUMsQ0FBQyxDQUFDO2dCQUNOLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLE9BQU8sRUFBRTtvQkFDWCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2lCQUNsQzthQUNGO1NBQ0Y7Z0JBQVM7WUFDUixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztTQUMzQjtJQUNILENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxPQUF5QjtRQUNuRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU87YUFDcEIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDbkMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWixPQUFPLEVBQUUsR0FBRyx3QkFBd0IsRUFBRSxHQUFHLElBQUksRUFBb0IsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxZQUFZO0lBQ0oscUJBQXFCO1FBQzNCLFNBQVM7UUFDVCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFdEQsZ0JBQWdCO1FBQ2hCLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQ2xELENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUMxQixDQUFDO1FBRUYseUNBQXlDO1FBQ3pDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ2hELENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQy9CLENBQUM7UUFFRixZQUFZO1FBQ1osTUFBTSxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUM7UUFDekQsTUFBTSxvQkFBb0IsR0FDeEIsaUJBQWlCLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDO1FBRXBELHNDQUFzQztRQUN0QyxNQUFNLHNCQUFzQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFakQsNkNBQTZDO1FBQzdDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQzNDLGlCQUFpQixFQUNqQixJQUFJLENBQUMsWUFBWSxDQUNsQixDQUFDO1lBQ0YsSUFBSSxjQUFjLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3pCLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUM1QztTQUNGO1FBRUQsZ0RBQWdEO1FBQ2hELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDOUMsaUJBQWlCLEVBQ2pCLElBQUksQ0FBQyxlQUFlLENBQ3JCLENBQUM7WUFDRixJQUFJLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUM1QixzQkFBc0IsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUMvQztTQUNGO1FBRUQsd0JBQXdCO1FBQ3hCLG9CQUFvQjtRQUNwQixNQUFNLG9CQUFvQixHQUN4QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksc0JBQXNCLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLEVBQUU7WUFDakUsS0FDRSxJQUFJLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLEVBQ3ZELENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQzVCLENBQUMsRUFBRSxFQUNIO2dCQUNBLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQjtTQUNGO1FBRUQsZ0JBQWdCO1FBQ2hCLE1BQU0sZUFBZSxHQUF1QixFQUFFLENBQUM7UUFDL0MsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3RDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDM0I7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILFNBQVM7UUFDVCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssb0JBQW9CLEVBQUU7WUFDbkQsT0FBTyxDQUFDLElBQUksQ0FDVix3QkFBd0Isb0JBQW9CLGFBQWEsZUFBZSxDQUFDLE1BQU0sNkNBQTZDLENBQzdILENBQUM7U0FDSDtRQUVELFlBQVk7UUFDWix1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDaEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQWEsQ0FBQztZQUMxQyxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDaEU7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FDWCxvQkFBb0IsWUFBWSxRQUFRLEtBQUssT0FBTyxDQUNyRCxDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILHlDQUF5QztRQUN6QyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGlCQUFrQixDQUFDO1lBQy9DLE1BQU0sYUFBYSxHQUFHLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUNoRCxJQUFJLGFBQWEsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7YUFDeEU7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FDWCx5QkFBeUIsWUFBWSxRQUFRLGFBQWEsT0FBTyxDQUNsRSxDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwwQkFBMEI7SUFDbEIsaUJBQWlCLENBQ3ZCLFNBQTZCLEVBQzdCLE1BQXdCO1FBRXhCLFlBQVk7UUFDWixJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRS9CLHVCQUF1QjtRQUN2QixJQUFJO1lBQ0YsTUFBTSxnQkFBZ0IsR0FBSSxNQUFjLENBQUMsVUFBVSxDQUFDO1lBQ3BELElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN6QyxNQUFNLGFBQWEsR0FBSSxTQUFTLENBQUMsQ0FBQyxDQUFTLENBQUMsVUFBVSxDQUFDO29CQUN2RCxJQUFJLGFBQWEsS0FBSyxnQkFBZ0IsRUFBRTt3QkFDdEMsT0FBTyxDQUFDLENBQUM7cUJBQ1Y7aUJBQ0Y7YUFDRjtTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPO1NBQ1I7UUFFRCx3QkFBd0I7UUFDeEIsSUFBSTtZQUNGLE1BQU0sZUFBZSxHQUFJLE1BQWMsQ0FBQyxzQkFBc0IsQ0FBQztZQUMvRCxJQUFJLGVBQWUsRUFBRTtnQkFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3pDLE1BQU0sWUFBWSxHQUFJLFNBQVMsQ0FBQyxDQUFDLENBQVMsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDbEUsSUFBSSxZQUFZLEtBQUssZUFBZSxFQUFFO3dCQUNwQyxPQUFPLENBQUMsQ0FBQztxQkFDVjtpQkFDRjthQUNGO1NBQ0Y7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU87U0FDUjtRQUVELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRUQsYUFBYTtJQUNMLHdCQUF3QixDQUFDLE9BQXlCO1FBQ3hELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRzt3QkFDaEIsR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUMxQyxHQUFHLElBQUksQ0FBQyxVQUFVO3FCQUNuQixDQUFDO2lCQUNIO3FCQUFNO29CQUNMLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2lCQUNsRTthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYztJQUNOLGdCQUFnQixDQUFDLE9BQXlCO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3pCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsRUFBRTtnQkFDeEQsSUFBSTtvQkFDRixNQUFNLE9BQU8sR0FBRyxNQUNkLElBQUksQ0FBQyxVQUNOLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztvQkFDYixJQUFJLENBQUMsVUFBK0IsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2lCQUN6RDtnQkFBQyxPQUFPLEtBQUssRUFBRTtvQkFDYixJQUFJLENBQUMsVUFBK0IsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2lCQUNwRDthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUF5QjtRQUNyRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLE9BQU87YUFDSixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNmLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2xELElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDaEQ7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQzthQUNELE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbkQsSUFBSSxZQUFZLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUVuRSw4Q0FBOEM7WUFDOUMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRTtnQkFDbkMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7cUJBQ3JELE1BQU0sQ0FBQyxDQUFDLEdBQWdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7cUJBQ3pDLEdBQUcsQ0FBQyxDQUFDLEdBQWdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7b0JBQ3JCLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQzthQUMzRDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLFlBQVksQ0FBQzthQUNwRTtZQUVELHVCQUF1QjtZQUN2QixJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssY0FBYyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3pDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFTCxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxDQUFNLEVBQUUsRUFBRTtZQUMvQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDbkUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ25FLElBQUksTUFBTSxLQUFLLE1BQU07Z0JBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEMsT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRXhELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVPLGtCQUFrQixDQUFDLGFBQStCO1FBQ3hELG1DQUFtQztRQUNuQyxNQUFNLGFBQWEsR0FBRyxhQUFhO2FBQ2hDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FDeEQ7YUFDQSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNqQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekUsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7UUFFTCwyQkFBMkI7UUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDN0MsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FDMUIsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDbkIsQ0FBQztZQUNELENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDdkMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FDeEQsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUN2QyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FDdkQsQ0FBQztRQUVGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsYUFBYSxFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsa0NBQWtDO0lBQzFCLHVCQUF1QixDQUFDLE1BQVc7UUFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE1BQU0sT0FBTyxHQUFzQjtZQUNqQyxHQUFHLENBQUMsR0FBUSxFQUFFLElBQXFCLEVBQUUsS0FBVTtnQkFDN0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRTtvQkFDcEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDakIsT0FBTyxJQUFJLENBQUM7aUJBQ2I7Z0JBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDakIsSUFBSTtvQkFDRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQzt3QkFDdkIsR0FBRzt3QkFDSCxLQUFLO3dCQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFO3FCQUMvQixDQUFDLENBQUM7aUJBQ0o7Z0JBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRTtnQkFDZCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7U0FDRixDQUFDO1FBQ0YsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEQsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLDBCQUEwQjtRQUMxQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQywwQkFBMEI7WUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDL0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxFQUFFLFFBQVEsSUFBSSxLQUFLLENBQUM7WUFDNUMsT0FBTztnQkFDTCxLQUFLLEVBQUUsU0FBUztnQkFDaEIsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFFO2FBQzdCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixPQUFPLEtBQUssQ0FBQyxDQUFDLGNBQWM7U0FDN0I7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sS0FBSyxDQUFDLENBQUMsMEJBQTBCO0lBQzFDLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQzVFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUVwQyxpQ0FBaUM7UUFDakMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxFQUFFO1lBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkQsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBRSxDQUFDO2dCQUNwQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLEdBQUcsS0FBSyxDQUFDO29CQUFFLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzthQUN2RDtZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sYUFBYSxDQUFDLElBQVMsRUFBRSxJQUFTO1FBQ3hDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLElBQUksSUFBSSxJQUFJLElBQUk7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVCLElBQUksSUFBSSxJQUFJLElBQUk7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQixJQUFJLElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksRUFBRTtZQUNoRCxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDeEM7UUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFNBQVMsSUFBSSxPQUFPLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDMUQsT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQztRQUNELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUN4RCxPQUFPLElBQUksR0FBRyxJQUFJLENBQUM7U0FDcEI7UUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDeEQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQztRQUNyRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELGdDQUFnQztJQUN4Qiw2QkFBNkIsQ0FBQyxLQUFZLEVBQUUsTUFBc0I7UUFDeEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQztRQUV4RCxJQUNHLE1BQU0sQ0FBQyxVQUFxQyxDQUFDLFVBQVU7WUFDeEQsT0FBUSxNQUFNLENBQUMsVUFBcUMsQ0FBQyxVQUFVO2dCQUM3RCxVQUFVLEVBQ1o7WUFDQSxJQUFJO2dCQUNGLE1BQU0sTUFBTSxHQUFJLE1BQU0sQ0FBQyxVQUFxQyxDQUFDLFVBQVUsQ0FDckUsS0FBSyxDQUNOLENBQUM7Z0JBQ0Ysd0JBQXdCO2dCQUN4QixJQUFJLE1BQU0sWUFBWSxPQUFPLEVBQUU7b0JBQzdCLE1BQU07eUJBQ0gsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ2IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3ZELENBQUMsQ0FBQzt5QkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUN2RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUMvQyxDQUFDLENBQUMsQ0FBQztpQkFDTjtxQkFBTTtvQkFDTCxTQUFTO29CQUNULElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO2lCQUN4RDthQUNGO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUM5QztTQUNGO0lBQ0gsQ0FBQztJQUVNLGVBQWUsQ0FBQyxPQUV0QjtRQUNDLE1BQU0sRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUMxRSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFDLE9BQU87WUFDTCxNQUFNO1lBQ04sUUFBUSxFQUFFO2dCQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7Z0JBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7YUFDbEM7WUFDRCxvQkFBb0I7WUFDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUTtnQkFDNUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFO2dCQUN6QyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ1IsQ0FBQztJQUNKLENBQUM7SUFFTSxNQUFNLENBQUMsV0FBcUI7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU0sY0FBYyxDQUFDLE1BQTJCO1FBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7WUFFdkQsb0RBQW9EO1lBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQ2hELENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQ3JELENBQUM7WUFDRixJQUFJLFlBQVksRUFBRSxTQUFTLEtBQUssVUFBVSxFQUFFO2dCQUMxQyxNQUFNLE1BQU0sR0FBVSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsVUFBZ0MsQ0FBQztnQkFDdkUsSUFBSSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUU7b0JBQzdCLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUNyRCxDQUFDLElBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ3RCLEdBQUcsSUFBSTt3QkFDUCxPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO3FCQUNyQyxDQUFDLENBQ0gsQ0FBQztpQkFDSDthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sYUFBYSxDQUFDLEdBQVcsRUFBRSxLQUFVO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FDckIsT0FBeUIsRUFDekIsT0FFQztRQUVELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVsQyxXQUFXO1FBQ1gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2QyxpQkFBaUI7UUFDakIsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekMsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV0RSxzQkFBc0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCO1FBRUQsZ0NBQWdDO1FBQ2hDLElBQUksT0FBTyxFQUFFLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsK0JBQStCO1FBQy9CLGdEQUFnRDtRQUNoRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBUSxDQUFDO0lBQ3RFLENBQUM7SUFFRCxZQUFZO0lBQ1osV0FBVyxDQUFDLElBQXdCO1FBQ2xDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDaEQsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQXNCLEVBQUUsSUFBUztRQUNuRCxNQUFNLEdBQUcsR0FDUCxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUMxRCxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUTtnQkFDZixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUk7Z0JBQ2IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFTO1FBQzFCLDhCQUE4QjtRQUM5QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hDO1FBQ0Qsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFdBQVc7SUFDWCxhQUFhLENBQUMsSUFBUztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMzRCxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLFlBQVksQ0FBQyxJQUFTO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3JDLHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsZ0JBQWdCLENBQUMsSUFBUyxFQUFFLE9BQWdCLEVBQUUsS0FBYTtRQUN6RCxJQUFJLEtBQUssRUFBRTtZQUNULEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQjtTQUMzQztRQUNELG1CQUFtQjtRQUNuQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUIsT0FBTztTQUNSO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRXZCLDRCQUE0QjtRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUMxQixDQUFDO1FBQ0YsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0I7WUFDRCxrQkFBa0I7WUFDbEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztTQUMvQjthQUFNO1lBQ0wsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO1lBQ0Qsa0JBQWtCO1lBQ2xCLElBQ0UsSUFBSSxDQUFDLGlCQUFpQjtnQkFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEVBQzVDO2dCQUNBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7YUFDL0I7U0FDRjtRQUVELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDNUIsT0FBTztTQUNSO1FBQ0QsaUJBQWlCO1FBQ2pCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUMxQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUNsQyxDQUFDO1FBQ0YsdUJBQXVCO1FBQ3ZCLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQ3ZDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLElBQUksQ0FDOUIsQ0FBQyxNQUFNLENBQUM7UUFDVCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXO1lBQ2QsVUFBVSxHQUFHLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksS0FBSyxVQUFVLENBQUM7UUFDcEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksR0FBRyxVQUFVLENBQUM7SUFDdEUsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixjQUFjLENBQUMsT0FBZ0IsRUFBRSxLQUFhO1FBQzVDLElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3pCO1FBRUQsaUJBQWlCO1FBQ2pCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUMxQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUNsQyxDQUFDO1FBRUYsa0JBQWtCO1FBQ2xCLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1QixHQUFHLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1lBQ3hDLG9CQUFvQjtZQUNwQixJQUFJLENBQUMsaUJBQWlCO2dCQUNwQixhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDdEQ7YUFBTTtZQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLE9BQU87WUFDUCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixzQkFBc0IsQ0FBQyxJQUFTLEVBQUUsT0FBZ0I7UUFDaEQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVCLE9BQU87U0FDUjtRQUVELCtCQUErQjtRQUMvQiwwQkFBMEI7UUFFMUIsNEJBQTRCO1FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQzFCLENBQUM7UUFDRixJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMvQjtZQUNELGtCQUFrQjtZQUNsQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO2FBQU07WUFDTCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDckM7WUFDRCxrQkFBa0I7WUFDbEIsSUFDRSxJQUFJLENBQUMsaUJBQWlCO2dCQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFDNUM7Z0JBQ0EsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzthQUMvQjtTQUNGO1FBRUQsU0FBUztRQUNULElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxpQkFBaUI7SUFDakIscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxtQkFBbUI7SUFDWCxRQUFRLENBQUMsSUFBUztRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUM7SUFDMUMsQ0FBQztJQUVELGFBQWE7SUFDTCxTQUFTLENBQUMsSUFBUyxFQUFFLElBQVM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhDLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQzFDLE9BQU8sR0FBRyxLQUFLLEdBQUcsQ0FBQztTQUNwQjtRQUVELHFCQUFxQjtRQUNyQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLGlCQUFpQjtRQUNmLDBCQUEwQjtRQUMxQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQzlCLEdBQUcsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxlQUE4QixFQUFFLEdBQVc7UUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNsQixDQUFDLEdBQUcsQ0FBQyxFQUFFLGVBQWU7aUJBQ25CLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztpQkFDOUIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3hELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM5QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1lBRUgseUJBQXlCO1lBQ3pCLElBQUksWUFBWSxFQUFFLFNBQVMsS0FBSyxVQUFVLEVBQUU7Z0JBQzFDLGtDQUFrQztnQkFDbEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDaEQsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7Z0JBQ3RELENBQUMsQ0FBQyxDQUFDO2dCQUVILG1DQUFtQztnQkFDbkMsTUFBTSxrQkFBa0IsR0FBRyxjQUFjLEVBQUUsVUFFOUIsQ0FBQztnQkFDZCxNQUFNLGFBQWEsR0FBRyxDQUFDLGtCQUFrQixFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7cUJBQ3RELE1BQU0sQ0FBQyxDQUFDLEdBQWdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7cUJBQ3pDLEdBQUcsQ0FBQyxDQUFDLEdBQWdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxZQUFZLEdBQ2hCLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDdEIsQ0FBQyxDQUFDLGFBQWE7b0JBQ2YsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBRTVELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUV2QywwQ0FBMEM7Z0JBQzFDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO2dCQUMxRCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxVQUFnQyxDQUFDO2dCQUN2RSxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQWlCLEVBQUUsRUFBRTtvQkFDbkUsT0FBTzt3QkFDTCxHQUFHLElBQUk7d0JBQ1AsT0FBTyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztxQkFDNUMsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxFQUFFLFVBQVU7b0JBQ2hELENBQUMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLEtBQUs7d0JBQzlCLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLO29CQUN2RCxDQUFDLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQzthQUMzRDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQscUJBQXFCLENBQUMsU0FBaUI7UUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsb0JBQW9CLENBQUMsUUFBYTtRQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxXQUFxQjtRQUNyQyxnQ0FBZ0M7UUFDaEMsSUFDRSxXQUFXO1lBQ1gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUM1QjtZQUNBLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztTQUN6RDtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJO2dCQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQztvQkFDaEMsTUFBTSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtvQkFDckMsUUFBUSxFQUFFO3dCQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7d0JBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7cUJBQ2xDO29CQUNELG9CQUFvQjtvQkFDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUTt3QkFDNUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFO3dCQUN6QyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNSLENBQUMsQ0FBQztnQkFFSCxpQ0FBaUM7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ2pELE9BQU87NEJBQ0wsR0FBRyxJQUFJOzRCQUNQLE9BQU8sRUFBRSxLQUFLO3lCQUNmLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztpQkFDckM7Z0JBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztnQkFDOUMsb0JBQW9CO2dCQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO29CQUM3QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztpQkFDOUI7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLG1CQUFtQjtnQkFDbkIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNyQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztpQkFDMUI7YUFDRjtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUN6QjtvQkFBUztnQkFDUixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzthQUMvQjtTQUNGO2FBQU07WUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRUQsVUFBVTtJQUNWLFlBQVksQ0FBQyxPQUFlLEVBQUUsU0FBc0M7UUFDbEUsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN6QyxJQUFJLEdBQUcsS0FBSyxPQUFPO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUVuQyxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDO1FBQ3JFLElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbEM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO1lBQzdCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCO2FBQU07WUFDTCxZQUFZO1lBQ1osSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFlO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDeEMsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQVM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xELFdBQVc7WUFDWCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN4QixNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztTQUMxQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFTO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELDJCQUEyQjtRQUN6QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsNEJBQTRCO0lBQzVCLHVCQUF1QixDQUFDLEtBQVksRUFBRSxNQUFzQjtRQUMxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDO1FBRXhELG9CQUFvQjtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNoRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFVLEVBQUUsRUFBRTtnQkFDMUMsMkJBQTJCO2dCQUMzQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUNqRCxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssUUFBUSxDQUN6RCxDQUFDO2dCQUNGLElBQUksYUFBYSxFQUFFO29CQUNqQixJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO2lCQUN4RDtZQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWE7WUFDdEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDMUQ7UUFFRCxTQUFTO1FBQ1QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRSxJQUFJLFdBQVcsRUFBRTtZQUNmLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRCx1QkFBdUI7SUFDdkIseUJBQXlCLENBQUMsTUFBc0I7UUFDOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFzQjtRQUNsQyxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixnQkFBZ0IsQ0FBQyxJQUF3QjtRQUN2QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ2hELENBQUM7SUFFRCxxQkFBcUI7SUFDckIsb0JBQW9CLENBQUMsTUFBc0I7UUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQztRQUNqRSxPQUFPLGFBQWEsU0FBUyxZQUFZLENBQUM7SUFDNUMsQ0FBQzt3R0FwcENVLGlCQUFpQixrQkEySmxCLHVCQUF1Qjs0RkEzSnRCLGlCQUFpQiwrekNBMkVYLFdBQVcsNkJDOUc5QixvcGZBeVhBOzs0RkR0VmEsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGVBQWU7OzBCQThKdEIsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyx1QkFBdUI7NENBMUp4QixhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFFb0IsWUFBWTtzQkFBdEMsWUFBWTt1QkFBQyxXQUFXO2dCQUVLLGVBQWU7c0JBQTVDLFlBQVk7dUJBQUMsY0FBYztnQkFFRSxZQUFZO3NCQUF6QyxlQUFlO3VCQUFDLFdBQVc7Z0JBK0Q1QixjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBUZW1wbGF0ZVJlZixcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAsIGhhc0luLCBpc05pbCwgZGVib3VuY2UsIGlzRXF1YWwgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCB7IFBST19UQUJMRV9ERUZBVUxUX0NPTFVNTiwgUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHtcclxuICBBdXRvQ29tcGxldGVGaWVsZFByb3BzLFxyXG4gIENoZWNrYm94RmllbGRQcm9wcyxcclxuICBPcHRpb25zVHlwZSxcclxuICBQcm9UYWJsZUNvbHVtbixcclxuICBQcm9UYWJsZVBhZ2VJbmZvLFxyXG4gIFByb1RhYmxlUmVxdWVzdFJlc3VsdCxcclxuICBQcm9UYWJsZVZhbHVlc0NoYW5nZSxcclxuICBTZWxlY3RGaWVsZFByb3BzLFxyXG59IGZyb20gXCIuL3R5cGVcIjtcclxuaW1wb3J0IHsgUFJPX1RBQkxFX0NPTFVNTl9SRU1PVEUsIFByb1RhYmxlUmVtb3RlQ29sdW1uU2VydmljZSB9IGZyb20gXCIuL3Rva2Vuc1wiO1xyXG5pbXBvcnQgeyBpc09ic2VydmFibGUsIGxhc3RWYWx1ZUZyb20gfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXByby10YWJsZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vcHJvLXRhYmxlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3Byby10YWJsZS5jb21wb25lbnQubGVzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuICBASW5wdXQoKSBzaG93U2VhcmNoQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NsZWFyQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSB0YWJsZU5hbWU6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIEBJbnB1dCgpIG11bHRpUm93OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJhcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25CYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBjb25maXJtQnRuVGV4dDogc3RyaW5nID0gXCLmn6Xor6JcIjtcclxuXHJcbiAgQElucHV0KCkgY2xlYXJCdG5UZXh0OiBzdHJpbmcgPSBcIua4heepulwiO1xyXG5cclxuICBASW5wdXQoKSBsYWJlbFdpZHRoOiBzdHJpbmcgPSBcIjkwcHhcIjtcclxuXHJcbiAgQElucHV0KCkgbGFiZWxBbGlnbjogc3RyaW5nID0gXCJyaWdodFwiO1xyXG5cclxuICBASW5wdXQoKSBmb3JtSXRlbVdpZHRoOiBzdHJpbmcgPSBcIjMzMHB4XCI7XHJcblxyXG4gIEBJbnB1dCgpIGRhdGFTb3VyY2U6IGFueVtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGJvcmRlcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgb3V0ZXJCb3JkZXJlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgZnJvbnRQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNjcm9sbDogeyB4Pzogc3RyaW5nIHwgbnVtYmVyOyB5Pzogc3RyaW5nIHwgbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgcmVxdWVzdDogKHBhcmFtczogYW55KSA9PiBQcm9taXNlPFByb1RhYmxlUmVxdWVzdFJlc3VsdD47XHJcblxyXG4gIEBJbnB1dCgpIHN1bW1hcnlEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIOaOkuW6j+aooeW8j++8mmxvY2FsIOacrOWcsOaOkuW6j++8m3NlcnZlciDlnKjnur/mjpLluo/vvIjmj5DkuqTnu5nmjqXlj6PvvIlcclxuICBASW5wdXQoKSBzb3J0TW9kZTogXCJsb2NhbFwiIHwgXCJzZXJ2ZXJcIiA9IFwibG9jYWxcIjtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NvbHVtblNldHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5piv5ZCm5byA5ZCv5aSa5YiX5o6S5bqP77yI6buY6K6k5Y2V5YiX77yJXHJcbiAgQElucHV0KCkgbXVsdGlwbGVTb3J0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDliKTmlq3ooYzmmK/lkKbnpoHnlKjnmoTlh73mlbBcclxuICBASW5wdXQoKSByb3dEaXNhYmxlZDogKGRhdGE6IGFueSkgPT4gYm9vbGVhbiA9ICgpID0+IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSByZXJlbmRlck9uUmVzaXplOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8g5piv5ZCm6Ieq5Yqo6Kem5Y+R6K+35rGCXHJcbiAgQElucHV0KCkgYXV0b1RyaWdnZXJSZXF1ZXN0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgY3VzdG9tVGFibGVSZW5kZXI/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dEYkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblZhbHVlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvVGFibGVWYWx1ZXNDaGFuZ2U+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblJlc2V0Rm9ybUJlZm9yZVJlbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAQ29udGVudENoaWxkKFwiYWN0aW9uQmFyXCIpIGFjdGlvbkJhclRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoXCJJbWdBY3Rpb25CYXJcIikgaW1nQWN0aW9uQmFyVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZVJlZikgYWxsVGVtcGxhdGVzITogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xyXG5cclxuICBwcml2YXRlIF9zYXZlZFNlYXJjaFBhcmFtczogYW55ID0ge307XHJcblxyXG4gIC8vIOWtmOWCqOaJgOacieiHquWumuS5ieaooeadv+eahOW8leeUqFxyXG4gIHByaXZhdGUgY3VzdG9tVGVtcGxhdGVzID0gbmV3IE1hcDxzdHJpbmcsIFRlbXBsYXRlUmVmPGFueT4+KCk7XHJcblxyXG4gIC8vIOiusOW9leWQhOWIl+aOkuW6j+eKtuaAge+8midhc2NlbmQnIHwgJ2Rlc2NlbmQnIHwgbnVsbFxyXG5cclxuICBwcml2YXRlIF9zb3J0TWFwOiBSZWNvcmQ8c3RyaW5nLCBcImFzY2VuZFwiIHwgXCJkZXNjZW5kXCIgfCBudWxsPiA9IHt9O1xyXG5cclxuICAvLyDorrDlvZXlpJrliJfmjpLluo/nmoTkvJjlhYjnuqfvvIjlkI7orr7nva7nmoTkvJjlhYjvvIlcclxuICBwcml2YXRlIF9zb3J0UHJpb3JpdHk6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIC8vIOWtmOWCqOavj+S4qiBhdXRvQ29tcGxldGUg5a2X5q6155qE6Ziy5oqW5Ye95pWwXHJcbiAgcHJpdmF0ZSBfYXV0b0NvbXBsZXRlRGVib3VuY2VNYXA6IE1hcDxzdHJpbmcsIChldmVudDogRXZlbnQpID0+IHZvaWQ+ID1cclxuICAgIG5ldyBNYXAoKTtcclxuXHJcblxyXG4gIF9jb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIC8vIOetm+mAieihqOWNleaVsOaNruWtmOWCqFxyXG4gIF9zZWFyY2hQYXJhbXM6IGFueSA9IHt9O1xyXG5cclxuICAvLyDnrZvpgInooajljZVsaXN05riy5p+T5pWw5o2uXHJcbiAgX3NlYXJjaEZpbGVkQ29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBfcGFnZUluZm86IFByb1RhYmxlUGFnZUluZm8gPSB7XHJcbiAgICBwYWdlSW5kZXg6IDEsXHJcbiAgICBwYWdlU2l6ZTogMTUsXHJcbiAgICB0b3RhbDogMTAwLFxyXG4gICAgcGFnZVNpemVPcHRpb25zOiBbMTAsIDE1LCAyMCwgNTAsIDEwMCwgNTAwLCAxMDAwXSxcclxuICB9O1xyXG5cclxuICBfbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBfc2VsZWN0ZWRUYWJsZVJvdzogYW55ID0gbnVsbDtcclxuXHJcbiAgLy8g6YCJ5Lit55qE6KGM5pWw5o2u77yI55So5LqO5aSN6YCJ5qGG6YCJ5oup77yJLSDkv53nlZnnlKjkuo7lhbzlrrnmgKdcclxuICBfc2VsZWN0ZWRSb3dzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAvLyDlhajpgInnirbmgIFcclxuICBfY2hlY2tlZEFsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDljYrpgInnirbmgIHvvIjpg6jliIbpgInkuK3vvIlcclxuICBfaW5kZXRlcm1pbmF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDov5znqItjb2x1bW5zXHJcbiAgX3NlcnZlckNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgLy8g5a2Y5YKoIGF1dG9Db21wbGV0ZSDlrZfmrrXnmoTmlbDmja7mupBcclxuICBfYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIGFueVtdPiA9IHt9O1xyXG5cclxuICAvLyDmjqfliLbooajmoLzmmL7npLrnirbmgIHvvIznlKjkuo7ph43mlrDmjILovb1cclxuICBfc2hvd1RhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8g5Yqo5oCB5YiX5Yqg6L295a6M5oiQ5qCH5b+X77yM6buY6K6kIHRydWXvvIjml6DliqjmgIHliJfml7bnm7TmjqXmmL7npLrvvIlcclxuICBfY29sdW1uc1JlYWR5OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8g6Ziy5oqW5a6a5pe25Zmo77yM55So5LqO56qX5Y+j5aSn5bCP6LCD5pW0XHJcbiAgcHJpdmF0ZSByZXNpemVEZWJvdW5jZTogYW55O1xyXG5cclxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxyXG4gIG9uV2luZG93UmVzaXplKCkge1xyXG4gICAgaWYgKCF0aGlzLnJlcmVuZGVyT25SZXNpemUpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5yZXNpemVEZWJvdW5jZSkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVEZWJvdW5jZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXNpemVEZWJvdW5jZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvLyDpgJrov4cgbmdJZiDph43mlrDmjILovb3ooajmoLxcclxuICAgICAgdGhpcy5fc2hvd1RhYmxlID0gZmFsc2U7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX3Nob3dUYWJsZSA9IHRydWU7XHJcbiAgICAgIH0sIDApO1xyXG4gICAgfSwgMTUwKTtcclxuICB9XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKVxyXG4gICAgQEluamVjdChQUk9fVEFCTEVfQ09MVU1OX1JFTU9URSlcclxuICAgIHByaXZhdGUgY29sdW1uUmVtb3RlOiBQcm9UYWJsZVJlbW90ZUNvbHVtblNlcnZpY2UgfCBudWxsLFxyXG4gICkge31cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlbW90ZUNvbHVtbnMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29sdW1uUmVtb3RlPy5nZXRDb2wgfHwgIXRoaXMudGFibGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jb2x1bW5SZW1vdGUuZ2V0Q29sKHRoaXMudGFibGVOYW1lLCB0aGlzLm11bHRpUm93KTtcclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwZXJzaXN0UmVtb3RlQ29sdW1ucyhjb2x1bW5zOiBhbnlbXSkge1xyXG4gICAgaWYgKCF0aGlzLmNvbHVtblJlbW90ZT8uc2V0Q29sIHx8ICF0aGlzLnRhYmxlTmFtZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29sdW1uUmVtb3RlLnNldENvbChcclxuICAgICAgICB0aGlzLnRhYmxlTmFtZSxcclxuICAgICAgICBjb2x1bW5zLFxyXG4gICAgICAgIHRoaXMubXVsdGlSb3csXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyZXN1bHQgJiYgaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgbGFzdFZhbHVlRnJvbShyZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4geyAgIFxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0ge307XHJcbiAgICB0aGlzLmZvcm1hdGVJbm5lckNvbHVtbnModGhpcy5jb2x1bW5zKTtcclxuICAgIGF3YWl0IHRoaXMuc2V0U2VhcmNoUGFyYW1zKHRoaXMuY29sdW1ucyk7XHJcblxyXG4gICAgLy8g5L2/55SoIFByb3h5IOWMheijhSBfc2VhcmNoUGFyYW1z77yM5oum5oiq6KGo5Y2V6aG55YC85Y+Y5YyW5bm25ZCR5aSW5Y+R5Ye65LqL5Lu2XHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXMgPSB0aGlzLmNyZWF0ZVNlYXJjaFBhcmFtc1Byb3h5KHRoaXMuX3NlYXJjaFBhcmFtcyk7XHJcbiAgICBpZiAodGhpcy5hdXRvVHJpZ2dlclJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudGFibGVOYW1lICYmIHRoaXMuY29sdW1uUmVtb3RlKSB7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnNSZWFkeSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5xdWVyeUR5bmFtaWNDb2x1bW5zKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICAvLyDoh6rliqjms6jlhozmiYDmnInoh6rlrprkuYnmqKHmnb9cclxuICAgIC8vIOazqOaEj++8muatpOaXtuaJgOaciSBDb250ZW50Q2hpbGQg5ZKMIENvbnRlbnRDaGlsZHJlbiDpg73lt7LliJ3lp4vljJblrozmiJBcclxuICAgIHRoaXMuYXV0b1JlZ2lzdGVyVGVtcGxhdGVzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHF1ZXJ5RHluYW1pY0NvbHVtbnMoKSB7XHJcbiAgICBpZiAoIXRoaXMudGFibGVOYW1lIHx8ICF0aGlzLmNvbHVtblJlbW90ZSkgcmV0dXJuO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5mZXRjaFJlbW90ZUNvbHVtbnMoKTtcclxuICAgICAgaWYgKCFyZXMpIHJldHVybjtcclxuICAgICAgaWYgKHJlcy5jb2RlID09PSAwKSB7XHJcbiAgICAgICAgY29uc3QgX3RhYkNvbHVtbiA9IHJlcy5kYXRhLnRhYkNvbHVtbi5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmhlYWRlcixcclxuICAgICAgICAgICAgcHJvcDogaXRlbS5maWVsZCxcclxuICAgICAgICAgICAgc29ydE5hbWU6IGl0ZW0uc29ydE5hbWUsXHJcbiAgICAgICAgICAgIGhpZGVJblRhYmxlOiAhaXRlbS5pc1Nob3csXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX3NlcnZlckNvbHVtbnMgPSBfdGFiQ29sdW1uLmZpbHRlcigoY29sKSA9PlxyXG4gICAgICAgICAgdGhpcy5jb2x1bW5zLnNvbWUoKGxvY2FsQ29sKSA9PiBsb2NhbENvbC5wcm9wID09PSBjb2wucHJvcCksXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRhYmxlQ29sdW1ucyh0aGlzLl9zZXJ2ZXJDb2x1bW5zKTtcclxuICAgICAgfSBlbHNlIGlmIChyZXMuY29kZSA9PT0gMTApIHtcclxuICAgICAgICAvLyDlpoLmnpzmnKrorr7nva7mjqXlj6Pov5Tlm57vvIzpnIDopoHpu5jorqTosIPnlKjkuIDmrKHkv67mlLnlh73mlbDliJ3lp4vljJbmlbDmja5cclxuICAgICAgICBjb25zdCBpbml0Q29sdW1ucyA9IHRoaXMuY29sdW1uc1xyXG4gICAgICAgICAgLmZpbHRlcigoY29sKSA9PiAhY29sLmF1eGlsaWFyeUNvbHVtbilcclxuICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4gKHtcclxuICAgICAgICAgICAgZmllbGQ6IGNvbHVtbi5wcm9wLFxyXG4gICAgICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgICAgIGhlYWRlcjogY29sdW1uLnRpdGxlLFxyXG4gICAgICAgICAgICBzb3J0TmFtZTogY29sdW1uLnNvcnROYW1lIHx8IG51bGwsXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgY29uc3QgaW5pdFJlcyA9IGF3YWl0IHRoaXMucGVyc2lzdFJlbW90ZUNvbHVtbnMoaW5pdENvbHVtbnMpO1xyXG4gICAgICAgIGlmIChpbml0UmVzKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnNSZWFkeSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdGVJbm5lckNvbHVtbnMoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaGlkZUluVGFibGUpXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4geyAuLi5QUk9fVEFCTEVfREVGQVVMVF9DT0xVTU4sIC4uLml0ZW0gfSBhcyBQcm9UYWJsZUNvbHVtbjtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDoh6rliqjms6jlhozmqKHmnb/nmoTmlrnms5VcclxuICBwcml2YXRlIGF1dG9SZWdpc3RlclRlbXBsYXRlcygpIHtcclxuICAgIC8vIOiOt+WPluaJgOacieaooeadv1xyXG4gICAgY29uc3QgYWxsVGVtcGxhdGVzQXJyYXkgPSB0aGlzLmFsbFRlbXBsYXRlcy50b0FycmF5KCk7XHJcblxyXG4gICAgLy8g6I635Y+W5omA5pyJ6ZyA6KaB6Ieq5a6a5LmJ5qih5p2/55qE5YiXXHJcbiAgICBjb25zdCBjb2x1bW5zV2l0aEN1c3RvbVJlbmRlciA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sKSA9PiBjb2wuY3VzdG9tUmVuZGVyLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDojrflj5bmiYDmnInpnIDopoHoh6rlrprkuYlsYWJlbOaooeadv+eahOWIl++8iOS9v+eUqOWOn+Wni2NvbHVtbnPvvIznoa7kv53pobrluo/mraPnoa7vvIlcclxuICAgIGNvbnN0IGNvbHVtbnNXaXRoQ3VzdG9tTGFiZWwgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sKSA9PiBjb2wuY3VzdG9tTGFiZWxSZW5kZXIsXHJcbiAgICApO1xyXG5cclxuICAgIC8vIOiuoeeul+mcgOimgeeahOaooeadv+aAu+aVsFxyXG4gICAgY29uc3QgY3VzdG9tUmVuZGVyQ291bnQgPSBjb2x1bW5zV2l0aEN1c3RvbVJlbmRlci5sZW5ndGg7XHJcbiAgICBjb25zdCB0b3RhbE5lZWRlZFRlbXBsYXRlcyA9XHJcbiAgICAgIGN1c3RvbVJlbmRlckNvdW50ICsgY29sdW1uc1dpdGhDdXN0b21MYWJlbC5sZW5ndGg7XHJcblxyXG4gICAgLy8g6K+G5Yir5bm25o6S6Zmk54m55q6K5qih5p2/77yIYWN0aW9uQmFyIOWSjCBpbWdBY3Rpb25CYXLvvIlcclxuICAgIGNvbnN0IHNwZWNpYWxUZW1wbGF0ZUluZGljZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcclxuXHJcbiAgICAvLyDlsJ3or5Xmib7liLAgYWN0aW9uQmFyVHBsIOWcqCBhbGxUZW1wbGF0ZXNBcnJheSDkuK3nmoTkvY3nva5cclxuICAgIGlmICh0aGlzLmFjdGlvbkJhclRwbCkge1xyXG4gICAgICBjb25zdCBhY3Rpb25CYXJJbmRleCA9IHRoaXMuZmluZFRlbXBsYXRlSW5kZXgoXHJcbiAgICAgICAgYWxsVGVtcGxhdGVzQXJyYXksXHJcbiAgICAgICAgdGhpcy5hY3Rpb25CYXJUcGwsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChhY3Rpb25CYXJJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmFkZChhY3Rpb25CYXJJbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlsJ3or5Xmib7liLAgaW1nQWN0aW9uQmFyVHBsIOWcqCBhbGxUZW1wbGF0ZXNBcnJheSDkuK3nmoTkvY3nva5cclxuICAgIGlmICh0aGlzLmltZ0FjdGlvbkJhclRwbCkge1xyXG4gICAgICBjb25zdCBpbWdBY3Rpb25CYXJJbmRleCA9IHRoaXMuZmluZFRlbXBsYXRlSW5kZXgoXHJcbiAgICAgICAgYWxsVGVtcGxhdGVzQXJyYXksXHJcbiAgICAgICAgdGhpcy5pbWdBY3Rpb25CYXJUcGwsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChpbWdBY3Rpb25CYXJJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmFkZChpbWdBY3Rpb25CYXJJbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzml6Dms5XpgJrov4flvJXnlKjmib7liLDnibnmrormqKHmnb/vvIzkvb/nlKjlpIfnlKjnrZbnlaVcclxuICAgIC8vIOWkh+eUqOetlueVpe+8muWBh+iuvuacgOWQjueahOaooeadv+aYr+eJueauiuaooeadv1xyXG4gICAgY29uc3Qgc3BlY2lhbFRlbXBsYXRlQ291bnQgPVxyXG4gICAgICAodGhpcy5hY3Rpb25CYXJUcGwgPyAxIDogMCkgKyAodGhpcy5pbWdBY3Rpb25CYXJUcGwgPyAxIDogMCk7XHJcbiAgICBpZiAoc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5zaXplID09PSAwICYmIHNwZWNpYWxUZW1wbGF0ZUNvdW50ID4gMCkge1xyXG4gICAgICBmb3IgKFxyXG4gICAgICAgIGxldCBpID0gYWxsVGVtcGxhdGVzQXJyYXkubGVuZ3RoIC0gc3BlY2lhbFRlbXBsYXRlQ291bnQ7XHJcbiAgICAgICAgaSA8IGFsbFRlbXBsYXRlc0FycmF5Lmxlbmd0aDtcclxuICAgICAgICBpKytcclxuICAgICAgKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoaSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDmj5Dlj5bliJfmqKHmnb/vvIjmjpLpmaTnibnmrormqKHmnb/vvIlcclxuICAgIGNvbnN0IGNvbHVtblRlbXBsYXRlczogVGVtcGxhdGVSZWY8YW55PltdID0gW107XHJcbiAgICBhbGxUZW1wbGF0ZXNBcnJheS5mb3JFYWNoKCh0cGwsIGluZGV4KSA9PiB7XHJcbiAgICAgIGlmICghc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5oYXMoaW5kZXgpKSB7XHJcbiAgICAgICAgY29sdW1uVGVtcGxhdGVzLnB1c2godHBsKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g6aqM6K+B5qih5p2/5pWw6YePXHJcbiAgICBpZiAoY29sdW1uVGVtcGxhdGVzLmxlbmd0aCAhPT0gdG90YWxOZWVkZWRUZW1wbGF0ZXMpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBQcm9UYWJsZTog5qih5p2/5pWw6YeP5LiN5Yy56YWN77yB6ZyA6KaBICR7dG90YWxOZWVkZWRUZW1wbGF0ZXN9IOS4quWIl+aooeadv++8jOWunumZheaciSAke2NvbHVtblRlbXBsYXRlcy5sZW5ndGh9IOS4quOAguivt+ajgOafpSBjdXN0b21SZW5kZXIg5ZKMIGN1c3RvbUxhYmVsUmVuZGVyIOmFjee9ruOAgmAsXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5rOo5YaM6Ieq5a6a5LmJ5riy5p+T5qih5p2/XHJcbiAgICBjb2x1bW5zV2l0aEN1c3RvbVJlbmRlci5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IGNvbHVtbi5jdXN0b21SZW5kZXIhO1xyXG4gICAgICBpZiAoaW5kZXggPCBjb2x1bW5UZW1wbGF0ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXMuc2V0KHRlbXBsYXRlTmFtZSwgY29sdW1uVGVtcGxhdGVzW2luZGV4XSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgIGBQcm9UYWJsZTog5pyq5om+5Yiw5qih5p2/IFwiJHt0ZW1wbGF0ZU5hbWV9XCLvvIzntKLlvJUgJHtpbmRleH0g6LaF5Ye66IyD5Zu0YCxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDms6jlhozoh6rlrprkuYlsYWJlbOaooeadv++8iOS7jiBjdXN0b21SZW5kZXJDb3VudCDkuYvlkI7lvIDlp4vvvIlcclxuICAgIGNvbHVtbnNXaXRoQ3VzdG9tTGFiZWwuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZU5hbWUgPSBjb2x1bW4uY3VzdG9tTGFiZWxSZW5kZXIhO1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZUluZGV4ID0gY3VzdG9tUmVuZGVyQ291bnQgKyBpbmRleDtcclxuICAgICAgaWYgKHRlbXBsYXRlSW5kZXggPCBjb2x1bW5UZW1wbGF0ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXMuc2V0KHRlbXBsYXRlTmFtZSwgY29sdW1uVGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgYFByb1RhYmxlOiDmnKrmib7liLBsYWJlbOaooeadvyBcIiR7dGVtcGxhdGVOYW1lfVwi77yM57Si5byVICR7dGVtcGxhdGVJbmRleH0g6LaF5Ye66IyD5Zu0YCxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOWwneivleWcqOaVsOe7hOS4reaJvuWIsOaooeadv+eahOe0ouW8le+8iOS9v+eUqOWkmuenjeavlOi+g+aWueW8j++8iVxyXG4gIHByaXZhdGUgZmluZFRlbXBsYXRlSW5kZXgoXHJcbiAgICB0ZW1wbGF0ZXM6IFRlbXBsYXRlUmVmPGFueT5bXSxcclxuICAgIHRhcmdldDogVGVtcGxhdGVSZWY8YW55PixcclxuICApOiBudW1iZXIge1xyXG4gICAgLy8g5pa55rOVMe+8muW8leeUqOebuOetieaAp1xyXG4gICAgbGV0IGluZGV4ID0gdGVtcGxhdGVzLmluZGV4T2YodGFyZ2V0KTtcclxuICAgIGlmIChpbmRleCAhPT0gLTEpIHJldHVybiBpbmRleDtcclxuXHJcbiAgICAvLyDmlrnms5Uy77ya6YCa6L+HIGVsZW1lbnRSZWYg5q+U6L6DXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0YXJnZXRFbGVtZW50UmVmID0gKHRhcmdldCBhcyBhbnkpLmVsZW1lbnRSZWY7XHJcbiAgICAgIGlmICh0YXJnZXRFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHRwbEVsZW1lbnRSZWYgPSAodGVtcGxhdGVzW2ldIGFzIGFueSkuZWxlbWVudFJlZjtcclxuICAgICAgICAgIGlmICh0cGxFbGVtZW50UmVmID09PSB0YXJnZXRFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyDlv73nlaXplJnor69cclxuICAgIH1cclxuXHJcbiAgICAvLyDmlrnms5Uz77ya6YCa6L+HIEFuZ3VsYXIg5YaF6YOo5bGe5oCn5q+U6L6DXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0YXJnZXRDb250YWluZXIgPSAodGFyZ2V0IGFzIGFueSkuX2RlY2xhcmF0aW9uVENvbnRhaW5lcjtcclxuICAgICAgaWYgKHRhcmdldENvbnRhaW5lcikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCB0cGxDb250YWluZXIgPSAodGVtcGxhdGVzW2ldIGFzIGFueSkuX2RlY2xhcmF0aW9uVENvbnRhaW5lcjtcclxuICAgICAgICAgIGlmICh0cGxDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8g5b+955Wl6ZSZ6K+vXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6+572u562b6YCJ6KGo5Y2V6buY6K6k5bGe5oCnXHJcbiAgcHJpdmF0ZSBzZXRTZWFyY2hGb3JtRGVmYXVsdFByb3AoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLnZhbHVlVHlwZSkge1xyXG4gICAgICAgIGlmIChpdGVtLmZpZWxkUHJvcHMpIHtcclxuICAgICAgICAgIGl0ZW0uZmllbGRQcm9wcyA9IHtcclxuICAgICAgICAgICAgLi4uUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbaXRlbS52YWx1ZVR5cGVdLFxyXG4gICAgICAgICAgICAuLi5pdGVtLmZpZWxkUHJvcHMsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpdGVtLmZpZWxkUHJvcHMgPSB7IC4uLlBST19UQUJMRV9ERUZBVUxUX1BST1BTW2l0ZW0udmFsdWVUeXBlXSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDliqjmgIHorr7nva5PcHRpb25zXHJcbiAgcHJpdmF0ZSBzZXRTZWxlY3RSZXF1ZXN0KGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIGNvbHVtbnMubWFwKGFzeW5jIChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLmZpZWxkUHJvcHMgJiYgaGFzSW4oaXRlbS5maWVsZFByb3BzLCBcInJlcXVlc3RcIikpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IChcclxuICAgICAgICAgICAgaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHNcclxuICAgICAgICAgICkucmVxdWVzdD8uKCk7XHJcbiAgICAgICAgICAoaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHMpLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAoaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHMpLm9wdGlvbnMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRTZWFyY2hQYXJhbXMoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zID0gW107XHJcbiAgICBjb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBmbGFnID0gIWl0ZW0uaGlkZUluU2VhcmNoICYmIGl0ZW0udmFsdWVUeXBlO1xyXG4gICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMucHVzaChjbG9uZURlZXAoaXRlbSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgICAgfSlcclxuICAgICAgLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1tjb2x1bW4udmFsdWVUeXBlXS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8g5a+55LqOY2hlY2tib3jnsbvlnovvvIzku45vcHRpb25z5Lit5om+5Ye6Y2hlY2tlZOS4unRydWXnmoTpobnkvZzkuLrpu5jorqTlgLxcclxuICAgICAgICBpZiAoY29sdW1uLnZhbHVlVHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XHJcbiAgICAgICAgICBjb25zdCBjaGVja2VkVmFsdWVzID0gKGNvbHVtbi5maWVsZFByb3BzPy5vcHRpb25zIHx8IFtdKVxyXG4gICAgICAgICAgICAuZmlsdGVyKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQuY2hlY2tlZClcclxuICAgICAgICAgICAgLm1hcCgob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LnZhbHVlKTtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID1cclxuICAgICAgICAgICAgY2hlY2tlZFZhbHVlcy5sZW5ndGggPiAwID8gY2hlY2tlZFZhbHVlcyA6IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSBjb2x1bW4uZmllbGRQcm9wcz8udmFsdWUgfHwgZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5Yid5aeL5YyWIGF1dG9Db21wbGV0ZSDmlbDmja7mupBcclxuICAgICAgICBpZiAoY29sdW1uLnZhbHVlVHlwZSA9PT0gXCJhdXRvQ29tcGxldGVcIikge1xyXG4gICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNba2V5XSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8g5qC55o2u5YiX55qEIG9yZGVyIOWtl+autei/m+ihjOaOkuW6j++8jOacquiuvue9riBvcmRlciDnmoTmlL7lnKjmnIDlkI5cclxuICAgIHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBhT3JkZXIgPSBpc05pbChhPy5vcmRlcikgPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IGEub3JkZXI7XHJcbiAgICAgIGNvbnN0IGJPcmRlciA9IGlzTmlsKGI/Lm9yZGVyKSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogYi5vcmRlcjtcclxuICAgICAgaWYgKGFPcmRlciA9PT0gYk9yZGVyKSByZXR1cm4gMDtcclxuICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2V0U2VhcmNoRm9ybURlZmF1bHRQcm9wKHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucyk7XHJcblxyXG4gICAgLy8g5bm25Y+R5Yqg6L295omA5pyJ6ZyA6KaB5byC5q2l6I635Y+W55qE6YCJ6aG5XHJcbiAgICB0aGlzLnNldFNlbGVjdFJlcXVlc3QodGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVGFibGVDb2x1bW5zKGluamVjdENvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIC8vIOi/nOeoi+WIl+ebtOaOpeS9nOS4uuadpea6kO+8jOi/h+a7pOaOieacrOWcsOS4jeWtmOWcqOeahOWIl++8jOW5tuS7juacrOWcsOWIl+ihpeWFhea4suafk+mFjee9rlxyXG4gICAgY29uc3QgcmVtb3RlQ29sdW1ucyA9IGluamVjdENvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaW5qZWN0Q29sKSA9PlxyXG4gICAgICAgIHRoaXMuY29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5wcm9wID09PSBpbmplY3RDb2wucHJvcCksXHJcbiAgICAgIClcclxuICAgICAgLm1hcCgoaW5qZWN0Q29sKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbG9jYWxDb2wgPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wucHJvcCA9PT0gaW5qZWN0Q29sLnByb3ApO1xyXG4gICAgICAgIHJldHVybiB7IC4uLmxvY2FsQ29sLCAuLi5pbmplY3RDb2wgfTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8g6L6F5Yqp5YiX5Y+W6Ieq5pys5Zyw77yM5L+d5oyB5Zyo5Y6f5aeL5L2N572u77yI6aaW6YOoIC8g5bC+6YOo77yJXHJcbiAgICBjb25zdCBmaXJzdE5vbkF1eEluZGV4ID0gdGhpcy5jb2x1bW5zLmZpbmRJbmRleChcclxuICAgICAgKGMpID0+ICFjLmF1eGlsaWFyeUNvbHVtbixcclxuICAgICk7XHJcbiAgICBjb25zdCBsYXN0Tm9uQXV4SW5kZXggPVxyXG4gICAgICB0aGlzLmNvbHVtbnMubGVuZ3RoIC1cclxuICAgICAgMSAtXHJcbiAgICAgIFsuLi50aGlzLmNvbHVtbnNdLnJldmVyc2UoKS5maW5kSW5kZXgoKGMpID0+ICFjLmF1eGlsaWFyeUNvbHVtbik7XHJcbiAgICBjb25zdCBoZWFkQXV4aWxpYXJ5ID0gdGhpcy5jb2x1bW5zLmZpbHRlcihcclxuICAgICAgKGNvbCwgaSkgPT4gY29sLmF1eGlsaWFyeUNvbHVtbiAmJiBpIDwgZmlyc3ROb25BdXhJbmRleCxcclxuICAgICk7XHJcbiAgICBjb25zdCB0YWlsQXV4aWxpYXJ5ID0gdGhpcy5jb2x1bW5zLmZpbHRlcihcclxuICAgICAgKGNvbCwgaSkgPT4gY29sLmF1eGlsaWFyeUNvbHVtbiAmJiBpID4gbGFzdE5vbkF1eEluZGV4LFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmZvcm1hdGVJbm5lckNvbHVtbnMoWy4uLmhlYWRBdXhpbGlhcnksIC4uLnJlbW90ZUNvbHVtbnMsIC4uLnRhaWxBdXhpbGlhcnldKTtcclxuICB9XHJcblxyXG4gIC8vIOmAmui/hyBQcm94eSDnm5HlkKwgX3NlYXJjaFBhcmFtcyDnmoTlsZ7mgKflj5jmm7RcclxuICBwcml2YXRlIGNyZWF0ZVNlYXJjaFBhcmFtc1Byb3h5KHRhcmdldDogYW55KSB7XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjxhbnk+ID0ge1xyXG4gICAgICBzZXQob2JqOiBhbnksIHByb3A6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwcm9wKTtcclxuICAgICAgICBjb25zdCBvbGRWYWwgPSBvYmpba2V5XTtcclxuICAgICAgICBpZiAob2xkVmFsID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBzZWxmLm9uVmFsdWVzQ2hhbmdlLmVtaXQoe1xyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgICBwYXJhbXM6IHNlbGYuZ2V0U2VhcmNoUGFyYW1zKCksXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpIHtcclxuICAgIGNvbnN0IGNsb25lU2VhcmNoUGFyYW1zID0gY2xvbmVEZWVwKHRoaXMuX3NlYXJjaFBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2xvbmVTZWFyY2hQYXJhbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkU2VydmVyU29ydFBheWxvYWQoKSB7XHJcbiAgICAvLyDmnoTlu7rmv4DmtLvmjpLluo/pm4blkIjvvIjmjInkvJjlhYjnuqfku47kvY7liLDpq5jvvIzmnKvlsL7kvJjlhYjvvIlcclxuICAgIGNvbnN0IGFjdGl2ZUtleXMgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiAhIXRoaXMuX3NvcnRNYXBba10pO1xyXG4gICAgaWYgKGFjdGl2ZUtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IHNvcnRzID0gYWN0aXZlS2V5cy5tYXAoKGZpZWxkKSA9PiB7XHJcbiAgICAgIC8vIOafpeaJvuWvueW6lOeahOWIl+mFjee9ru+8jOS8mOWFiOS9v+eUqHNvcnROYW1l5a2X5q61XHJcbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wucHJvcCA9PT0gZmllbGQpO1xyXG4gICAgICBjb25zdCBzb3J0RmllbGQgPSBjb2x1bW4/LnNvcnROYW1lIHx8IGZpZWxkO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGZpZWxkOiBzb3J0RmllbGQsXHJcbiAgICAgICAgb3JkZXI6IHRoaXMuX3NvcnRNYXBbZmllbGRdISxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMubXVsdGlwbGVTb3J0KSB7XHJcbiAgICAgIHJldHVybiBzb3J0czsgLy8g5Lul5pWw57uE5b2i5byP5o+Q5Lqk5aSa5YiX5o6S5bqPXHJcbiAgICB9XHJcbiAgICBjb25zdCBbZmlyc3RdID0gc29ydHM7XHJcbiAgICByZXR1cm4gZmlyc3Q7IC8vIOWFvOWuueWNleWIl+e7k+aehCB7IGZpZWxkLCBvcmRlciB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnREYXRhU291cmNlSW5QbGFjZSgpIHtcclxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpIHx8IHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgIGNvbnN0IGFjdGl2ZUtleXMgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiAhIXRoaXMuX3NvcnRNYXBba10pO1xyXG4gICAgaWYgKGFjdGl2ZUtleXMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8g5aSN5Yi25LiA5Lu95LyY5YWI57qn77yM5LuO5YmN5Yiw5ZCO5LyY5YWI57qn5LuO5L2O5Yiw6auY77yI5pyA5ZCO6K6+572u55qE5a2X5q615LyY5YWI77yJXHJcbiAgICBjb25zdCBrZXlzSW5Qcmlvcml0eSA9IFsuLi5hY3RpdmVLZXlzXTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICBmb3IgKGxldCBpID0ga2V5c0luUHJpb3JpdHkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IGtleXNJblByaW9yaXR5W2ldO1xyXG4gICAgICAgIGNvbnN0IG9yZGVyID0gdGhpcy5fc29ydE1hcFtmaWVsZF0hO1xyXG4gICAgICAgIGNvbnN0IGF2ID0gYT8uW2ZpZWxkXTtcclxuICAgICAgICBjb25zdCBidiA9IGI/LltmaWVsZF07XHJcbiAgICAgICAgY29uc3QgY21wID0gdGhpcy5jb21wYXJlVmFsdWVzKGF2LCBidik7XHJcbiAgICAgICAgaWYgKGNtcCAhPT0gMCkgcmV0dXJuIG9yZGVyID09PSBcImFzY2VuZFwiID8gY21wIDogLWNtcDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKGFWYWw6IGFueSwgYlZhbDogYW55KTogbnVtYmVyIHtcclxuICAgIGlmIChhVmFsID09IG51bGwgJiYgYlZhbCA9PSBudWxsKSByZXR1cm4gMDtcclxuICAgIGlmIChhVmFsID09IG51bGwpIHJldHVybiAtMTtcclxuICAgIGlmIChiVmFsID09IG51bGwpIHJldHVybiAxO1xyXG4gICAgaWYgKGFWYWwgaW5zdGFuY2VvZiBEYXRlICYmIGJWYWwgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIHJldHVybiBhVmFsLmdldFRpbWUoKSAtIGJWYWwuZ2V0VGltZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBhVmFsID09PSBcImJvb2xlYW5cIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJib29sZWFuXCIpIHtcclxuICAgICAgcmV0dXJuIGFWYWwgPT09IGJWYWwgPyAwIDogYVZhbCA/IDEgOiAtMTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgYVZhbCA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICByZXR1cm4gYVZhbCAtIGJWYWw7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgcmV0dXJuIGFWYWwubG9jYWxlQ29tcGFyZShiVmFsKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGFOdW0gPSBOdW1iZXIoYVZhbCk7XHJcbiAgICBjb25zdCBiTnVtID0gTnVtYmVyKGJWYWwpO1xyXG4gICAgaWYgKCFpc05hTihhTnVtKSAmJiAhaXNOYU4oYk51bSkpIHJldHVybiBhTnVtIC0gYk51bTtcclxuICAgIHJldHVybiBTdHJpbmcoYVZhbCkubG9jYWxlQ29tcGFyZShTdHJpbmcoYlZhbCkpO1xyXG4gIH1cclxuXHJcbiAgLy8g5omn6KGMIGF1dG9Db21wbGV0ZSDmlbDmja7mupDmn6Xor6LvvIjlrp7pmYXmiafooYzpgLvovpHvvIlcclxuICBwcml2YXRlIGV4ZWN1dGVBdXRvQ29tcGxldGVEYXRhU291cmNlKGV2ZW50OiBFdmVudCwgY29sdW1uOiBQcm9UYWJsZUNvbHVtbikge1xyXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2x1bW4uZmllbGRQcm9wcz8ubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIChjb2x1bW4uZmllbGRQcm9wcyBhcyBBdXRvQ29tcGxldGVGaWVsZFByb3BzKS5kYXRhU291cmNlICYmXHJcbiAgICAgIHR5cGVvZiAoY29sdW1uLmZpZWxkUHJvcHMgYXMgQXV0b0NvbXBsZXRlRmllbGRQcm9wcykuZGF0YVNvdXJjZSA9PT1cclxuICAgICAgICBcImZ1bmN0aW9uXCJcclxuICAgICkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IChjb2x1bW4uZmllbGRQcm9wcyBhcyBBdXRvQ29tcGxldGVGaWVsZFByb3BzKS5kYXRhU291cmNlKFxyXG4gICAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyDlpoLmnpzov5Tlm57nmoTmmK8gUHJvbWlzZe+8jOWkhOeQhuW8guatpee7k+aenFxyXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICByZXN1bHRcclxuICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBkYXRhIHx8IFtdO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkF1dG9Db21wbGV0ZSBkYXRhU291cmNlIGVycm9yOlwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gW107XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDlkIzmraXov5Tlm57nu5PmnpxcclxuICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IHJlc3VsdCB8fCBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkF1dG9Db21wbGV0ZSBkYXRhU291cmNlIGVycm9yOlwiLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTZWFyY2hQYXJhbXMob3B0aW9ucz86IHtcclxuICAgIHVzZVNhdmVkPzogYm9vbGVhbjsgLy8g5L2/55So5pyA6L+R5LiA5qyh5p+l6K+i5o+Q5Lqk55qE5Y+C5pWw77yM6buY6K6k5Li6IGZhbHNl77ybZmFsc2Ug5Li65b2T5YmN6KGo5Y2V5YC8XHJcbiAgfSk6IGFueSB7XHJcbiAgICBjb25zdCB7IHVzZVNhdmVkID0gZmFsc2UgfSA9IG9wdGlvbnMgfHwge307XHJcbiAgICBjb25zdCByYXdQYXJhbXMgPSB1c2VTYXZlZCA/IHRoaXMuX3NhdmVkU2VhcmNoUGFyYW1zIDogdGhpcy5fc2VhcmNoUGFyYW1zO1xyXG4gICAgY29uc3QgcGFyYW1zID0gY2xvbmVEZWVwKHJhd1BhcmFtcyB8fCB7fSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICBwYWdlSW5mbzoge1xyXG4gICAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4LFxyXG4gICAgICAgIHBhZ2VTaXplOiB0aGlzLl9wYWdlSW5mby5wYWdlU2l6ZSxcclxuICAgICAgfSxcclxuICAgICAgLy8g5Zyo57q/5o6S5bqP5qih5byP77ya5oqK5o6S5bqP5a+56LGh5o+Q5Lqk57uZ5o6l5Y+jXHJcbiAgICAgIC4uLih0aGlzLnNvcnRNb2RlID09PSBcInNlcnZlclwiXHJcbiAgICAgICAgPyB7IHNvcnQ6IHRoaXMuYnVpbGRTZXJ2ZXJTb3J0UGF5bG9hZCgpIH1cclxuICAgICAgICA6IHt9KSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkKGFmdGVyRGVsZXRlPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeShhZnRlckRlbGV0ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RmllbGRzVmFsdWUoZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBPYmplY3Qua2V5cyhmaWVsZHMpLmZvckVhY2goKGspID0+IHtcclxuICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tdID0gZmllbGRzW2tdOyAvLyDkv53nlZkgUHJveHnvvIzpgJDpobnotYvlgLzop6blj5Hmi6bmiKpcclxuXHJcbiAgICAgIC8vIGNoZWNrYm94IOexu+Wei+mcgOimgeWQjOatpeabtOaWsCBvcHRpb25zIOeahCBjaGVja2VkIOeKtuaAge+8jOWQpuWImSBVSSDkuI3kvJrlk43lupRcclxuICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zLmZpbmQoXHJcbiAgICAgICAgKGl0ZW0pID0+IChpdGVtLmZpZWxkUHJvcHM/Lm5hbWUgfHwgaXRlbS5wcm9wKSA9PT0gayxcclxuICAgICAgKTtcclxuICAgICAgaWYgKHRhcmdldENvbHVtbj8udmFsdWVUeXBlID09PSBcImNoZWNrYm94XCIpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZXM6IGFueVtdID0gQXJyYXkuaXNBcnJheShmaWVsZHNba10pID8gZmllbGRzW2tdIDogW107XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0RmllbGRQcm9wcyA9IHRhcmdldENvbHVtbi5maWVsZFByb3BzIGFzIENoZWNrYm94RmllbGRQcm9wcztcclxuICAgICAgICBpZiAodGFyZ2V0RmllbGRQcm9wcz8ub3B0aW9ucykge1xyXG4gICAgICAgICAgdGFyZ2V0RmllbGRQcm9wcy5vcHRpb25zID0gdGFyZ2V0RmllbGRQcm9wcy5vcHRpb25zLm1hcChcclxuICAgICAgICAgICAgKGl0ZW06IE9wdGlvbnNUeXBlKSA9PiAoe1xyXG4gICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgY2hlY2tlZDogdmFsdWVzLmluY2x1ZGVzKGl0ZW0udmFsdWUpLFxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGaWVsZFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRSb3coKSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRDb2x1bW5zKFxyXG4gICAgY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSxcclxuICAgIG9wdGlvbnM/OiB7XHJcbiAgICAgIHJlbG9hZD86IGJvb2xlYW47IC8vIOaYr+WQpumHjeaWsOWKoOi9veaVsOaNru+8jOm7mOiupOS4uiBmYWxzZVxyXG4gICAgfSxcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIOabtOaWsCBjb2x1bW5zIOi+k+WFpeWxnuaAp1xyXG4gICAgdGhpcy5jb2x1bW5zID0gY2xvbmVEZWVwKGNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOagvOW8j+WMluWGhemDqOWIl1xyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKHRoaXMuY29sdW1ucyk7XHJcblxyXG4gICAgLy8g6YeN5paw6K6+572u5pCc57Si5Y+C5pWw77yI5byC5q2l5pON5L2c77yJXHJcbiAgICAvLyDlhYjmuIXnqbrml6fnmoTmkJzntKLlj4LmlbDvvIzpgb/lhY3ml6fmlbDmja7mrovnlZlcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgYXdhaXQgdGhpcy5zZXRTZWFyY2hQYXJhbXModGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAvLyDph43mlrDliJvlu7ogUHJveHnvvIznoa7kv53ooajljZXpobnlgLzlj5jljJbog73mraPluLjop6blj5Hkuovku7ZcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHRoaXMuY3JlYXRlU2VhcmNoUGFyYW1zUHJveHkodGhpcy5fc2VhcmNoUGFyYW1zKTtcclxuXHJcbiAgICAvLyDph43mlrDms6jlhozmqKHmnb/vvIjlpoLmnpznu4Tku7blt7Lnu4/liJ3lp4vljJblrozmiJDvvIlcclxuICAgIGlmICh0aGlzLmFsbFRlbXBsYXRlcykge1xyXG4gICAgICB0aGlzLmF1dG9SZWdpc3RlclRlbXBsYXRlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWmguaenOiuvue9ruS6hiByZWxvYWQg6YCJ6aG55Li6IHRydWXvvIzliJnph43mlrDmn6Xor6LmlbDmja5cclxuICAgIGlmIChvcHRpb25zPy5yZWxvYWQgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlbGVjdGVkUm93RGF0YTxUID0gYW55PigpOiBUIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFRhYmxlUm93O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoZWNrZWRSb3dzPFQgPSBhbnk+KCk6IFRbXSB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIC8vIOi/lOWbnuW9k+WJjeaVsOaNrua6kOS4reaJgOaciSBjaGVja2VkIOS4uiB0cnVlIOeahOmhuVxyXG4gICAgLy8g5rOo5oSP77ya5aaC5p6c6ZyA6KaB6I635Y+W5omA5pyJ6aG155qE6YCJ5Lit6aG577yM6ZyA6KaB6YGN5Y6G5omA5pyJ5pWw5o2u5rqQ5oiW5L2/55SoIF9zZWxlY3RlZFJvd0lkc1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoKHJvdykgPT4gcm93LmNoZWNrZWQgPT09IHRydWUpIGFzIFRbXTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluaMh+WumuWQjeensOeahOaooeadv1xyXG4gIGdldFRlbXBsYXRlKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcclxuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5jdXN0b21UZW1wbGF0ZXMuZ2V0KG5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRUb29sVGlwVGV4dFZhbHVlKGNvbHVtbjogUHJvVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBrZXkgPVxyXG4gICAgICBjb2x1bW4uY3VzdG9tUmVuZGVyICYmIHRoaXMuZ2V0VGVtcGxhdGUoY29sdW1uLmN1c3RvbVJlbmRlcilcclxuICAgICAgICA/IFwiXCJcclxuICAgICAgICA6IGNvbHVtbi5lbGxpcHNpc1xyXG4gICAgICAgICAgPyBjb2x1bW4ucHJvcFxyXG4gICAgICAgICAgOiBcIlwiO1xyXG4gICAgcmV0dXJuICFrZXkgPyBcIlwiIDogZGF0YVtrZXldO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGFibGVSb3dDaGVja2VkKGRhdGE6IGFueSkge1xyXG4gICAgLy8g5ZCv55So5aSN6YCJ5qGG5pe277ya6KGM6auY5Lqu5bqU5LiO5aSN6YCJ5qGG6YCJ5Lit54q25oCB5LiA6Ie077yI5pSv5oyB5aSa6YCJ77yJXHJcbiAgICBpZiAodGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaXNSb3dDaGVja2VkKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgLy8g5pyq5ZCv55So5aSN6YCJ5qGG5pe277ya5LuN54S25L2/55So5Y2V6YCJ6KGM6auY5LquXHJcbiAgICBpZiAoIXRoaXMuX3NlbGVjdGVkVGFibGVSb3cpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLl9zZWxlY3RlZFRhYmxlUm93KSA9PT0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvLyDmo4Dmn6XooYzmmK/lkKbooqvnpoHnlKhcclxuICBpc1Jvd0Rpc2FibGVkKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnNob3dDaGVja2JveCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRoaXMucm93RGlzYWJsZWQgPyB0aGlzLnJvd0Rpc2FibGVkKGRhdGEpIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyDmo4Dmn6XooYzmmK/lkKbooqvlpI3pgInmoYbpgInkuK3vvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICBpc1Jvd0NoZWNrZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyDnm7TmjqXor7vlj5bmlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKdcclxuICAgIHJldHVybiBkYXRhLmNoZWNrZWQgPT09IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyDliIfmjaLooYznmoTpgInkuK3nirbmgIHvvIjmlbDmja7pqbHliqjmqKHlvI/vvIzkv53nlZnnlKjkuo7lhbzlrrnvvIlcclxuICB0b2dnbGVSb3dDaGVja2VkKGRhdGE6IGFueSwgY2hlY2tlZDogYm9vbGVhbiwgZXZlbnQ/OiBFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyDpmLvmraLkuovku7blhpLms6HvvIzpgb/lhY3op6blj5HooYzngrnlh7tcclxuICAgIH1cclxuICAgIC8vIOWmguaenOihjOiiq+emgeeUqO+8jOS4jeWFgeiuuOWIh+aNoumAieS4reeKtuaAgVxyXG4gICAgaWYgKHRoaXMuaXNSb3dEaXNhYmxlZChkYXRhKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g55u05o6l6K6+572u5pWw5o2u5a+56LGh55qEIGNoZWNrZWQg5bGe5oCnXHJcbiAgICBkYXRhLmNoZWNrZWQgPSBjaGVja2VkO1xyXG5cclxuICAgIC8vIOWQjOatpeabtOaWsCBfc2VsZWN0ZWRSb3dz77yI55So5LqO5YW85a655oCn77yJXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NlbGVjdGVkUm93cy5maW5kSW5kZXgoKHJvdykgPT5cclxuICAgICAgdGhpcy5pc1NhbWVSb3cocm93LCBkYXRhKSxcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnB1c2goZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5Yu+6YCJ5aSN6YCJ5qGG5pe25ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3Muc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDoi6XlvZPliY3pq5jkuq7ooYzkuLror6XooYzvvIzliJnlj5bmtojpq5jkuq5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgJiZcclxuICAgICAgICB0aGlzLmlzU2FtZVJvdyh0aGlzLl9zZWxlY3RlZFRhYmxlUm93LCBkYXRhKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWFqOmAieeKtuaAge+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIHVwZGF0ZUNoZWNrQWxsU3RhdHVzKCkge1xyXG4gICAgaWYgKCF0aGlzLnNob3dDaGVja2JveCB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpKSB7XHJcbiAgICAgIHRoaXMuX2NoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyDlj6rorqHnrpflj6/nlKjnmoTooYzvvIjmnKrnpoHnlKjnmoTooYzvvIlcclxuICAgIGNvbnN0IGF2YWlsYWJsZVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiAhdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdyksXHJcbiAgICApO1xyXG4gICAgLy8g5Z+65LqO5pWw5o2u5a+56LGh55qEIGNoZWNrZWQg5bGe5oCn6K6h566XXHJcbiAgICBjb25zdCBjaGVja2VkQ291bnQgPSBhdmFpbGFibGVSb3dzLmZpbHRlcihcclxuICAgICAgKHJvdykgPT4gcm93LmNoZWNrZWQgPT09IHRydWUsXHJcbiAgICApLmxlbmd0aDtcclxuICAgIGNvbnN0IHRvdGFsQ291bnQgPSBhdmFpbGFibGVSb3dzLmxlbmd0aDtcclxuICAgIHRoaXMuX2NoZWNrZWRBbGwgPVxyXG4gICAgICB0b3RhbENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPiAwICYmIGNoZWNrZWRDb3VudCA9PT0gdG90YWxDb3VudDtcclxuICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBjaGVja2VkQ291bnQgPiAwICYmIGNoZWNrZWRDb3VudCA8IHRvdGFsQ291bnQ7XHJcbiAgfVxyXG5cclxuICAvLyDlhajpgIkv5Y+W5raI5YWo6YCJ77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgdG9nZ2xlQ2hlY2tBbGwoY2hlY2tlZDogYm9vbGVhbiwgZXZlbnQ/OiBFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWPquWkhOeQhuWPr+eUqOeahOihjO+8iOacquemgeeUqOeahOihjO+8iVxyXG4gICAgY29uc3QgYXZhaWxhYmxlUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoXHJcbiAgICAgIChyb3cpID0+ICF0aGlzLmlzUm93RGlzYWJsZWQocm93KSxcclxuICAgICk7XHJcblxyXG4gICAgLy8g5om56YeP6K6+572uIGNoZWNrZWQg5bGe5oCnXHJcbiAgICBhdmFpbGFibGVSb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICByb3cuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gWy4uLmF2YWlsYWJsZVJvd3NdO1xyXG4gICAgICAvLyDlkIzmraXorr7nva7pq5jkuq7pgInkuK3ooYzkuLrnrKzkuIDmnaHlj6/pgInmlbDmja5cclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9XHJcbiAgICAgICAgYXZhaWxhYmxlUm93cy5sZW5ndGggPiAwID8gYXZhaWxhYmxlUm93c1swXSA6IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbXTtcclxuICAgICAgLy8g5Y+W5raI6auY5LquXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPlumAieS4reeahOihjOaVsOaNru+8iOS/neeVmeeUqOS6juWFvOWuueaAp++8iVxyXG4gIGdldFNlbGVjdGVkUm93cygpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDaGVja2VkUm93cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5aSE55CG6KGMIGNoZWNrYm94IOWPmOWMluS6i+S7tu+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGhhbmRsZVJvd0NoZWNrZWRDaGFuZ2UoZGF0YTogYW55LCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc1Jvd0Rpc2FibGVkKGRhdGEpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDmlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKflt7Lnu4/pgJrov4flj4zlkJHnu5Hlrproh6rliqjmm7TmlrBcclxuICAgIC8vIOi/memHjOWPqumcgOimgeWQjOatpeabtOaWsCBfc2VsZWN0ZWRSb3dzXHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3PvvIjnlKjkuo7lhbzlrrnmgKfvvIlcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fc2VsZWN0ZWRSb3dzLmZpbmRJbmRleCgocm93KSA9PlxyXG4gICAgICB0aGlzLmlzU2FtZVJvdyhyb3csIGRhdGEpLFxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3MucHVzaChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDli77pgInlpI3pgInmoYbml7blkIzmraXorr7nva7pq5jkuq7pgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOiLpeW9k+WJjemrmOS6ruihjOS4uuivpeihjO+8jOWImeWPlua2iOmrmOS6rlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyAmJlxyXG4gICAgICAgIHRoaXMuaXNTYW1lUm93KHRoaXMuX3NlbGVjdGVkVGFibGVSb3csIGRhdGEpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5pu05paw5YWo6YCJ54q25oCBXHJcbiAgICB0aGlzLnVwZGF0ZUNoZWNrQWxsU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDliLfmlrDlhajpgInnirbmgIHvvIjnlKjkuo7lhbbku5blnLrmma/vvIlcclxuICByZWZyZXNoQ2hlY2tBbGxTdGF0dXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUNoZWNrQWxsU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5booYznmoTllK/kuIDmoIfor4bvvIjnlKjkuo7ot6jpobXpgInkuK3vvIlcclxuICBwcml2YXRlIGdldFJvd0lkKGRhdGE6IGFueSk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gZGF0YS5pZCA/PyBkYXRhLmtleSA/PyB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvLyDliKTmlq3kuKTooYzmmK/lkKbkuLrlkIzkuIDooYxcclxuICBwcml2YXRlIGlzU2FtZVJvdyhyb3cxOiBhbnksIHJvdzI6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaWQxID0gdGhpcy5nZXRSb3dJZChyb3cxKTtcclxuICAgIGNvbnN0IGlkMiA9IHRoaXMuZ2V0Um93SWQocm93Mik7XHJcblxyXG4gICAgaWYgKGlkMSAhPT0gdW5kZWZpbmVkICYmIGlkMiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBpZDEgPT09IGlkMjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmYWxsYmFjayDliLAgSlNPTiDmr5TovoNcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyb3cxKSA9PT0gSlNPTi5zdHJpbmdpZnkocm93Mik7XHJcbiAgfVxyXG5cclxuICAvLyDmuIXnqbrpgInkuK3nmoTooYzvvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICBjbGVhclNlbGVjdGVkUm93cygpIHtcclxuICAgIC8vIOa4heepuuW9k+WJjeaVsOaNrua6kOS4reaJgOaciemhueeahCBjaGVja2VkIOeKtuaAgVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSkge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgICAgcm93LmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XHJcbiAgICB0aGlzLl9jaGVja2VkQWxsID0gZmFsc2U7XHJcbiAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIGhhbmRsZUZpZWxkQ2hlY2tCb3hDaGFuZ2UoY2hlY2tCb3hPcHRpb25zOiBPcHRpb25zVHlwZVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgdGhpcy5zZXRGaWVsZHNWYWx1ZSh7XHJcbiAgICAgIFtrZXldOiBjaGVja0JveE9wdGlvbnNcclxuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmNoZWNrZWQpXHJcbiAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVNlYXJjaCgpIHtcclxuICAgIHRoaXMuX3NhdmVkU2VhcmNoUGFyYW1zID0gdGhpcy5jbGVhckVtcHR5U2VhcmNoUGFyYW1zKCk7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSAxO1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUmVzZXRGb3JtKCkge1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5fc2VhcmNoUGFyYW1zKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4gKGl0ZW0uZmllbGRQcm9wcz8ubmFtZSB8fCBpdGVtLnByb3ApID09PSBrZXk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8g5a+55LqOY2hlY2tib3jnsbvlnovvvIzpnIDopoHnibnmrorlpITnkIbpu5jorqTlgLxcclxuICAgICAgaWYgKHRhcmdldENvbHVtbj8udmFsdWVUeXBlID09PSBcImNoZWNrYm94XCIpIHtcclxuICAgICAgICAvLyDku47ljp/lp4tjb2x1bW5z6YWN572u5Lit6I635Y+W5Yid5aeL6YWN572u77yM5Lul56Gu5L+d5L2/55So5q2j56Gu55qE6buY6K6k5YC8XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIChpdGVtLmZpZWxkUHJvcHM/Lm5hbWUgfHwgaXRlbS5wcm9wKSA9PT0ga2V5O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyDku47ljp/lp4tvcHRpb25z5Lit5om+5Ye6Y2hlY2tlZOS4unRydWXnmoTpobnkvZzkuLrpu5jorqTlgLxcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEZpZWxkUHJvcHMgPSBvcmlnaW5hbENvbHVtbj8uZmllbGRQcm9wcyBhc1xyXG4gICAgICAgICAgfCBDaGVja2JveEZpZWxkUHJvcHNcclxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IGNoZWNrZWRWYWx1ZXMgPSAob3JpZ2luYWxGaWVsZFByb3BzPy5vcHRpb25zIHx8IFtdKVxyXG4gICAgICAgICAgLmZpbHRlcigob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LmNoZWNrZWQpXHJcbiAgICAgICAgICAubWFwKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQudmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9XHJcbiAgICAgICAgICBjaGVja2VkVmFsdWVzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgPyBjaGVja2VkVmFsdWVzXHJcbiAgICAgICAgICAgIDogUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbdGFyZ2V0Q29sdW1uLnZhbHVlVHlwZV0udmFsdWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID0gZGVmYXVsdFZhbHVlO1xyXG5cclxuICAgICAgICAvLyDmoLnmja7pu5jorqTlgLzmgaLlpI1vcHRpb25z55qEY2hlY2tlZOeKtuaAge+8jOS9v+eUqOWOn+Wni29wdGlvbnPnmoTnu5PmnoRcclxuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVzID0gQXJyYXkuaXNBcnJheShkZWZhdWx0VmFsdWUpID8gZGVmYXVsdFZhbHVlIDogW107XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxPcHRpb25zID0gb3JpZ2luYWxGaWVsZFByb3BzPy5vcHRpb25zIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEZpZWxkUHJvcHMgPSB0YXJnZXRDb2x1bW4uZmllbGRQcm9wcyBhcyBDaGVja2JveEZpZWxkUHJvcHM7XHJcbiAgICAgICAgdGFyZ2V0RmllbGRQcm9wcy5vcHRpb25zID0gb3JpZ2luYWxPcHRpb25zLm1hcCgoaXRlbTogT3B0aW9uc1R5cGUpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IGRlZmF1bHRWYWx1ZXMuaW5jbHVkZXMoaXRlbS52YWx1ZSksXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID0gdGFyZ2V0Q29sdW1uPy5maWVsZFByb3BzXHJcbiAgICAgICAgICA/IHRhcmdldENvbHVtbj8uZmllbGRQcm9wcy52YWx1ZSB8fFxyXG4gICAgICAgICAgICBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1t0YXJnZXRDb2x1bW4udmFsdWVUeXBlXS52YWx1ZVxyXG4gICAgICAgICAgOiBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1t0YXJnZXRDb2x1bW4udmFsdWVUeXBlXS52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgPSB7fTtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLm9uUmVzZXRGb3JtQmVmb3JlUmVsb2FkLmVtaXQoKTtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVBhZ2VJbmRleENoYW5nZShwYWdlSW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gcGFnZUluZGV4O1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUGFnZVNpemVDaGFuZ2UocGFnZVNpemU6IGFueSkge1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBoYW5kbGVRdWVyeShhZnRlckRlbGV0ZT86IGJvb2xlYW4pIHtcclxuICAgIC8vIOWIoOmZpOWQjuWIt+aWsOS4lOW9k+WJjemhteS7heWJqeS4gOadoeiusOW9leaXtu+8jOiLpeS4jeWcqOesrOS4gOmhteWImeWFiOWbnumAgOS4gOmhtVxyXG4gICAgaWYgKFxyXG4gICAgICBhZnRlckRlbGV0ZSAmJlxyXG4gICAgICBBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkgJiZcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPiAxXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4IC0gMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLnJlcXVlc3QpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3Qoe1xyXG4gICAgICAgICAgcGFyYW1zOiB0aGlzLmNsZWFyRW1wdHlTZWFyY2hQYXJhbXMoKSxcclxuICAgICAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4LFxyXG4gICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5fcGFnZUluZm8ucGFnZVNpemUsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgLy8g5Zyo57q/5o6S5bqP5qih5byP77ya5oqK5o6S5bqP5a+56LGh5o+Q5Lqk57uZ5o6l5Y+jXHJcbiAgICAgICAgICAuLi4odGhpcy5zb3J0TW9kZSA9PT0gXCJzZXJ2ZXJcIlxyXG4gICAgICAgICAgICA/IHsgc29ydDogdGhpcy5idWlsZFNlcnZlclNvcnRQYXlsb2FkKCkgfVxyXG4gICAgICAgICAgICA6IHt9KSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8g5p+l6K+i5ZCO6buY6K6k5LiN5L+d55WZ6Leo6aG16YCJ5Lit54q25oCB77ya5q+P5qyh6L+U5Zue55qE5pWw5o2u5Z2H5Yid5aeL5YyW5Li65pyq6YCJ5LitXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0NoZWNrYm94KSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSAocmVzdWx0LmRhdGEgfHwgW10pLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgY2hlY2tlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gcmVzdWx0LmRhdGEgfHwgW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN1bW1hcnlEYXRhID0gcmVzdWx0LnN1bW1hcnlEYXRhIHx8IG51bGw7XHJcbiAgICAgICAgLy8g5pys5Zyw5o6S5bqP5qih5byP77ya5ou/5Yiw5pWw5o2u5ZCO5Zyo5YmN56uv5o6S5bqPXHJcbiAgICAgICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IFwibG9jYWxcIikge1xyXG4gICAgICAgICAgdGhpcy5zb3J0RGF0YVNvdXJjZUluUGxhY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcGFnZUluZm8udG90YWwgPSByZXN1bHQudG90YWwgfHwgMDtcclxuICAgICAgICAvLyDlj5bmtojot6jpobXlpJrpgInvvJrmn6Xor6LlkI7muIXnqbrpgInkuK3nirbmgIFcclxuICAgICAgICBpZiAodGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3RlZFJvd3MoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIuafpeivouWksei0pTpcIiwgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IFtdO1xyXG4gICAgICAgIHRoaXMuX3BhZ2VJbmZvLnRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLnN1bW1hcnlEYXRhID0gbnVsbDtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICB0aGlzLl9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIuacquaPkOS+myBfcmVxdWVzdCDlm57osIPlh73mlbBcIik7XHJcbiAgICAgIHRoaXMuX2xvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOinpuWPkeWIl+aOkuW6j+WPmOabtFxyXG4gIG9uU29ydENoYW5nZShzb3J0S2V5OiBzdHJpbmcsIHNvcnRPcmRlcjogXCJhc2NlbmRcIiB8IFwiZGVzY2VuZFwiIHwgbnVsbCkge1xyXG4gICAgLy8g5Y2V5YiX5o6S5bqP77ya6YeN572u5YW25a6D5YiX77yb5aSa5YiX5o6S5bqP77ya5L+d55WZ5YW25a6D5YiXXHJcbiAgICBpZiAoIXRoaXMubXVsdGlwbGVTb3J0KSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3NvcnRNYXApLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGlmIChrZXkgIT09IHNvcnRLZXkpIHRoaXMuX3NvcnRNYXBba2V5XSA9IG51bGw7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc29ydE1hcFtzb3J0S2V5XSA9IHNvcnRPcmRlcjtcclxuXHJcbiAgICAvLyDnu7TmiqTkvJjlhYjnuqfpmJ/liJfvvJrmnInluo/liJfkuJTpnZ7nqbogLT4g572u5LqO5pyr5bC+77yb5Li656m6IC0+IOenu+mZpFxyXG4gICAgdGhpcy5fc29ydFByaW9yaXR5ID0gdGhpcy5fc29ydFByaW9yaXR5LmZpbHRlcigoaykgPT4gayAhPT0gc29ydEtleSk7XHJcbiAgICBpZiAoc29ydE9yZGVyKSB7XHJcbiAgICAgIHRoaXMuX3NvcnRQcmlvcml0eS5wdXNoKHNvcnRLZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBcImxvY2FsXCIpIHtcclxuICAgICAgdGhpcy5zb3J0RGF0YVNvdXJjZUluUGxhY2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOWcqOe6v+aOkuW6j++8mumHjeaWsOivt+axglxyXG4gICAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTb3J0T3JkZXIoc29ydEtleTogc3RyaW5nKTogXCJhc2NlbmRcIiB8IFwiZGVzY2VuZFwiIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc29ydE1hcFtzb3J0S2V5XSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlVGFibGVSb3dDbGljayhkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgaWYgKHRoaXMuc2hvd0NoZWNrYm94ICYmICF0aGlzLmlzUm93RGlzYWJsZWQoZGF0YSkpIHtcclxuICAgICAgLy8g5YWI5riF56m65omA5pyJ6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgICBjb25zdCBuZXh0Q2hlY2tlZCA9ICF0aGlzLmlzUm93Q2hlY2tlZChkYXRhKTtcclxuICAgICAgdGhpcy50b2dnbGVSb3dDaGVja2VkKGRhdGEsIG5leHRDaGVja2VkKTtcclxuICAgIH1cclxuICAgIHRoaXMub25Sb3dDbGljay5lbWl0KHRoaXMuX3NlbGVjdGVkVGFibGVSb3cpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlVGFibGVSb3dEYkNsaWNrKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICB0aGlzLm9uUm93RGJDbGljay5lbWl0KHRoaXMuX3NlbGVjdGVkVGFibGVSb3cpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ29sdW1uc1NldHRpbmdDb25maXJtKCkge1xyXG4gICAgdGhpcy5xdWVyeUR5bmFtaWNDb2x1bW5zKCk7XHJcbiAgfVxyXG5cclxuICAvLyDlpITnkIYgYXV0b0NvbXBsZXRlIOi+k+WFpeS6i+S7tu+8iOW4pumYsuaKlu+8iVxyXG4gIGhhbmRsZUF1dG9Db21wbGV0ZUlucHV0KGV2ZW50OiBFdmVudCwgY29sdW1uOiBQcm9UYWJsZUNvbHVtbikge1xyXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2x1bW4uZmllbGRQcm9wcz8ubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuXHJcbiAgICAvLyDlpoLmnpzor6XlrZfmrrXov5jmsqHmnInpmLLmipblh73mlbDvvIzliJvlu7rkuIDkuKpcclxuICAgIGlmICghdGhpcy5fYXV0b0NvbXBsZXRlRGVib3VuY2VNYXAuaGFzKGZpZWxkS2V5KSkge1xyXG4gICAgICBjb25zdCBkZWJvdW5jZWRGbiA9IGRlYm91bmNlKChldnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8g6YeN5paw5p+l5om+5a+55bqU55qEIGNvbHVtbu+8jOehruS/neS9v+eUqOacgOaWsOeahOmFjee9rlxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMuZmluZChcclxuICAgICAgICAgIChjb2wpID0+IChjb2wuZmllbGRQcm9wcz8ubmFtZSB8fCBjb2wucHJvcCkgPT09IGZpZWxkS2V5LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRDb2x1bW4pIHtcclxuICAgICAgICAgIHRoaXMuZXhlY3V0ZUF1dG9Db21wbGV0ZURhdGFTb3VyY2UoZXZ0LCBjdXJyZW50Q29sdW1uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDMwMCk7IC8vIDMwMG1zIOmYsuaKluW7tui/n1xyXG4gICAgICB0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5zZXQoZmllbGRLZXksIGRlYm91bmNlZEZuKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDosIPnlKjpmLLmipblh73mlbBcclxuICAgIGNvbnN0IGRlYm91bmNlZEZuID0gdGhpcy5fYXV0b0NvbXBsZXRlRGVib3VuY2VNYXAuZ2V0KGZpZWxkS2V5KTtcclxuICAgIGlmIChkZWJvdW5jZWRGbikge1xyXG4gICAgICBkZWJvdW5jZWRGbihldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5YgYXV0b0NvbXBsZXRlIOeahOaVsOaNrua6kFxyXG4gIGdldEF1dG9Db21wbGV0ZURhdGFTb3VyY2UoY29sdW1uOiBQcm9UYWJsZUNvbHVtbik6IGFueVtdIHtcclxuICAgIGNvbnN0IGZpZWxkS2V5ID0gY29sdW1uLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sdW1uLnByb3A7XHJcbiAgICByZXR1cm4gdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGRQcm9wcyhjb2x1bW46IFByb1RhYmxlQ29sdW1uKTogYW55IHtcclxuICAgIHJldHVybiBjb2x1bW4uZmllbGRQcm9wcztcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluaMh+WumuWQjeensOeahGxhYmVs5qih5p2/XHJcbiAgZ2V0TGFiZWxUZW1wbGF0ZShuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XHJcbiAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tVGVtcGxhdGVzLmdldChuYW1lKSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+WIGZvcm0taXRlbSDnmoTliqjmgIHnsbvlkI1cclxuICBnZXRGb3JtSXRlbUNsYXNzTmFtZShjb2x1bW46IFByb1RhYmxlQ29sdW1uKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGZpZWxkTmFtZSA9IHRoaXMuZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3A7XHJcbiAgICByZXR1cm4gYHByby10YWJsZS0ke2ZpZWxkTmFtZX0tZm9ybS1pdGVtYDtcclxuICB9XHJcbn1cclxuIiwiPGFwcC1wYWdlLWNvbnRhaW5lclxyXG4gIFt0aXRsZV09XCJ0aXRsZVwiXHJcbiAgW3Nob3dIZWFkZXJdPVwic2hvd1NlYXJjaEJhclwiXHJcbiAgbmdDbGFzcz1cInByby10YWJsZS1jb250YWluZXJcIlxyXG4+XHJcbiAgPG5nLXRlbXBsYXRlICNoZWFkZXI+XHJcbiAgICA8YXBwLXRhYmxlLXNlYXJjaC1iYXJcclxuICAgICAgKm5nSWY9XCJzaG93U2VhcmNoQmFyXCJcclxuICAgICAgW2xhYmVsV2lkdGhdPVwibGFiZWxXaWR0aFwiXHJcbiAgICAgIFtsYWJlbEFsaWduXT1cImxhYmVsQWxpZ25cIlxyXG4gICAgICBbZm9ybUl0ZW1XaWR0aF09XCJmb3JtSXRlbVdpZHRoXCJcclxuICAgID5cclxuICAgICAgPG5nLXRlbXBsYXRlICNsZWZ0Q29udGVudD5cclxuICAgICAgICA8bnotZm9ybS1pdGVtXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIF9zZWFyY2hGaWxlZENvbHVtbnNcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0Rm9ybUl0ZW1DbGFzc05hbWUoY29sdW1uKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG56LWZvcm0tbGFiZWwgKm5nSWY9XCIhZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmhpZGVMYWJlbFwiIG56Tm9Db2xvbj5cclxuICAgICAgICAgICAgPCEtLSDmo4Dmn6XmmK/lkKbmnInoh6rlrprkuYlsYWJlbOaooeadvyAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICBjb2x1bW4uY3VzdG9tTGFiZWxSZW5kZXIgJiZcclxuICAgICAgICAgICAgICAgICAgZ2V0TGFiZWxUZW1wbGF0ZShjb2x1bW4uY3VzdG9tTGFiZWxSZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBkZWZhdWx0TGFiZWxcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0TGFiZWxUZW1wbGF0ZShjb2x1bW4uY3VzdG9tTGFiZWxSZW5kZXIpXCJcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogY29sdW1uLFxyXG4gICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcclxuICAgICAgICAgICAgICAgICAgZmllbGRQcm9wczogZ2V0RmllbGRQcm9wcyhjb2x1bW4pXHJcbiAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRMYWJlbD5cclxuICAgICAgICAgICAgICB7eyBnZXRGaWVsZFByb3BzKGNvbHVtbikubGFiZWwgfHwgY29sdW1uLnRpdGxlIH19XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L256LWZvcm0tbGFiZWw+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2lucHV0J1wiPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBuei1pbnB1dFxyXG4gICAgICAgICAgICAgIFtuYW1lXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2lucHV0UGxhdGUnXCI+XHJcbiAgICAgICAgICAgIDxhcHAtcGxhdGUtaW5wdXRcclxuICAgICAgICAgICAgICBbbmFtZV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcFwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvYXBwLXBsYXRlLWlucHV0PlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ3NlbGVjdCdcIj5cclxuICAgICAgICAgICAgPG56LXNlbGVjdFxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW256QWxsb3dDbGVhcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuYWxsb3dDbGVhclwiXHJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICBbbmFtZV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcFwiXHJcbiAgICAgICAgICAgICAgW256T3B0aW9uc109XCJnZXRGaWVsZFByb3BzKGNvbHVtbikub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L256LXNlbGVjdD5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdzZWxlY3RNdWx0aXBsZSdcIj5cclxuICAgICAgICAgICAgPG56LXNlbGVjdFxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW256QWxsb3dDbGVhcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuYWxsb3dDbGVhclwiXHJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICBbbmFtZV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcFwiXHJcbiAgICAgICAgICAgICAgW256T3B0aW9uc109XCJnZXRGaWVsZFByb3BzKGNvbHVtbikub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBuek1vZGU9XCJtdWx0aXBsZVwiXHJcbiAgICAgICAgICAgICAgW256TWF4VGFnQ291bnRdPVwiMlwiXHJcbiAgICAgICAgICAgICAgW256TWF4VGFnUGxhY2Vob2xkZXJdPVwibnpNYXhUYWdQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW256Q3VzdG9tVGVtcGxhdGVdPVwiZGVmYXVsdFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbnpNYXhUYWdQbGFjZWhvbGRlcj5cclxuICAgICAgICAgICAgICAgICtcclxuICAgICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgICAgICAgPy5sZW5ndGhcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZW1wbGF0ZSBsZXQtc2VsZWN0ZWQ+XHJcbiAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZC5uekxhYmVsLmxlbmd0aCA+IDQgPyBzZWxlY3RlZC5uekxhYmVsLnN1YnN0cmluZygwLCA0KSArICcuLi4nIDogc2VsZWN0ZWQubnpMYWJlbCB9fVxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbnotc2VsZWN0PlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgIDxuei1kYXRlLXBpY2tlclxyXG4gICAgICAgICAgICAgIFtuelNob3dUaW1lXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5zaG93VGltZVwiXHJcbiAgICAgICAgICAgICAgW256Rm9ybWF0XT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5mb3JtYXRcIlxyXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW256QWxsb3dDbGVhcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuYWxsb3dDbGVhclwiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtuek1vZGVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm1vZGVcIlxyXG4gICAgICAgICAgICA+PC9uei1kYXRlLXBpY2tlcj5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdjaGVja2JveCdcIj5cclxuICAgICAgICAgICAgPG56LWNoZWNrYm94LWdyb3VwXHJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cIlxyXG4gICAgICAgICAgICAgICAgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5vU3R5bGVcclxuICAgICAgICAgICAgICAgICAgPyAncHJvLXRhYmxlLWNoZWNrYm94Z3JvdXAtbm9zdHlsZSdcclxuICAgICAgICAgICAgICAgICAgOiAnJ1xyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJcclxuICAgICAgICAgICAgICAgIGhhbmRsZUZpZWxkQ2hlY2tCb3hDaGFuZ2UoXHJcbiAgICAgICAgICAgICAgICAgICRldmVudCxcclxuICAgICAgICAgICAgICAgICAgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+PC9uei1jaGVja2JveC1ncm91cD5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdhdXRvQ29tcGxldGUnXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIG56LWlucHV0XHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pPy5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImhhbmRsZUF1dG9Db21wbGV0ZUlucHV0KCRldmVudCwgY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgW256QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbik/LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pPy5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxuei1hdXRvY29tcGxldGVcclxuICAgICAgICAgICAgICBbbnpCYWNrZmlsbF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuYmFja0ZpbGxcIlxyXG4gICAgICAgICAgICAgIFtuekRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbl09XCJcclxuICAgICAgICAgICAgICAgIGdldEZpZWxkUHJvcHMoY29sdW1uKS5kZWZhdWx0QWN0aXZlRmlyc3RPcHRpb25cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtueldpZHRoXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS53aWR0aFwiXHJcbiAgICAgICAgICAgICAgI2F1dG9cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuei1hdXRvLW9wdGlvblxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBnZXRBdXRvQ29tcGxldGVEYXRhU291cmNlKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgW256VmFsdWVdPVwiXHJcbiAgICAgICAgICAgICAgICAgIGdldEZpZWxkUHJvcHMoY29sdW1uKS5yZXR1cm5GdWxsRGF0YSA/IG9wdGlvbiA6IG9wdGlvbi52YWx1ZVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFtuekxhYmVsXT1cIm9wdGlvbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgIDwvbnotYXV0by1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbnotYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2N1c3RvbSdcIj5cclxuICAgICAgICAgICAgPGFwcC1keW5hbWljLXNlYXJjaC1maWVsZFxyXG4gICAgICAgICAgICAgIFtjb21wb25lbnRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIl9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXCJcclxuICAgICAgICAgICAgICBbcHJvcHNdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiXHJcbiAgICAgICAgICAgICAgICBzZXRGaWVsZFZhbHVlKGdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wLCAkZXZlbnQpXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvYXBwLWR5bmFtaWMtc2VhcmNoLWZpZWxkPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2lucHV0TnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICA8bnotaW5wdXQtbnVtYmVyXHJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIicxMDAlJ1wiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgW256Rm9ybWF0dGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5mb3JtYXR0ZXJQZXJjZW50XCJcclxuICAgICAgICAgICAgICBbbnpQYXJzZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnBhcnNlclBlcmNlbnRcIlxyXG4gICAgICAgICAgICA+PC9uei1pbnB1dC1udW1iZXI+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICA8L256LWZvcm0taXRlbT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlICNhY3Rpb25UZXh0QnRuPlxyXG4gICAgICAgIDxuei1zcGFjZSBbbnpTaXplXT1cIjRcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuelNwYWNlSXRlbSAqbmdJZj1cInNob3dTZWFyY2hCdG5cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIChjbGljayk9XCJoYW5kbGVTZWFyY2goKVwiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbmZpcm1CdG5UZXh0IH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuelNwYWNlSXRlbSAqbmdJZj1cInNob3dDbGVhckJ0blwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlUmVzZXRGb3JtKClcIj5cclxuICAgICAgICAgICAgICB7eyBjbGVhckJ0blRleHQgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbnotc3BhY2U+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjYWN0aW9uSW1nQnRuPlxyXG4gICAgICAgIDxuei1zcGFjZT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbWdBY3Rpb25CYXJUcGxcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuelNwYWNlSXRlbSBjbGFzcz1cInNldHRpbmctc3BhY2UtaXRlbVwiICpuZ0lmPVwic2hvd0NvbHVtblNldHRpbmdcIj5cclxuICAgICAgICAgICAgPHNwYW4gbnotdG9vbHRpcCBuelRvb2x0aXBUaXRsZT1cIuiuvue9ruWtl+autVwiPlxyXG4gICAgICAgICAgICAgIDxhcHAtY29sbXVucy1zZXR0aW5nXHJcbiAgICAgICAgICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZENvbHVtbnNdPVwiX3NlcnZlckNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgW3RhYmxlTmFtZV09XCJ0YWJsZU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgKGFmdGVyQ29uZmlybSk9XCJoYW5kbGVDb2x1bW5zU2V0dGluZ0NvbmZpcm0oKVwiXHJcbiAgICAgICAgICAgICAgPjwvYXBwLWNvbG11bnMtc2V0dGluZz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L256LXNwYWNlPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9hcHAtdGFibGUtc2VhcmNoLWJhcj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8bmctdGVtcGxhdGUgI2JvZHk+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0FjdGlvbkJhclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25CYXJUcGxcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21UYWJsZVJlbmRlclwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGFibGVSZW5kZXJcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG56LXRhYmxlXHJcbiAgICAgICpuZ0lmPVwiIWN1c3RvbVRhYmxlUmVuZGVyICYmIF9zaG93VGFibGUgJiYgX2NvbHVtbnNSZWFkeVwiXHJcbiAgICAgICNkeW5hbWljVGFibGVcclxuICAgICAgbnpTaXplPVwic21hbGxcIlxyXG4gICAgICBuelNob3dTaXplQ2hhbmdlclxyXG4gICAgICBbbnpCb3JkZXJlZF09XCJib3JkZXJlZFwiXHJcbiAgICAgIFtuek91dGVyQm9yZGVyZWRdPVwib3V0ZXJCb3JkZXJlZFwiXHJcbiAgICAgIFtuekRhdGFdPVwiZGF0YVNvdXJjZVwiXHJcbiAgICAgIFtuelBhZ2VJbmRleF09XCJfcGFnZUluZm8ucGFnZUluZGV4XCJcclxuICAgICAgW256UGFnZVNpemVdPVwiX3BhZ2VJbmZvLnBhZ2VTaXplXCJcclxuICAgICAgW256VG90YWxdPVwiX3BhZ2VJbmZvLnRvdGFsXCJcclxuICAgICAgW256UGFnZVNpemVPcHRpb25zXT1cIl9wYWdlSW5mby5wYWdlU2l6ZU9wdGlvbnNcIlxyXG4gICAgICBbbnpTaG93UGFnaW5hdGlvbl09XCJzaG93UGFnaW5hdGlvblwiXHJcbiAgICAgIFtuelNob3dUb3RhbF09XCJ0b3RhbFRlbXBsYXRlXCJcclxuICAgICAgW256TG9hZGluZ109XCJfbG9hZGluZ1wiXHJcbiAgICAgIFtuekZyb250UGFnaW5hdGlvbl09XCJmcm9udFBhZ2luYXRpb25cIlxyXG4gICAgICBbbnpTY3JvbGxdPVwic2Nyb2xsXCJcclxuICAgICAgKG56UGFnZUluZGV4Q2hhbmdlKT1cImhhbmRsZVBhZ2VJbmRleENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgKG56UGFnZVNpemVDaGFuZ2UpPVwiaGFuZGxlUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgIDx0aGVhZD5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8IS0tIOWkjemAieahhuWIl++8iOW9kyBzaG93Q2hlY2tib3g9dHJ1ZSDml7bmmL7npLrvvIkgLS0+XHJcbiAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICBbbnpXaWR0aF09XCInNTBweCdcIlxyXG4gICAgICAgICAgICBbbnpBbGlnbl09XCInY2VudGVyJ1wiXHJcbiAgICAgICAgICAgIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCJcclxuICAgICAgICAgICAgWyhuekNoZWNrZWQpXT1cIl9jaGVja2VkQWxsXCJcclxuICAgICAgICAgICAgW256SW5kZXRlcm1pbmF0ZV09XCJfaW5kZXRlcm1pbmF0ZVwiXHJcbiAgICAgICAgICAgIChuekNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlQ2hlY2tBbGwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgPjwvdGg+XHJcbiAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBfY29sdW1uc1wiXHJcbiAgICAgICAgICAgIFtueldpZHRoXT1cImNvbHVtbi53aWR0aFwiXHJcbiAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICAgIFtuekxlZnRdPVwiY29sdW1uLmZpeGVkTGVmdFwiXHJcbiAgICAgICAgICAgIFtuelJpZ2h0XT1cImNvbHVtbi5maXhlZFJpZ2h0XCJcclxuICAgICAgICAgICAgW256U2hvd1NvcnRdPVwiISFjb2x1bW4uc29ydGVyXCJcclxuICAgICAgICAgICAgW256U29ydE9yZGVyXT1cImdldFNvcnRPcmRlcihjb2x1bW4ucHJvcClcIlxyXG4gICAgICAgICAgICAobnpTb3J0T3JkZXJDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKGNvbHVtbi5wcm9wLCAkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgY29sdW1uLnRpdGxlIH19XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGhlYWQ+XHJcblxyXG4gICAgICA8dGJvZHk+XHJcbiAgICAgICAgPHRyXHJcbiAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0YTsgbGV0IGkgPSBpbmRleDsgb2Y6IGR5bmFtaWNUYWJsZS5kYXRhXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgJ2FudC10YWJsZS1jdXN0b20tcm93LXNlbGVjdGVkJzogISFnZXRUYWJsZVJvd0NoZWNrZWQoZGF0YSksXHJcbiAgICAgICAgICAgICdhbnQtdGFibGUtY3VzdG9tLXJvdy1ldmVuJzogaSAlIDIgPT09IDAsXHJcbiAgICAgICAgICAgICdhbnQtdGFibGUtY3VzdG9tLXJvdy1vZGQnOiBpICUgMiAhPT0gMFxyXG4gICAgICAgICAgfVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlVGFibGVSb3dDbGljayhkYXRhKVwiXHJcbiAgICAgICAgICAoZGJsY2xpY2spPVwiaGFuZGxlVGFibGVSb3dEYkNsaWNrKGRhdGEpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8IS0tIOWkjemAieahhuWIl++8iOW9kyBzaG93Q2hlY2tib3g9dHJ1ZSDml7bmmL7npLrvvIkgLS0+XHJcbiAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICBbbnpBbGlnbl09XCInY2VudGVyJ1wiXHJcbiAgICAgICAgICAgIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogNTBweFwiXHJcbiAgICAgICAgICAgIFsobnpDaGVja2VkKV09XCJkYXRhLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJpc1Jvd0Rpc2FibGVkKGRhdGEpXCJcclxuICAgICAgICAgICAgKG56Q2hlY2tlZENoYW5nZSk9XCJoYW5kbGVSb3dDaGVja2VkQ2hhbmdlKGRhdGEsICRldmVudClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgX2NvbHVtbnNcIlxyXG4gICAgICAgICAgICBbbnpMZWZ0XT1cImNvbHVtbi5maXhlZExlZnRcIlxyXG4gICAgICAgICAgICBbbnpSaWdodF09XCJjb2x1bW4uZml4ZWRSaWdodFwiXHJcbiAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAncHJvLW5vd3JhcCc6IHRydWVcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwhLS0g5qOA5p+l5piv5ZCm5pyJ6Ieq5a6a5LmJ5qih5p2/IC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIGNvbHVtbi5jdXN0b21SZW5kZXIgJiYgZ2V0VGVtcGxhdGUoY29sdW1uLmN1c3RvbVJlbmRlcik7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGVcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxyXG4gICAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgICAgcGFnZUluZm86IF9wYWdlSW5mb1xyXG4gICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSDpu5jorqTmuLLmn5PpgLvovpEgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdJZj1cIiFjb2x1bW4uY3VzdG9tUmVuZGVyIHx8ICFnZXRUZW1wbGF0ZShjb2x1bW4uY3VzdG9tUmVuZGVyKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvLWVsbGlwc2lzXCJcclxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImRhdGFbY29sdW1uLnByb3BdXCJcclxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnY2FsYygnICsgY29sdW1uLndpZHRoICsgJyAtIDI1cHgpJ1xyXG4gICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAge3sgZGF0YVtjb2x1bW4ucHJvcF0gfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLmVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXRhW2NvbHVtbi5wcm9wXSB9fVxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgICA8dHIgKm5nSWY9XCJzdW1tYXJ5RGF0YSAmJiBfcGFnZUluZm8udG90YWwgPiAwXCI+XHJcbiAgICAgICAgICA8IS0tIOaxh+aAu+ihjOeahOWkjemAieahhuWIl++8iOW9kyBzaG93Q2hlY2tib3g9dHJ1ZSDml7bmmL7npLrvvIzkvYbkuLrnqbrvvIkgLS0+XHJcbiAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZThlOGU4XCJcclxuICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW47IGxldCBpID0gaW5kZXg7IG9mOiBfY29sdW1uc1wiXHJcbiAgICAgICAgICAgIFtuekxlZnRdPVwiY29sdW1uLmZpeGVkTGVmdFwiXHJcbiAgICAgICAgICAgIFtuelJpZ2h0XT1cImNvbHVtbi5maXhlZFJpZ2h0XCJcclxuICAgICAgICAgICAgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2U4ZThlOFwiXHJcbiAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaSA9PT0gMFwiPuaAu+iuoTwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgIT09IDAgJiYgY29sdW1uLnN1bW1hcnlcIj5cclxuICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLnN1bW1hcnk/LmZvcm1hdFxyXG4gICAgICAgICAgICAgICAgICA/IGNvbHVtbi5zdW1tYXJ5Py5mb3JtYXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5RGF0YVtjb2x1bW4uc3VtbWFyeT8ubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgIDogc3VtbWFyeURhdGFbY29sdW1uLnN1bW1hcnk/Lm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjdG90YWxUZW1wbGF0ZSBsZXQtdG90YWxcclxuICAgICAgICA+5YWxIHt7IF9wYWdlSW5mby50b3RhbCB9fSDmnaHorrDlvZU8L25nLXRlbXBsYXRlXHJcbiAgICAgID5cclxuICAgIDwvbnotdGFibGU+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9hcHAtcGFnZS1jb250YWluZXI+XHJcbiJdfQ==
1072
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byby10YWJsZS9zcmMvbGliL3Byby10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm8tdGFibGUvc3JjL2xpYi9wcm8tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFXLE1BQU0sV0FBVyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVdoRixPQUFPLEVBQUUsdUJBQXVCLEVBQStCLE1BQU0sVUFBVSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9uRCxNQUFNLE9BQU8saUJBQWlCO0lBMEk1QixjQUFjO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPO1FBRW5DLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3BDLGlCQUFpQjtZQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENB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O2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBRW9CLFlBQVk7c0JBQXRDLFlBQVk7dUJBQUMsV0FBVztnQkFFSyxlQUFlO3NCQUE1QyxZQUFZO3VCQUFDLGNBQWM7Z0JBRUUsWUFBWTtzQkFBekMsZUFBZTt1QkFBQyxXQUFXO2dCQStENUIsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgY2xvbmVEZWVwLCBoYXNJbiwgaXNOaWwsIGRlYm91bmNlLCBpc0VxdWFsIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgeyBQUk9fVEFCTEVfREVGQVVMVF9DT0xVTU4sIFBST19UQUJMRV9ERUZBVUxUX1BST1BTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7XHJcbiAgQXV0b0NvbXBsZXRlRmllbGRQcm9wcyxcclxuICBDaGVja2JveEZpZWxkUHJvcHMsXHJcbiAgT3B0aW9uc1R5cGUsXHJcbiAgUHJvVGFibGVDb2x1bW4sXHJcbiAgUHJvVGFibGVQYWdlSW5mbyxcclxuICBQcm9UYWJsZVJlcXVlc3RSZXN1bHQsXHJcbiAgUHJvVGFibGVWYWx1ZXNDaGFuZ2UsXHJcbiAgU2VsZWN0RmllbGRQcm9wcyxcclxufSBmcm9tIFwiLi90eXBlXCI7XHJcbmltcG9ydCB7IFBST19UQUJMRV9DT0xVTU5fUkVNT1RFLCBQcm9UYWJsZVJlbW90ZUNvbHVtblNlcnZpY2UgfSBmcm9tIFwiLi90b2tlbnNcIjtcclxuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBsYXN0VmFsdWVGcm9tIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1wcm8tdGFibGVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3Byby10YWJsZS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9wcm8tdGFibGUuY29tcG9uZW50Lmxlc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9UYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJ0bjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDbGVhckJ0bjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgdGFibGVOYW1lOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBASW5wdXQoKSBtdWx0aVJvdzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBzaG93QWN0aW9uQmFyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgY29uZmlybUJ0blRleHQ6IHN0cmluZyA9IFwi5p+l6K+iXCI7XHJcblxyXG4gIEBJbnB1dCgpIGNsZWFyQnRuVGV4dDogc3RyaW5nID0gXCLmuIXnqbpcIjtcclxuXHJcbiAgQElucHV0KCkgbGFiZWxXaWR0aDogc3RyaW5nID0gXCI5MHB4XCI7XHJcblxyXG4gIEBJbnB1dCgpIGxhYmVsQWxpZ246IHN0cmluZyA9IFwicmlnaHRcIjtcclxuXHJcbiAgQElucHV0KCkgZm9ybUl0ZW1XaWR0aDogc3RyaW5nID0gXCIzMzBweFwiO1xyXG5cclxuICBASW5wdXQoKSBkYXRhU291cmNlOiBhbnlbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBib3JkZXJlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIG91dGVyQm9yZGVyZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBzaG93UGFnaW5hdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGZyb250UGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzY3JvbGw6IHsgeD86IHN0cmluZyB8IG51bWJlcjsgeT86IHN0cmluZyB8IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIHJlcXVlc3Q6IChwYXJhbXM6IGFueSkgPT4gUHJvbWlzZTxQcm9UYWJsZVJlcXVlc3RSZXN1bHQ+O1xyXG5cclxuICBASW5wdXQoKSBzdW1tYXJ5RGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyDmjpLluo/mqKHlvI/vvJpsb2NhbCDmnKzlnLDmjpLluo/vvJtzZXJ2ZXIg5Zyo57q/5o6S5bqP77yI5o+Q5Lqk57uZ5o6l5Y+j77yJXHJcbiAgQElucHV0KCkgc29ydE1vZGU6IFwibG9jYWxcIiB8IFwic2VydmVyXCIgPSBcImxvY2FsXCI7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDb2x1bW5TZXR0aW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOaYr+WQpuW8gOWQr+WkmuWIl+aOkuW6j++8iOm7mOiupOWNleWIl++8iVxyXG4gIEBJbnB1dCgpIG11bHRpcGxlU29ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzaG93Q2hlY2tib3g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5Yik5pat6KGM5piv5ZCm56aB55So55qE5Ye95pWwXHJcbiAgQElucHV0KCkgcm93RGlzYWJsZWQ6IChkYXRhOiBhbnkpID0+IGJvb2xlYW4gPSAoKSA9PiBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgcmVyZW5kZXJPblJlc2l6ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8vIOaYr+WQpuiHquWKqOinpuWPkeivt+axglxyXG4gIEBJbnB1dCgpIGF1dG9UcmlnZ2VyUmVxdWVzdDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGN1c3RvbVRhYmxlUmVuZGVyPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQE91dHB1dCgpIG9uUm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uUm93RGJDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25WYWx1ZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFByb1RhYmxlVmFsdWVzQ2hhbmdlPigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25SZXNldEZvcm1CZWZvcmVSZWxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChcImFjdGlvbkJhclwiKSBhY3Rpb25CYXJUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAQ29udGVudENoaWxkKFwiSW1nQWN0aW9uQmFyXCIpIGltZ0FjdGlvbkJhclRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVSZWYpIGFsbFRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuXHJcbiAgcHJpdmF0ZSBfc2F2ZWRTZWFyY2hQYXJhbXM6IGFueSA9IHt9O1xyXG5cclxuICAvLyDlrZjlgqjmiYDmnInoh6rlrprkuYnmqKHmnb/nmoTlvJXnlKhcclxuICBwcml2YXRlIGN1c3RvbVRlbXBsYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBUZW1wbGF0ZVJlZjxhbnk+PigpO1xyXG5cclxuICAvLyDorrDlvZXlkITliJfmjpLluo/nirbmgIHvvJonYXNjZW5kJyB8ICdkZXNjZW5kJyB8IG51bGxcclxuXHJcbiAgcHJpdmF0ZSBfc29ydE1hcDogUmVjb3JkPHN0cmluZywgXCJhc2NlbmRcIiB8IFwiZGVzY2VuZFwiIHwgbnVsbD4gPSB7fTtcclxuXHJcbiAgLy8g6K6w5b2V5aSa5YiX5o6S5bqP55qE5LyY5YWI57qn77yI5ZCO6K6+572u55qE5LyY5YWI77yJXHJcbiAgcHJpdmF0ZSBfc29ydFByaW9yaXR5OiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAvLyDlrZjlgqjmr4/kuKogYXV0b0NvbXBsZXRlIOWtl+auteeahOmYsuaKluWHveaVsFxyXG4gIHByaXZhdGUgX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwOiBNYXA8c3RyaW5nLCAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkPiA9XHJcbiAgICBuZXcgTWFwKCk7XHJcblxyXG5cclxuICBfY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAvLyDnrZvpgInooajljZXmlbDmja7lrZjlgqhcclxuICBfc2VhcmNoUGFyYW1zOiBhbnkgPSB7fTtcclxuXHJcbiAgLy8g562b6YCJ6KGo5Y2VbGlzdOa4suafk+aVsOaNrlxyXG4gIF9zZWFyY2hGaWxlZENvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgX3BhZ2VJbmZvOiBQcm9UYWJsZVBhZ2VJbmZvID0ge1xyXG4gICAgcGFnZUluZGV4OiAxLFxyXG4gICAgcGFnZVNpemU6IDE1LFxyXG4gICAgdG90YWw6IDEwMCxcclxuICAgIHBhZ2VTaXplT3B0aW9uczogWzEwLCAxNSwgMjAsIDUwLCAxMDAsIDUwMCwgMTAwMF0sXHJcbiAgfTtcclxuXHJcbiAgX2xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgX3NlbGVjdGVkVGFibGVSb3c6IGFueSA9IG51bGw7XHJcblxyXG4gIC8vIOmAieS4reeahOihjOaVsOaNru+8iOeUqOS6juWkjemAieahhumAieaLqe+8iS0g5L+d55WZ55So5LqO5YW85a655oCnXHJcbiAgX3NlbGVjdGVkUm93czogYW55W10gPSBbXTtcclxuXHJcbiAgLy8g5YWo6YCJ54q25oCBXHJcbiAgX2NoZWNrZWRBbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5Y2K6YCJ54q25oCB77yI6YOo5YiG6YCJ5Lit77yJXHJcbiAgX2luZGV0ZXJtaW5hdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g6L+c56iLY29sdW1uc1xyXG4gIF9zZXJ2ZXJDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIC8vIOWtmOWCqCBhdXRvQ29tcGxldGUg5a2X5q6155qE5pWw5o2u5rqQXHJcbiAgX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT4gPSB7fTtcclxuXHJcbiAgLy8g5o6n5Yi26KGo5qC85pi+56S654q25oCB77yM55So5LqO6YeN5paw5oyC6L29XHJcbiAgX3Nob3dUYWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8vIOWKqOaAgeWIl+WKoOi9veWujOaIkOagh+W/l++8jOm7mOiupCB0cnVl77yI5peg5Yqo5oCB5YiX5pe255u05o6l5pi+56S677yJXHJcbiAgX2NvbHVtbnNSZWFkeTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8vIOmYsuaKluWumuaXtuWZqO+8jOeUqOS6jueql+WPo+Wkp+Wwj+iwg+aVtFxyXG4gIHByaXZhdGUgcmVzaXplRGVib3VuY2U6IGFueTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIilcclxuICBvbldpbmRvd1Jlc2l6ZSgpIHtcclxuICAgIGlmICghdGhpcy5yZXJlbmRlck9uUmVzaXplKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMucmVzaXplRGVib3VuY2UpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplRGVib3VuY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzaXplRGVib3VuY2UgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8g6YCa6L+HIG5nSWYg6YeN5paw5oyC6L296KGo5qC8XHJcbiAgICAgIHRoaXMuX3Nob3dUYWJsZSA9IGZhbHNlO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLl9zaG93VGFibGUgPSB0cnVlO1xyXG4gICAgICB9LCAwKTtcclxuICAgIH0sIDE1MCk7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQE9wdGlvbmFsKClcclxuICAgIEBJbmplY3QoUFJPX1RBQkxFX0NPTFVNTl9SRU1PVEUpXHJcbiAgICBwcml2YXRlIGNvbHVtblJlbW90ZTogUHJvVGFibGVSZW1vdGVDb2x1bW5TZXJ2aWNlIHwgbnVsbCxcclxuICApIHt9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hSZW1vdGVDb2x1bW5zKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbHVtblJlbW90ZT8uZ2V0Q29sIHx8ICF0aGlzLnRhYmxlTmFtZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY29sdW1uUmVtb3RlLmdldENvbCh0aGlzLnRhYmxlTmFtZSwgdGhpcy5tdWx0aVJvdyk7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcGVyc2lzdFJlbW90ZUNvbHVtbnMoY29sdW1uczogYW55W10pIHtcclxuICAgIGlmICghdGhpcy5jb2x1bW5SZW1vdGU/LnNldENvbCB8fCAhdGhpcy50YWJsZU5hbWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbHVtblJlbW90ZS5zZXRDb2woXHJcbiAgICAgICAgdGhpcy50YWJsZU5hbWUsXHJcbiAgICAgICAgY29sdW1ucyxcclxuICAgICAgICB0aGlzLm11bHRpUm93LFxyXG4gICAgICApO1xyXG4gICAgICBpZiAocmVzdWx0ICYmIGlzT2JzZXJ2YWJsZShyZXN1bHQpKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGxhc3RWYWx1ZUZyb20ocmVzdWx0KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHsgICBcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKHRoaXMuY29sdW1ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnNldFNlYXJjaFBhcmFtcyh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOS9v+eUqCBQcm94eSDljIXoo4UgX3NlYXJjaFBhcmFtc++8jOaLpuaIquihqOWNlemhueWAvOWPmOWMluW5tuWQkeWkluWPkeWHuuS6i+S7tlxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0gdGhpcy5jcmVhdGVTZWFyY2hQYXJhbXNQcm94eSh0aGlzLl9zZWFyY2hQYXJhbXMpO1xyXG4gICAgaWYgKHRoaXMuYXV0b1RyaWdnZXJSZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRhYmxlTmFtZSAmJiB0aGlzLmNvbHVtblJlbW90ZSkge1xyXG4gICAgICB0aGlzLl9jb2x1bW5zUmVhZHkgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMucXVlcnlEeW5hbWljQ29sdW1ucygpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgLy8g6Ieq5Yqo5rOo5YaM5omA5pyJ6Ieq5a6a5LmJ5qih5p2/XHJcbiAgICAvLyDms6jmhI/vvJrmraTml7bmiYDmnIkgQ29udGVudENoaWxkIOWSjCBDb250ZW50Q2hpbGRyZW4g6YO95bey5Yid5aeL5YyW5a6M5oiQXHJcbiAgICB0aGlzLmF1dG9SZWdpc3RlclRlbXBsYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBxdWVyeUR5bmFtaWNDb2x1bW5zKCkge1xyXG4gICAgaWYgKCF0aGlzLnRhYmxlTmFtZSB8fCAhdGhpcy5jb2x1bW5SZW1vdGUpIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZmV0Y2hSZW1vdGVDb2x1bW5zKCk7XHJcbiAgICAgIGlmICghcmVzKSByZXR1cm47XHJcbiAgICAgIGlmIChyZXMuY29kZSA9PT0gMCkge1xyXG4gICAgICAgIGNvbnN0IF90YWJDb2x1bW4gPSByZXMuZGF0YS50YWJDb2x1bW4ubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5oZWFkZXIsXHJcbiAgICAgICAgICAgIHByb3A6IGl0ZW0uZmllbGQsXHJcbiAgICAgICAgICAgIHNvcnROYW1lOiBpdGVtLnNvcnROYW1lLFxyXG4gICAgICAgICAgICBoaWRlSW5UYWJsZTogIWl0ZW0uaXNTaG93LFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9zZXJ2ZXJDb2x1bW5zID0gX3RhYkNvbHVtbi5maWx0ZXIoKGNvbCkgPT5cclxuICAgICAgICAgIHRoaXMuY29sdW1ucy5zb21lKChsb2NhbENvbCkgPT4gbG9jYWxDb2wucHJvcCA9PT0gY29sLnByb3ApLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUYWJsZUNvbHVtbnModGhpcy5fc2VydmVyQ29sdW1ucyk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzLmNvZGUgPT09IDEwKSB7XHJcbiAgICAgICAgLy8g5aaC5p6c5pyq6K6+572u5o6l5Y+j6L+U5Zue77yM6ZyA6KaB6buY6K6k6LCD55So5LiA5qyh5L+u5pS55Ye95pWw5Yid5aeL5YyW5pWw5o2uXHJcbiAgICAgICAgY29uc3QgaW5pdENvbHVtbnMgPSB0aGlzLmNvbHVtbnNcclxuICAgICAgICAgIC5maWx0ZXIoKGNvbCkgPT4gIWNvbC5hdXhpbGlhcnlDb2x1bW4pXHJcbiAgICAgICAgICAubWFwKChjb2x1bW4pID0+ICh7XHJcbiAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4ucHJvcCxcclxuICAgICAgICAgICAgaXNTaG93OiB0cnVlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IGNvbHVtbi50aXRsZSxcclxuICAgICAgICAgICAgc29ydE5hbWU6IGNvbHVtbi5zb3J0TmFtZSB8fCBudWxsLFxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIGNvbnN0IGluaXRSZXMgPSBhd2FpdCB0aGlzLnBlcnNpc3RSZW1vdGVDb2x1bW5zKGluaXRDb2x1bW5zKTtcclxuICAgICAgICBpZiAoaW5pdFJlcykge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeUR5bmFtaWNDb2x1bW5zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9jb2x1bW5zUmVhZHkgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRlSW5uZXJDb2x1bW5zKGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIHRoaXMuX2NvbHVtbnMgPSBjb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmhpZGVJblRhYmxlKVxyXG4gICAgICAubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4uUFJPX1RBQkxFX0RFRkFVTFRfQ09MVU1OLCAuLi5pdGVtIH0gYXMgUHJvVGFibGVDb2x1bW47XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g6Ieq5Yqo5rOo5YaM5qih5p2/55qE5pa55rOVXHJcbiAgcHJpdmF0ZSBhdXRvUmVnaXN0ZXJUZW1wbGF0ZXMoKSB7XHJcbiAgICAvLyDojrflj5bmiYDmnInmqKHmnb9cclxuICAgIGNvbnN0IGFsbFRlbXBsYXRlc0FycmF5ID0gdGhpcy5hbGxUZW1wbGF0ZXMudG9BcnJheSgpO1xyXG5cclxuICAgIC8vIOiOt+WPluaJgOaciemcgOimgeiHquWumuS5ieaooeadv+eahOWIl1xyXG4gICAgY29uc3QgY29sdW1uc1dpdGhDdXN0b21SZW5kZXIgPSB0aGlzLl9jb2x1bW5zLmZpbHRlcihcclxuICAgICAgKGNvbCkgPT4gY29sLmN1c3RvbVJlbmRlcixcclxuICAgICk7XHJcblxyXG4gICAgLy8g6I635Y+W5omA5pyJ6ZyA6KaB6Ieq5a6a5LmJbGFiZWzmqKHmnb/nmoTliJfvvIjkvb/nlKjljp/lp4tjb2x1bW5z77yM56Gu5L+d6aG65bqP5q2j56Gu77yJXHJcbiAgICBjb25zdCBjb2x1bW5zV2l0aEN1c3RvbUxhYmVsID0gdGhpcy5jb2x1bW5zLmZpbHRlcihcclxuICAgICAgKGNvbCkgPT4gY29sLmN1c3RvbUxhYmVsUmVuZGVyLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDorqHnrpfpnIDopoHnmoTmqKHmnb/mgLvmlbBcclxuICAgIGNvbnN0IGN1c3RvbVJlbmRlckNvdW50ID0gY29sdW1uc1dpdGhDdXN0b21SZW5kZXIubGVuZ3RoO1xyXG4gICAgY29uc3QgdG90YWxOZWVkZWRUZW1wbGF0ZXMgPVxyXG4gICAgICBjdXN0b21SZW5kZXJDb3VudCArIGNvbHVtbnNXaXRoQ3VzdG9tTGFiZWwubGVuZ3RoO1xyXG5cclxuICAgIC8vIOivhuWIq+W5tuaOkumZpOeJueauiuaooeadv++8iGFjdGlvbkJhciDlkowgaW1nQWN0aW9uQmFy77yJXHJcbiAgICBjb25zdCBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzID0gbmV3IFNldDxudW1iZXI+KCk7XHJcblxyXG4gICAgLy8g5bCd6K+V5om+5YiwIGFjdGlvbkJhclRwbCDlnKggYWxsVGVtcGxhdGVzQXJyYXkg5Lit55qE5L2N572uXHJcbiAgICBpZiAodGhpcy5hY3Rpb25CYXJUcGwpIHtcclxuICAgICAgY29uc3QgYWN0aW9uQmFySW5kZXggPSB0aGlzLmZpbmRUZW1wbGF0ZUluZGV4KFxyXG4gICAgICAgIGFsbFRlbXBsYXRlc0FycmF5LFxyXG4gICAgICAgIHRoaXMuYWN0aW9uQmFyVHBsLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoYWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoYWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5bCd6K+V5om+5YiwIGltZ0FjdGlvbkJhclRwbCDlnKggYWxsVGVtcGxhdGVzQXJyYXkg5Lit55qE5L2N572uXHJcbiAgICBpZiAodGhpcy5pbWdBY3Rpb25CYXJUcGwpIHtcclxuICAgICAgY29uc3QgaW1nQWN0aW9uQmFySW5kZXggPSB0aGlzLmZpbmRUZW1wbGF0ZUluZGV4KFxyXG4gICAgICAgIGFsbFRlbXBsYXRlc0FycmF5LFxyXG4gICAgICAgIHRoaXMuaW1nQWN0aW9uQmFyVHBsLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoaW1nQWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoaW1nQWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5peg5rOV6YCa6L+H5byV55So5om+5Yiw54m55q6K5qih5p2/77yM5L2/55So5aSH55So562W55WlXHJcbiAgICAvLyDlpIfnlKjnrZbnlaXvvJrlgYforr7mnIDlkI7nmoTmqKHmnb/mmK/nibnmrormqKHmnb9cclxuICAgIGNvbnN0IHNwZWNpYWxUZW1wbGF0ZUNvdW50ID1cclxuICAgICAgKHRoaXMuYWN0aW9uQmFyVHBsID8gMSA6IDApICsgKHRoaXMuaW1nQWN0aW9uQmFyVHBsID8gMSA6IDApO1xyXG4gICAgaWYgKHNwZWNpYWxUZW1wbGF0ZUluZGljZXMuc2l6ZSA9PT0gMCAmJiBzcGVjaWFsVGVtcGxhdGVDb3VudCA+IDApIHtcclxuICAgICAgZm9yIChcclxuICAgICAgICBsZXQgaSA9IGFsbFRlbXBsYXRlc0FycmF5Lmxlbmd0aCAtIHNwZWNpYWxUZW1wbGF0ZUNvdW50O1xyXG4gICAgICAgIGkgPCBhbGxUZW1wbGF0ZXNBcnJheS5sZW5ndGg7XHJcbiAgICAgICAgaSsrXHJcbiAgICAgICkge1xyXG4gICAgICAgIHNwZWNpYWxUZW1wbGF0ZUluZGljZXMuYWRkKGkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5o+Q5Y+W5YiX5qih5p2/77yI5o6S6Zmk54m55q6K5qih5p2/77yJXHJcbiAgICBjb25zdCBjb2x1bW5UZW1wbGF0ZXM6IFRlbXBsYXRlUmVmPGFueT5bXSA9IFtdO1xyXG4gICAgYWxsVGVtcGxhdGVzQXJyYXkuZm9yRWFjaCgodHBsLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAoIXNwZWNpYWxUZW1wbGF0ZUluZGljZXMuaGFzKGluZGV4KSkge1xyXG4gICAgICAgIGNvbHVtblRlbXBsYXRlcy5wdXNoKHRwbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIOmqjOivgeaooeadv+aVsOmHj1xyXG4gICAgaWYgKGNvbHVtblRlbXBsYXRlcy5sZW5ndGggIT09IHRvdGFsTmVlZGVkVGVtcGxhdGVzKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgUHJvVGFibGU6IOaooeadv+aVsOmHj+S4jeWMuemFje+8gemcgOimgSAke3RvdGFsTmVlZGVkVGVtcGxhdGVzfSDkuKrliJfmqKHmnb/vvIzlrp7pmYXmnIkgJHtjb2x1bW5UZW1wbGF0ZXMubGVuZ3RofSDkuKrjgILor7fmo4Dmn6UgY3VzdG9tUmVuZGVyIOWSjCBjdXN0b21MYWJlbFJlbmRlciDphY3nva7jgIJgLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOazqOWGjOiHquWumuS5iea4suafk+aooeadv1xyXG4gICAgY29sdW1uc1dpdGhDdXN0b21SZW5kZXIuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZU5hbWUgPSBjb2x1bW4uY3VzdG9tUmVuZGVyITtcclxuICAgICAgaWYgKGluZGV4IDwgY29sdW1uVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzLnNldCh0ZW1wbGF0ZU5hbWUsIGNvbHVtblRlbXBsYXRlc1tpbmRleF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICBgUHJvVGFibGU6IOacquaJvuWIsOaooeadvyBcIiR7dGVtcGxhdGVOYW1lfVwi77yM57Si5byVICR7aW5kZXh9IOi2heWHuuiMg+WbtGAsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5rOo5YaM6Ieq5a6a5LmJbGFiZWzmqKHmnb/vvIjku44gY3VzdG9tUmVuZGVyQ291bnQg5LmL5ZCO5byA5aeL77yJXHJcbiAgICBjb2x1bW5zV2l0aEN1c3RvbUxhYmVsLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gY29sdW1uLmN1c3RvbUxhYmVsUmVuZGVyITtcclxuICAgICAgY29uc3QgdGVtcGxhdGVJbmRleCA9IGN1c3RvbVJlbmRlckNvdW50ICsgaW5kZXg7XHJcbiAgICAgIGlmICh0ZW1wbGF0ZUluZGV4IDwgY29sdW1uVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzLnNldCh0ZW1wbGF0ZU5hbWUsIGNvbHVtblRlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgIGBQcm9UYWJsZTog5pyq5om+5YiwbGFiZWzmqKHmnb8gXCIke3RlbXBsYXRlTmFtZX1cIu+8jOe0ouW8lSAke3RlbXBsYXRlSW5kZXh9IOi2heWHuuiMg+WbtGAsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDlsJ3or5XlnKjmlbDnu4TkuK3mib7liLDmqKHmnb/nmoTntKLlvJXvvIjkvb/nlKjlpJrnp43mr5TovoPmlrnlvI/vvIlcclxuICBwcml2YXRlIGZpbmRUZW1wbGF0ZUluZGV4KFxyXG4gICAgdGVtcGxhdGVzOiBUZW1wbGF0ZVJlZjxhbnk+W10sXHJcbiAgICB0YXJnZXQ6IFRlbXBsYXRlUmVmPGFueT4sXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIC8vIOaWueazlTHvvJrlvJXnlKjnm7jnrYnmgKdcclxuICAgIGxldCBpbmRleCA9IHRlbXBsYXRlcy5pbmRleE9mKHRhcmdldCk7XHJcbiAgICBpZiAoaW5kZXggIT09IC0xKSByZXR1cm4gaW5kZXg7XHJcblxyXG4gICAgLy8g5pa55rOVMu+8mumAmui/hyBlbGVtZW50UmVmIOavlOi+g1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudFJlZiA9ICh0YXJnZXQgYXMgYW55KS5lbGVtZW50UmVmO1xyXG4gICAgICBpZiAodGFyZ2V0RWxlbWVudFJlZikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCB0cGxFbGVtZW50UmVmID0gKHRlbXBsYXRlc1tpXSBhcyBhbnkpLmVsZW1lbnRSZWY7XHJcbiAgICAgICAgICBpZiAodHBsRWxlbWVudFJlZiA9PT0gdGFyZ2V0RWxlbWVudFJlZikge1xyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8g5b+955Wl6ZSZ6K+vXHJcbiAgICB9XHJcblxyXG4gICAgLy8g5pa55rOVM++8mumAmui/hyBBbmd1bGFyIOWGhemDqOWxnuaAp+avlOi+g1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgdGFyZ2V0Q29udGFpbmVyID0gKHRhcmdldCBhcyBhbnkpLl9kZWNsYXJhdGlvblRDb250YWluZXI7XHJcbiAgICAgIGlmICh0YXJnZXRDb250YWluZXIpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgdHBsQ29udGFpbmVyID0gKHRlbXBsYXRlc1tpXSBhcyBhbnkpLl9kZWNsYXJhdGlvblRDb250YWluZXI7XHJcbiAgICAgICAgICBpZiAodHBsQ29udGFpbmVyID09PSB0YXJnZXRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIOW/veeVpemUmeivr1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAtMTtcclxuICB9XHJcblxyXG4gIC8vIOiuvue9ruetm+mAieihqOWNlem7mOiupOWxnuaAp1xyXG4gIHByaXZhdGUgc2V0U2VhcmNoRm9ybURlZmF1bHRQcm9wKGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS52YWx1ZVR5cGUpIHtcclxuICAgICAgICBpZiAoaXRlbS5maWVsZFByb3BzKSB7XHJcbiAgICAgICAgICBpdGVtLmZpZWxkUHJvcHMgPSB7XHJcbiAgICAgICAgICAgIC4uLlBST19UQUJMRV9ERUZBVUxUX1BST1BTW2l0ZW0udmFsdWVUeXBlXSxcclxuICAgICAgICAgICAgLi4uaXRlbS5maWVsZFByb3BzLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaXRlbS5maWVsZFByb3BzID0geyAuLi5QUk9fVEFCTEVfREVGQVVMVF9QUk9QU1tpdGVtLnZhbHVlVHlwZV0gfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yqo5oCB6K6+572uT3B0aW9uc1xyXG4gIHByaXZhdGUgc2V0U2VsZWN0UmVxdWVzdChjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5zLm1hcChhc3luYyAoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5maWVsZFByb3BzICYmIGhhc0luKGl0ZW0uZmllbGRQcm9wcywgXCJyZXF1ZXN0XCIpKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCAoXHJcbiAgICAgICAgICAgIGl0ZW0uZmllbGRQcm9wcyBhcyBTZWxlY3RGaWVsZFByb3BzXHJcbiAgICAgICAgICApLnJlcXVlc3Q/LigpO1xyXG4gICAgICAgICAgKGl0ZW0uZmllbGRQcm9wcyBhcyBTZWxlY3RGaWVsZFByb3BzKS5vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgKGl0ZW0uZmllbGRQcm9wcyBhcyBTZWxlY3RGaWVsZFByb3BzKS5vcHRpb25zID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2V0U2VhcmNoUGFyYW1zKGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucyA9IFtdO1xyXG4gICAgY29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmxhZyA9ICFpdGVtLmhpZGVJblNlYXJjaCAmJiBpdGVtLnZhbHVlVHlwZTtcclxuICAgICAgICBpZiAoZmxhZykge1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zLnB1c2goY2xvbmVEZWVwKGl0ZW0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICBjb25zdCBrZXkgPSBjb2x1bW4uZmllbGRQcm9wcz8ubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbY29sdW1uLnZhbHVlVHlwZV0udmFsdWU7XHJcblxyXG4gICAgICAgIC8vIOWvueS6jmNoZWNrYm9457G75Z6L77yM5LuOb3B0aW9uc+S4reaJvuWHumNoZWNrZWTkuLp0cnVl55qE6aG55L2c5Li66buY6K6k5YC8XHJcbiAgICAgICAgaWYgKGNvbHVtbi52YWx1ZVR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICAgICAgY29uc3QgY2hlY2tlZFZhbHVlcyA9IChjb2x1bW4uZmllbGRQcm9wcz8ub3B0aW9ucyB8fCBbXSlcclxuICAgICAgICAgICAgLmZpbHRlcigob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LmNoZWNrZWQpXHJcbiAgICAgICAgICAgIC5tYXAoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC52YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9XHJcbiAgICAgICAgICAgIGNoZWNrZWRWYWx1ZXMubGVuZ3RoID4gMCA/IGNoZWNrZWRWYWx1ZXMgOiBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID0gY29sdW1uLmZpZWxkUHJvcHM/LnZhbHVlIHx8IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOWIneWni+WMliBhdXRvQ29tcGxldGUg5pWw5o2u5rqQXHJcbiAgICAgICAgaWYgKGNvbHVtbi52YWx1ZVR5cGUgPT09IFwiYXV0b0NvbXBsZXRlXCIpIHtcclxuICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2tleV0gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIOagueaNruWIl+eahCBvcmRlciDlrZfmrrXov5vooYzmjpLluo/vvIzmnKrorr7nva4gb3JkZXIg55qE5pS+5Zyo5pyA5ZCOXHJcbiAgICB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgYU9yZGVyID0gaXNOaWwoYT8ub3JkZXIpID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiBhLm9yZGVyO1xyXG4gICAgICBjb25zdCBiT3JkZXIgPSBpc05pbChiPy5vcmRlcikgPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IGIub3JkZXI7XHJcbiAgICAgIGlmIChhT3JkZXIgPT09IGJPcmRlcikgcmV0dXJuIDA7XHJcbiAgICAgIHJldHVybiBhT3JkZXIgLSBiT3JkZXI7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldFNlYXJjaEZvcm1EZWZhdWx0UHJvcCh0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMpO1xyXG5cclxuICAgIC8vIOW5tuWPkeWKoOi9veaJgOaciemcgOimgeW8guatpeiOt+WPlueahOmAiemhuVxyXG4gICAgdGhpcy5zZXRTZWxlY3RSZXF1ZXN0KHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRhYmxlQ29sdW1ucyhpbmplY3RDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICAvLyDov5znqIvliJfnm7TmjqXkvZzkuLrmnaXmupDvvIzov4fmu6TmjonmnKzlnLDkuI3lrZjlnKjnmoTliJfvvIzlubbku47mnKzlnLDliJfooaXlhYXmuLLmn5PphY3nva5cclxuICAgIGNvbnN0IHJlbW90ZUNvbHVtbnMgPSBpbmplY3RDb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGluamVjdENvbCkgPT5cclxuICAgICAgICB0aGlzLmNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wucHJvcCA9PT0gaW5qZWN0Q29sLnByb3ApLFxyXG4gICAgICApXHJcbiAgICAgIC5tYXAoKGluamVjdENvbCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGxvY2FsQ29sID0gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLnByb3AgPT09IGluamVjdENvbC5wcm9wKTtcclxuICAgICAgICByZXR1cm4geyAuLi5sb2NhbENvbCwgLi4uaW5qZWN0Q29sIH07XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIOi+heWKqeWIl+WPluiHquacrOWcsO+8jOS/neaMgeWcqOWOn+Wni+S9jee9ru+8iOmmlumDqCAvIOWwvumDqO+8iVxyXG4gICAgY29uc3QgZmlyc3ROb25BdXhJbmRleCA9IHRoaXMuY29sdW1ucy5maW5kSW5kZXgoXHJcbiAgICAgIChjKSA9PiAhYy5hdXhpbGlhcnlDb2x1bW4sXHJcbiAgICApO1xyXG4gICAgY29uc3QgbGFzdE5vbkF1eEluZGV4ID1cclxuICAgICAgdGhpcy5jb2x1bW5zLmxlbmd0aCAtXHJcbiAgICAgIDEgLVxyXG4gICAgICBbLi4udGhpcy5jb2x1bW5zXS5yZXZlcnNlKCkuZmluZEluZGV4KChjKSA9PiAhYy5hdXhpbGlhcnlDb2x1bW4pO1xyXG4gICAgY29uc3QgaGVhZEF1eGlsaWFyeSA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wsIGkpID0+IGNvbC5hdXhpbGlhcnlDb2x1bW4gJiYgaSA8IGZpcnN0Tm9uQXV4SW5kZXgsXHJcbiAgICApO1xyXG4gICAgY29uc3QgdGFpbEF1eGlsaWFyeSA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wsIGkpID0+IGNvbC5hdXhpbGlhcnlDb2x1bW4gJiYgaSA+IGxhc3ROb25BdXhJbmRleCxcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKFsuLi5oZWFkQXV4aWxpYXJ5LCAuLi5yZW1vdGVDb2x1bW5zLCAuLi50YWlsQXV4aWxpYXJ5XSk7XHJcbiAgfVxyXG5cclxuICAvLyDpgJrov4cgUHJveHkg55uR5ZCsIF9zZWFyY2hQYXJhbXMg55qE5bGe5oCn5Y+Y5pu0XHJcbiAgcHJpdmF0ZSBjcmVhdGVTZWFyY2hQYXJhbXNQcm94eSh0YXJnZXQ6IGFueSkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCBoYW5kbGVyOiBQcm94eUhhbmRsZXI8YW55PiA9IHtcclxuICAgICAgc2V0KG9iajogYW55LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBTdHJpbmcocHJvcCk7XHJcbiAgICAgICAgY29uc3Qgb2xkVmFsID0gb2JqW2tleV07XHJcbiAgICAgICAgaWYgKG9sZFZhbCA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgIG9ialtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgc2VsZi5vblZhbHVlc0NoYW5nZS5lbWl0KHtcclxuICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgcGFyYW1zOiBzZWxmLmdldFNlYXJjaFBhcmFtcygpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyRW1wdHlTZWFyY2hQYXJhbXMoKSB7XHJcbiAgICBjb25zdCBjbG9uZVNlYXJjaFBhcmFtcyA9IGNsb25lRGVlcCh0aGlzLl9zZWFyY2hQYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNsb25lU2VhcmNoUGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFNlcnZlclNvcnRQYXlsb2FkKCkge1xyXG4gICAgLy8g5p6E5bu65r+A5rS75o6S5bqP6ZuG5ZCI77yI5oyJ5LyY5YWI57qn5LuO5L2O5Yiw6auY77yM5pyr5bC+5LyY5YWI77yJXHJcbiAgICBjb25zdCBhY3RpdmVLZXlzID0gdGhpcy5fc29ydFByaW9yaXR5LmZpbHRlcigoaykgPT4gISF0aGlzLl9zb3J0TWFwW2tdKTtcclxuICAgIGlmIChhY3RpdmVLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICBjb25zdCBzb3J0cyA9IGFjdGl2ZUtleXMubWFwKChmaWVsZCkgPT4ge1xyXG4gICAgICAvLyDmn6Xmib7lr7nlupTnmoTliJfphY3nva7vvIzkvJjlhYjkvb/nlKhzb3J0TmFtZeWtl+autVxyXG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLl9jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLnByb3AgPT09IGZpZWxkKTtcclxuICAgICAgY29uc3Qgc29ydEZpZWxkID0gY29sdW1uPy5zb3J0TmFtZSB8fCBmaWVsZDtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBmaWVsZDogc29ydEZpZWxkLFxyXG4gICAgICAgIG9yZGVyOiB0aGlzLl9zb3J0TWFwW2ZpZWxkXSEsXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLm11bHRpcGxlU29ydCkge1xyXG4gICAgICByZXR1cm4gc29ydHM7IC8vIOS7peaVsOe7hOW9ouW8j+aPkOS6pOWkmuWIl+aOkuW6j1xyXG4gICAgfVxyXG4gICAgY29uc3QgW2ZpcnN0XSA9IHNvcnRzO1xyXG4gICAgcmV0dXJuIGZpcnN0OyAvLyDlhbzlrrnljZXliJfnu5PmnoQgeyBmaWVsZCwgb3JkZXIgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzb3J0RGF0YVNvdXJjZUluUGxhY2UoKSB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSB8fCB0aGlzLmRhdGFTb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICBjb25zdCBhY3RpdmVLZXlzID0gdGhpcy5fc29ydFByaW9yaXR5LmZpbHRlcigoaykgPT4gISF0aGlzLl9zb3J0TWFwW2tdKTtcclxuICAgIGlmIChhY3RpdmVLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIOWkjeWItuS4gOS7veS8mOWFiOe6p++8jOS7juWJjeWIsOWQjuS8mOWFiOe6p+S7juS9juWIsOmrmO+8iOacgOWQjuiuvue9rueahOWtl+auteS8mOWFiO+8iVxyXG4gICAgY29uc3Qga2V5c0luUHJpb3JpdHkgPSBbLi4uYWN0aXZlS2V5c107XHJcbiAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgZm9yIChsZXQgaSA9IGtleXNJblByaW9yaXR5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgY29uc3QgZmllbGQgPSBrZXlzSW5Qcmlvcml0eVtpXTtcclxuICAgICAgICBjb25zdCBvcmRlciA9IHRoaXMuX3NvcnRNYXBbZmllbGRdITtcclxuICAgICAgICBjb25zdCBhdiA9IGE/LltmaWVsZF07XHJcbiAgICAgICAgY29uc3QgYnYgPSBiPy5bZmllbGRdO1xyXG4gICAgICAgIGNvbnN0IGNtcCA9IHRoaXMuY29tcGFyZVZhbHVlcyhhdiwgYnYpO1xyXG4gICAgICAgIGlmIChjbXAgIT09IDApIHJldHVybiBvcmRlciA9PT0gXCJhc2NlbmRcIiA/IGNtcCA6IC1jbXA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcGFyZVZhbHVlcyhhVmFsOiBhbnksIGJWYWw6IGFueSk6IG51bWJlciB7XHJcbiAgICBpZiAoYVZhbCA9PSBudWxsICYmIGJWYWwgPT0gbnVsbCkgcmV0dXJuIDA7XHJcbiAgICBpZiAoYVZhbCA9PSBudWxsKSByZXR1cm4gLTE7XHJcbiAgICBpZiAoYlZhbCA9PSBudWxsKSByZXR1cm4gMTtcclxuICAgIGlmIChhVmFsIGluc3RhbmNlb2YgRGF0ZSAmJiBiVmFsIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICByZXR1cm4gYVZhbC5nZXRUaW1lKCkgLSBiVmFsLmdldFRpbWUoKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgYVZhbCA9PT0gXCJib29sZWFuXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgIHJldHVybiBhVmFsID09PSBiVmFsID8gMCA6IGFWYWwgPyAxIDogLTE7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgcmV0dXJuIGFWYWwgLSBiVmFsO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBhVmFsID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBiVmFsID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIHJldHVybiBhVmFsLmxvY2FsZUNvbXBhcmUoYlZhbCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhTnVtID0gTnVtYmVyKGFWYWwpO1xyXG4gICAgY29uc3QgYk51bSA9IE51bWJlcihiVmFsKTtcclxuICAgIGlmICghaXNOYU4oYU51bSkgJiYgIWlzTmFOKGJOdW0pKSByZXR1cm4gYU51bSAtIGJOdW07XHJcbiAgICByZXR1cm4gU3RyaW5nKGFWYWwpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGJWYWwpKTtcclxuICB9XHJcblxyXG4gIC8vIOaJp+ihjCBhdXRvQ29tcGxldGUg5pWw5o2u5rqQ5p+l6K+i77yI5a6e6ZmF5omn6KGM6YC76L6R77yJXHJcbiAgcHJpdmF0ZSBleGVjdXRlQXV0b0NvbXBsZXRlRGF0YVNvdXJjZShldmVudDogRXZlbnQsIGNvbHVtbjogUHJvVGFibGVDb2x1bW4pIHtcclxuICAgIGNvbnN0IGZpZWxkS2V5ID0gY29sdW1uLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sdW1uLnByb3A7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAoY29sdW1uLmZpZWxkUHJvcHMgYXMgQXV0b0NvbXBsZXRlRmllbGRQcm9wcykuZGF0YVNvdXJjZSAmJlxyXG4gICAgICB0eXBlb2YgKGNvbHVtbi5maWVsZFByb3BzIGFzIEF1dG9Db21wbGV0ZUZpZWxkUHJvcHMpLmRhdGFTb3VyY2UgPT09XHJcbiAgICAgICAgXCJmdW5jdGlvblwiXHJcbiAgICApIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSAoY29sdW1uLmZpZWxkUHJvcHMgYXMgQXV0b0NvbXBsZXRlRmllbGRQcm9wcykuZGF0YVNvdXJjZShcclxuICAgICAgICAgIGV2ZW50LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8g5aaC5p6c6L+U5Zue55qE5pivIFByb21pc2XvvIzlpITnkIblvILmraXnu5PmnpxcclxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgcmVzdWx0XHJcbiAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gZGF0YSB8fCBbXTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBdXRvQ29tcGxldGUgZGF0YVNvdXJjZSBlcnJvcjpcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IFtdO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8g5ZCM5q2l6L+U5Zue57uT5p6cXHJcbiAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSByZXN1bHQgfHwgW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBdXRvQ29tcGxldGUgZGF0YVNvdXJjZSBlcnJvcjpcIiwgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2VhcmNoUGFyYW1zKG9wdGlvbnM/OiB7XHJcbiAgICB1c2VTYXZlZD86IGJvb2xlYW47IC8vIOS9v+eUqOacgOi/keS4gOasoeafpeivouaPkOS6pOeahOWPguaVsO+8jOm7mOiupOS4uiBmYWxzZe+8m2ZhbHNlIOS4uuW9k+WJjeihqOWNleWAvFxyXG4gIH0pOiBhbnkge1xyXG4gICAgY29uc3QgeyB1c2VTYXZlZCA9IGZhbHNlIH0gPSBvcHRpb25zIHx8IHt9O1xyXG4gICAgY29uc3QgcmF3UGFyYW1zID0gdXNlU2F2ZWQgPyB0aGlzLl9zYXZlZFNlYXJjaFBhcmFtcyA6IHRoaXMuX3NlYXJjaFBhcmFtcztcclxuICAgIGNvbnN0IHBhcmFtcyA9IGNsb25lRGVlcChyYXdQYXJhbXMgfHwge30pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHBhcmFtcyxcclxuICAgICAgcGFnZUluZm86IHtcclxuICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCxcclxuICAgICAgICBwYWdlU2l6ZTogdGhpcy5fcGFnZUluZm8ucGFnZVNpemUsXHJcbiAgICAgIH0sXHJcbiAgICAgIC8vIOWcqOe6v+aOkuW6j+aooeW8j++8muaKiuaOkuW6j+WvueixoeaPkOS6pOe7meaOpeWPo1xyXG4gICAgICAuLi4odGhpcy5zb3J0TW9kZSA9PT0gXCJzZXJ2ZXJcIlxyXG4gICAgICAgID8geyBzb3J0OiB0aGlzLmJ1aWxkU2VydmVyU29ydFBheWxvYWQoKSB9XHJcbiAgICAgICAgOiB7fSksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbG9hZChhZnRlckRlbGV0ZT86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoYWZ0ZXJEZWxldGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZpZWxkc1ZhbHVlKGZpZWxkczogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgT2JqZWN0LmtleXMoZmllbGRzKS5mb3JFYWNoKChrKSA9PiB7XHJcbiAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trXSA9IGZpZWxkc1trXTsgLy8g5L+d55WZIFByb3h577yM6YCQ6aG56LWL5YC86Kem5Y+R5oum5oiqXHJcblxyXG4gICAgICAvLyBjaGVja2JveCDnsbvlnovpnIDopoHlkIzmraXmm7TmlrAgb3B0aW9ucyDnmoQgY2hlY2tlZCDnirbmgIHvvIzlkKbliJkgVUkg5LiN5Lya5ZON5bqUXHJcbiAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKFxyXG4gICAgICAgIChpdGVtKSA9PiAoaXRlbS5maWVsZFByb3BzPy5uYW1lIHx8IGl0ZW0ucHJvcCkgPT09IGssXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh0YXJnZXRDb2x1bW4/LnZhbHVlVHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoZmllbGRzW2tdKSA/IGZpZWxkc1trXSA6IFtdO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEZpZWxkUHJvcHMgPSB0YXJnZXRDb2x1bW4uZmllbGRQcm9wcyBhcyBDaGVja2JveEZpZWxkUHJvcHM7XHJcbiAgICAgICAgaWYgKHRhcmdldEZpZWxkUHJvcHM/Lm9wdGlvbnMpIHtcclxuICAgICAgICAgIHRhcmdldEZpZWxkUHJvcHMub3B0aW9ucyA9IHRhcmdldEZpZWxkUHJvcHMub3B0aW9ucy5tYXAoXHJcbiAgICAgICAgICAgIChpdGVtOiBPcHRpb25zVHlwZSkgPT4gKHtcclxuICAgICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IHZhbHVlcy5pbmNsdWRlcyhpdGVtLnZhbHVlKSxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RmllbGRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkUm93KCkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0Q29sdW1ucyhcclxuICAgIGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10sXHJcbiAgICBvcHRpb25zPzoge1xyXG4gICAgICByZWxvYWQ/OiBib29sZWFuOyAvLyDmmK/lkKbph43mlrDliqDovb3mlbDmja7vvIzpu5jorqTkuLogZmFsc2VcclxuICAgIH0sXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyDmm7TmlrAgY29sdW1ucyDovpPlhaXlsZ7mgKdcclxuICAgIHRoaXMuY29sdW1ucyA9IGNsb25lRGVlcChjb2x1bW5zKTtcclxuXHJcbiAgICAvLyDph43mlrDmoLzlvI/ljJblhoXpg6jliJdcclxuICAgIHRoaXMuZm9ybWF0ZUlubmVyQ29sdW1ucyh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOiuvue9ruaQnOe0ouWPguaVsO+8iOW8guatpeaTjeS9nO+8iVxyXG4gICAgLy8g5YWI5riF56m65pen55qE5pCc57Si5Y+C5pWw77yM6YG/5YWN5pen5pWw5o2u5q6L55WZXHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXMgPSB7fTtcclxuICAgIGF3YWl0IHRoaXMuc2V0U2VhcmNoUGFyYW1zKHRoaXMuY29sdW1ucyk7XHJcblxyXG4gICAgLy8g6YeN5paw5Yib5bu6IFByb3h577yM56Gu5L+d6KGo5Y2V6aG55YC85Y+Y5YyW6IO95q2j5bi46Kem5Y+R5LqL5Lu2XHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXMgPSB0aGlzLmNyZWF0ZVNlYXJjaFBhcmFtc1Byb3h5KHRoaXMuX3NlYXJjaFBhcmFtcyk7XHJcblxyXG4gICAgLy8g6YeN5paw5rOo5YaM5qih5p2/77yI5aaC5p6c57uE5Lu25bey57uP5Yid5aeL5YyW5a6M5oiQ77yJXHJcbiAgICBpZiAodGhpcy5hbGxUZW1wbGF0ZXMpIHtcclxuICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJUZW1wbGF0ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzorr7nva7kuoYgcmVsb2FkIOmAiemhueS4uiB0cnVl77yM5YiZ6YeN5paw5p+l6K+i5pWw5o2uXHJcbiAgICBpZiAob3B0aW9ucz8ucmVsb2FkID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFJvd0RhdGE8VCA9IGFueT4oKTogVCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDaGVja2VkUm93czxUID0gYW55PigpOiBUW10ge1xyXG4gICAgaWYgKCF0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICAvLyDov5Tlm57lvZPliY3mlbDmja7mupDkuK3miYDmnIkgY2hlY2tlZCDkuLogdHJ1ZSDnmoTpoblcclxuICAgIC8vIOazqOaEj++8muWmguaenOmcgOimgeiOt+WPluaJgOaciemhteeahOmAieS4remhue+8jOmcgOimgemBjeWOhuaJgOacieaVsOaNrua6kOaIluS9v+eUqCBfc2VsZWN0ZWRSb3dJZHNcclxuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyKChyb3cpID0+IHJvdy5jaGVja2VkID09PSB0cnVlKSBhcyBUW107XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bmjIflrprlkI3np7DnmoTmqKHmnb9cclxuICBnZXRUZW1wbGF0ZShuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XHJcbiAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tVGVtcGxhdGVzLmdldChuYW1lKSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0VG9vbFRpcFRleHRWYWx1ZShjb2x1bW46IFByb1RhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qga2V5ID1cclxuICAgICAgY29sdW1uLmN1c3RvbVJlbmRlciAmJiB0aGlzLmdldFRlbXBsYXRlKGNvbHVtbi5jdXN0b21SZW5kZXIpXHJcbiAgICAgICAgPyBcIlwiXHJcbiAgICAgICAgOiBjb2x1bW4uZWxsaXBzaXNcclxuICAgICAgICAgID8gY29sdW1uLnByb3BcclxuICAgICAgICAgIDogXCJcIjtcclxuICAgIHJldHVybiAha2V5ID8gXCJcIiA6IGRhdGFba2V5XTtcclxuICB9XHJcblxyXG4gIGdldFRhYmxlUm93Q2hlY2tlZChkYXRhOiBhbnkpIHtcclxuICAgIC8vIOWQr+eUqOWkjemAieahhuaXtu+8muihjOmrmOS6ruW6lOS4juWkjemAieahhumAieS4reeKtuaAgeS4gOiHtO+8iOaUr+aMgeWkmumAie+8iVxyXG4gICAgaWYgKHRoaXMuc2hvd0NoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzUm93Q2hlY2tlZChkYXRhKTtcclxuICAgIH1cclxuICAgIC8vIOacquWQr+eUqOWkjemAieahhuaXtu+8muS7jeeEtuS9v+eUqOWNlemAieihjOmrmOS6rlxyXG4gICAgaWYgKCF0aGlzLl9zZWxlY3RlZFRhYmxlUm93KSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdykgPT09IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLy8g5qOA5p+l6KGM5piv5ZCm6KKr56aB55SoXHJcbiAgaXNSb3dEaXNhYmxlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0aGlzLnJvd0Rpc2FibGVkID8gdGhpcy5yb3dEaXNhYmxlZChkYXRhKSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8g5qOA5p+l6KGM5piv5ZCm6KKr5aSN6YCJ5qGG6YCJ5Lit77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgaXNSb3dDaGVja2VkKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnNob3dDaGVja2JveCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8g55u05o6l6K+75Y+W5pWw5o2u5a+56LGh55qEIGNoZWNrZWQg5bGe5oCnXHJcbiAgICByZXR1cm4gZGF0YS5jaGVja2VkID09PSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8g5YiH5o2i6KGM55qE6YCJ5Lit54q25oCB77yI5pWw5o2u6amx5Yqo5qih5byP77yM5L+d55WZ55So5LqO5YW85a6577yJXHJcbiAgdG9nZ2xlUm93Q2hlY2tlZChkYXRhOiBhbnksIGNoZWNrZWQ6IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8g6Zi75q2i5LqL5Lu25YaS5rOh77yM6YG/5YWN6Kem5Y+R6KGM54K55Ye7XHJcbiAgICB9XHJcbiAgICAvLyDlpoLmnpzooYzooqvnpoHnlKjvvIzkuI3lhYHorrjliIfmjaLpgInkuK3nirbmgIFcclxuICAgIGlmICh0aGlzLmlzUm93RGlzYWJsZWQoZGF0YSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOebtOaOpeiuvue9ruaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp1xyXG4gICAgZGF0YS5jaGVja2VkID0gY2hlY2tlZDtcclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MuZmluZEluZGV4KChyb3cpID0+XHJcbiAgICAgIHRoaXMuaXNTYW1lUm93KHJvdywgZGF0YSksXHJcbiAgICApO1xyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5wdXNoKGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOWLvumAieWkjemAieahhuaXtuWQjOatpeiuvue9rumrmOS6rumAieS4reihjFxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g6Iul5b2T5YmN6auY5Lqu6KGM5Li66K+l6KGM77yM5YiZ5Y+W5raI6auY5LquXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ICYmXHJcbiAgICAgICAgdGhpcy5pc1NhbWVSb3codGhpcy5fc2VsZWN0ZWRUYWJsZVJvdywgZGF0YSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZUNoZWNrQWxsU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDmm7TmlrDlhajpgInnirbmgIHvvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICB1cGRhdGVDaGVja0FsbFN0YXR1cygpIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3ggfHwgIUFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSkge1xyXG4gICAgICB0aGlzLl9jaGVja2VkQWxsID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8g5Y+q6K6h566X5Y+v55So55qE6KGM77yI5pyq56aB55So55qE6KGM77yJXHJcbiAgICBjb25zdCBhdmFpbGFibGVSb3dzID0gdGhpcy5kYXRhU291cmNlLmZpbHRlcihcclxuICAgICAgKHJvdykgPT4gIXRoaXMuaXNSb3dEaXNhYmxlZChyb3cpLFxyXG4gICAgKTtcclxuICAgIC8vIOWfuuS6juaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp+iuoeeul1xyXG4gICAgY29uc3QgY2hlY2tlZENvdW50ID0gYXZhaWxhYmxlUm93cy5maWx0ZXIoXHJcbiAgICAgIChyb3cpID0+IHJvdy5jaGVja2VkID09PSB0cnVlLFxyXG4gICAgKS5sZW5ndGg7XHJcbiAgICBjb25zdCB0b3RhbENvdW50ID0gYXZhaWxhYmxlUm93cy5sZW5ndGg7XHJcbiAgICB0aGlzLl9jaGVja2VkQWxsID1cclxuICAgICAgdG90YWxDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPT09IHRvdGFsQ291bnQ7XHJcbiAgICB0aGlzLl9pbmRldGVybWluYXRlID0gY2hlY2tlZENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPCB0b3RhbENvdW50O1xyXG4gIH1cclxuXHJcbiAgLy8g5YWo6YCJL+WPlua2iOWFqOmAie+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIHRvZ2dsZUNoZWNrQWxsKGNoZWNrZWQ6IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlj6rlpITnkIblj6/nlKjnmoTooYzvvIjmnKrnpoHnlKjnmoTooYzvvIlcclxuICAgIGNvbnN0IGF2YWlsYWJsZVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiAhdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdyksXHJcbiAgICApO1xyXG5cclxuICAgIC8vIOaJuemHj+iuvue9riBjaGVja2VkIOWxnuaAp1xyXG4gICAgYXZhaWxhYmxlUm93cy5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgcm93LmNoZWNrZWQgPSBjaGVja2VkO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3PvvIjnlKjkuo7lhbzlrrnmgKfvvIlcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFsuLi5hdmFpbGFibGVSb3dzXTtcclxuICAgICAgLy8g5ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGM5Li656ys5LiA5p2h5Y+v6YCJ5pWw5o2uXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPVxyXG4gICAgICAgIGF2YWlsYWJsZVJvd3MubGVuZ3RoID4gMCA/IGF2YWlsYWJsZVJvd3NbMF0gOiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XHJcbiAgICAgIC8vIOWPlua2iOmrmOS6rlxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZUNoZWNrQWxsU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bpgInkuK3nmoTooYzmlbDmja7vvIjkv53nlZnnlKjkuo7lhbzlrrnmgKfvvIlcclxuICBnZXRTZWxlY3RlZFJvd3MoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hlY2tlZFJvd3MoKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhuihjCBjaGVja2JveCDlj5jljJbkuovku7bvvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICBoYW5kbGVSb3dDaGVja2VkQ2hhbmdlKGRhdGE6IGFueSwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNSb3dEaXNhYmxlZChkYXRhKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5pWw5o2u5a+56LGh55qEIGNoZWNrZWQg5bGe5oCn5bey57uP6YCa6L+H5Y+M5ZCR57uR5a6a6Ieq5Yqo5pu05pawXHJcbiAgICAvLyDov5nph4zlj6rpnIDopoHlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c1xyXG5cclxuICAgIC8vIOWQjOatpeabtOaWsCBfc2VsZWN0ZWRSb3dz77yI55So5LqO5YW85a655oCn77yJXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NlbGVjdGVkUm93cy5maW5kSW5kZXgoKHJvdykgPT5cclxuICAgICAgdGhpcy5pc1NhbWVSb3cocm93LCBkYXRhKSxcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnB1c2goZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5Yu+6YCJ5aSN6YCJ5qGG5pe25ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3Muc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDoi6XlvZPliY3pq5jkuq7ooYzkuLror6XooYzvvIzliJnlj5bmtojpq5jkuq5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgJiZcclxuICAgICAgICB0aGlzLmlzU2FtZVJvdyh0aGlzLl9zZWxlY3RlZFRhYmxlUm93LCBkYXRhKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOabtOaWsOWFqOmAieeKtuaAgVxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yi35paw5YWo6YCJ54q25oCB77yI55So5LqO5YW25LuW5Zy65pmv77yJXHJcbiAgcmVmcmVzaENoZWNrQWxsU3RhdHVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W6KGM55qE5ZSv5LiA5qCH6K+G77yI55So5LqO6Leo6aG16YCJ5Lit77yJXHJcbiAgcHJpdmF0ZSBnZXRSb3dJZChkYXRhOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIGRhdGEuaWQgPz8gZGF0YS5rZXkgPz8gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yik5pat5Lik6KGM5piv5ZCm5Li65ZCM5LiA6KGMXHJcbiAgcHJpdmF0ZSBpc1NhbWVSb3cocm93MTogYW55LCByb3cyOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlkMSA9IHRoaXMuZ2V0Um93SWQocm93MSk7XHJcbiAgICBjb25zdCBpZDIgPSB0aGlzLmdldFJvd0lkKHJvdzIpO1xyXG5cclxuICAgIGlmIChpZDEgIT09IHVuZGVmaW5lZCAmJiBpZDIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gaWQxID09PSBpZDI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmFsbGJhY2sg5YiwIEpTT04g5q+U6L6DXHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocm93MSkgPT09IEpTT04uc3RyaW5naWZ5KHJvdzIpO1xyXG4gIH1cclxuXHJcbiAgLy8g5riF56m66YCJ5Lit55qE6KGM77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgY2xlYXJTZWxlY3RlZFJvd3MoKSB7XHJcbiAgICAvLyDmuIXnqbrlvZPliY3mlbDmja7mupDkuK3miYDmnInpobnnmoQgY2hlY2tlZCDnirbmgIFcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgIHJvdy5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgdGhpcy5fY2hlY2tlZEFsbCA9IGZhbHNlO1xyXG4gICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGaWVsZENoZWNrQm94Q2hhbmdlKGNoZWNrQm94T3B0aW9uczogT3B0aW9uc1R5cGVbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2V0RmllbGRzVmFsdWUoe1xyXG4gICAgICBba2V5XTogY2hlY2tCb3hPcHRpb25zXHJcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5jaGVja2VkKVxyXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0udmFsdWUpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTZWFyY2goKSB7XHJcbiAgICB0aGlzLl9zYXZlZFNlYXJjaFBhcmFtcyA9IHRoaXMuY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpO1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVJlc2V0Rm9ybSgpIHtcclxuICAgIE9iamVjdC5rZXlzKHRoaXMuX3NlYXJjaFBhcmFtcykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChpdGVtLmZpZWxkUHJvcHM/Lm5hbWUgfHwgaXRlbS5wcm9wKSA9PT0ga2V5O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIOWvueS6jmNoZWNrYm9457G75Z6L77yM6ZyA6KaB54m55q6K5aSE55CG6buY6K6k5YC8XHJcbiAgICAgIGlmICh0YXJnZXRDb2x1bW4/LnZhbHVlVHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XHJcbiAgICAgICAgLy8g5LuO5Y6f5aeLY29sdW1uc+mFjee9ruS4reiOt+WPluWIneWni+mFjee9ru+8jOS7peehruS/neS9v+eUqOato+ehrueahOm7mOiupOWAvFxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiAoaXRlbS5maWVsZFByb3BzPy5uYW1lIHx8IGl0ZW0ucHJvcCkgPT09IGtleTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8g5LuO5Y6f5aeLb3B0aW9uc+S4reaJvuWHumNoZWNrZWTkuLp0cnVl55qE6aG55L2c5Li66buY6K6k5YC8XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxGaWVsZFByb3BzID0gb3JpZ2luYWxDb2x1bW4/LmZpZWxkUHJvcHMgYXNcclxuICAgICAgICAgIHwgQ2hlY2tib3hGaWVsZFByb3BzXHJcbiAgICAgICAgICB8IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBjaGVja2VkVmFsdWVzID0gKG9yaWdpbmFsRmllbGRQcm9wcz8ub3B0aW9ucyB8fCBbXSlcclxuICAgICAgICAgIC5maWx0ZXIoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC5jaGVja2VkKVxyXG4gICAgICAgICAgLm1hcCgob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LnZhbHVlKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxyXG4gICAgICAgICAgY2hlY2tlZFZhbHVlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgID8gY2hlY2tlZFZhbHVlc1xyXG4gICAgICAgICAgICA6IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IGRlZmF1bHRWYWx1ZTtcclxuXHJcbiAgICAgICAgLy8g5qC55o2u6buY6K6k5YC85oGi5aSNb3B0aW9uc+eahGNoZWNrZWTnirbmgIHvvIzkvb/nlKjljp/lp4tvcHRpb25z55qE57uT5p6EXHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlKSA/IGRlZmF1bHRWYWx1ZSA6IFtdO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsT3B0aW9ucyA9IG9yaWdpbmFsRmllbGRQcm9wcz8ub3B0aW9ucyB8fCBbXTtcclxuICAgICAgICBjb25zdCB0YXJnZXRGaWVsZFByb3BzID0gdGFyZ2V0Q29sdW1uLmZpZWxkUHJvcHMgYXMgQ2hlY2tib3hGaWVsZFByb3BzO1xyXG4gICAgICAgIHRhcmdldEZpZWxkUHJvcHMub3B0aW9ucyA9IG9yaWdpbmFsT3B0aW9ucy5tYXAoKGl0ZW06IE9wdGlvbnNUeXBlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICBjaGVja2VkOiBkZWZhdWx0VmFsdWVzLmluY2x1ZGVzKGl0ZW0udmFsdWUpLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IHRhcmdldENvbHVtbj8uZmllbGRQcm9wc1xyXG4gICAgICAgICAgPyB0YXJnZXRDb2x1bW4/LmZpZWxkUHJvcHMudmFsdWUgfHxcclxuICAgICAgICAgICAgUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbdGFyZ2V0Q29sdW1uLnZhbHVlVHlwZV0udmFsdWVcclxuICAgICAgICAgIDogUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbdGFyZ2V0Q29sdW1uLnZhbHVlVHlwZV0udmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3NhdmVkU2VhcmNoUGFyYW1zID0ge307XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSAxO1xyXG4gICAgdGhpcy5vblJlc2V0Rm9ybUJlZm9yZVJlbG9hZC5lbWl0KCk7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQYWdlSW5kZXhDaGFuZ2UocGFnZUluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBhbnkpIHtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplID0gcGFnZVNpemU7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSAxO1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlUXVlcnkoYWZ0ZXJEZWxldGU/OiBib29sZWFuKSB7XHJcbiAgICAvLyDliKDpmaTlkI7liLfmlrDkuJTlvZPliY3pobXku4XliankuIDmnaHorrDlvZXml7bvvIzoi6XkuI3lnKjnrKzkuIDpobXliJnlhYjlm57pgIDkuIDpobVcclxuICAgIGlmIChcclxuICAgICAgYWZ0ZXJEZWxldGUgJiZcclxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpICYmXHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPT09IDEgJiZcclxuICAgICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID4gMVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCAtIDE7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbG9hZGluZyA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5yZXF1ZXN0KSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHtcclxuICAgICAgICAgIHBhcmFtczogdGhpcy5jbGVhckVtcHR5U2VhcmNoUGFyYW1zKCksXHJcbiAgICAgICAgICBwYWdlSW5mbzoge1xyXG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCxcclxuICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIC8vIOWcqOe6v+aOkuW6j+aooeW8j++8muaKiuaOkuW6j+WvueixoeaPkOS6pOe7meaOpeWPo1xyXG4gICAgICAgICAgLi4uKHRoaXMuc29ydE1vZGUgPT09IFwic2VydmVyXCJcclxuICAgICAgICAgICAgPyB7IHNvcnQ6IHRoaXMuYnVpbGRTZXJ2ZXJTb3J0UGF5bG9hZCgpIH1cclxuICAgICAgICAgICAgOiB7fSksXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIOafpeivouWQjum7mOiupOS4jeS/neeVmei3qOmhtemAieS4reeKtuaAge+8muavj+asoei/lOWbnueahOaVsOaNruWdh+WIneWni+WMluS4uuacqumAieS4rVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gKHJlc3VsdC5kYXRhIHx8IFtdKS5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IHJlc3VsdC5kYXRhIHx8IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zdW1tYXJ5RGF0YSA9IHJlc3VsdC5zdW1tYXJ5RGF0YSB8fCBudWxsO1xyXG4gICAgICAgIC8vIOacrOWcsOaOkuW6j+aooeW8j++8muaLv+WIsOaVsOaNruWQjuWcqOWJjeerr+aOkuW6j1xyXG4gICAgICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBcImxvY2FsXCIpIHtcclxuICAgICAgICAgIHRoaXMuc29ydERhdGFTb3VyY2VJblBsYWNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3BhZ2VJbmZvLnRvdGFsID0gcmVzdWx0LnRvdGFsIHx8IDA7XHJcbiAgICAgICAgLy8g5Y+W5raI6Leo6aG15aSa6YCJ77ya5p+l6K+i5ZCO5riF56m66YCJ5Lit54q25oCBXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0NoZWNrYm94KSB7XHJcbiAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0ZWRSb3dzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCLmn6Xor6LlpLHotKU6XCIsIGVycm9yKTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBbXTtcclxuICAgICAgICB0aGlzLl9wYWdlSW5mby50b3RhbCA9IDA7XHJcbiAgICAgICAgdGhpcy5zdW1tYXJ5RGF0YSA9IG51bGw7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgdGhpcy5fbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCLmnKrmj5DkvpsgX3JlcXVlc3Qg5Zue6LCD5Ye95pWwXCIpO1xyXG4gICAgICB0aGlzLl9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDop6blj5HliJfmjpLluo/lj5jmm7RcclxuICBvblNvcnRDaGFuZ2Uoc29ydEtleTogc3RyaW5nLCBzb3J0T3JkZXI6IFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGwpIHtcclxuICAgIC8vIOWNleWIl+aOkuW6j++8mumHjee9ruWFtuWug+WIl++8m+WkmuWIl+aOkuW6j++8muS/neeVmeWFtuWug+WIl1xyXG4gICAgaWYgKCF0aGlzLm11bHRpcGxlU29ydCkge1xyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLl9zb3J0TWFwKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBpZiAoa2V5ICE9PSBzb3J0S2V5KSB0aGlzLl9zb3J0TWFwW2tleV0gPSBudWxsO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NvcnRNYXBbc29ydEtleV0gPSBzb3J0T3JkZXI7XHJcblxyXG4gICAgLy8g57u05oqk5LyY5YWI57qn6Zif5YiX77ya5pyJ5bqP5YiX5LiU6Z2e56m6IC0+IOe9ruS6juacq+Wwvu+8m+S4uuepuiAtPiDnp7vpmaRcclxuICAgIHRoaXMuX3NvcnRQcmlvcml0eSA9IHRoaXMuX3NvcnRQcmlvcml0eS5maWx0ZXIoKGspID0+IGsgIT09IHNvcnRLZXkpO1xyXG4gICAgaWYgKHNvcnRPcmRlcikge1xyXG4gICAgICB0aGlzLl9zb3J0UHJpb3JpdHkucHVzaChzb3J0S2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gXCJsb2NhbFwiKSB7XHJcbiAgICAgIHRoaXMuc29ydERhdGFTb3VyY2VJblBsYWNlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDlnKjnur/mjpLluo/vvJrph43mlrDor7fmsYJcclxuICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U29ydE9yZGVyKHNvcnRLZXk6IHN0cmluZyk6IFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NvcnRNYXBbc29ydEtleV0gfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGhhbmRsZVRhYmxlUm93Q2xpY2soZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIGlmICh0aGlzLnNob3dDaGVja2JveCAmJiAhdGhpcy5pc1Jvd0Rpc2FibGVkKGRhdGEpKSB7XHJcbiAgICAgIC8vIOWFiOa4heepuuaJgOaciemAieS4reihjFxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbXTtcclxuICAgICAgY29uc3QgbmV4dENoZWNrZWQgPSAhdGhpcy5pc1Jvd0NoZWNrZWQoZGF0YSk7XHJcbiAgICAgIHRoaXMudG9nZ2xlUm93Q2hlY2tlZChkYXRhLCBuZXh0Q2hlY2tlZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9uUm93Q2xpY2suZW1pdCh0aGlzLl9zZWxlY3RlZFRhYmxlUm93KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVRhYmxlUm93RGJDbGljayhkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgdGhpcy5vblJvd0RiQ2xpY2suZW1pdCh0aGlzLl9zZWxlY3RlZFRhYmxlUm93KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNvbHVtbnNTZXR0aW5nQ29uZmlybSgpIHtcclxuICAgIHRoaXMucXVlcnlEeW5hbWljQ29sdW1ucygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5aSE55CGIGF1dG9Db21wbGV0ZSDovpPlhaXkuovku7bvvIjluKbpmLLmipbvvIlcclxuICBoYW5kbGVBdXRvQ29tcGxldGVJbnB1dChldmVudDogRXZlbnQsIGNvbHVtbjogUHJvVGFibGVDb2x1bW4pIHtcclxuICAgIGNvbnN0IGZpZWxkS2V5ID0gY29sdW1uLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sdW1uLnByb3A7XHJcblxyXG4gICAgLy8g5aaC5p6c6K+l5a2X5q616L+Y5rKh5pyJ6Ziy5oqW5Ye95pWw77yM5Yib5bu65LiA5LiqXHJcbiAgICBpZiAoIXRoaXMuX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwLmhhcyhmaWVsZEtleSkpIHtcclxuICAgICAgY29uc3QgZGVib3VuY2VkRm4gPSBkZWJvdW5jZSgoZXZ0OiBFdmVudCkgPT4ge1xyXG4gICAgICAgIC8vIOmHjeaWsOafpeaJvuWvueW6lOeahCBjb2x1bW7vvIznoa7kv53kvb/nlKjmnIDmlrDnmoTphY3nva5cclxuICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zLmZpbmQoXHJcbiAgICAgICAgICAoY29sKSA9PiAoY29sLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sLnByb3ApID09PSBmaWVsZEtleSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChjdXJyZW50Q29sdW1uKSB7XHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVBdXRvQ29tcGxldGVEYXRhU291cmNlKGV2dCwgY3VycmVudENvbHVtbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAzMDApOyAvLyAzMDBtcyDpmLLmipblu7bov59cclxuICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGVib3VuY2VNYXAuc2V0KGZpZWxkS2V5LCBkZWJvdW5jZWRGbik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6LCD55So6Ziy5oqW5Ye95pWwXHJcbiAgICBjb25zdCBkZWJvdW5jZWRGbiA9IHRoaXMuX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwLmdldChmaWVsZEtleSk7XHJcbiAgICBpZiAoZGVib3VuY2VkRm4pIHtcclxuICAgICAgZGVib3VuY2VkRm4oZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+WIGF1dG9Db21wbGV0ZSDnmoTmlbDmja7mupBcclxuICBnZXRBdXRvQ29tcGxldGVEYXRhU291cmNlKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBhbnlbXSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSB8fCBbXTtcclxuICB9XHJcblxyXG4gIGdldEZpZWxkUHJvcHMoY29sdW1uOiBQcm9UYWJsZUNvbHVtbik6IGFueSB7XHJcbiAgICByZXR1cm4gY29sdW1uLmZpZWxkUHJvcHM7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bmjIflrprlkI3np7DnmoRsYWJlbOaooeadv1xyXG4gIGdldExhYmVsVGVtcGxhdGUobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xyXG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbVRlbXBsYXRlcy5nZXQobmFtZSkgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPliBmb3JtLWl0ZW0g55qE5Yqo5oCB57G75ZCNXHJcbiAgZ2V0Rm9ybUl0ZW1DbGFzc05hbWUoY29sdW1uOiBQcm9UYWJsZUNvbHVtbik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmaWVsZE5hbWUgPSB0aGlzLmdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgcmV0dXJuIGBwcm8tdGFibGUtJHtmaWVsZE5hbWV9LWZvcm0taXRlbWA7XHJcbiAgfVxyXG59XHJcbiIsIjxhcHAtcGFnZS1jb250YWluZXJcclxuICBbdGl0bGVdPVwidGl0bGVcIlxyXG4gIFtzaG93SGVhZGVyXT1cInNob3dTZWFyY2hCYXJcIlxyXG4gIG5nQ2xhc3M9XCJwcm8tdGFibGUtY29udGFpbmVyXCJcclxuPlxyXG4gIDxuZy10ZW1wbGF0ZSAjaGVhZGVyPlxyXG4gICAgPGFwcC10YWJsZS1zZWFyY2gtYmFyXHJcbiAgICAgICpuZ0lmPVwic2hvd1NlYXJjaEJhclwiXHJcbiAgICAgIFtsYWJlbFdpZHRoXT1cImxhYmVsV2lkdGhcIlxyXG4gICAgICBbbGFiZWxBbGlnbl09XCJsYWJlbEFsaWduXCJcclxuICAgICAgW2Zvcm1JdGVtV2lkdGhdPVwiZm9ybUl0ZW1XaWR0aFwiXHJcbiAgICA+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjbGVmdENvbnRlbnQ+XHJcbiAgICAgICAgPG56LWZvcm0taXRlbVxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBfc2VhcmNoRmlsZWRDb2x1bW5zXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldEZvcm1JdGVtQ2xhc3NOYW1lKGNvbHVtbilcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxuei1mb3JtLWxhYmVsICpuZ0lmPVwiIWdldEZpZWxkUHJvcHMoY29sdW1uKS5oaWRlTGFiZWxcIiBuek5vQ29sb24+XHJcbiAgICAgICAgICAgIDwhLS0g5qOA5p+l5piv5ZCm5pyJ6Ieq5a6a5LmJbGFiZWzmqKHmnb8gLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgY29sdW1uLmN1c3RvbUxhYmVsUmVuZGVyICYmXHJcbiAgICAgICAgICAgICAgICAgIGdldExhYmVsVGVtcGxhdGUoY29sdW1uLmN1c3RvbUxhYmVsUmVuZGVyKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgZGVmYXVsdExhYmVsXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldExhYmVsVGVtcGxhdGUoY29sdW1uLmN1c3RvbUxhYmVsUmVuZGVyKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNvbHVtbixcclxuICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXHJcbiAgICAgICAgICAgICAgICAgIGZpZWxkUHJvcHM6IGdldEZpZWxkUHJvcHMoY29sdW1uKVxyXG4gICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TGFiZWw+XHJcbiAgICAgICAgICAgICAge3sgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmxhYmVsIHx8IGNvbHVtbi50aXRsZSB9fVxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWxhYmVsPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdpbnB1dCdcIj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgbnotaW5wdXRcclxuICAgICAgICAgICAgICBbbmFtZV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcFwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdpbnB1dFBsYXRlJ1wiPlxyXG4gICAgICAgICAgICA8YXBwLXBsYXRlLWlucHV0XHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID48L2FwcC1wbGF0ZS1pbnB1dD5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdzZWxlY3QnXCI+XHJcbiAgICAgICAgICAgIDxuei1zZWxlY3RcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtuekFsbG93Q2xlYXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmFsbG93Q2xlYXJcIlxyXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcIlxyXG4gICAgICAgICAgICAgIFtuek9wdGlvbnNdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9uei1zZWxlY3Q+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnc2VsZWN0TXVsdGlwbGUnXCI+XHJcbiAgICAgICAgICAgIDxuei1zZWxlY3RcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtuekFsbG93Q2xlYXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmFsbG93Q2xlYXJcIlxyXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcIlxyXG4gICAgICAgICAgICAgIFtuek9wdGlvbnNdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgbnpNb2RlPVwibXVsdGlwbGVcIlxyXG4gICAgICAgICAgICAgIFtuek1heFRhZ0NvdW50XT1cIjJcIlxyXG4gICAgICAgICAgICAgIFtuek1heFRhZ1BsYWNlaG9sZGVyXT1cIm56TWF4VGFnUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtuekN1c3RvbVRlbXBsYXRlXT1cImRlZmF1bHRUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI256TWF4VGFnUGxhY2Vob2xkZXI+XHJcbiAgICAgICAgICAgICAgICArXHJcbiAgICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgICAgICAgID8ubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGVtcGxhdGUgbGV0LXNlbGVjdGVkPlxyXG4gICAgICAgICAgICAgICAge3sgc2VsZWN0ZWQubnpMYWJlbC5sZW5ndGggPiA0ID8gc2VsZWN0ZWQubnpMYWJlbC5zdWJzdHJpbmcoMCwgNCkgKyAnLi4uJyA6IHNlbGVjdGVkLm56TGFiZWwgfX1cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L256LXNlbGVjdD5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgICA8bnotZGF0ZS1waWNrZXJcclxuICAgICAgICAgICAgICBbbnpTaG93VGltZV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuc2hvd1RpbWVcIlxyXG4gICAgICAgICAgICAgIFtuekZvcm1hdF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZm9ybWF0XCJcclxuICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtuekFsbG93Q2xlYXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmFsbG93Q2xlYXJcIlxyXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbbnpNb2RlXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5tb2RlXCJcclxuICAgICAgICAgICAgPjwvbnotZGF0ZS1waWNrZXI+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnY2hlY2tib3gnXCI+XHJcbiAgICAgICAgICAgIDxuei1jaGVja2JveC1ncm91cFxyXG4gICAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAgIGdldEZpZWxkUHJvcHMoY29sdW1uKS5ub1N0eWxlXHJcbiAgICAgICAgICAgICAgICAgID8gJ3Byby10YWJsZS1jaGVja2JveGdyb3VwLW5vc3R5bGUnXHJcbiAgICAgICAgICAgICAgICAgIDogJydcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXHJcbiAgICAgICAgICAgICAgICBoYW5kbGVGaWVsZENoZWNrQm94Q2hhbmdlKFxyXG4gICAgICAgICAgICAgICAgICAkZXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgIGdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvbnotY2hlY2tib3gtZ3JvdXA+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnYXV0b0NvbXBsZXRlJ1wiPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBuei1pbnB1dFxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKT8ubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJoYW5kbGVBdXRvQ29tcGxldGVJbnB1dCgkZXZlbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgIFtuekF1dG9jb21wbGV0ZV09XCJhdXRvXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pPy5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKT8ucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bnotYXV0b2NvbXBsZXRlXHJcbiAgICAgICAgICAgICAgW256QmFja2ZpbGxdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmJhY2tGaWxsXCJcclxuICAgICAgICAgICAgICBbbnpEZWZhdWx0QWN0aXZlRmlyc3RPcHRpb25dPVwiXHJcbiAgICAgICAgICAgICAgICBnZXRGaWVsZFByb3BzKGNvbHVtbikuZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbbnpXaWR0aF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikud2lkdGhcIlxyXG4gICAgICAgICAgICAgICNhdXRvXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bnotYXV0by1vcHRpb25cclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZ2V0QXV0b0NvbXBsZXRlRGF0YVNvdXJjZShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgIFtuelZhbHVlXT1cIlxyXG4gICAgICAgICAgICAgICAgICBnZXRGaWVsZFByb3BzKGNvbHVtbikucmV0dXJuRnVsbERhdGEgPyBvcHRpb24gOiBvcHRpb24udmFsdWVcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbbnpMYWJlbF09XCJvcHRpb24ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBvcHRpb24ubGFiZWwgfX1cclxuICAgICAgICAgICAgICA8L256LWF1dG8tb3B0aW9uPlxyXG4gICAgICAgICAgICA8L256LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdjdXN0b20nXCI+XHJcbiAgICAgICAgICAgIDxhcHAtZHluYW1pYy1zZWFyY2gtZmllbGRcclxuICAgICAgICAgICAgICBbY29tcG9uZW50XT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5jb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVwiXHJcbiAgICAgICAgICAgICAgW3Byb3BzXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIlxyXG4gICAgICAgICAgICAgICAgc2V0RmllbGRWYWx1ZShnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcCwgJGV2ZW50KVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID48L2FwcC1keW5hbWljLXNlYXJjaC1maWVsZD5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdpbnB1dE51bWJlcidcIj5cclxuICAgICAgICAgICAgPG56LWlucHV0LW51bWJlclxyXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInMTAwJSdcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFtuekZvcm1hdHRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZm9ybWF0dGVyUGVyY2VudFwiXHJcbiAgICAgICAgICAgICAgW256UGFyc2VyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5wYXJzZXJQZXJjZW50XCJcclxuICAgICAgICAgICAgPjwvbnotaW5wdXQtbnVtYmVyPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjYWN0aW9uVGV4dEJ0bj5cclxuICAgICAgICA8bnotc3BhY2UgW256U2l6ZV09XCI0XCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgbnpTcGFjZUl0ZW0gKm5nSWY9XCJzaG93U2VhcmNoQnRuXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbnotYnV0dG9uIG56VHlwZT1cInByaW1hcnlcIiAoY2xpY2spPVwiaGFuZGxlU2VhcmNoKClcIj5cclxuICAgICAgICAgICAgICB7eyBjb25maXJtQnRuVGV4dCB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgbnpTcGFjZUl0ZW0gKm5nSWY9XCJzaG93Q2xlYXJCdG5cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gKGNsaWNrKT1cImhhbmRsZVJlc2V0Rm9ybSgpXCI+XHJcbiAgICAgICAgICAgICAge3sgY2xlYXJCdG5UZXh0IH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L256LXNwYWNlPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2FjdGlvbkltZ0J0bj5cclxuICAgICAgICA8bnotc3BhY2U+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW1nQWN0aW9uQmFyVHBsXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgbnpTcGFjZUl0ZW0gY2xhc3M9XCJzZXR0aW5nLXNwYWNlLWl0ZW1cIiAqbmdJZj1cInNob3dDb2x1bW5TZXR0aW5nXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIG56LXRvb2x0aXAgbnpUb29sdGlwVGl0bGU9XCLorr7nva7lrZfmrrVcIj5cclxuICAgICAgICAgICAgICA8YXBwLWNvbG11bnMtc2V0dGluZ1xyXG4gICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRDb2x1bW5zXT1cIl9zZXJ2ZXJDb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgIFt0YWJsZU5hbWVdPVwidGFibGVOYW1lXCJcclxuICAgICAgICAgICAgICAgIChhZnRlckNvbmZpcm0pPVwiaGFuZGxlQ29sdW1uc1NldHRpbmdDb25maXJtKClcIlxyXG4gICAgICAgICAgICAgID48L2FwcC1jb2xtdW5zLXNldHRpbmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uei1zcGFjZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvYXBwLXRhYmxlLXNlYXJjaC1iYXI+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNib2R5PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dBY3Rpb25CYXJcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQmFyVHBsXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tVGFibGVSZW5kZXJcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRhYmxlUmVuZGVyXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuei10YWJsZVxyXG4gICAgICAqbmdJZj1cIiFjdXN0b21UYWJsZVJlbmRlciAmJiBfc2hvd1RhYmxlICYmIF9jb2x1bW5zUmVhZHlcIlxyXG4gICAgICAjZHluYW1pY1RhYmxlXHJcbiAgICAgIG56U2l6ZT1cInNtYWxsXCJcclxuICAgICAgbnpTaG93U2l6ZUNoYW5nZXJcclxuICAgICAgW256Qm9yZGVyZWRdPVwiYm9yZGVyZWRcIlxyXG4gICAgICBbbnpPdXRlckJvcmRlcmVkXT1cIm91dGVyQm9yZGVyZWRcIlxyXG4gICAgICBbbnpEYXRhXT1cImRhdGFTb3VyY2VcIlxyXG4gICAgICBbbnpQYWdlSW5kZXhdPVwiX3BhZ2VJbmZvLnBhZ2VJbmRleFwiXHJcbiAgICAgIFtuelBhZ2VTaXplXT1cIl9wYWdlSW5mby5wYWdlU2l6ZVwiXHJcbiAgICAgIFtuelRvdGFsXT1cIl9wYWdlSW5mby50b3RhbFwiXHJcbiAgICAgIFtuelBhZ2VTaXplT3B0aW9uc109XCJfcGFnZUluZm8ucGFnZVNpemVPcHRpb25zXCJcclxuICAgICAgW256U2hvd1BhZ2luYXRpb25dPVwic2hvd1BhZ2luYXRpb25cIlxyXG4gICAgICBbbnpTaG93VG90YWxdPVwidG90YWxUZW1wbGF0ZVwiXHJcbiAgICAgIFtuekxvYWRpbmddPVwiX2xvYWRpbmdcIlxyXG4gICAgICBbbnpGcm9udFBhZ2luYXRpb25dPVwiZnJvbnRQYWdpbmF0aW9uXCJcclxuICAgICAgW256U2Nyb2xsXT1cInNjcm9sbFwiXHJcbiAgICAgIChuelBhZ2VJbmRleENoYW5nZSk9XCJoYW5kbGVQYWdlSW5kZXhDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgIChuelBhZ2VTaXplQ2hhbmdlKT1cImhhbmRsZVBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxyXG4gICAgPlxyXG4gICAgICA8dGhlYWQ+XHJcbiAgICAgICAgPHRyPlxyXG4gICAgICAgICAgPCEtLSDlpI3pgInmoYbliJfvvIjlvZMgc2hvd0NoZWNrYm94PXRydWUg5pe25pi+56S677yJIC0tPlxyXG4gICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0NoZWNrYm94XCJcclxuICAgICAgICAgICAgW256V2lkdGhdPVwiJzUwcHgnXCJcclxuICAgICAgICAgICAgW256QWxpZ25dPVwiJ2NlbnRlcidcIlxyXG4gICAgICAgICAgICBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlclwiXHJcbiAgICAgICAgICAgIFsobnpDaGVja2VkKV09XCJfY2hlY2tlZEFsbFwiXHJcbiAgICAgICAgICAgIFtuekluZGV0ZXJtaW5hdGVdPVwiX2luZGV0ZXJtaW5hdGVcIlxyXG4gICAgICAgICAgICAobnpDaGVja2VkQ2hhbmdlKT1cInRvZ2dsZUNoZWNrQWxsKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgID48L3RoPlxyXG4gICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgX2NvbHVtbnNcIlxyXG4gICAgICAgICAgICBbbnpXaWR0aF09XCJjb2x1bW4ud2lkdGhcIlxyXG4gICAgICAgICAgICBbbnpBbGlnbl09XCJjb2x1bW4uYWxpZ25cIlxyXG4gICAgICAgICAgICBbbnpMZWZ0XT1cImNvbHVtbi5maXhlZExlZnRcIlxyXG4gICAgICAgICAgICBbbnpSaWdodF09XCJjb2x1bW4uZml4ZWRSaWdodFwiXHJcbiAgICAgICAgICAgIFtuelNob3dTb3J0XT1cIiEhY29sdW1uLnNvcnRlclwiXHJcbiAgICAgICAgICAgIFtuelNvcnRPcmRlcl09XCJnZXRTb3J0T3JkZXIoY29sdW1uLnByb3ApXCJcclxuICAgICAgICAgICAgKG56U29ydE9yZGVyQ2hhbmdlKT1cIm9uU29ydENoYW5nZShjb2x1bW4ucHJvcCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGNvbHVtbi50aXRsZSB9fVxyXG4gICAgICAgICAgPC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L3RoZWFkPlxyXG5cclxuICAgICAgPHRib2R5PlxyXG4gICAgICAgIDx0clxyXG4gICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGRhdGE7IGxldCBpID0gaW5kZXg7IG9mOiBkeW5hbWljVGFibGUuZGF0YVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICdhbnQtdGFibGUtY3VzdG9tLXJvdy1zZWxlY3RlZCc6ICEhZ2V0VGFibGVSb3dDaGVja2VkKGRhdGEpLFxyXG4gICAgICAgICAgICAnYW50LXRhYmxlLWN1c3RvbS1yb3ctZXZlbic6IGkgJSAyID09PSAwLFxyXG4gICAgICAgICAgICAnYW50LXRhYmxlLWN1c3RvbS1yb3ctb2RkJzogaSAlIDIgIT09IDBcclxuICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZVRhYmxlUm93Q2xpY2soZGF0YSlcIlxyXG4gICAgICAgICAgKGRibGNsaWNrKT1cImhhbmRsZVRhYmxlUm93RGJDbGljayhkYXRhKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPCEtLSDlpI3pgInmoYbliJfvvIjlvZMgc2hvd0NoZWNrYm94PXRydWUg5pe25pi+56S677yJIC0tPlxyXG4gICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0NoZWNrYm94XCJcclxuICAgICAgICAgICAgW256QWxpZ25dPVwiJ2NlbnRlcidcIlxyXG4gICAgICAgICAgICBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgd2lkdGg6IDUwcHhcIlxyXG4gICAgICAgICAgICBbKG56Q2hlY2tlZCldPVwiZGF0YS5jaGVja2VkXCJcclxuICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiaXNSb3dEaXNhYmxlZChkYXRhKVwiXHJcbiAgICAgICAgICAgIChuekNoZWNrZWRDaGFuZ2UpPVwiaGFuZGxlUm93Q2hlY2tlZENoYW5nZShkYXRhLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICA+PC90ZD5cclxuICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIF9jb2x1bW5zXCJcclxuICAgICAgICAgICAgW256TGVmdF09XCJjb2x1bW4uZml4ZWRMZWZ0XCJcclxuICAgICAgICAgICAgW256UmlnaHRdPVwiY29sdW1uLmZpeGVkUmlnaHRcIlxyXG4gICAgICAgICAgICBbbnpBbGlnbl09XCJjb2x1bW4uYWxpZ25cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgJ3Byby1ub3dyYXAnOiB0cnVlXHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8IS0tIOajgOafpeaYr+WQpuacieiHquWumuS5ieaooeadvyAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICBjb2x1bW4uY3VzdG9tUmVuZGVyICYmIGdldFRlbXBsYXRlKGNvbHVtbi5jdXN0b21SZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcclxuICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcclxuICAgICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvOiBfcGFnZUluZm9cclxuICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0g6buY6K6k5riy5p+T6YC76L6RIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhY29sdW1uLmN1c3RvbVJlbmRlciB8fCAhZ2V0VGVtcGxhdGUoY29sdW1uLmN1c3RvbVJlbmRlcilcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5lbGxpcHNpc1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInByby1lbGxpcHNpc1wiXHJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJkYXRhW2NvbHVtbi5wcm9wXVwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogJ2NhbGMoJyArIGNvbHVtbi53aWR0aCArICcgLSAyNXB4KSdcclxuICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGRhdGFbY29sdW1uLnByb3BdIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbi5lbGxpcHNpc1wiPlxyXG4gICAgICAgICAgICAgICAge3sgZGF0YVtjb2x1bW4ucHJvcF0gfX1cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgICAgPHRyICpuZ0lmPVwic3VtbWFyeURhdGEgJiYgX3BhZ2VJbmZvLnRvdGFsID4gMFwiPlxyXG4gICAgICAgICAgPCEtLSDmsYfmgLvooYznmoTlpI3pgInmoYbliJfvvIjlvZMgc2hvd0NoZWNrYm94PXRydWUg5pe25pi+56S677yM5L2G5Li656m677yJIC0tPlxyXG4gICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0NoZWNrYm94XCJcclxuICAgICAgICAgICAgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2U4ZThlOFwiXHJcbiAgICAgICAgICA+PC90ZD5cclxuICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uOyBsZXQgaSA9IGluZGV4OyBvZjogX2NvbHVtbnNcIlxyXG4gICAgICAgICAgICBbbnpMZWZ0XT1cImNvbHVtbi5maXhlZExlZnRcIlxyXG4gICAgICAgICAgICBbbnpSaWdodF09XCJjb2x1bW4uZml4ZWRSaWdodFwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlOGU4ZThcIlxyXG4gICAgICAgICAgICBbbnpBbGlnbl09XCJjb2x1bW4uYWxpZ25cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImkgPT09IDBcIj7mgLvorqE8L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpICE9PSAwICYmIGNvbHVtbi5zdW1tYXJ5XCI+XHJcbiAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgIGNvbHVtbi5zdW1tYXJ5Py5mb3JtYXRcclxuICAgICAgICAgICAgICAgICAgPyBjb2x1bW4uc3VtbWFyeT8uZm9ybWF0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeURhdGFbY29sdW1uLnN1bW1hcnk/Lm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICA6IHN1bW1hcnlEYXRhW2NvbHVtbi5zdW1tYXJ5Py5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L3Rib2R5PlxyXG4gICAgICA8bmctdGVtcGxhdGUgI3RvdGFsVGVtcGxhdGUgbGV0LXRvdGFsXHJcbiAgICAgICAgPuWFsSB7eyBfcGFnZUluZm8udG90YWwgfX0g5p2h6K6w5b2VPC9uZy10ZW1wbGF0ZVxyXG4gICAgICA+XHJcbiAgICA8L256LXRhYmxlPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvYXBwLXBhZ2UtY29udGFpbmVyPlxyXG4iXX0=