@pepperi-addons/ngx-composite-lib 0.0.16-loader.2 → 0.4.0-angular14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/color-settings/color-settings.component.d.ts +25 -25
  2. package/color-settings/color-settings.model.d.ts +5 -5
  3. package/color-settings/color-settings.module.d.ts +12 -12
  4. package/color-settings/{pepperi-addons-ngx-composite-lib-color-settings.d.ts → index.d.ts} +5 -5
  5. package/color-settings/public-api.d.ts +3 -3
  6. package/core/common/directives/index.d.ts +1 -1
  7. package/core/common/directives/public-api.d.ts +1 -1
  8. package/core/common/directives/reset-configuration-field.directive.d.ts +39 -39
  9. package/core/common/index.d.ts +1 -1
  10. package/core/common/public-api.d.ts +2 -2
  11. package/core/common/services/dimx.service.d.ts +32 -32
  12. package/core/common/services/index.d.ts +1 -1
  13. package/core/common/services/public-api.d.ts +2 -2
  14. package/core/common/services/utilities.service.d.ts +6 -6
  15. package/core/index.d.ts +1 -1
  16. package/core/public-api.d.ts +1 -1
  17. package/data-view-builder/data-view-builder.component.d.ts +35 -35
  18. package/data-view-builder/data-view-builder.model.d.ts +1 -1
  19. package/data-view-builder/data-view-builder.module.d.ts +23 -23
  20. package/data-view-builder/data-view-builder.service.d.ts +14 -14
  21. package/data-view-builder/{pepperi-addons-ngx-composite-lib-data-view-builder.d.ts → index.d.ts} +5 -5
  22. package/data-view-builder/menu-data-view/menu-data-view.component.d.ts +36 -36
  23. package/data-view-builder/public-api.d.ts +3 -3
  24. package/{esm2015/color-settings/color-settings.component.js → esm2020/color-settings/color-settings.component.mjs} +87 -91
  25. package/{esm2015/color-settings/color-settings.model.js → esm2020/color-settings/color-settings.model.mjs} +8 -8
  26. package/{esm2015/color-settings/color-settings.module.js → esm2020/color-settings/color-settings.module.mjs} +38 -40
  27. package/{esm2015/color-settings/pepperi-addons-ngx-composite-lib-color-settings.js → esm2020/color-settings/pepperi-addons-ngx-composite-lib-color-settings.mjs} +4 -4
  28. package/{esm2015/color-settings/public-api.js → esm2020/color-settings/public-api.mjs} +6 -6
  29. package/{esm2015/core/common/directives/index.js → esm2020/core/common/directives/index.mjs} +4 -4
  30. package/{esm2015/core/common/directives/public-api.js → esm2020/core/common/directives/public-api.mjs} +4 -4
  31. package/esm2020/core/common/directives/reset-configuration-field.directive.mjs +153 -0
  32. package/{esm2015/core/common/index.js → esm2020/core/common/index.mjs} +4 -4
  33. package/{esm2015/core/common/public-api.js → esm2020/core/common/public-api.mjs} +5 -5
  34. package/esm2020/core/common/services/dimx.service.mjs +48 -0
  35. package/{esm2015/core/common/services/index.js → esm2020/core/common/services/index.mjs} +4 -4
  36. package/{esm2015/core/common/services/public-api.js → esm2020/core/common/services/public-api.mjs} +5 -5
  37. package/{esm2015/core/common/services/utilities.service.js → esm2020/core/common/services/utilities.service.mjs} +18 -18
  38. package/{esm2015/core/index.js → esm2020/core/index.mjs} +4 -4
  39. package/{esm2015/core/public-api.js → esm2020/core/public-api.mjs} +4 -4
  40. package/esm2020/data-view-builder/data-view-builder.component.mjs +117 -0
  41. package/{esm2015/data-view-builder/data-view-builder.model.js → esm2020/data-view-builder/data-view-builder.model.mjs} +1 -1
  42. package/{esm2015/data-view-builder/data-view-builder.module.js → esm2020/data-view-builder/data-view-builder.module.mjs} +80 -82
  43. package/{esm2015/data-view-builder/data-view-builder.service.js → esm2020/data-view-builder/data-view-builder.service.mjs} +38 -38
  44. package/esm2020/data-view-builder/menu-data-view/menu-data-view.component.mjs +117 -0
  45. package/{esm2015/data-view-builder/pepperi-addons-ngx-composite-lib-data-view-builder.js → esm2020/data-view-builder/pepperi-addons-ngx-composite-lib-data-view-builder.mjs} +4 -4
  46. package/{esm2015/data-view-builder/public-api.js → esm2020/data-view-builder/public-api.mjs} +6 -6
  47. package/esm2020/file-status-panel/file-status-panel.component.mjs +35 -0
  48. package/{esm2015/file-status-panel/file-status-panel.model.js → esm2020/file-status-panel/file-status-panel.model.mjs} +8 -8
  49. package/{esm2015/file-status-panel/file-status-panel.module.js → esm2020/file-status-panel/file-status-panel.module.mjs} +54 -56
  50. package/{esm2015/file-status-panel/pepperi-addons-ngx-composite-lib-file-status-panel.js → esm2020/file-status-panel/pepperi-addons-ngx-composite-lib-file-status-panel.mjs} +4 -4
  51. package/{esm2015/file-status-panel/public-api.js → esm2020/file-status-panel/public-api.mjs} +6 -6
  52. package/esm2020/generic-form/generic-form.component.mjs +184 -0
  53. package/{esm2015/generic-form/generic-form.model.js → esm2020/generic-form/generic-form.model.mjs} +1 -1
  54. package/{esm2015/generic-form/generic-form.module.js → esm2020/generic-form/generic-form.module.mjs} +68 -74
  55. package/{esm2015/generic-form/generic-form.service.js → esm2020/generic-form/generic-form.service.mjs} +67 -67
  56. package/{esm2015/generic-form/pepperi-addons-ngx-composite-lib-generic-form.js → esm2020/generic-form/pepperi-addons-ngx-composite-lib-generic-form.mjs} +4 -4
  57. package/{esm2015/generic-form/public-api.js → esm2020/generic-form/public-api.mjs} +7 -7
  58. package/esm2020/generic-list/generic-list.component.mjs +425 -0
  59. package/{esm2015/generic-list/generic-list.model.js → esm2020/generic-list/generic-list.model.mjs} +1 -1
  60. package/{esm2015/generic-list/generic-list.module.js → esm2020/generic-list/generic-list.module.mjs} +70 -72
  61. package/esm2020/generic-list/generic-list.service.mjs +125 -0
  62. package/{esm2015/generic-list/pepperi-addons-ngx-composite-lib-generic-list.js → esm2020/generic-list/pepperi-addons-ngx-composite-lib-generic-list.mjs} +4 -4
  63. package/{esm2015/generic-list/public-api.js → esm2020/generic-list/public-api.mjs} +7 -7
  64. package/esm2020/group-buttons-settings/group-buttons-settings.component.mjs +130 -0
  65. package/{esm2015/group-buttons-settings/group-buttons-settings.model.js → esm2020/group-buttons-settings/group-buttons-settings.model.mjs} +1 -1
  66. package/{esm2015/group-buttons-settings/group-buttons-settings.module.js → esm2020/group-buttons-settings/group-buttons-settings.module.mjs} +48 -50
  67. package/{esm2015/group-buttons-settings/pepperi-addons-ngx-composite-lib-group-buttons-settings.js → esm2020/group-buttons-settings/pepperi-addons-ngx-composite-lib-group-buttons-settings.mjs} +4 -4
  68. package/{esm2015/group-buttons-settings/public-api.js → esm2020/group-buttons-settings/public-api.mjs} +6 -6
  69. package/{esm2015/ngx-composite-lib.module.js → esm2020/ngx-composite-lib.module.mjs} +54 -56
  70. package/{esm2015/pepperi-addons-ngx-composite-lib.js → esm2020/pepperi-addons-ngx-composite-lib.mjs} +4 -4
  71. package/{esm2015/public-api.js → esm2020/public-api.mjs} +5 -5
  72. package/{esm2015/shadow-settings/pepperi-addons-ngx-composite-lib-shadow-settings.js → esm2020/shadow-settings/pepperi-addons-ngx-composite-lib-shadow-settings.mjs} +4 -4
  73. package/{esm2015/shadow-settings/public-api.js → esm2020/shadow-settings/public-api.mjs} +6 -6
  74. package/{esm2015/shadow-settings/shadow-settings.component.js → esm2020/shadow-settings/shadow-settings.component.mjs} +69 -73
  75. package/{esm2015/shadow-settings/shadow-settings.model.js → esm2020/shadow-settings/shadow-settings.model.mjs} +7 -7
  76. package/{esm2015/shadow-settings/shadow-settings.module.js → esm2020/shadow-settings/shadow-settings.module.mjs} +42 -44
  77. package/fesm2015/{pepperi-addons-ngx-composite-lib-color-settings.js → pepperi-addons-ngx-composite-lib-color-settings.mjs} +117 -123
  78. package/fesm2015/pepperi-addons-ngx-composite-lib-color-settings.mjs.map +1 -0
  79. package/fesm2015/pepperi-addons-ngx-composite-lib-data-view-builder.mjs +350 -0
  80. package/fesm2015/pepperi-addons-ngx-composite-lib-data-view-builder.mjs.map +1 -0
  81. package/fesm2015/pepperi-addons-ngx-composite-lib-file-status-panel.mjs +107 -0
  82. package/fesm2015/pepperi-addons-ngx-composite-lib-file-status-panel.mjs.map +1 -0
  83. package/fesm2015/{pepperi-addons-ngx-composite-lib-generic-form.js → pepperi-addons-ngx-composite-lib-generic-form.mjs} +295 -305
  84. package/fesm2015/pepperi-addons-ngx-composite-lib-generic-form.mjs.map +1 -0
  85. package/fesm2015/{pepperi-addons-ngx-composite-lib-generic-list.js → pepperi-addons-ngx-composite-lib-generic-list.mjs} +605 -604
  86. package/fesm2015/pepperi-addons-ngx-composite-lib-generic-list.mjs.map +1 -0
  87. package/fesm2015/{pepperi-addons-ngx-composite-lib-group-buttons-settings.js → pepperi-addons-ngx-composite-lib-group-buttons-settings.mjs} +168 -174
  88. package/fesm2015/pepperi-addons-ngx-composite-lib-group-buttons-settings.mjs.map +1 -0
  89. package/fesm2015/{pepperi-addons-ngx-composite-lib-shadow-settings.js → pepperi-addons-ngx-composite-lib-shadow-settings.mjs} +102 -108
  90. package/fesm2015/pepperi-addons-ngx-composite-lib-shadow-settings.mjs.map +1 -0
  91. package/fesm2015/{pepperi-addons-ngx-composite-lib.js → pepperi-addons-ngx-composite-lib.mjs} +254 -256
  92. package/fesm2015/pepperi-addons-ngx-composite-lib.mjs.map +1 -0
  93. package/fesm2020/pepperi-addons-ngx-composite-lib-color-settings.mjs +141 -0
  94. package/fesm2020/pepperi-addons-ngx-composite-lib-color-settings.mjs.map +1 -0
  95. package/fesm2020/pepperi-addons-ngx-composite-lib-data-view-builder.mjs +348 -0
  96. package/fesm2020/pepperi-addons-ngx-composite-lib-data-view-builder.mjs.map +1 -0
  97. package/{fesm2015/pepperi-addons-ngx-composite-lib-file-status-panel.js → fesm2020/pepperi-addons-ngx-composite-lib-file-status-panel.mjs} +82 -88
  98. package/fesm2020/pepperi-addons-ngx-composite-lib-file-status-panel.mjs.map +1 -0
  99. package/fesm2020/pepperi-addons-ngx-composite-lib-generic-form.mjs +315 -0
  100. package/fesm2020/pepperi-addons-ngx-composite-lib-generic-form.mjs.map +1 -0
  101. package/fesm2020/pepperi-addons-ngx-composite-lib-generic-list.mjs +619 -0
  102. package/fesm2020/pepperi-addons-ngx-composite-lib-generic-list.mjs.map +1 -0
  103. package/fesm2020/pepperi-addons-ngx-composite-lib-group-buttons-settings.mjs +186 -0
  104. package/fesm2020/pepperi-addons-ngx-composite-lib-group-buttons-settings.mjs.map +1 -0
  105. package/fesm2020/pepperi-addons-ngx-composite-lib-shadow-settings.mjs +126 -0
  106. package/fesm2020/pepperi-addons-ngx-composite-lib-shadow-settings.mjs.map +1 -0
  107. package/fesm2020/pepperi-addons-ngx-composite-lib.mjs +304 -0
  108. package/fesm2020/pepperi-addons-ngx-composite-lib.mjs.map +1 -0
  109. package/file-status-panel/file-status-panel.component.d.ts +14 -14
  110. package/file-status-panel/file-status-panel.model.d.ts +7 -7
  111. package/file-status-panel/file-status-panel.module.d.ts +17 -17
  112. package/file-status-panel/{pepperi-addons-ngx-composite-lib-file-status-panel.d.ts → index.d.ts} +5 -5
  113. package/file-status-panel/public-api.d.ts +3 -3
  114. package/generic-form/generic-form.component.d.ts +46 -46
  115. package/generic-form/generic-form.model.d.ts +34 -34
  116. package/generic-form/generic-form.module.d.ts +13 -13
  117. package/generic-form/generic-form.service.d.ts +16 -16
  118. package/generic-form/index.d.ts +5 -1
  119. package/generic-form/public-api.d.ts +4 -4
  120. package/generic-list/generic-list.component.d.ts +101 -101
  121. package/generic-list/generic-list.model.d.ts +54 -54
  122. package/generic-list/generic-list.module.d.ts +18 -18
  123. package/generic-list/generic-list.service.d.ts +43 -43
  124. package/generic-list/{pepperi-addons-ngx-composite-lib-generic-list.d.ts → index.d.ts} +5 -5
  125. package/generic-list/public-api.d.ts +4 -4
  126. package/group-buttons-settings/group-buttons-settings.component.d.ts +33 -33
  127. package/group-buttons-settings/group-buttons-settings.model.d.ts +1 -1
  128. package/group-buttons-settings/group-buttons-settings.module.d.ts +15 -15
  129. package/group-buttons-settings/{pepperi-addons-ngx-composite-lib-group-buttons-settings.d.ts → index.d.ts} +5 -5
  130. package/group-buttons-settings/public-api.d.ts +3 -3
  131. package/{pepperi-addons-ngx-composite-lib.d.ts → index.d.ts} +5 -5
  132. package/ngx-composite-lib.module.d.ts +13 -13
  133. package/package.json +88 -18
  134. package/public-api.d.ts +2 -2
  135. package/shadow-settings/{pepperi-addons-ngx-composite-lib-shadow-settings.d.ts → index.d.ts} +5 -5
  136. package/shadow-settings/public-api.d.ts +3 -3
  137. package/shadow-settings/shadow-settings.component.d.ts +23 -23
  138. package/shadow-settings/shadow-settings.model.d.ts +7 -7
  139. package/shadow-settings/shadow-settings.module.d.ts +13 -13
  140. package/bundles/pepperi-addons-ngx-composite-lib-color-settings.umd.js +0 -181
  141. package/bundles/pepperi-addons-ngx-composite-lib-color-settings.umd.js.map +0 -1
  142. package/bundles/pepperi-addons-ngx-composite-lib-data-view-builder.umd.js +0 -393
  143. package/bundles/pepperi-addons-ngx-composite-lib-data-view-builder.umd.js.map +0 -1
  144. package/bundles/pepperi-addons-ngx-composite-lib-file-status-panel.umd.js +0 -137
  145. package/bundles/pepperi-addons-ngx-composite-lib-file-status-panel.umd.js.map +0 -1
  146. package/bundles/pepperi-addons-ngx-composite-lib-generic-form.umd.js +0 -697
  147. package/bundles/pepperi-addons-ngx-composite-lib-generic-form.umd.js.map +0 -1
  148. package/bundles/pepperi-addons-ngx-composite-lib-generic-list.umd.js +0 -1055
  149. package/bundles/pepperi-addons-ngx-composite-lib-generic-list.umd.js.map +0 -1
  150. package/bundles/pepperi-addons-ngx-composite-lib-group-buttons-settings.umd.js +0 -225
  151. package/bundles/pepperi-addons-ngx-composite-lib-group-buttons-settings.umd.js.map +0 -1
  152. package/bundles/pepperi-addons-ngx-composite-lib-shadow-settings.umd.js +0 -165
  153. package/bundles/pepperi-addons-ngx-composite-lib-shadow-settings.umd.js.map +0 -1
  154. package/bundles/pepperi-addons-ngx-composite-lib.umd.js +0 -666
  155. package/bundles/pepperi-addons-ngx-composite-lib.umd.js.map +0 -1
  156. package/color-settings/package.json +0 -10
  157. package/data-view-builder/package.json +0 -10
  158. package/esm2015/core/common/directives/reset-configuration-field.directive.js +0 -157
  159. package/esm2015/core/common/services/dimx.service.js +0 -50
  160. package/esm2015/data-view-builder/data-view-builder.component.js +0 -122
  161. package/esm2015/data-view-builder/menu-data-view/menu-data-view.component.js +0 -122
  162. package/esm2015/file-status-panel/file-status-panel.component.js +0 -39
  163. package/esm2015/generic-form/generic-form.component.js +0 -190
  164. package/esm2015/generic-form/index.js +0 -5
  165. package/esm2015/generic-list/generic-list.component.js +0 -438
  166. package/esm2015/generic-list/generic-list.service.js +0 -127
  167. package/esm2015/group-buttons-settings/group-buttons-settings.component.js +0 -135
  168. package/fesm2015/pepperi-addons-ngx-composite-lib-color-settings.js.map +0 -1
  169. package/fesm2015/pepperi-addons-ngx-composite-lib-data-view-builder.js +0 -360
  170. package/fesm2015/pepperi-addons-ngx-composite-lib-data-view-builder.js.map +0 -1
  171. package/fesm2015/pepperi-addons-ngx-composite-lib-file-status-panel.js.map +0 -1
  172. package/fesm2015/pepperi-addons-ngx-composite-lib-generic-form.js.map +0 -1
  173. package/fesm2015/pepperi-addons-ngx-composite-lib-generic-list.js.map +0 -1
  174. package/fesm2015/pepperi-addons-ngx-composite-lib-group-buttons-settings.js.map +0 -1
  175. package/fesm2015/pepperi-addons-ngx-composite-lib-shadow-settings.js.map +0 -1
  176. package/fesm2015/pepperi-addons-ngx-composite-lib.js.map +0 -1
  177. package/file-status-panel/package.json +0 -10
  178. package/generic-form/package.json +0 -10
  179. package/generic-form/pepperi-addons-ngx-composite-lib-generic-form.d.ts +0 -5
  180. package/generic-list/package.json +0 -13
  181. package/group-buttons-settings/package.json +0 -10
  182. package/shadow-settings/package.json +0 -10
@@ -1,438 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Component, ViewChild, Input, Output, EventEmitter, ViewContainerRef } from '@angular/core';
3
- //import { TranslateService } from '@ngx-translate/core';
4
- import { PepGuid, UIControl } from '@pepperi-addons/ngx-lib';
5
- import { Subscription } from 'rxjs';
6
- import { PepListComponent, PepSelectionData, DEFAULT_PAGE_SIZE } from '@pepperi-addons/ngx-lib/list';
7
- import { PepGenericListService } from './generic-list.service';
8
- import { DataViewConverter } from '@pepperi-addons/data-views';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@pepperi-addons/ngx-lib";
11
- import * as i2 from "./generic-list.service";
12
- import * as i3 from "@pepperi-addons/ngx-lib/page-layout";
13
- import * as i4 from "@pepperi-addons/ngx-lib/top-bar";
14
- import * as i5 from "@pepperi-addons/ngx-lib/list";
15
- import * as i6 from "@pepperi-addons/ngx-lib/search";
16
- import * as i7 from "@pepperi-addons/ngx-lib/side-bar";
17
- import * as i8 from "@pepperi-addons/ngx-lib/smart-filters";
18
- import * as i9 from "@pepperi-addons/ngx-lib/bread-crumbs";
19
- import * as i10 from "@angular/common";
20
- export class GenericListComponent {
21
- constructor(_resolver, _dataConvertorService, _layoutService, _loaderService,
22
- // private _translate: TranslateService,
23
- _genericListService) {
24
- this._resolver = _resolver;
25
- this._dataConvertorService = _dataConvertorService;
26
- this._layoutService = _layoutService;
27
- this._loaderService = _loaderService;
28
- this._genericListService = _genericListService;
29
- this._dataSource = {
30
- init: (params) => __awaiter(this, void 0, void 0, function* () {
31
- return {
32
- dataView: {
33
- Type: 'Grid'
34
- },
35
- totalCount: -1,
36
- items: []
37
- };
38
- })
39
- };
40
- this.actions = {
41
- get: (data) => __awaiter(this, void 0, void 0, function* () {
42
- return [];
43
- })
44
- };
45
- this.uuidMapping = 'key';
46
- this.disabled = false;
47
- this.addPadding = false;
48
- this.title = '';
49
- this.description = '';
50
- this.inline = false;
51
- this.showSearch = false;
52
- this.noDataFoundMsg = '';
53
- this.selectionType = 'multi';
54
- this.supportSorting = false;
55
- this.pager = {
56
- type: 'scroll'
57
- };
58
- this.tableViewType = 'regular';
59
- this.zebraStripes = false;
60
- this.showTopBar = false;
61
- this.breadCrumbsItems = new Array();
62
- this.fieldClick = new EventEmitter();
63
- this.valueChange = new EventEmitter();
64
- this.breadCrumbItemClick = new EventEmitter();
65
- this._resize$ = new Subscription();
66
- this._loader$ = new Subscription();
67
- this._dataView = {
68
- Type: 'Grid'
69
- };
70
- this.totalRowCount = -1;
71
- this.searchString = '';
72
- this.showSmartFilter = false;
73
- this.internalSmartFilter = {
74
- fields: [],
75
- data: []
76
- };
77
- this._appliedFilters = [];
78
- this._sorting = undefined;
79
- this.menuHandlers = {};
80
- this.menuActions = [];
81
- this._resize$ = this._layoutService.onResize$.pipe().subscribe((size) => {
82
- //
83
- });
84
- this._loader$ = this._loaderService.onChanged$.subscribe((status) => {
85
- //
86
- });
87
- }
88
- set pepListContainer(val) {
89
- this._pepListContainer = val;
90
- }
91
- set dataSource(val) {
92
- this._dataSource = val;
93
- this._sorting = undefined;
94
- this.initSearch();
95
- this.initTable();
96
- }
97
- set smartFilter(val) {
98
- this.internalSmartFilter = this._genericListService.convertToSmartFilter(val);
99
- this.showSmartFilter = this.internalSmartFilter.fields.length > 0;
100
- }
101
- set pepList(val) {
102
- this._pepList = val;
103
- }
104
- get pepList() {
105
- return this._pepList;
106
- }
107
- ngOnInit() {
108
- //
109
- }
110
- initTable() {
111
- return __awaiter(this, void 0, void 0, function* () {
112
- setTimeout(() => __awaiter(this, void 0, void 0, function* () {
113
- var _a, _b, _c;
114
- if (this._dataSource &&
115
- this._pepListContainer) {
116
- if (this._pepListContainer.length > 0) {
117
- this._pepListContainer.remove();
118
- }
119
- const factory = this._resolver.resolveComponentFactory(PepListComponent);
120
- const componentRef = this._pepListContainer.createComponent(factory);
121
- this.pepList = componentRef.instance;
122
- //merge selector inputs with callback inputs
123
- this.loadTableInputs();
124
- let fromIndex = 0;
125
- let toIndex = 0;
126
- if (this._listInputs.pager.type === 'pages') {
127
- fromIndex = this._listInputs.pager.size * this._listInputs.pager.index;
128
- toIndex = fromIndex + (this._listInputs.pager.size || DEFAULT_PAGE_SIZE) - 1;
129
- }
130
- else {
131
- toIndex = 100; //TO DO - get value from - this.customList.getTopItems()
132
- }
133
- const data = yield this.loadData(fromIndex, toIndex);
134
- this.totalRowCount = (data === null || data === void 0 ? void 0 : data.totalCount) || 0;
135
- componentRef.instance.viewType = this._genericListService.getListViewType(this._dataView.Type);
136
- componentRef.instance.tableViewType = this._listInputs.tableViewType;
137
- componentRef.instance.zebraStripes = this._listInputs.zebraStripes;
138
- if (this.disabled) {
139
- componentRef.instance.disabled = true;
140
- componentRef.instance.lockItemInnerEvents = true;
141
- }
142
- componentRef.instance.supportSorting = this._listInputs.supportSorting;
143
- componentRef.instance.selectionTypeForActions = this._listInputs.selectionType;
144
- componentRef.instance.showCardSelection = this._listInputs.selectionType !== 'none';
145
- componentRef.instance.pagerType = this._listInputs.pager.type;
146
- if (this._listInputs.pager.type === 'pages') {
147
- componentRef.instance.pageSize = ((_a = this._listInputs.pager) === null || _a === void 0 ? void 0 : _a.size) || DEFAULT_PAGE_SIZE;
148
- componentRef.instance.pageIndex = ((_b = this._listInputs.pager) === null || _b === void 0 ? void 0 : _b.index) || 0;
149
- }
150
- componentRef.instance.noDataFoundMsg = this._listInputs.noDataFoundMsg;
151
- componentRef.instance.fieldClick.subscribe(($event) => {
152
- this.onCustomizeFieldClick($event);
153
- });
154
- componentRef.instance.selectedItemsChange.subscribe(($event) => {
155
- this.onSelectedItemsChanged($event);
156
- });
157
- componentRef.instance.loadItems.subscribe(($event) => {
158
- this.onLoadItems($event);
159
- });
160
- componentRef.instance.loadPage.subscribe(($event) => {
161
- this.onLoadPage($event);
162
- });
163
- componentRef.instance.valueChange.subscribe(($event) => {
164
- this.onValueChanged($event);
165
- });
166
- componentRef.instance.sortingChange.subscribe(($event) => {
167
- this.onSortingChange($event);
168
- });
169
- let convertedList = [];
170
- if (data) {
171
- if ((_c = data.items) === null || _c === void 0 ? void 0 : _c.length) {
172
- convertedList = this._dataConvertorService.convertListData(data.items);
173
- }
174
- const uiControl = this.getUiControl(DataViewConverter.toUIControlData(data.dataView));
175
- componentRef.instance.initListData(uiControl, data.totalCount, convertedList);
176
- }
177
- }
178
- }), 0);
179
- });
180
- }
181
- /**
182
- * loads inputs in case they are provided and merge with selector inputs
183
- * @returns merged pep-list inputs
184
- */
185
- loadTableInputs() {
186
- this._listInputs = {
187
- supportSorting: this.supportSorting,
188
- selectionType: this.selectionType,
189
- pager: this.pager,
190
- noDataFoundMsg: this.noDataFoundMsg,
191
- tableViewType: this.tableViewType,
192
- zebraStripes: this.zebraStripes
193
- };
194
- if (this._dataSource.inputs) {
195
- Object.entries(this._dataSource.inputs).forEach((item) => {
196
- if (this._genericListService.hasProperty(this._listInputs, item[0])) {
197
- this._listInputs[item[0]] = item[1];
198
- }
199
- });
200
- }
201
- }
202
- getUiControl(data) {
203
- const uiControl = new UIControl();
204
- uiControl.ControlFields = [];
205
- if (data === null || data === void 0 ? void 0 : data.ControlFields) {
206
- uiControl.ControlFields = data.ControlFields.map((field) => this._genericListService.convertToUiControlField(field));
207
- }
208
- return uiControl;
209
- }
210
- loadMenuItems() {
211
- if (this._listInputs.selectionType !== 'none') {
212
- this.getMenuActions().then(x => this.menuActions = x);
213
- }
214
- }
215
- getMenuActions() {
216
- return __awaiter(this, void 0, void 0, function* () {
217
- const res = [];
218
- const result = this.getMenuObjects();
219
- if (result.success) {
220
- const actions = yield this.actions.get(result.data);
221
- this.menuHandlers = {};
222
- actions === null || actions === void 0 ? void 0 : actions.forEach(item => {
223
- const uuid = PepGuid.newGuid();
224
- this.menuHandlers[uuid] = item.handler;
225
- res.push({
226
- key: uuid,
227
- text: item.title
228
- });
229
- });
230
- }
231
- return res;
232
- });
233
- }
234
- getMenuObjects() {
235
- const menuObjects = {
236
- success: false,
237
- data: new PepSelectionData()
238
- };
239
- if (this.pepList) {
240
- menuObjects.success = true;
241
- menuObjects.data = this.pepList.getSelectedItemsData();
242
- }
243
- return menuObjects;
244
- }
245
- initSearch() {
246
- var _a;
247
- this.searchString = '';
248
- (_a = this.search) === null || _a === void 0 ? void 0 : _a.initSearch();
249
- }
250
- loadData(fromIndex, toIndex) {
251
- var _a;
252
- return __awaiter(this, void 0, void 0, function* () {
253
- this._loaderService.show();
254
- const data = yield this._dataSource.init({
255
- searchString: this.searchString || undefined,
256
- filters: this._appliedFilters.length ? this._appliedFilters : undefined,
257
- sorting: this._sorting || undefined,
258
- fromIndex: fromIndex,
259
- toIndex: toIndex
260
- });
261
- this._loaderService.hide();
262
- if (data) {
263
- this._dataView = data.dataView;
264
- if (((_a = data.items) === null || _a === void 0 ? void 0 : _a.length) > 0 && !data.isPepRowData) {
265
- data.items = data.items.map(item => this._genericListService.convertToPepRowData(item, data.dataView, this.uuidMapping));
266
- }
267
- }
268
- return data;
269
- });
270
- }
271
- updateDataList(fromIndex, toIndex, pageIndex = undefined) {
272
- return __awaiter(this, void 0, void 0, function* () {
273
- if (this._dataSource.update) {
274
- this._loaderService.show();
275
- const dataList = yield this._dataSource.update({
276
- searchString: this.searchString || undefined,
277
- filters: this._appliedFilters.length ? this._appliedFilters : undefined,
278
- sorting: this._sorting || undefined,
279
- fromIndex: fromIndex,
280
- toIndex: toIndex,
281
- pageIndex: pageIndex
282
- });
283
- this._loaderService.hide();
284
- if ((dataList === null || dataList === void 0 ? void 0 : dataList.length) > 0) {
285
- return dataList.map(item => this._genericListService.convertToPepRowData(item, this._dataView, this.uuidMapping));
286
- }
287
- else {
288
- return [];
289
- }
290
- }
291
- else {
292
- return [];
293
- }
294
- });
295
- }
296
- /**
297
- * loads virtual scroll items from api
298
- */
299
- onLoadItems(event) {
300
- return __awaiter(this, void 0, void 0, function* () {
301
- const list = yield this.updateDataList(event.fromIndex, event.toIndex);
302
- const convertedList = this._dataConvertorService.convertListData(list);
303
- this.pepList.updateItems(convertedList, event);
304
- });
305
- }
306
- /**
307
- * loads paging bulk from api
308
- */
309
- onLoadPage(event) {
310
- return __awaiter(this, void 0, void 0, function* () {
311
- const fromIndex = event.pageIndex * event.pageSize;
312
- const toIndex = Math.min(fromIndex + event.pageSize - 1, this.totalRowCount - 1);
313
- const list = yield this.updateDataList(fromIndex, toIndex, event.pageIndex);
314
- const convertedList = this._dataConvertorService.convertListData(list);
315
- this.pepList.updatePage(convertedList, event);
316
- });
317
- }
318
- getItemById(id) {
319
- if (this.pepList) {
320
- return this._pepList.getItemDataByID(id);
321
- }
322
- else {
323
- return null;
324
- }
325
- }
326
- getSelectedItems() {
327
- if (this.pepList) {
328
- return this._pepList.getSelectedItemsData();
329
- }
330
- else {
331
- return null;
332
- }
333
- }
334
- getPageIndex() {
335
- return this.pepList.pageIndex;
336
- }
337
- onActionItemClicked(action) {
338
- const result = this.getMenuObjects();
339
- if (result.success) {
340
- this.menuHandlers[action.source.key](result.data);
341
- }
342
- }
343
- onSearchChanged(event) {
344
- this.searchString = event.value;
345
- this.initTable();
346
- }
347
- onSelectedItemsChanged(selectedRowsCount) {
348
- //loading menu items after pep-list selected items are updated
349
- setTimeout(() => {
350
- this.loadMenuItems();
351
- }, 0);
352
- }
353
- onCustomizeFieldClick(fieldClickEvent) {
354
- this.fieldClick.emit(fieldClickEvent);
355
- }
356
- onBreadCrumbItemClick(event) {
357
- this.breadCrumbItemClick.emit(event);
358
- }
359
- onValueChanged(event) {
360
- this.valueChange.emit(event);
361
- }
362
- onSortingChange(event) {
363
- this._sorting = event;
364
- this.initTable();
365
- }
366
- onFiltersChange(filters) {
367
- this._appliedFilters = filters;
368
- this.initTable();
369
- }
370
- ngOnDestroy() {
371
- if (this._resize$) {
372
- this._resize$.unsubscribe();
373
- }
374
- if (this._loader$) {
375
- this._loader$.unsubscribe();
376
- }
377
- }
378
- }
379
- GenericListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: GenericListComponent, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.PepDataConvertorService }, { token: i1.PepLayoutService }, { token: i1.PepLoaderService }, { token: i2.PepGenericListService }], target: i0.ɵɵFactoryTarget.Component });
380
- GenericListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: GenericListComponent, selector: "pep-generic-list", inputs: { dataSource: "dataSource", actions: "actions", uuidMapping: "uuidMapping", disabled: "disabled", addPadding: "addPadding", title: "title", description: "description", inline: "inline", showSearch: "showSearch", noDataFoundMsg: "noDataFoundMsg", selectionType: "selectionType", supportSorting: "supportSorting", pager: "pager", tableViewType: "tableViewType", zebraStripes: "zebraStripes", smartFilter: "smartFilter", showTopBar: "showTopBar", breadCrumbsItems: "breadCrumbsItems" }, outputs: { fieldClick: "fieldClick", valueChange: "valueChange", breadCrumbItemClick: "breadCrumbItemClick" }, providers: [PepGenericListService], viewQueries: [{ propertyName: "search", first: true, predicate: ["search"], descendants: true }, { propertyName: "pepListContainer", first: true, predicate: ["pepListContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<div *ngIf=\"inline\" class=\"inline-container\" [ngClass]=\"{ 'add-padding': addPadding }\">\n <div class=\"header-area\" >\n <div *ngIf=\"showTopBar\" class=\"inline-top-bar-container\">\n <ng-container *ngTemplateOutlet=\"topBarTemplate\"></ng-container>\n </div>\n <ng-container *ngIf=\"description\">\n <div class=\"list-description\">{{description}}</div>\n </ng-container>\n <ng-container *ngIf=\"breadCrumbsItems.length\">\n <ng-container *ngTemplateOutlet=\"breadCrumbsTemplate\"></ng-container>\n </ng-container>\n </div>\n <ng-container *ngIf=\"showSmartFilter\">\n <ng-container *ngTemplateOutlet=\"smartFilterTemplate\"></ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n</div>\n<pep-page-layout *ngIf=\"!inline\" class=\"none-inline\" [addPadding]=\"addPadding\" [showShadow]=\"showSmartFilter\">\n <ng-container *ngIf=\"showSmartFilter\" pep-side-area>\n <ng-container *ngTemplateOutlet=\"smartFilterTemplate\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"showTopBar\" pep-top-area>\n <ng-container *ngTemplateOutlet=\"topBarTemplate\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"description\" pep-top-area>\n <div class=\"list-description\">{{description}}</div>\n </ng-container>\n <ng-container *ngIf=\"breadCrumbsItems.length\" pep-top-area>\n <ng-container *ngTemplateOutlet=\"breadCrumbsTemplate\"></ng-container>\n </ng-container>\n <div pep-main-area class=\"main-area-container\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n </div>\n</pep-page-layout>\n\n<ng-template #topBarTemplate>\n <pep-top-bar [title]=\"title\" [inline]=\"inline\">\n <div header-start-content>\n <ng-content select=\"[left-buttons]\"></ng-content>\n </div>\n <div header-end-content>\n <ng-content select=\"[right-buttons]\"></ng-content>\n </div>\n <!-- <div footer-start-content>\n <ng-content select=\"[left-bottom-area]\"></ng-content> \n </div>\n <div footer-end-content>\n <ng-content select=\"[right-bottom-area]\"></ng-content> \n </div> -->\n <pep-list-actions *ngIf=\"menuActions.length > 0\" [sizeType]=\"inline ? 'sm' : 'md'\" [actions]=\"menuActions\"\n (actionClick)=\"onActionItemClicked($event)\"></pep-list-actions>\n <pep-list-total [sizeType]=\"inline ? 'sm' : 'md'\" [totalRows]=\"totalRowCount\">\n </pep-list-total>\n <pep-search #search *ngIf=\"showSearch\" [value]=\"searchString\" [sizeType]=\"inline ? 'sm' : 'md'\"\n (search)=\"onSearchChanged($event)\">\n </pep-search>\n </pep-top-bar>\n</ng-template>\n\n<ng-template #smartFilterTemplate>\n <pep-side-bar #sideNav [ngClass]=\"{'smart-filter-area': inline}\">\n <pep-smart-filters title=\"Test filters\" [fields]=\"internalSmartFilter.fields\"\n [filters]=\"internalSmartFilter.data\" (filtersChange)=\"onFiltersChange($event)\">\n </pep-smart-filters>\n </pep-side-bar>\n</ng-template>\n\n<ng-template #breadCrumbsTemplate>\n <pep-bread-crumbs class=\"bread-crumbs\" [items]=\"breadCrumbsItems\" [addSpacing]=\"true\" [displayType]=\"'items'\"\n (itemClick)=\"onBreadCrumbItemClick($event)\"></pep-bread-crumbs>\n</ng-template>\n\n<ng-template #listTemplate>\n <div class=\"list-container\">\n <ng-container #pepListContainer></ng-container>\n </div>\n</ng-template>", styles: [":host{height:inherit;display:block}.main-area-container{display:grid;height:inherit}.list-container{height:100%}.inline-container{height:inherit;display:grid;grid-template-rows:auto 1fr;grid-template-columns:auto 1fr}.inline-container.add-padding{padding-inline:var(--pep-spacing-lg, 1rem)}.inline-container .header-area{grid-column:2/3;grid-row:1/2}.inline-container .smart-filter-area{grid-column:1/2;grid-row:1/3}.inline-container .list-container{grid-column:2/3;grid-row:2/3}.inline-container .list-description{font-size:var(--pep-font-size-xs, .75rem);max-width:640px;padding:var(--pep-spacing-sm, .5rem) 0}.inline-container .bread-crumbs{padding:var(--pep-spacing-md, .75rem) 0 var(--pep-spacing-sm, .5rem) 0}.none-inline .list-description{font-size:var(--pep-font-size-sm, .875rem);max-width:720px;padding:var(--pep-spacing-sm, .5rem) var(--pep-spacing-xs, .25rem)}.none-inline .bread-crumbs{padding:var(--pep-spacing-md, .75rem) var(--pep-spacing-xs, .25rem) var(--pep-spacing-sm, .5rem) var(--pep-spacing-xs, .25rem)}::ng-deep .pep-top-bar-container:not(.inline){margin-inline:var(--pep-spacing-xs, .25rem)}::ng-deep .pep-top-bar-container.inline{height:var(--pep-top-bar-field-height, 2.5rem)!important}.noDataFoundMsg{margin:1rem 0;height:calc(100% - 2rem);width:100%;background:hsla(0deg,0%,10%,.12);display:flex;justify-content:center;align-items:center}\n"], components: [{ type: i3.PepPageLayoutComponent, selector: "pep-page-layout", inputs: ["addPadding", "showShadow"] }, { type: i4.PepTopBarComponent, selector: "pep-top-bar", inputs: ["inline", "title"], outputs: ["footerStateChange"] }, { type: i5.PepListActionsComponent, selector: "pep-list-actions", inputs: ["actions", "sizeType", "xPosition", "hidden"], outputs: ["actionClick", "stateChange", "menuClick"] }, { type: i5.PepListTotalComponent, selector: "pep-list-total", inputs: ["totalRows", "totalAmount", "isMapView", "sizeType"] }, { type: i6.PepSearchComponent, selector: "pep-search", inputs: ["triggerOn", "autoCompleteTop", "sizeType", "autoCompleteValues", "shrink", "value", "searchControl", "useAsWebComponent"], outputs: ["search", "autocompleteChange", "stateChange"] }, { type: i7.PepSideBarComponent, selector: "pep-side-bar", inputs: ["ignoreResize", "showHeader", "showFooter", "useAsWebComponent"], outputs: ["stateChange"] }, { type: i8.PepSmartFiltersComponent, selector: "pep-smart-filters", inputs: ["title", "filters", "fields", "useAsWebComponent"], outputs: ["filtersChange", "fieldToggleChange"] }, { type: i9.PepBreadCrumbsComponent, selector: "pep-bread-crumbs", inputs: ["addSpacing", "items", "displayType"], outputs: ["itemClick"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
381
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: GenericListComponent, decorators: [{
382
- type: Component,
383
- args: [{
384
- selector: 'pep-generic-list',
385
- templateUrl: './generic-list.component.html',
386
- styleUrls: ['./generic-list.component.scss'],
387
- providers: [PepGenericListService]
388
- }]
389
- }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i1.PepDataConvertorService }, { type: i1.PepLayoutService }, { type: i1.PepLoaderService }, { type: i2.PepGenericListService }]; }, propDecorators: { search: [{
390
- type: ViewChild,
391
- args: ['search']
392
- }], pepListContainer: [{
393
- type: ViewChild,
394
- args: ['pepListContainer', { read: ViewContainerRef }]
395
- }], dataSource: [{
396
- type: Input
397
- }], actions: [{
398
- type: Input
399
- }], uuidMapping: [{
400
- type: Input
401
- }], disabled: [{
402
- type: Input
403
- }], addPadding: [{
404
- type: Input
405
- }], title: [{
406
- type: Input
407
- }], description: [{
408
- type: Input
409
- }], inline: [{
410
- type: Input
411
- }], showSearch: [{
412
- type: Input
413
- }], noDataFoundMsg: [{
414
- type: Input
415
- }], selectionType: [{
416
- type: Input
417
- }], supportSorting: [{
418
- type: Input
419
- }], pager: [{
420
- type: Input
421
- }], tableViewType: [{
422
- type: Input
423
- }], zebraStripes: [{
424
- type: Input
425
- }], smartFilter: [{
426
- type: Input
427
- }], showTopBar: [{
428
- type: Input
429
- }], breadCrumbsItems: [{
430
- type: Input
431
- }], fieldClick: [{
432
- type: Output
433
- }], valueChange: [{
434
- type: Output
435
- }], breadCrumbItemClick: [{
436
- type: Output
437
- }] } });
438
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21wb3NpdGUtbGliL2dlbmVyaWMtbGlzdC9nZW5lcmljLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbXBvc2l0ZS1saWIvZ2VuZXJpYy1saXN0L2dlbmVyaWMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osZ0JBQWdCLEVBRW5CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLHlEQUF5RDtBQUN6RCxPQUFPLEVBSUgsT0FBTyxFQUNQLFNBQVMsRUFFWixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUNILGdCQUFnQixFQUNoQixnQkFBZ0IsRUFJaEIsaUJBQWlCLEVBR3BCLE1BQU0sOEJBQThCLENBQUM7QUF3QnRDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7Ozs7QUFhL0QsTUFBTSxPQUFPLG9CQUFvQjtJQWlJN0IsWUFDWSxTQUFtQyxFQUNuQyxxQkFBOEMsRUFDOUMsY0FBZ0MsRUFDaEMsY0FBZ0M7SUFDeEMsd0NBQXdDO0lBQ2hDLG1CQUEwQztRQUwxQyxjQUFTLEdBQVQsU0FBUyxDQUEwQjtRQUNuQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXlCO1FBQzlDLG1CQUFjLEdBQWQsY0FBYyxDQUFrQjtRQUNoQyxtQkFBYyxHQUFkLGNBQWMsQ0FBa0I7UUFFaEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUF1QjtRQTlIOUMsZ0JBQVcs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QUlOLFVBQVU7c0JBRFQsTUFBTTtnQkFJUCxXQUFXO3NCQURWLE1BQU07Z0JBSVAsbUJBQW1CO3NCQURsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLy9pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1xuICAgIFBlcERhdGFDb252ZXJ0b3JTZXJ2aWNlLFxuICAgIFBlcExheW91dFNlcnZpY2UsXG4gICAgT2JqZWN0c0RhdGFSb3csXG4gICAgUGVwR3VpZCxcbiAgICBVSUNvbnRyb2wsXG4gICAgUGVwTG9hZGVyU2VydmljZVxufSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElQZXBGb3JtRmllbGRDbGlja0V2ZW50IH0gZnJvbSAnQHBlcHBlcmktYWRkb25zL25neC1saWIvZm9ybSc7XG5pbXBvcnQge1xuICAgIFBlcExpc3RDb21wb25lbnQsXG4gICAgUGVwU2VsZWN0aW9uRGF0YSxcbiAgICBJUGVwTGlzdExvYWRQYWdlRXZlbnQsXG4gICAgUGVwTGlzdFNlbGVjdGlvblR5cGUsXG4gICAgSVBlcExpc3RTb3J0aW5nQ2hhbmdlRXZlbnQsXG4gICAgREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgSVBlcExpc3RMb2FkSXRlbXNFdmVudCxcbiAgICBQZXBMaXN0VGFibGVWaWV3VHlwZVxufSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9saXN0JztcbmltcG9ydCB7XG4gICAgUGVwTWVudUl0ZW0sXG4gICAgSVBlcE1lbnVJdGVtQ2xpY2tFdmVudCxcbn0gZnJvbSAnQHBlcHBlcmktYWRkb25zL25neC1saWIvbWVudSc7XG5pbXBvcnQgeyBJUGVwRm9ybUZpZWxkVmFsdWVDaGFuZ2VFdmVudCB9IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL2Zvcm0nO1xuaW1wb3J0IHtcbiAgICBQZXBCcmVhZENydW1iSXRlbSxcbiAgICBJUGVwQnJlYWRDcnVtYkl0ZW1DbGlja0V2ZW50XG59IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL2JyZWFkLWNydW1icyc7XG5pbXBvcnQgeyBJUGVwU2VhcmNoQ2xpY2tFdmVudCwgUGVwU2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnQHBlcHBlcmktYWRkb25zL25neC1saWIvc2VhcmNoJztcblxuaW1wb3J0IHtcbiAgICBEYXRhVmlldyxcbiAgICBHcmlkRGF0YVZpZXdcbn0gZnJvbSAnQHBlcHBlcmktYWRkb25zL3BhcGktc2RrL2Rpc3QvZW50aXRpZXMvZGF0YS12aWV3JztcbmltcG9ydCB7XG4gICAgSVBlcEdlbmVyaWNMaXN0SW5pdERhdGEsXG4gICAgSVBlcEdlbmVyaWNMaXN0RGF0YVNvdXJjZSxcbiAgICBJUGVwR2VuZXJpY0xpc3RQYWdlcixcbiAgICBJUGVwR2VuZXJpY0xpc3RBY3Rpb25zLFxuICAgIElQZXBHZW5lcmljTGlzdFNtYXJ0RmlsdGVyLFxuICAgIElQZXBHZW5lcmljTGlzdExpc3RJbnB1dHNcbn0gZnJvbSAnLi9nZW5lcmljLWxpc3QubW9kZWwnO1xuaW1wb3J0IHsgUGVwR2VuZXJpY0xpc3RTZXJ2aWNlIH0gZnJvbSAnLi9nZW5lcmljLWxpc3Quc2VydmljZSc7XG5pbXBvcnQgeyBEYXRhVmlld0NvbnZlcnRlciB9IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9kYXRhLXZpZXdzJztcbmltcG9ydCB7XG4gICAgSVBlcFNtYXJ0RmlsdGVyRGF0YSxcbiAgICBQZXBTbWFydEZpbHRlckJhc2VGaWVsZFxufSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9zbWFydC1maWx0ZXJzJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3BlcC1nZW5lcmljLWxpc3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9nZW5lcmljLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2dlbmVyaWMtbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW1BlcEdlbmVyaWNMaXN0U2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgR2VuZXJpY0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaCcpIHNlYXJjaDogUGVwU2VhcmNoQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuXG4gICAgcHJpdmF0ZSBfcGVwTGlzdENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZiB8IHVuZGVmaW5lZDtcbiAgICBAVmlld0NoaWxkKCdwZXBMaXN0Q29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gICAgc2V0IHBlcExpc3RDb250YWluZXIodmFsOiBWaWV3Q29udGFpbmVyUmVmKSB7XG4gICAgICAgIHRoaXMuX3BlcExpc3RDb250YWluZXIgPSB2YWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGF0YVNvdXJjZTogSVBlcEdlbmVyaWNMaXN0RGF0YVNvdXJjZSA9IHtcbiAgICAgICAgaW5pdDogYXN5bmMgKHBhcmFtczogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFWaWV3OiB7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdHcmlkJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG90YWxDb3VudDogLTEsXG4gICAgICAgICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgQElucHV0KClcbiAgICBzZXQgZGF0YVNvdXJjZSh2YWw6IElQZXBHZW5lcmljTGlzdERhdGFTb3VyY2UpIHtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSA9IHZhbDtcbiAgICAgICAgdGhpcy5fc29ydGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pbml0U2VhcmNoKCk7XG4gICAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBhY3Rpb25zOiBJUGVwR2VuZXJpY0xpc3RBY3Rpb25zID0ge1xuICAgICAgICBnZXQ6IGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIEBJbnB1dCgpXG4gICAgdXVpZE1hcHBpbmcgPSAna2V5JztcblxuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgYWRkUGFkZGluZyA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICB0aXRsZSA9ICcnO1xuXG4gICAgQElucHV0KClcbiAgICBkZXNjcmlwdGlvbiA9ICcnO1xuXG4gICAgQElucHV0KClcbiAgICBpbmxpbmUgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgc2hvd1NlYXJjaCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBub0RhdGFGb3VuZE1zZyA9ICcnO1xuXG4gICAgQElucHV0KClcbiAgICBzZWxlY3Rpb25UeXBlOiBQZXBMaXN0U2VsZWN0aW9uVHlwZSA9ICdtdWx0aSc7XG5cbiAgICBASW5wdXQoKVxuICAgIHN1cHBvcnRTb3J0aW5nID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHBhZ2VyOiBJUGVwR2VuZXJpY0xpc3RQYWdlciA9IHtcbiAgICAgICAgdHlwZTogJ3Njcm9sbCdcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHRhYmxlVmlld1R5cGU6IFBlcExpc3RUYWJsZVZpZXdUeXBlID0gJ3JlZ3VsYXInO1xuXG4gICAgQElucHV0KClcbiAgICB6ZWJyYVN0cmlwZXMgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IHNtYXJ0RmlsdGVyKHZhbDogSVBlcEdlbmVyaWNMaXN0U21hcnRGaWx0ZXIpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFNtYXJ0RmlsdGVyID0gdGhpcy5fZ2VuZXJpY0xpc3RTZXJ2aWNlLmNvbnZlcnRUb1NtYXJ0RmlsdGVyKHZhbCk7XG4gICAgICAgIHRoaXMuc2hvd1NtYXJ0RmlsdGVyID0gdGhpcy5pbnRlcm5hbFNtYXJ0RmlsdGVyLmZpZWxkcy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgc2hvd1RvcEJhciA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBicmVhZENydW1ic0l0ZW1zOiBQZXBCcmVhZENydW1iSXRlbVtdID0gbmV3IEFycmF5PFBlcEJyZWFkQ3J1bWJJdGVtPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgZmllbGRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcEZvcm1GaWVsZENsaWNrRXZlbnQ+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBicmVhZENydW1iSXRlbUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwQnJlYWRDcnVtYkl0ZW1DbGlja0V2ZW50PigpO1xuXG4gICAgc2V0IHBlcExpc3QodmFsOiBQZXBMaXN0Q29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX3BlcExpc3QgPSB2YWw7XG4gICAgfVxuXG4gICAgZ2V0IHBlcExpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wZXBMaXN0O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc2l6ZSQ6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICBwcml2YXRlIF9sb2FkZXIkOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBwcml2YXRlIF9kYXRhVmlldzogRGF0YVZpZXcgPSB7XG4gICAgICAgIFR5cGU6ICdHcmlkJ1xuICAgIH07XG4gICAgcHJpdmF0ZSBfbGlzdElucHV0czogYW55O1xuICAgIHByaXZhdGUgX3BlcExpc3Q6IGFueTtcbiAgICB0b3RhbFJvd0NvdW50ID0gLTE7XG4gICAgc2VhcmNoU3RyaW5nID0gJyc7XG4gICAgc2hvd1NtYXJ0RmlsdGVyID0gZmFsc2U7XG4gICAgaW50ZXJuYWxTbWFydEZpbHRlcjoge1xuICAgICAgICBmaWVsZHM6IFBlcFNtYXJ0RmlsdGVyQmFzZUZpZWxkW10sXG4gICAgICAgIGRhdGE6IElQZXBTbWFydEZpbHRlckRhdGFbXVxuICAgIH0gPSB7XG4gICAgICAgICAgICBmaWVsZHM6IFtdLFxuICAgICAgICAgICAgZGF0YTogW11cbiAgICAgICAgfTtcbiAgICBwcml2YXRlIF9hcHBsaWVkRmlsdGVyczogSVBlcFNtYXJ0RmlsdGVyRGF0YVtdID0gW107XG4gICAgcHJpdmF0ZSBfc29ydGluZzogSVBlcExpc3RTb3J0aW5nQ2hhbmdlRXZlbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBtZW51SGFuZGxlcnM6IHsgW2tleTogc3RyaW5nXTogKG9iajogYW55KSA9PiBQcm9taXNlPHZvaWQ+IH0gPSB7fTtcbiAgICBtZW51QWN0aW9uczogQXJyYXk8UGVwTWVudUl0ZW0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJpdmF0ZSBfZGF0YUNvbnZlcnRvclNlcnZpY2U6IFBlcERhdGFDb252ZXJ0b3JTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9sYXlvdXRTZXJ2aWNlOiBQZXBMYXlvdXRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9sb2FkZXJTZXJ2aWNlOiBQZXBMb2FkZXJTZXJ2aWNlLFxuICAgICAgICAvLyBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2dlbmVyaWNMaXN0U2VydmljZTogUGVwR2VuZXJpY0xpc3RTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX3Jlc2l6ZSQgPSB0aGlzLl9sYXlvdXRTZXJ2aWNlLm9uUmVzaXplJC5waXBlKCkuc3Vic2NyaWJlKChzaXplKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgIFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbG9hZGVyJCA9IHRoaXMuX2xvYWRlclNlcnZpY2Uub25DaGFuZ2VkJC5zdWJzY3JpYmUoKHN0YXR1czogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIC8vXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0VGFibGUoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGFTb3VyY2UgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9wZXBMaXN0Q29udGFpbmVyKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGVwTGlzdENvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BlcExpc3RDb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLl9yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShQZXBMaXN0Q29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLl9wZXBMaXN0Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcExpc3QgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG5cbiAgICAgICAgICAgICAgICAvL21lcmdlIHNlbGVjdG9yIGlucHV0cyB3aXRoIGNhbGxiYWNrIGlucHV0c1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFRhYmxlSW5wdXRzKCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZnJvbUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgdG9JbmRleCA9IDA7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGlzdElucHV0cy5wYWdlci50eXBlID09PSAncGFnZXMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21JbmRleCA9IHRoaXMuX2xpc3RJbnB1dHMucGFnZXIuc2l6ZSAqIHRoaXMuX2xpc3RJbnB1dHMucGFnZXIuaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHRvSW5kZXggPSBmcm9tSW5kZXggKyAodGhpcy5fbGlzdElucHV0cy5wYWdlci5zaXplIHx8IERFRkFVTFRfUEFHRV9TSVpFKSAtIDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9JbmRleCA9IDEwMDsvL1RPIERPIC0gZ2V0IHZhbHVlIGZyb20gLSB0aGlzLmN1c3RvbUxpc3QuZ2V0VG9wSXRlbXMoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKGZyb21JbmRleCwgdG9JbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbFJvd0NvdW50ID0gZGF0YT8udG90YWxDb3VudCB8fCAwO1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnZpZXdUeXBlID0gdGhpcy5fZ2VuZXJpY0xpc3RTZXJ2aWNlLmdldExpc3RWaWV3VHlwZSh0aGlzLl9kYXRhVmlldy5UeXBlKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UudGFibGVWaWV3VHlwZSA9IHRoaXMuX2xpc3RJbnB1dHMudGFibGVWaWV3VHlwZTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuemVicmFTdHJpcGVzID0gdGhpcy5fbGlzdElucHV0cy56ZWJyYVN0cmlwZXM7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmxvY2tJdGVtSW5uZXJFdmVudHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2Uuc3VwcG9ydFNvcnRpbmcgPSB0aGlzLl9saXN0SW5wdXRzLnN1cHBvcnRTb3J0aW5nO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9IHRoaXMuX2xpc3RJbnB1dHMuc2VsZWN0aW9uVHlwZTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2Uuc2hvd0NhcmRTZWxlY3Rpb24gPSB0aGlzLl9saXN0SW5wdXRzLnNlbGVjdGlvblR5cGUgIT09ICdub25lJztcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UucGFnZXJUeXBlID0gdGhpcy5fbGlzdElucHV0cy5wYWdlci50eXBlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9saXN0SW5wdXRzLnBhZ2VyLnR5cGUgPT09ICdwYWdlcycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnBhZ2VTaXplID0gdGhpcy5fbGlzdElucHV0cy5wYWdlcj8uc2l6ZSB8fCBERUZBVUxUX1BBR0VfU0laRTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnBhZ2VJbmRleCA9IHRoaXMuX2xpc3RJbnB1dHMucGFnZXI/LmluZGV4IHx8IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5ub0RhdGFGb3VuZE1zZyA9IHRoaXMuX2xpc3RJbnB1dHMubm9EYXRhRm91bmRNc2c7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmZpZWxkQ2xpY2suc3Vic2NyaWJlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkN1c3RvbWl6ZUZpZWxkQ2xpY2soJGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2Uuc2VsZWN0ZWRJdGVtc0NoYW5nZS5zdWJzY3JpYmUoKCRldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoJGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UubG9hZEl0ZW1zLnN1YnNjcmliZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Mb2FkSXRlbXMoJGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UubG9hZFBhZ2Uuc3Vic2NyaWJlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkxvYWRQYWdlKCRldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnZhbHVlQ2hhbmdlLnN1YnNjcmliZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQoJGV2ZW50KVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5zb3J0aW5nQ2hhbmdlLnN1YnNjcmliZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Tb3J0aW5nQ2hhbmdlKCRldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnZlcnRlZExpc3Q6IE9iamVjdHNEYXRhUm93W10gPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRMaXN0ID0gdGhpcy5fZGF0YUNvbnZlcnRvclNlcnZpY2UuY29udmVydExpc3REYXRhKGRhdGEuaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpQ29udHJvbCA9IHRoaXMuZ2V0VWlDb250cm9sKERhdGFWaWV3Q29udmVydGVyLnRvVUlDb250cm9sRGF0YShkYXRhLmRhdGFWaWV3KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5pbml0TGlzdERhdGEodWlDb250cm9sLCBkYXRhLnRvdGFsQ291bnQsIGNvbnZlcnRlZExpc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbG9hZHMgaW5wdXRzIGluIGNhc2UgdGhleSBhcmUgcHJvdmlkZWQgYW5kIG1lcmdlIHdpdGggc2VsZWN0b3IgaW5wdXRzXG4gICAgICogQHJldHVybnMgbWVyZ2VkIHBlcC1saXN0IGlucHV0c1xuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZFRhYmxlSW5wdXRzKCkge1xuICAgICAgICB0aGlzLl9saXN0SW5wdXRzID0ge1xuICAgICAgICAgICAgc3VwcG9ydFNvcnRpbmc6IHRoaXMuc3VwcG9ydFNvcnRpbmcsXG4gICAgICAgICAgICBzZWxlY3Rpb25UeXBlOiB0aGlzLnNlbGVjdGlvblR5cGUsXG4gICAgICAgICAgICBwYWdlcjogdGhpcy5wYWdlcixcbiAgICAgICAgICAgIG5vRGF0YUZvdW5kTXNnOiB0aGlzLm5vRGF0YUZvdW5kTXNnLFxuICAgICAgICAgICAgdGFibGVWaWV3VHlwZTogdGhpcy50YWJsZVZpZXdUeXBlLFxuICAgICAgICAgICAgemVicmFTdHJpcGVzOiB0aGlzLnplYnJhU3RyaXBlc1xuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5fZGF0YVNvdXJjZS5pbnB1dHMpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuX2RhdGFTb3VyY2UuaW5wdXRzKS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ2VuZXJpY0xpc3RTZXJ2aWNlLmhhc1Byb3BlcnR5KHRoaXMuX2xpc3RJbnB1dHMsIGl0ZW1bMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xpc3RJbnB1dHNbaXRlbVswXV0gPSBpdGVtWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRVaUNvbnRyb2woZGF0YTogYW55KTogVUlDb250cm9sIHtcbiAgICAgICAgY29uc3QgdWlDb250cm9sID0gbmV3IFVJQ29udHJvbCgpO1xuICAgICAgICB1aUNvbnRyb2wuQ29udHJvbEZpZWxkcyA9IFtdO1xuXG4gICAgICAgIGlmIChkYXRhPy5Db250cm9sRmllbGRzKSB7XG4gICAgICAgICAgICB1aUNvbnRyb2wuQ29udHJvbEZpZWxkcyA9IGRhdGEuQ29udHJvbEZpZWxkcy5tYXAoKGZpZWxkOiBhbnkpID0+IHRoaXMuX2dlbmVyaWNMaXN0U2VydmljZS5jb252ZXJ0VG9VaUNvbnRyb2xGaWVsZChmaWVsZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVpQ29udHJvbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRNZW51SXRlbXMoKTogdm9pZCB7IC8vVE9ET1xuICAgICAgICBpZiAodGhpcy5fbGlzdElucHV0cy5zZWxlY3Rpb25UeXBlICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0TWVudUFjdGlvbnMoKS50aGVuKFxuICAgICAgICAgICAgICAgIHggPT4gdGhpcy5tZW51QWN0aW9ucyA9IHhcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldE1lbnVBY3Rpb25zKCk6IFByb21pc2U8UGVwTWVudUl0ZW1bXT4ge1xuICAgICAgICBjb25zdCByZXM6IFBlcE1lbnVJdGVtW10gPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRNZW51T2JqZWN0cygpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBhd2FpdCB0aGlzLmFjdGlvbnMuZ2V0KHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMubWVudUhhbmRsZXJzID0ge307XG4gICAgICAgICAgICBhY3Rpb25zPy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBQZXBHdWlkLm5ld0d1aWQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lbnVIYW5kbGVyc1t1dWlkXSA9IGl0ZW0uaGFuZGxlcjtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogdXVpZCxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogaXRlbS50aXRsZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1lbnVPYmplY3RzKCkge1xuICAgICAgICBjb25zdCBtZW51T2JqZWN0czogYW55ID0ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBkYXRhOiBuZXcgUGVwU2VsZWN0aW9uRGF0YSgpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMucGVwTGlzdCkge1xuICAgICAgICAgICAgbWVudU9iamVjdHMuc3VjY2VzcyA9IHRydWU7XG4gICAgICAgICAgICBtZW51T2JqZWN0cy5kYXRhID0gdGhpcy5wZXBMaXN0LmdldFNlbGVjdGVkSXRlbXNEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVudU9iamVjdHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0U2VhcmNoKCkge1xuICAgICAgICB0aGlzLnNlYXJjaFN0cmluZyA9ICcnO1xuICAgICAgICB0aGlzLnNlYXJjaD8uaW5pdFNlYXJjaCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZERhdGEoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBlcEdlbmVyaWNMaXN0SW5pdERhdGE+IHtcbiAgICAgICAgdGhpcy5fbG9hZGVyU2VydmljZS5zaG93KCk7XG4gICAgICAgIGNvbnN0IGRhdGE6IElQZXBHZW5lcmljTGlzdEluaXREYXRhID0gYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5pbml0KHtcbiAgICAgICAgICAgIHNlYXJjaFN0cmluZzogdGhpcy5zZWFyY2hTdHJpbmcgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5fYXBwbGllZEZpbHRlcnMubGVuZ3RoID8gdGhpcy5fYXBwbGllZEZpbHRlcnMgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzb3J0aW5nOiB0aGlzLl9zb3J0aW5nIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGZyb21JbmRleDogZnJvbUluZGV4LFxuICAgICAgICAgICAgdG9JbmRleDogdG9JbmRleFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbG9hZGVyU2VydmljZS5oaWRlKCk7XG5cbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFWaWV3ID0gZGF0YS5kYXRhVmlldztcblxuICAgICAgICAgICAgaWYgKGRhdGEuaXRlbXM/Lmxlbmd0aCA+IDAgJiYgIWRhdGEuaXNQZXBSb3dEYXRhKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5pdGVtcyA9IGRhdGEuaXRlbXMubWFwKGl0ZW0gPT4gdGhpcy5fZ2VuZXJpY0xpc3RTZXJ2aWNlLmNvbnZlcnRUb1BlcFJvd0RhdGEoaXRlbSwgZGF0YS5kYXRhVmlldywgdGhpcy51dWlkTWFwcGluZykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGFzeW5jIHVwZGF0ZURhdGFMaXN0KGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIsIHBhZ2VJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLl9kYXRhU291cmNlLnVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVyU2VydmljZS5zaG93KCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhTGlzdCA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UudXBkYXRlKHtcbiAgICAgICAgICAgICAgICBzZWFyY2hTdHJpbmc6IHRoaXMuc2VhcmNoU3RyaW5nIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLl9hcHBsaWVkRmlsdGVycy5sZW5ndGggPyB0aGlzLl9hcHBsaWVkRmlsdGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzb3J0aW5nOiB0aGlzLl9zb3J0aW5nIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBmcm9tSW5kZXg6IGZyb21JbmRleCxcbiAgICAgICAgICAgICAgICB0b0luZGV4OiB0b0luZGV4LFxuICAgICAgICAgICAgICAgIHBhZ2VJbmRleDogcGFnZUluZGV4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlclNlcnZpY2UuaGlkZSgpO1xuXG4gICAgICAgICAgICBpZiAoZGF0YUxpc3Q/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YUxpc3QubWFwKGl0ZW0gPT4gdGhpcy5fZ2VuZXJpY0xpc3RTZXJ2aWNlLmNvbnZlcnRUb1BlcFJvd0RhdGEoaXRlbSwgdGhpcy5fZGF0YVZpZXcsIHRoaXMudXVpZE1hcHBpbmcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbG9hZHMgdmlydHVhbCBzY3JvbGwgaXRlbXMgZnJvbSBhcGlcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIG9uTG9hZEl0ZW1zKGV2ZW50OiBJUGVwTGlzdExvYWRJdGVtc0V2ZW50KSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBhd2FpdCB0aGlzLnVwZGF0ZURhdGFMaXN0KGV2ZW50LmZyb21JbmRleCwgZXZlbnQudG9JbmRleCk7XG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZExpc3QgPSB0aGlzLl9kYXRhQ29udmVydG9yU2VydmljZS5jb252ZXJ0TGlzdERhdGEobGlzdCk7XG4gICAgICAgIHRoaXMucGVwTGlzdC51cGRhdGVJdGVtcyhjb252ZXJ0ZWRMaXN0LCBldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbG9hZHMgcGFnaW5nIGJ1bGsgZnJvbSBhcGlcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIG9uTG9hZFBhZ2UoZXZlbnQ6IElQZXBMaXN0TG9hZFBhZ2VFdmVudCkge1xuICAgICAgICBjb25zdCBmcm9tSW5kZXggPSBldmVudC5wYWdlSW5kZXggKiBldmVudC5wYWdlU2l6ZTtcbiAgICAgICAgY29uc3QgdG9JbmRleCA9IE1hdGgubWluKGZyb21JbmRleCArIGV2ZW50LnBhZ2VTaXplIC0gMSwgdGhpcy50b3RhbFJvd0NvdW50IC0gMSk7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBhd2FpdCB0aGlzLnVwZGF0ZURhdGFMaXN0KGZyb21JbmRleCwgdG9JbmRleCwgZXZlbnQucGFnZUluZGV4KTtcbiAgICAgICAgY29uc3QgY29udmVydGVkTGlzdCA9IHRoaXMuX2RhdGFDb252ZXJ0b3JTZXJ2aWNlLmNvbnZlcnRMaXN0RGF0YShsaXN0KTtcbiAgICAgICAgdGhpcy5wZXBMaXN0LnVwZGF0ZVBhZ2UoY29udmVydGVkTGlzdCwgZXZlbnQpO1xuICAgIH1cblxuICAgIGdldEl0ZW1CeUlkKGlkOiBzdHJpbmcpOiBPYmplY3RzRGF0YVJvdyB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5wZXBMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGVwTGlzdC5nZXRJdGVtRGF0YUJ5SUQoaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTZWxlY3RlZEl0ZW1zKCk6IFBlcFNlbGVjdGlvbkRhdGEgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMucGVwTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BlcExpc3QuZ2V0U2VsZWN0ZWRJdGVtc0RhdGEoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UGFnZUluZGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXBMaXN0LnBhZ2VJbmRleDtcbiAgICB9XG5cbiAgICBvbkFjdGlvbkl0ZW1DbGlja2VkKGFjdGlvbjogSVBlcE1lbnVJdGVtQ2xpY2tFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmdldE1lbnVPYmplY3RzKCk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5tZW51SGFuZGxlcnNbYWN0aW9uLnNvdXJjZS5rZXldKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uU2VhcmNoQ2hhbmdlZChldmVudDogSVBlcFNlYXJjaENsaWNrRXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hTdHJpbmcgPSBldmVudC52YWx1ZTtcbiAgICAgICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdGVkSXRlbXNDaGFuZ2VkKHNlbGVjdGVkUm93c0NvdW50OiBudW1iZXIpIHtcbiAgICAgICAgLy9sb2FkaW5nIG1lbnUgaXRlbXMgYWZ0ZXIgcGVwLWxpc3Qgc2VsZWN0ZWQgaXRlbXMgYXJlIHVwZGF0ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRNZW51SXRlbXMoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgb25DdXN0b21pemVGaWVsZENsaWNrKGZpZWxkQ2xpY2tFdmVudDogSVBlcEZvcm1GaWVsZENsaWNrRXZlbnQpIHtcbiAgICAgICAgdGhpcy5maWVsZENsaWNrLmVtaXQoZmllbGRDbGlja0V2ZW50KTtcbiAgICB9XG5cbiAgICBvbkJyZWFkQ3J1bWJJdGVtQ2xpY2soZXZlbnQ6IElQZXBCcmVhZENydW1iSXRlbUNsaWNrRXZlbnQpIHtcbiAgICAgICAgdGhpcy5icmVhZENydW1iSXRlbUNsaWNrLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uVmFsdWVDaGFuZ2VkKGV2ZW50OiBJUGVwRm9ybUZpZWxkVmFsdWVDaGFuZ2VFdmVudCkge1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uU29ydGluZ0NoYW5nZShldmVudDogSVBlcExpc3RTb3J0aW5nQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fc29ydGluZyA9IGV2ZW50O1xuICAgICAgICB0aGlzLmluaXRUYWJsZSgpO1xuICAgIH1cblxuICAgIG9uRmlsdGVyc0NoYW5nZShmaWx0ZXJzOiBJUGVwU21hcnRGaWx0ZXJEYXRhW10pIHtcbiAgICAgICAgdGhpcy5fYXBwbGllZEZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICB0aGlzLmluaXRUYWJsZSgpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVzaXplJCkge1xuICAgICAgICAgICAgdGhpcy5fcmVzaXplJC51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9sb2FkZXIkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZXIkLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiIsIjxkaXYgKm5nSWY9XCJpbmxpbmVcIiBjbGFzcz1cImlubGluZS1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7ICdhZGQtcGFkZGluZyc6IGFkZFBhZGRpbmcgfVwiPlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYXJlYVwiID5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dUb3BCYXJcIiBjbGFzcz1cImlubGluZS10b3AtYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRvcEJhclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWRlc2NyaXB0aW9uXCI+e3tkZXNjcmlwdGlvbn19PC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYnJlYWRDcnVtYnNJdGVtcy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJicmVhZENydW1ic1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93U21hcnRGaWx0ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNtYXJ0RmlsdGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cbjxwZXAtcGFnZS1sYXlvdXQgKm5nSWY9XCIhaW5saW5lXCIgY2xhc3M9XCJub25lLWlubGluZVwiIFthZGRQYWRkaW5nXT1cImFkZFBhZGRpbmdcIiBbc2hvd1NoYWRvd109XCJzaG93U21hcnRGaWx0ZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1NtYXJ0RmlsdGVyXCIgcGVwLXNpZGUtYXJlYT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNtYXJ0RmlsdGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1RvcEJhclwiIHBlcC10b3AtYXJlYT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRvcEJhclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRlc2NyaXB0aW9uXCIgcGVwLXRvcC1hcmVhPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1kZXNjcmlwdGlvblwiPnt7ZGVzY3JpcHRpb259fTwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJicmVhZENydW1ic0l0ZW1zLmxlbmd0aFwiIHBlcC10b3AtYXJlYT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJyZWFkQ3J1bWJzVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2IHBlcC1tYWluLWFyZWEgY2xhc3M9XCJtYWluLWFyZWEtY29udGFpbmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvcGVwLXBhZ2UtbGF5b3V0PlxuXG48bmctdGVtcGxhdGUgI3RvcEJhclRlbXBsYXRlPlxuICAgIDxwZXAtdG9wLWJhciBbdGl0bGVdPVwidGl0bGVcIiBbaW5saW5lXT1cImlubGluZVwiPlxuICAgICAgICA8ZGl2IGhlYWRlci1zdGFydC1jb250ZW50PlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2xlZnQtYnV0dG9uc11cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGhlYWRlci1lbmQtY29udGVudD5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltyaWdodC1idXR0b25zXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gPGRpdiBmb290ZXItc3RhcnQtY29udGVudD5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltsZWZ0LWJvdHRvbS1hcmVhXVwiPjwvbmctY29udGVudD4gICAgICAgICAgICAgICBcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgZm9vdGVyLWVuZC1jb250ZW50PlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3JpZ2h0LWJvdHRvbS1hcmVhXVwiPjwvbmctY29udGVudD4gICAgIFxuICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDxwZXAtbGlzdC1hY3Rpb25zICpuZ0lmPVwibWVudUFjdGlvbnMubGVuZ3RoID4gMFwiIFtzaXplVHlwZV09XCJpbmxpbmUgPyAnc20nIDogJ21kJ1wiIFthY3Rpb25zXT1cIm1lbnVBY3Rpb25zXCJcbiAgICAgICAgICAgIChhY3Rpb25DbGljayk9XCJvbkFjdGlvbkl0ZW1DbGlja2VkKCRldmVudClcIj48L3BlcC1saXN0LWFjdGlvbnM+XG4gICAgICAgIDxwZXAtbGlzdC10b3RhbCBbc2l6ZVR5cGVdPVwiaW5saW5lID8gJ3NtJyA6ICdtZCdcIiBbdG90YWxSb3dzXT1cInRvdGFsUm93Q291bnRcIj5cbiAgICAgICAgPC9wZXAtbGlzdC10b3RhbD5cbiAgICAgICAgPHBlcC1zZWFyY2ggI3NlYXJjaCAqbmdJZj1cInNob3dTZWFyY2hcIiBbdmFsdWVdPVwic2VhcmNoU3RyaW5nXCIgW3NpemVUeXBlXT1cImlubGluZSA/ICdzbScgOiAnbWQnXCJcbiAgICAgICAgICAgIChzZWFyY2gpPVwib25TZWFyY2hDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgPC9wZXAtc2VhcmNoPlxuICAgIDwvcGVwLXRvcC1iYXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NtYXJ0RmlsdGVyVGVtcGxhdGU+XG4gICAgPHBlcC1zaWRlLWJhciAjc2lkZU5hdiBbbmdDbGFzc109XCJ7J3NtYXJ0LWZpbHRlci1hcmVhJzogaW5saW5lfVwiPlxuICAgICAgICA8cGVwLXNtYXJ0LWZpbHRlcnMgdGl0bGU9XCJUZXN0IGZpbHRlcnNcIiBbZmllbGRzXT1cImludGVybmFsU21hcnRGaWx0ZXIuZmllbGRzXCJcbiAgICAgICAgICAgIFtmaWx0ZXJzXT1cImludGVybmFsU21hcnRGaWx0ZXIuZGF0YVwiIChmaWx0ZXJzQ2hhbmdlKT1cIm9uRmlsdGVyc0NoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgIDwvcGVwLXNtYXJ0LWZpbHRlcnM+XG4gICAgPC9wZXAtc2lkZS1iYXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2JyZWFkQ3J1bWJzVGVtcGxhdGU+XG4gICAgPHBlcC1icmVhZC1jcnVtYnMgY2xhc3M9XCJicmVhZC1jcnVtYnNcIiBbaXRlbXNdPVwiYnJlYWRDcnVtYnNJdGVtc1wiIFthZGRTcGFjaW5nXT1cInRydWVcIiBbZGlzcGxheVR5cGVdPVwiJ2l0ZW1zJ1wiXG4gICAgICAgIChpdGVtQ2xpY2spPVwib25CcmVhZENydW1iSXRlbUNsaWNrKCRldmVudClcIj48L3BlcC1icmVhZC1jcnVtYnM+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3RUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwibGlzdC1jb250YWluZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAjcGVwTGlzdENvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19