@universis/ngx-tables 6.0.0 → 15.0.3

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 (163) hide show
  1. package/esm2020/lib/actions/table.actions.mjs +27 -0
  2. package/esm2020/lib/advanced-aggregator.mjs +2 -0
  3. package/esm2020/lib/components/add-items/add-items.component.mjs +138 -0
  4. package/esm2020/lib/components/advanced-aggregator/advanced-aggregator.component.mjs +126 -0
  5. package/esm2020/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.mjs +53 -0
  6. package/esm2020/lib/components/advanced-list/advanced-list.component.mjs +184 -0
  7. package/esm2020/lib/components/advanced-row-action/advanced-row-action.component.mjs +178 -0
  8. package/esm2020/lib/components/advanced-search-form/advanced-search-form.component.mjs +154 -0
  9. package/esm2020/lib/components/advanced-select/advanced-select.component.mjs +42 -0
  10. package/esm2020/lib/components/advanced-select/advanced-select.service.mjs +38 -0
  11. package/esm2020/lib/components/advanced-table/advanced-filter-value-provider.service.mjs +31 -0
  12. package/esm2020/lib/components/advanced-table/advanced-table-resolvers.mjs +40 -0
  13. package/esm2020/lib/components/advanced-table/advanced-table-search-base.mjs +31 -0
  14. package/esm2020/lib/components/advanced-table/advanced-table-search.component.mjs +525 -0
  15. package/esm2020/lib/components/advanced-table/advanced-table-settings.component.mjs +108 -0
  16. package/esm2020/lib/components/advanced-table/advanced-table.component.mjs +1599 -0
  17. package/esm2020/lib/components/advanced-table/advanced-table.formatters.interface.mjs +17 -0
  18. package/esm2020/lib/components/advanced-table/advanced-table.formatters.mjs +429 -0
  19. package/esm2020/lib/components/advanced-table/advanced-table.interfaces.mjs +2 -0
  20. package/esm2020/lib/components/advanced-table-modal/advanced-table-modal-base.component.mjs +420 -0
  21. package/esm2020/lib/components/column-selector/column-selector.component.mjs +205 -0
  22. package/esm2020/lib/components/column-selector/column-selector.service.mjs +45 -0
  23. package/esm2020/lib/components/table-simple-header/table-simple-header.component.mjs +52 -0
  24. package/esm2020/lib/directives/advance-search-state.directive.mjs +111 -0
  25. package/esm2020/lib/directives/advance-table-state.directive.mjs +63 -0
  26. package/esm2020/lib/directives/advanced-search-router-state.directive.mjs +64 -0
  27. package/esm2020/lib/directives/advanced-table-editor.directive.mjs +154 -0
  28. package/esm2020/lib/directives/btnexp.directive.mjs +222 -0
  29. package/esm2020/lib/i18n/tables.el.mjs +129 -0
  30. package/esm2020/lib/i18n/tables.en.mjs +128 -0
  31. package/esm2020/lib/pipes/advanced-aggregator.pipe.mjs +38 -0
  32. package/esm2020/lib/pipes/advansed-aggregator-list-title-parse.pipe.mjs +45 -0
  33. package/esm2020/lib/reducers/index.mjs +37 -0
  34. package/esm2020/lib/services/advanced-aggregator/advanced-aggregator.service.mjs +119 -0
  35. package/esm2020/lib/tables.activated-table.service.mjs +46 -0
  36. package/esm2020/lib/tables.module.mjs +218 -0
  37. package/esm2020/public_api.mjs +37 -0
  38. package/esm2020/universis-ngx-tables.mjs +5 -0
  39. package/fesm2015/universis-ngx-tables.mjs +5642 -0
  40. package/fesm2015/universis-ngx-tables.mjs.map +1 -0
  41. package/fesm2020/universis-ngx-tables.mjs +5609 -0
  42. package/fesm2020/universis-ngx-tables.mjs.map +1 -0
  43. package/index.d.ts +5 -0
  44. package/lib/actions/table.actions.d.ts +4 -4
  45. package/lib/components/add-items/add-items.component.d.ts +8 -8
  46. package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +10 -4
  47. package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +4 -1
  48. package/lib/components/advanced-list/advanced-list.component.d.ts +6 -3
  49. package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +9 -7
  50. package/lib/components/advanced-search-form/advanced-search-form.component.d.ts +4 -1
  51. package/lib/components/advanced-select/advanced-select.component.d.ts +3 -1
  52. package/lib/components/advanced-select/advanced-select.service.d.ts +3 -0
  53. package/lib/components/advanced-table/advanced-filter-value-provider.service.d.ts +3 -0
  54. package/lib/components/advanced-table/advanced-table-resolvers.d.ts +5 -0
  55. package/lib/components/advanced-table/advanced-table-search-base.d.ts +6 -2
  56. package/lib/components/advanced-table/advanced-table-search.component.d.ts +6 -2
  57. package/lib/components/advanced-table/advanced-table-settings.component.d.ts +3 -0
  58. package/lib/components/advanced-table/advanced-table.component.d.ts +21 -12
  59. package/lib/components/advanced-table-modal/advanced-table-modal-base.component.d.ts +4 -1
  60. package/lib/components/column-selector/column-selector.component.d.ts +8 -5
  61. package/lib/components/column-selector/column-selector.service.d.ts +3 -0
  62. package/lib/components/table-simple-header/table-simple-header.component.d.ts +8 -3
  63. package/lib/directives/advance-search-state.directive.d.ts +3 -0
  64. package/lib/directives/advance-table-state.directive.d.ts +3 -0
  65. package/lib/directives/advanced-search-router-state.directive.d.ts +3 -0
  66. package/lib/directives/advanced-table-editor.directive.d.ts +4 -1
  67. package/lib/directives/btnexp.directive.d.ts +3 -0
  68. package/lib/i18n/tables.el.d.ts +107 -107
  69. package/lib/i18n/tables.en.d.ts +106 -106
  70. package/lib/pipes/advanced-aggregator.pipe.d.ts +4 -1
  71. package/lib/pipes/advansed-aggregator-list-title-parse.pipe.d.ts +4 -1
  72. package/lib/reducers/index.d.ts +5 -3
  73. package/lib/services/advanced-aggregator/advanced-aggregator.service.d.ts +3 -0
  74. package/lib/tables.activated-table.service.d.ts +5 -1
  75. package/lib/tables.module.d.ts +36 -0
  76. package/package.json +44 -42
  77. package/public_api.d.ts +3 -0
  78. package/bundles/universis-ngx-tables.umd.js +0 -8161
  79. package/bundles/universis-ngx-tables.umd.js.map +0 -1
  80. package/bundles/universis-ngx-tables.umd.min.js +0 -2
  81. package/bundles/universis-ngx-tables.umd.min.js.map +0 -1
  82. package/esm2015/lib/actions/table.actions.js +0 -69
  83. package/esm2015/lib/advanced-aggregator.js +0 -6
  84. package/esm2015/lib/components/add-items/add-items.component.js +0 -209
  85. package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -190
  86. package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -80
  87. package/esm2015/lib/components/advanced-list/advanced-list.component.js +0 -245
  88. package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +0 -265
  89. package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +0 -213
  90. package/esm2015/lib/components/advanced-select/advanced-select.component.js +0 -97
  91. package/esm2015/lib/components/advanced-select/advanced-select.service.js +0 -57
  92. package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -58
  93. package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +0 -72
  94. package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +0 -49
  95. package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +0 -718
  96. package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +0 -191
  97. package/esm2015/lib/components/advanced-table/advanced-table.component.js +0 -1973
  98. package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -53
  99. package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +0 -642
  100. package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +0 -6
  101. package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -553
  102. package/esm2015/lib/components/column-selector/column-selector.component.js +0 -296
  103. package/esm2015/lib/components/column-selector/column-selector.service.js +0 -64
  104. package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +0 -76
  105. package/esm2015/lib/directives/advance-search-state.directive.js +0 -147
  106. package/esm2015/lib/directives/advance-table-state.directive.js +0 -86
  107. package/esm2015/lib/directives/advanced-search-router-state.directive.js +0 -90
  108. package/esm2015/lib/directives/advanced-table-editor.directive.js +0 -186
  109. package/esm2015/lib/directives/btnexp.directive.js +0 -272
  110. package/esm2015/lib/i18n/tables.el.js +0 -133
  111. package/esm2015/lib/i18n/tables.en.js +0 -132
  112. package/esm2015/lib/pipes/advanced-aggregator.pipe.js +0 -39
  113. package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -58
  114. package/esm2015/lib/reducers/index.js +0 -63
  115. package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -142
  116. package/esm2015/lib/tables.activated-table.service.js +0 -85
  117. package/esm2015/lib/tables.module.js +0 -163
  118. package/esm2015/public_api.js +0 -37
  119. package/esm2015/universis-ngx-tables.js +0 -13
  120. package/esm5/lib/actions/table.actions.js +0 -64
  121. package/esm5/lib/advanced-aggregator.js +0 -6
  122. package/esm5/lib/components/add-items/add-items.component.js +0 -243
  123. package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -265
  124. package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -99
  125. package/esm5/lib/components/advanced-list/advanced-list.component.js +0 -273
  126. package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +0 -288
  127. package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +0 -232
  128. package/esm5/lib/components/advanced-select/advanced-select.component.js +0 -103
  129. package/esm5/lib/components/advanced-select/advanced-select.service.js +0 -61
  130. package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -82
  131. package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +0 -80
  132. package/esm5/lib/components/advanced-table/advanced-table-search-base.js +0 -59
  133. package/esm5/lib/components/advanced-table/advanced-table-search.component.js +0 -828
  134. package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +0 -212
  135. package/esm5/lib/components/advanced-table/advanced-table.component.js +0 -2145
  136. package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -53
  137. package/esm5/lib/components/advanced-table/advanced-table.formatters.js +0 -815
  138. package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +0 -6
  139. package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -555
  140. package/esm5/lib/components/column-selector/column-selector.component.js +0 -389
  141. package/esm5/lib/components/column-selector/column-selector.service.js +0 -68
  142. package/esm5/lib/components/table-simple-header/table-simple-header.component.js +0 -92
  143. package/esm5/lib/directives/advance-search-state.directive.js +0 -169
  144. package/esm5/lib/directives/advance-table-state.directive.js +0 -87
  145. package/esm5/lib/directives/advanced-search-router-state.directive.js +0 -98
  146. package/esm5/lib/directives/advanced-table-editor.directive.js +0 -244
  147. package/esm5/lib/directives/btnexp.directive.js +0 -389
  148. package/esm5/lib/i18n/tables.el.js +0 -133
  149. package/esm5/lib/i18n/tables.en.js +0 -132
  150. package/esm5/lib/pipes/advanced-aggregator.pipe.js +0 -65
  151. package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -75
  152. package/esm5/lib/reducers/index.js +0 -65
  153. package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -196
  154. package/esm5/lib/tables.activated-table.service.js +0 -88
  155. package/esm5/lib/tables.module.js +0 -168
  156. package/esm5/public_api.js +0 -37
  157. package/esm5/universis-ngx-tables.js +0 -13
  158. package/fesm2015/universis-ngx-tables.js +0 -6745
  159. package/fesm2015/universis-ngx-tables.js.map +0 -1
  160. package/fesm5/universis-ngx-tables.js +0 -7837
  161. package/fesm5/universis-ngx-tables.js.map +0 -1
  162. package/universis-ngx-tables.d.ts +0 -8
  163. package/universis-ngx-tables.metadata.json +0 -1
@@ -1,815 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { template, at } from 'lodash';
7
- import { TranslateService } from '@ngx-translate/core';
8
- import { DatePipe } from '@angular/common';
9
- import * as ISO6391 from 'iso-639-1/build';
10
- import { ActivatedRoute, Router } from '@angular/router';
11
- /**
12
- * @abstract
13
- */
14
- var AdvancedColumnFormatter = /** @class */ (function () {
15
- function AdvancedColumnFormatter() {
16
- this.title = '';
17
- }
18
- /**
19
- * @param {?} expr
20
- * @return {?}
21
- */
22
- AdvancedColumnFormatter.template = /**
23
- * @param {?} expr
24
- * @return {?}
25
- */
26
- function (expr) {
27
- /** @type {?} */
28
- var result = AdvancedColumnFormatter.templateCache.get(expr);
29
- if (typeof result === 'function') {
30
- return result;
31
- }
32
- result = template(expr);
33
- AdvancedColumnFormatter.templateCache.set(expr, result);
34
- return result;
35
- };
36
- /**
37
- * @param {?} data
38
- * @param {?} options
39
- * @return {?}
40
- */
41
- AdvancedColumnFormatter.prototype.createUrlTree = /**
42
- * @param {?} data
43
- * @param {?} options
44
- * @return {?}
45
- */
46
- function (data, options) {
47
- if (Array.isArray(options.commands) && this.injector) {
48
- /** @type {?} */
49
- var activatedRoute = this.injector.get(ActivatedRoute);
50
- /** @type {?} */
51
- var router = this.injector.get(Router);
52
- /** @type {?} */
53
- var commands = options.commands.map(function (command) {
54
- if (typeof command === 'string') {
55
- return AdvancedColumnFormatter.template(command)(data);
56
- }
57
- if (command.outlets) {
58
- /** @type {?} */
59
- var commandOutlets_1 = {};
60
- Object.keys(command.outlets).forEach(function (key) {
61
- if (Object.prototype.hasOwnProperty.call(command.outlets, key)) {
62
- /** @type {?} */
63
- var outlet = command.outlets[key];
64
- if (Array.isArray(outlet)) {
65
- Object.defineProperty(commandOutlets_1, key, {
66
- enumerable: true,
67
- configurable: true,
68
- writable: true,
69
- value: outlet.map(function (x) {
70
- return AdvancedColumnFormatter.template(x)(data);
71
- }),
72
- });
73
- }
74
- else {
75
- Object.defineProperty(commandOutlets_1, key, {
76
- enumerable: true,
77
- configurable: true,
78
- writable: true,
79
- value: outlet,
80
- });
81
- }
82
- }
83
- });
84
- return {
85
- outlets: commandOutlets_1,
86
- };
87
- }
88
- return command;
89
- });
90
- /** @type {?} */
91
- var queryParams_1 = {};
92
- /** @type {?} */
93
- var replaceUrl = true;
94
- /** @type {?} */
95
- var queryParamExtras_1 = options.navigationExtras && options.navigationExtras.queryParams;
96
- if (queryParamExtras_1) {
97
- Object.keys(queryParamExtras_1).map(function (key) {
98
- /** @type {?} */
99
- var text = queryParamExtras_1[key];
100
- queryParams_1[key] = AdvancedColumnFormatter.template(text)(data);
101
- });
102
- }
103
- if (options.navigationExtras && typeof options.navigationExtras.replaceUrl !== 'undefined') {
104
- replaceUrl = options.navigationExtras.replaceUrl;
105
- }
106
- /** @type {?} */
107
- var skipLocationChange = false;
108
- if (options.navigationExtras && typeof options.navigationExtras.skipLocationChange !== 'undefined') {
109
- skipLocationChange = options.navigationExtras.skipLocationChange;
110
- }
111
- /** @type {?} */
112
- var fragment = void 0;
113
- if (options.navigationExtras && typeof options.navigationExtras.fragment !== 'undefined') {
114
- fragment = options.navigationExtras.fragment;
115
- }
116
- return router.createUrlTree(commands, {
117
- fragment: fragment,
118
- relativeTo: activatedRoute,
119
- queryParams: queryParams_1,
120
- replaceUrl: replaceUrl,
121
- skipLocationChange: skipLocationChange,
122
- });
123
- }
124
- };
125
- AdvancedColumnFormatter.templateCache = new Map();
126
- return AdvancedColumnFormatter;
127
- }());
128
- export { AdvancedColumnFormatter };
129
- if (false) {
130
- /** @type {?} */
131
- AdvancedColumnFormatter.templateCache;
132
- /** @type {?} */
133
- AdvancedColumnFormatter.prototype.injector;
134
- /** @type {?} */
135
- AdvancedColumnFormatter.prototype.className;
136
- /** @type {?} */
137
- AdvancedColumnFormatter.prototype.defaultContent;
138
- /** @type {?} */
139
- AdvancedColumnFormatter.prototype.formatString;
140
- /** @type {?} */
141
- AdvancedColumnFormatter.prototype.formatter;
142
- /** @type {?} */
143
- AdvancedColumnFormatter.prototype.hidden;
144
- /** @type {?} */
145
- AdvancedColumnFormatter.prototype.name;
146
- /** @type {?} */
147
- AdvancedColumnFormatter.prototype.order;
148
- /** @type {?} */
149
- AdvancedColumnFormatter.prototype.property;
150
- /** @type {?} */
151
- AdvancedColumnFormatter.prototype.sortable;
152
- /** @type {?} */
153
- AdvancedColumnFormatter.prototype.title;
154
- /** @type {?} */
155
- AdvancedColumnFormatter.prototype.formatOptions;
156
- /** @type {?} */
157
- AdvancedColumnFormatter.prototype.actions;
158
- /**
159
- * @abstract
160
- * @param {?} data
161
- * @param {?} type
162
- * @param {?} row
163
- * @param {?} meta
164
- * @return {?}
165
- */
166
- AdvancedColumnFormatter.prototype.render = function (data, type, row, meta) { };
167
- }
168
- /**
169
- * @record
170
- */
171
- export function OnAdvancedColumnAfterRender() { }
172
- /** @type {?} */
173
- OnAdvancedColumnAfterRender.prototype.afterRender;
174
- var NestedPropertyFormatter = /** @class */ (function (_super) {
175
- tslib_1.__extends(NestedPropertyFormatter, _super);
176
- function NestedPropertyFormatter() {
177
- return _super.call(this) || this;
178
- }
179
- /**
180
- * @param {?} data
181
- * @param {?} type
182
- * @param {?} row
183
- * @param {?} meta
184
- * @return {?}
185
- */
186
- NestedPropertyFormatter.prototype.render = /**
187
- * @param {?} data
188
- * @param {?} type
189
- * @param {?} row
190
- * @param {?} meta
191
- * @return {?}
192
- */
193
- function (data, type, row, meta) {
194
- /** @type {?} */
195
- var column = meta.settings.aoColumns[meta.col];
196
- if (column && column.data) {
197
- return at(row, column.data.replace(/\//g, '.'));
198
- }
199
- return data;
200
- };
201
- return NestedPropertyFormatter;
202
- }(AdvancedColumnFormatter));
203
- export { NestedPropertyFormatter };
204
- var ButtonFormatter = /** @class */ (function (_super) {
205
- tslib_1.__extends(ButtonFormatter, _super);
206
- function ButtonFormatter() {
207
- return _super.call(this) || this;
208
- }
209
- /**
210
- * @param {?} data
211
- * @param {?} type
212
- * @param {?} row
213
- * @param {?} meta
214
- * @return {?}
215
- */
216
- ButtonFormatter.prototype.render = /**
217
- * @param {?} data
218
- * @param {?} type
219
- * @param {?} row
220
- * @param {?} meta
221
- * @return {?}
222
- */
223
- function (data, type, row, meta) {
224
- if (data == null || this.injector == null) {
225
- return '';
226
- }
227
- /** @type {?} */
228
- var formatOptions = Object.assign({
229
- buttonClass: 'btn btn-default',
230
- }, this.formatOptions);
231
- /** @type {?} */
232
- var buttonText;
233
- /** @type {?} */
234
- var buttonTitle = '';
235
- if (formatOptions.buttonText) {
236
- buttonText = this.injector.get(TranslateService).instant(formatOptions.buttonText);
237
- }
238
- else {
239
- buttonText = formatOptions.buttonContent;
240
- }
241
- if (formatOptions.buttonTitle) {
242
- buttonTitle = this.injector.get(TranslateService).instant(formatOptions.buttonTitle);
243
- }
244
- if (Array.isArray(this.formatOptions.commands)) {
245
- /** @type {?} */
246
- var routerLink = this.createUrlTree(row, this.formatOptions);
247
- return "<a class=\"" + formatOptions.buttonClass + "\" title=\"" + buttonTitle + "\" href=\"#" + routerLink + "\">" + buttonText + "</a>";
248
- }
249
- /** @type {?} */
250
- var href = AdvancedColumnFormatter.template(/** @type {?} */ (this.formatString))(row);
251
- return "<a class=\"" + formatOptions.buttonClass + "\" title=\"" + buttonTitle + "\" href=\"" + href + "\">" + buttonText + "</a>";
252
- };
253
- return ButtonFormatter;
254
- }(AdvancedColumnFormatter));
255
- export { ButtonFormatter };
256
- var LinkFormatter = /** @class */ (function (_super) {
257
- tslib_1.__extends(LinkFormatter, _super);
258
- function LinkFormatter() {
259
- return _super.call(this) || this;
260
- }
261
- /**
262
- * @param {?} data
263
- * @param {?} type
264
- * @param {?} row
265
- * @param {?} meta
266
- * @return {?}
267
- */
268
- LinkFormatter.prototype.render = /**
269
- * @param {?} data
270
- * @param {?} type
271
- * @param {?} row
272
- * @param {?} meta
273
- * @return {?}
274
- */
275
- function (data, type, row, meta) {
276
- /** @type {?} */
277
- var column = meta.settings.aoColumns[meta.col];
278
- if (column && column.data) {
279
- return "<a href=\"" + (AdvancedColumnFormatter.template((/** @type {?} */ (this.formatString)))(row)) + "\">" + data + "</a>";
280
- }
281
- return data;
282
- };
283
- return LinkFormatter;
284
- }(AdvancedColumnFormatter));
285
- export { LinkFormatter };
286
- var ActionLinkFormatter = /** @class */ (function (_super) {
287
- tslib_1.__extends(ActionLinkFormatter, _super);
288
- function ActionLinkFormatter() {
289
- return _super.call(this) || this;
290
- }
291
- /**
292
- * @param {?} data
293
- * @param {?} type
294
- * @param {?} row
295
- * @param {?} meta
296
- * @return {?}
297
- */
298
- ActionLinkFormatter.prototype.render = /**
299
- * @param {?} data
300
- * @param {?} type
301
- * @param {?} row
302
- * @param {?} meta
303
- * @return {?}
304
- */
305
- function (data, type, row, meta) {
306
- var _this = this;
307
- var e_1, _a;
308
- /** @type {?} */
309
- var column = meta.settings.aoColumns[meta.col];
310
- if (column && column.data) {
311
- /** @type {?} */
312
- var actions = this.actions || [];
313
- /** @type {?} */
314
- var index = 1;
315
- try {
316
- for (var actions_1 = tslib_1.__values(actions), actions_1_1 = actions_1.next(); !actions_1_1.done; actions_1_1 = actions_1.next()) {
317
- var action = actions_1_1.value;
318
- Object.assign(action, {
319
- name: action.name || "action" + index,
320
- });
321
- index += 1;
322
- }
323
- }
324
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
325
- finally {
326
- try {
327
- if (actions_1_1 && !actions_1_1.done && (_a = actions_1.return)) _a.call(actions_1);
328
- }
329
- finally { if (e_1) throw e_1.error; }
330
- }
331
- // return the dropdown menu with 3 dots
332
- return "<div class='dropdown details-control' data-id='" + data + "' data-type='student' >\n <a id=\"dropdownMenuButton-" + data + "\"\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\n <span class=\"fa-2x text-dots\"></span>\n </a>\n <div class=\"dropdown-menu\" aria-labelledby=\"dropdownMenuButton-" + data + "\">\n " + actions.map(function (x) {
333
- if (x.type === 'divider') {
334
- return "<div class=\"dropdown-divider\"></div>";
335
- }
336
- if (x.formatOptions && x.formatOptions.commands) {
337
- /** @type {?} */
338
- var urlTree = _this.createUrlTree(row, x.formatOptions);
339
- return "<a data-name='" + x.name + "' class=\"dropdown-item" + (typeof x.className === 'string' && x.className.length
340
- ? " " + x.className.trim() : '') + "\" href=\"#" + (urlTree && urlTree.toString()) + "\">\n " + (_this.injector && _this.injector.get(TranslateService).instant(x.title)) + "\n </a>";
341
- }
342
- return "<a data-name='" + x.name + "' class=\"dropdown-item" + (typeof x.className === 'string' && x.className.length
343
- ? " " + x.className.trim() : '') + "\" href=\"" + AdvancedColumnFormatter.template(x.href)(row) + "\">\n " + (_this.injector && _this.injector.get(TranslateService).instant(x.title)) + "\n </a>";
344
- })
345
- .join('') + "\n </div>\n </div>";
346
- }
347
- return data;
348
- };
349
- /**
350
- * @param {?} cell
351
- * @param {?} cellData
352
- * @param {?} rowData
353
- * @param {?} rowIndex
354
- * @param {?} colIndex
355
- * @return {?}
356
- */
357
- ActionLinkFormatter.prototype.afterRender = /**
358
- * @param {?} cell
359
- * @param {?} cellData
360
- * @param {?} rowData
361
- * @param {?} rowIndex
362
- * @param {?} colIndex
363
- * @return {?}
364
- */
365
- function (cell, cellData, rowData, rowIndex, colIndex) {
366
- // assign bootstrap dropdown (?)
367
- };
368
- return ActionLinkFormatter;
369
- }(AdvancedColumnFormatter));
370
- export { ActionLinkFormatter };
371
- var ActionButtonFormatter = /** @class */ (function (_super) {
372
- tslib_1.__extends(ActionButtonFormatter, _super);
373
- function ActionButtonFormatter() {
374
- return _super.call(this) || this;
375
- }
376
- /**
377
- * @param {?} data
378
- * @param {?} type
379
- * @param {?} row
380
- * @param {?} meta
381
- * @return {?}
382
- */
383
- ActionButtonFormatter.prototype.render = /**
384
- * @param {?} data
385
- * @param {?} type
386
- * @param {?} row
387
- * @param {?} meta
388
- * @return {?}
389
- */
390
- function (data, type, row, meta) {
391
- var _this = this;
392
- var e_2, _a;
393
- /** @type {?} */
394
- var column = meta.settings.aoColumns[meta.col];
395
- if (column && column.data && this.injector) {
396
- /** @type {?} */
397
- var actions = this.actions || [];
398
- /** @type {?} */
399
- var index = 1;
400
- try {
401
- for (var actions_2 = tslib_1.__values(actions), actions_2_1 = actions_2.next(); !actions_2_1.done; actions_2_1 = actions_2.next()) {
402
- var action = actions_2_1.value;
403
- Object.assign(action, {
404
- name: action.name || "action" + index,
405
- });
406
- index += 1;
407
- }
408
- }
409
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
410
- finally {
411
- try {
412
- if (actions_2_1 && !actions_2_1.done && (_a = actions_2.return)) _a.call(actions_2);
413
- }
414
- finally { if (e_2) throw e_2.error; }
415
- }
416
- /** @type {?} */
417
- var buttonText = void 0;
418
- if (this.formatOptions && this.formatOptions.buttonText) {
419
- // if button text is a literal expression
420
- if (this.formatOptions.buttonText.includes('${')) {
421
- // use template
422
- buttonText = AdvancedColumnFormatter.template(this.formatOptions.buttonText)(row);
423
- }
424
- else {
425
- // otherwise translate it
426
- buttonText = this.injector.get(TranslateService).instant(this.formatOptions.buttonText);
427
- }
428
- }
429
- /** @type {?} */
430
- var buttonTitle = void 0;
431
- if (this.formatOptions && this.formatOptions.buttonTitle) {
432
- buttonTitle = this.injector.get(TranslateService).instant(this.formatOptions.buttonTbuttonTitleext);
433
- }
434
- /** @type {?} */
435
- var buttonClass = (this.formatOptions && this.formatOptions.buttonClass) || 'btn btn-light';
436
- // return the dropdown menu with 3 dots
437
- return "<div class='dropdown details-control' data-id='" + data + "'>\n <a class=\"" + buttonClass + " dropdown-toggle\" href=\"#\" role=\"button\" title=\"" + buttonTitle + "\"\n id=\"dropdownMenuButton-" + data + "\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\n " + buttonText + "\n </a>\n <div class=\"dropdown-menu\" aria-labelledby=\"dropdownMenuButton-" + data + "\">\n " + actions.map(function (x) {
438
- if (x.type === 'divider') {
439
- return "<div class=\"dropdown-divider\"></div>";
440
- }
441
- if (x.commands) {
442
- /** @type {?} */
443
- var urlTree = _this.createUrlTree(row, x);
444
- return "<a class=\"dropdown-item\" href=\"#" + (urlTree && urlTree.toString()) + "\">\n " + (_this.injector && _this.injector.get(TranslateService).instant(x.title)) + "\n </a>";
445
- }
446
- return "<a class=\"dropdown-item\" href=\"" + AdvancedColumnFormatter.template(x.href)(row) + "\">\n " + (_this.injector && _this.injector.get(TranslateService).instant(x.title)) + "\n </a>";
447
- })
448
- .join('') + "\n </div>\n </div>";
449
- }
450
- return data;
451
- };
452
- /**
453
- * @param {?} cell
454
- * @param {?} cellData
455
- * @param {?} rowData
456
- * @param {?} rowIndex
457
- * @param {?} colIndex
458
- * @return {?}
459
- */
460
- ActionButtonFormatter.prototype.afterRender = /**
461
- * @param {?} cell
462
- * @param {?} cellData
463
- * @param {?} rowData
464
- * @param {?} rowIndex
465
- * @param {?} colIndex
466
- * @return {?}
467
- */
468
- function (cell, cellData, rowData, rowIndex, colIndex) {
469
- // assign bootstrap dropdown (?)
470
- };
471
- return ActionButtonFormatter;
472
- }(AdvancedColumnFormatter));
473
- export { ActionButtonFormatter };
474
- var ActionSplitButtonFormatter = /** @class */ (function (_super) {
475
- tslib_1.__extends(ActionSplitButtonFormatter, _super);
476
- function ActionSplitButtonFormatter() {
477
- return _super.call(this) || this;
478
- }
479
- /**
480
- * @param {?} data
481
- * @param {?} type
482
- * @param {?} row
483
- * @param {?} meta
484
- * @return {?}
485
- */
486
- ActionSplitButtonFormatter.prototype.render = /**
487
- * @param {?} data
488
- * @param {?} type
489
- * @param {?} row
490
- * @param {?} meta
491
- * @return {?}
492
- */
493
- function (data, type, row, meta) {
494
- var _this = this;
495
- var e_3, _a;
496
- /** @type {?} */
497
- var column = meta.settings.aoColumns[meta.col];
498
- if (column && column.data) {
499
- /** @type {?} */
500
- var actions = this.actions || [];
501
- /** @type {?} */
502
- var index = 1;
503
- try {
504
- for (var actions_3 = tslib_1.__values(actions), actions_3_1 = actions_3.next(); !actions_3_1.done; actions_3_1 = actions_3.next()) {
505
- var action = actions_3_1.value;
506
- Object.assign(action, {
507
- name: action.name || "action" + index,
508
- });
509
- index += 1;
510
- }
511
- }
512
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
513
- finally {
514
- try {
515
- if (actions_3_1 && !actions_3_1.done && (_a = actions_3.return)) _a.call(actions_3);
516
- }
517
- finally { if (e_3) throw e_3.error; }
518
- }
519
- if (actions.length === 0) {
520
- return;
521
- }
522
- /** @type {?} */
523
- var buttonClass = (this.formatOptions && this.formatOptions.buttonClass) || 'btn btn-light';
524
- /** @type {?} */
525
- var defaultAction = actions[0];
526
- /** @type {?} */
527
- var defaultActionHref = void 0;
528
- if (defaultAction && defaultAction.commands) {
529
- /** @type {?} */
530
- var urlTree = this.createUrlTree(row, defaultAction);
531
- defaultActionHref = '#' + (urlTree && urlTree.toString());
532
- }
533
- else {
534
- defaultActionHref = AdvancedColumnFormatter.template(defaultAction.href)(row);
535
- }
536
- return "<div class=\"btn-group\">\n <a type=\"button\" class=\"" + buttonClass + "\" href=\"" + defaultActionHref + "\">\n " + (this.injector && this.injector.get(TranslateService).instant(defaultAction.title)) + "\n </a>\n <button type=\"button\" class=\"" + buttonClass + " dropdown-toggle dropdown-toggle-split\"\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\n <span class=\"sr-only\">" + (this.injector && this.injector.get(TranslateService).instant('Toggle Dropdown')) + "</span>\n </button>\n <div class=\"dropdown-menu\" aria-labelledby=\"dropdownMenuButton-" + data + "\">\n " + actions.map(function (x) {
537
- if (x.title === '-') {
538
- return "<div class=\"dropdown-divider\"></div>";
539
- }
540
- if (x.commands) {
541
- /** @type {?} */
542
- var urlTree = _this.createUrlTree(row, x);
543
- return "<a class=\"dropdown-item\" href=\"#" + (urlTree && urlTree.toString()) + "\">\n " + (_this.injector && _this.injector.get(TranslateService).instant(x.title)) + "\n </a>";
544
- }
545
- return "<a class=\"dropdown-item\" href=\"" + AdvancedColumnFormatter.template(x.href)(row) + "\">\n " + (_this.injector && _this.injector.get(TranslateService).instant(x.title)) + "\n </a>";
546
- })
547
- .join('') + "\n </div>\n </div>";
548
- }
549
- return data;
550
- };
551
- /**
552
- * @param {?} cell
553
- * @param {?} cellData
554
- * @param {?} rowData
555
- * @param {?} rowIndex
556
- * @param {?} colIndex
557
- * @return {?}
558
- */
559
- ActionSplitButtonFormatter.prototype.afterRender = /**
560
- * @param {?} cell
561
- * @param {?} cellData
562
- * @param {?} rowData
563
- * @param {?} rowIndex
564
- * @param {?} colIndex
565
- * @return {?}
566
- */
567
- function (cell, cellData, rowData, rowIndex, colIndex) {
568
- // assign bootstrap dropdown (?)
569
- };
570
- return ActionSplitButtonFormatter;
571
- }(AdvancedColumnFormatter));
572
- export { ActionSplitButtonFormatter };
573
- var SelectRowFormatter = /** @class */ (function (_super) {
574
- tslib_1.__extends(SelectRowFormatter, _super);
575
- function SelectRowFormatter() {
576
- return _super.call(this) || this;
577
- }
578
- /**
579
- * @param {?} data
580
- * @param {?} type
581
- * @param {?} row
582
- * @param {?} meta
583
- * @return {?}
584
- */
585
- SelectRowFormatter.prototype.render = /**
586
- * @param {?} data
587
- * @param {?} type
588
- * @param {?} row
589
- * @param {?} meta
590
- * @return {?}
591
- */
592
- function (data, type, row, meta) {
593
- /** @type {?} */
594
- var column = meta.settings.aoColumns[meta.col];
595
- if (column && column.data) {
596
- /** @type {?} */
597
- var _tpl = "<input class=\"checkbox checkbox-theme\" type=\"checkbox\"\n id=\"s-" + meta.row + "\" /><label for=\"s-" + meta.row + "\">&nbsp;</label>";
598
- return AdvancedColumnFormatter.template(_tpl)(row);
599
- }
600
- return data;
601
- };
602
- return SelectRowFormatter;
603
- }(AdvancedColumnFormatter));
604
- export { SelectRowFormatter };
605
- var TemplateFormatter = /** @class */ (function (_super) {
606
- tslib_1.__extends(TemplateFormatter, _super);
607
- function TemplateFormatter() {
608
- return _super.call(this) || this;
609
- }
610
- /**
611
- * @param {?} data
612
- * @param {?} type
613
- * @param {?} row
614
- * @param {?} meta
615
- * @return {?}
616
- */
617
- TemplateFormatter.prototype.render = /**
618
- * @param {?} data
619
- * @param {?} type
620
- * @param {?} row
621
- * @param {?} meta
622
- * @return {?}
623
- */
624
- function (data, type, row, meta) {
625
- /** @type {?} */
626
- var column = meta.settings.aoColumns[meta.col];
627
- if (column && column.data) {
628
- return AdvancedColumnFormatter.template(/** @type {?} */ (this.formatString))(row);
629
- }
630
- return data;
631
- };
632
- return TemplateFormatter;
633
- }(AdvancedColumnFormatter));
634
- export { TemplateFormatter };
635
- var TrueFalseFormatter = /** @class */ (function (_super) {
636
- tslib_1.__extends(TrueFalseFormatter, _super);
637
- function TrueFalseFormatter() {
638
- return _super.call(this) || this;
639
- }
640
- /**
641
- * @param {?} data
642
- * @param {?} type
643
- * @param {?} row
644
- * @param {?} meta
645
- * @return {?}
646
- */
647
- TrueFalseFormatter.prototype.render = /**
648
- * @param {?} data
649
- * @param {?} type
650
- * @param {?} row
651
- * @param {?} meta
652
- * @return {?}
653
- */
654
- function (data, type, row, meta) {
655
- return data ? (this.injector && this.injector.get(TranslateService).instant('TrueFalse.long.Yes')) :
656
- (this.injector && this.injector.get(TranslateService).instant('TrueFalse.long.No'));
657
- };
658
- return TrueFalseFormatter;
659
- }(AdvancedColumnFormatter));
660
- export { TrueFalseFormatter };
661
- var TranslationFormatter = /** @class */ (function (_super) {
662
- tslib_1.__extends(TranslationFormatter, _super);
663
- function TranslationFormatter() {
664
- return _super.call(this) || this;
665
- }
666
- /**
667
- * @param {?} data
668
- * @param {?} type
669
- * @param {?} row
670
- * @param {?} meta
671
- * @return {?}
672
- */
673
- TranslationFormatter.prototype.render = /**
674
- * @param {?} data
675
- * @param {?} type
676
- * @param {?} row
677
- * @param {?} meta
678
- * @return {?}
679
- */
680
- function (data, type, row, meta) {
681
- /** @type {?} */
682
- var column = meta.settings.aoColumns[meta.col];
683
- if (column && data != null) {
684
- return this.injector && this.injector.get(TranslateService).instant(AdvancedColumnFormatter.template(/** @type {?} */ (this.formatString))({
685
- value: data,
686
- }));
687
- }
688
- return this.injector && this.injector.get(TranslateService).instant('Unknown');
689
- };
690
- return TranslationFormatter;
691
- }(AdvancedColumnFormatter));
692
- export { TranslationFormatter };
693
- var DateTimeFormatter = /** @class */ (function (_super) {
694
- tslib_1.__extends(DateTimeFormatter, _super);
695
- function DateTimeFormatter() {
696
- return _super.call(this) || this;
697
- }
698
- /**
699
- * @param {?} data
700
- * @param {?} type
701
- * @param {?} row
702
- * @param {?} meta
703
- * @return {?}
704
- */
705
- DateTimeFormatter.prototype.render = /**
706
- * @param {?} data
707
- * @param {?} type
708
- * @param {?} row
709
- * @param {?} meta
710
- * @return {?}
711
- */
712
- function (data, type, row, meta) {
713
- /** @type {?} */
714
- var column = meta.settings.aoColumns[meta.col];
715
- if (column && column.data && this.injector) {
716
- /** @type {?} */
717
- var datePipe = new DatePipe(this.injector.get(TranslateService).currentLang);
718
- if (typeof data === 'string' && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}$/.test(data)) {
719
- return datePipe.transform(new Date(data + ':00'), this.formatString);
720
- }
721
- return datePipe.transform(data, this.formatString);
722
- }
723
- return data;
724
- };
725
- return DateTimeFormatter;
726
- }(AdvancedColumnFormatter));
727
- export { DateTimeFormatter };
728
- var NgClassFormatter = /** @class */ (function (_super) {
729
- tslib_1.__extends(NgClassFormatter, _super);
730
- function NgClassFormatter() {
731
- return _super.call(this) || this;
732
- }
733
- /**
734
- * @param {?} data
735
- * @param {?} type
736
- * @param {?} row
737
- * @param {?} meta
738
- * @return {?}
739
- */
740
- NgClassFormatter.prototype.render = /**
741
- * @param {?} data
742
- * @param {?} type
743
- * @param {?} row
744
- * @param {?} meta
745
- * @return {?}
746
- */
747
- function (data, type, row, meta) {
748
- var e_4, _a;
749
- /** @type {?} */
750
- var column = meta.settings.aoColumns[meta.col];
751
- if (column && column.data) {
752
- // get formatOptions
753
- if (this.formatOptions) {
754
- /** @type {?} */
755
- var ngClass = this.formatOptions.ngClass;
756
- // check condition for each key
757
- column.ngClassTemplates = column.ngClassTemplates || {};
758
- try {
759
- for (var _b = tslib_1.__values(Object.keys(ngClass)), _c = _b.next(); !_c.done; _c = _b.next()) {
760
- var key = _c.value;
761
- /** @type {?} */
762
- var result = AdvancedColumnFormatter.template(ngClass[key])(row);
763
- /** @type {?} */
764
- var fn = new Function("return " + result + ";");
765
- // if condition returns true add class
766
- if (fn() === true) {
767
- return "<span class=\"" + key + "\">" + data + "</span>";
768
- }
769
- }
770
- }
771
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
772
- finally {
773
- try {
774
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
775
- }
776
- finally { if (e_4) throw e_4.error; }
777
- }
778
- }
779
- return data;
780
- }
781
- return data;
782
- };
783
- return NgClassFormatter;
784
- }(AdvancedColumnFormatter));
785
- export { NgClassFormatter };
786
- var LanguageFormatter = /** @class */ (function (_super) {
787
- tslib_1.__extends(LanguageFormatter, _super);
788
- function LanguageFormatter() {
789
- return _super.call(this) || this;
790
- }
791
- /**
792
- * @param {?} data
793
- * @param {?} type
794
- * @param {?} row
795
- * @param {?} meta
796
- * @return {?}
797
- */
798
- LanguageFormatter.prototype.render = /**
799
- * @param {?} data
800
- * @param {?} type
801
- * @param {?} row
802
- * @param {?} meta
803
- * @return {?}
804
- */
805
- function (data, type, row, meta) {
806
- if (data) {
807
- return ISO6391.getNativeName(data);
808
- }
809
- return data;
810
- };
811
- return LanguageFormatter;
812
- }(AdvancedColumnFormatter));
813
- export { LanguageFormatter };
814
-
815
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUuZm9ybWF0dGVycy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvbmd4LXRhYmxlcy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2FkdmFuY2VkLXRhYmxlL2FkdmFuY2VkLXRhYmxlLmZvcm1hdHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUd0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFvQixNQUFNLEVBQVcsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7O3FCQWdCbkUsRUFBRTs7Ozs7O0lBSUgsZ0NBQVE7Ozs7Y0FBQyxJQUFZOztRQUNqQyxJQUFJLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxFQUFFO1lBQ2hDLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFDRCxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELE9BQU8sTUFBTSxDQUFDOzs7Ozs7O0lBS04sK0NBQWE7Ozs7O0lBQXZCLFVBQXdCLElBQVMsRUFBRSxPQUFpRTtRQUNsRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7O1lBQ3BELElBQU0sY0FBYyxHQUFtQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcs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cm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW5Db25maWd1cmF0aW9uIH0gZnJvbSAnLi9hZHZhbmNlZC10YWJsZS5pbnRlcmZhY2VzJztcbmltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgKiBhcyBJU082MzkxIGZyb20gJ2lzby02MzktMS9idWlsZCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkV4dHJhcywgUm91dGVyLCBVcmxUcmVlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmRlY2xhcmUgdmFyIGpRdWVyeTogYW55O1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIGltcGxlbWVudHMgVGFibGVDb2x1bW5Db25maWd1cmF0aW9uIHtcblxuICBwdWJsaWMgc3RhdGljIHRlbXBsYXRlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgKGRhdGE6IGFueSkgPT4gc3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCBpbmplY3Rvcj86IEluamVjdG9yO1xuICBwdWJsaWMgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBwdWJsaWMgZGVmYXVsdENvbnRlbnQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBmb3JtYXRTdHJpbmc/OiBzdHJpbmc7XG4gIHB1YmxpYyBmb3JtYXR0ZXI/OiBzdHJpbmc7XG4gIHB1YmxpYyBoaWRkZW4/OiBib29sZWFuO1xuICBwdWJsaWMgbmFtZT86IHN0cmluZztcbiAgcHVibGljIG9yZGVyPzogc3RyaW5nO1xuICBwdWJsaWMgcHJvcGVydHk/OiBzdHJpbmc7XG4gIHB1YmxpYyBzb3J0YWJsZT86IGJvb2xlYW47XG4gIHB1YmxpYyB0aXRsZSA9ICcnO1xuICBwdWJsaWMgZm9ybWF0T3B0aW9ucz86IGFueTtcbiAgcHVibGljIGFjdGlvbnM/OiBBcnJheTxhbnk+O1xuXG4gIHB1YmxpYyBzdGF0aWMgdGVtcGxhdGUoZXhwcjogc3RyaW5nKTogKGRhdGE6IGFueSkgPT4gc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGVDYWNoZS5nZXQoZXhwcik7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJlc3VsdCA9IHRlbXBsYXRlKGV4cHIpO1xuICAgIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlQ2FjaGUuc2V0KGV4cHIsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpOiBhbnk7XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVVybFRyZWUoZGF0YTogYW55LCBvcHRpb25zOiB7IGNvbW1hbmRzOiBhbnlbXSwgbmF2aWdhdGlvbkV4dHJhcz86IE5hdmlnYXRpb25FeHRyYXMgfSk6IFVybFRyZWUgfCB1bmRlZmluZWQge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuY29tbWFuZHMpICYmIHRoaXMuaW5qZWN0b3IpIHtcbiAgICAgIGNvbnN0IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KEFjdGl2YXRlZFJvdXRlKTtcbiAgICAgIGNvbnN0IHJvdXRlcjogUm91dGVyID0gdGhpcy5pbmplY3Rvci5nZXQoUm91dGVyKTtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZShjb21tYW5kKShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWFuZC5vdXRsZXRzKSB7XG4gICAgICAgICAgY29uc3QgY29tbWFuZE91dGxldHMgPSB7fTtcbiAgICAgICAgICBPYmplY3Qua2V5cyhjb21tYW5kLm91dGxldHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb21tYW5kLm91dGxldHMsIGtleSkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3V0bGV0ID0gY29tbWFuZC5vdXRsZXRzW2tleV07XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG91dGxldCkpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29tbWFuZE91dGxldHMsIGtleSwge1xuICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IG91dGxldC5tYXAoKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKHgpKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbW1hbmRPdXRsZXRzLCBrZXksIHtcbiAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBvdXRsZXQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3V0bGV0czogY29tbWFuZE91dGxldHMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWFuZDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7fTtcbiAgICAgIGxldCByZXBsYWNlVXJsID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1FeHRyYXMgPSBvcHRpb25zLm5hdmlnYXRpb25FeHRyYXMgJiYgb3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzLnF1ZXJ5UGFyYW1zO1xuICAgICAgaWYgKHF1ZXJ5UGFyYW1FeHRyYXMpIHtcbiAgICAgICAgT2JqZWN0LmtleXMocXVlcnlQYXJhbUV4dHJhcykubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gcXVlcnlQYXJhbUV4dHJhc1trZXldO1xuICAgICAgICAgIHF1ZXJ5UGFyYW1zW2tleV0gPSBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZSh0ZXh0KShkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzICYmIHR5cGVvZiBvcHRpb25zLm5hdmlnYXRpb25FeHRyYXMucmVwbGFjZVVybCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmVwbGFjZVVybCA9IG9wdGlvbnMubmF2aWdhdGlvbkV4dHJhcy5yZXBsYWNlVXJsO1xuICAgICAgfVxuICAgICAgbGV0IHNraXBMb2NhdGlvbkNoYW5nZSA9IGZhbHNlO1xuICAgICAgaWYgKG9wdGlvbnMubmF2aWdhdGlvbkV4dHJhcyAmJiB0eXBlb2Ygb3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzLnNraXBMb2NhdGlvbkNoYW5nZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2tpcExvY2F0aW9uQ2hhbmdlID0gb3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzLnNraXBMb2NhdGlvbkNoYW5nZTtcbiAgICAgIH1cblxuICAgICAgbGV0IGZyYWdtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAob3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzICYmIHR5cGVvZiBvcHRpb25zLm5hdmlnYXRpb25FeHRyYXMuZnJhZ21lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZyYWdtZW50ID0gb3B0aW9ucy5uYXZpZ2F0aW9uRXh0cmFzLmZyYWdtZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm91dGVyLmNyZWF0ZVVybFRyZWUoY29tbWFuZHMsXG4gICAgICAgIHtcbiAgICAgICAgICBmcmFnbWVudCxcbiAgICAgICAgICByZWxhdGl2ZVRvOiBhY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICBxdWVyeVBhcmFtcyxcbiAgICAgICAgICByZXBsYWNlVXJsLFxuICAgICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPbkFkdmFuY2VkQ29sdW1uQWZ0ZXJSZW5kZXIge1xuICBhZnRlclJlbmRlcihjZWxsOiBhbnksIGNlbGxEYXRhOiBhbnksIHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBOZXN0ZWRQcm9wZXJ0eUZvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgcHVibGljIHJlbmRlcihkYXRhLCB0eXBlLCByb3csIG1ldGEpIHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmRhdGEpIHtcbiAgICAgIHJldHVybiBhdChyb3csIGNvbHVtbi5kYXRhLnJlcGxhY2UoL1xcLy9nLCAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQnV0dG9uRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGEsIHR5cGUsIHJvdywgbWV0YSkge1xuICAgIGlmIChkYXRhID09IG51bGwgfHwgdGhpcy5pbmplY3RvciA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIC8vIGdldCBmb3JtYXQgb3B0aW9uc1xuICAgIGNvbnN0IGZvcm1hdE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGJ1dHRvbkNsYXNzOiAnYnRuIGJ0bi1kZWZhdWx0JyxcbiAgICB9LCB0aGlzLmZvcm1hdE9wdGlvbnMpO1xuICAgIC8vIGdldCB0ZXh0IGNvbnRlbnRcbiAgICBsZXQgYnV0dG9uVGV4dDogc3RyaW5nO1xuICAgIGxldCBidXR0b25UaXRsZSA9ICcnO1xuICAgIGlmIChmb3JtYXRPcHRpb25zLmJ1dHRvblRleHQpIHtcbiAgICAgIGJ1dHRvblRleHQgPSB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KGZvcm1hdE9wdGlvbnMuYnV0dG9uVGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1dHRvblRleHQgPSBmb3JtYXRPcHRpb25zLmJ1dHRvbkNvbnRlbnQ7XG4gICAgfVxuICAgIGlmIChmb3JtYXRPcHRpb25zLmJ1dHRvblRpdGxlKSB7XG4gICAgICBidXR0b25UaXRsZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQoZm9ybWF0T3B0aW9ucy5idXR0b25UaXRsZSk7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZm9ybWF0T3B0aW9ucy5jb21tYW5kcykpIHtcbiAgICAgIGNvbnN0IHJvdXRlckxpbmsgPSB0aGlzLmNyZWF0ZVVybFRyZWUocm93LCB0aGlzLmZvcm1hdE9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGA8YSBjbGFzcz1cIiR7Zm9ybWF0T3B0aW9ucy5idXR0b25DbGFzc31cIiB0aXRsZT1cIiR7YnV0dG9uVGl0bGV9XCIgaHJlZj1cIiMke3JvdXRlckxpbmt9XCI+JHtidXR0b25UZXh0fTwvYT5gO1xuICAgIH1cbiAgICAvLyBhbmQgcmV0dXJuIGJ1dHRvblxuICAgIGNvbnN0IGhyZWYgPSBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZSh0aGlzLmZvcm1hdFN0cmluZyBhcyBzdHJpbmcpKHJvdyk7XG4gICAgcmV0dXJuIGA8YSBjbGFzcz1cIiR7Zm9ybWF0T3B0aW9ucy5idXR0b25DbGFzc31cIiB0aXRsZT1cIiR7YnV0dG9uVGl0bGV9XCIgaHJlZj1cIiR7aHJlZn1cIj4ke2J1dHRvblRleHR9PC9hPmA7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlua0Zvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgcHVibGljIHJlbmRlcihkYXRhOiBhbnksIHR5cGU6IHN0cmluZywgcm93OiBhbnksIG1ldGE6IGFueSk6IGFueSB7XG4gICAgLy8gZ2V0IGNvbHVtblxuICAgIGNvbnN0IGNvbHVtbiA9IG1ldGEuc2V0dGluZ3MuYW9Db2x1bW5zW21ldGEuY29sXTtcbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5kYXRhKSB7XG4gICAgICByZXR1cm4gYDxhIGhyZWY9XCIkeyhBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZSh0aGlzLmZvcm1hdFN0cmluZyBhcyBzdHJpbmcpKHJvdykpfVwiPiR7ZGF0YX08L2E+YDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uTGlua0Zvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyXG4gIGltcGxlbWVudHMgT25BZHZhbmNlZENvbHVtbkFmdGVyUmVuZGVyIHtcbiAgcHVibGljIHJlbmRlcihkYXRhOiBhbnksIHR5cGU6IHN0cmluZywgcm93OiBhbnksIG1ldGE6IGFueSk6IGFueSB7XG4gICAgLy8gZ2V0IGNvbHVtblxuICAgIGNvbnN0IGNvbHVtbiA9IG1ldGEuc2V0dGluZ3MuYW9Db2x1bW5zW21ldGEuY29sXTtcblxuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmRhdGEpIHtcbiAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmFjdGlvbnMgfHwgW107XG4gICAgICBsZXQgaW5kZXggPSAxO1xuICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGFjdGlvbiwge1xuICAgICAgICAgIG5hbWU6IGFjdGlvbi5uYW1lIHx8IGBhY3Rpb24ke2luZGV4fWAsXG4gICAgICAgIH0pO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHRoZSBkcm9wZG93biBtZW51IHdpdGggMyBkb3RzXG4gICAgICByZXR1cm4gYDxkaXYgY2xhc3M9J2Ryb3Bkb3duIGRldGFpbHMtY29udHJvbCcgZGF0YS1pZD0nJHtkYXRhfScgZGF0YS10eXBlPSdzdHVkZW50JyA+XG4gICAgICAgICAgICAgICAgICAgIDxhIGlkPVwiZHJvcGRvd25NZW51QnV0dG9uLSR7ZGF0YX1cIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEtMnggdGV4dC1kb3RzXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgYXJpYS1sYWJlbGxlZGJ5PVwiZHJvcGRvd25NZW51QnV0dG9uLSR7ZGF0YX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICR7YWN0aW9ucy5tYXAoKHgpID0+IHtcbiAgICAgICAgaWYgKHgudHlwZSA9PT0gJ2RpdmlkZXInKSB7XG4gICAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPjwvZGl2PmA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHguZm9ybWF0T3B0aW9ucyAmJiB4LmZvcm1hdE9wdGlvbnMuY29tbWFuZHMpIHtcbiAgICAgICAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5jcmVhdGVVcmxUcmVlKHJvdywgeC5mb3JtYXRPcHRpb25zKTtcbiAgICAgICAgICByZXR1cm4gYDxhIGRhdGEtbmFtZT0nJHt4Lm5hbWV9JyBjbGFzcz1cImRyb3Bkb3duLWl0ZW0ke3R5cGVvZiB4LmNsYXNzTmFtZSA9PT0gJ3N0cmluZycgJiYgeC5jbGFzc05hbWUubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAgYCAke3guY2xhc3NOYW1lLnRyaW0oKX1gIDogJyd9XCIgaHJlZj1cIiMke3VybFRyZWUgJiYgdXJsVHJlZS50b1N0cmluZygpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5pbmplY3RvciAmJiB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KHgudGl0bGUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYDxhIGRhdGEtbmFtZT0nJHt4Lm5hbWV9JyBjbGFzcz1cImRyb3Bkb3duLWl0ZW0ke3R5cGVvZiB4LmNsYXNzTmFtZSA9PT0gJ3N0cmluZycgJiYgeC5jbGFzc05hbWUubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gYCAke3guY2xhc3NOYW1lLnRyaW0oKX1gIDogJyd9XCIgaHJlZj1cIiR7QWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUoeC5ocmVmKShyb3cpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuaW5qZWN0b3IgJiYgdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCh4LnRpdGxlKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5gO1xuICAgICAgfSlcbiAgICAgICAgICAuam9pbignJyl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgYWZ0ZXJSZW5kZXIoY2VsbDogYW55LCBjZWxsRGF0YTogYW55LCByb3dEYXRhOiBhbnksIHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBhc3NpZ24gYm9vdHN0cmFwIGRyb3Bkb3duICg/KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25CdXR0b25Gb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlclxuICBpbXBsZW1lbnRzIE9uQWR2YW5jZWRDb2x1bW5BZnRlclJlbmRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpOiBhbnkge1xuICAgIC8vIGdldCBjb2x1bW5cbiAgICBjb25zdCBjb2x1bW4gPSBtZXRhLnNldHRpbmdzLmFvQ29sdW1uc1ttZXRhLmNvbF07XG5cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5kYXRhICYmIHRoaXMuaW5qZWN0b3IpIHtcbiAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmFjdGlvbnMgfHwgW107XG4gICAgICBsZXQgaW5kZXggPSAxO1xuICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGFjdGlvbiwge1xuICAgICAgICAgIG5hbWU6IGFjdGlvbi5uYW1lIHx8IGBhY3Rpb24ke2luZGV4fWAsXG4gICAgICAgIH0pO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfVxuICAgICAgbGV0IGJ1dHRvblRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLmZvcm1hdE9wdGlvbnMgJiYgdGhpcy5mb3JtYXRPcHRpb25zLmJ1dHRvblRleHQpIHtcbiAgICAgICAgLy8gaWYgYnV0dG9uIHRleHQgaXMgYSBsaXRlcmFsIGV4cHJlc3Npb25cbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0T3B0aW9ucy5idXR0b25UZXh0LmluY2x1ZGVzKCckeycpKSB7XG4gICAgICAgICAgLy8gdXNlIHRlbXBsYXRlXG4gICAgICAgICAgYnV0dG9uVGV4dCA9IEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKHRoaXMuZm9ybWF0T3B0aW9ucy5idXR0b25UZXh0KShyb3cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG90aGVyd2lzZSB0cmFuc2xhdGUgaXRcbiAgICAgICAgICBidXR0b25UZXh0ID0gdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCh0aGlzLmZvcm1hdE9wdGlvbnMuYnV0dG9uVGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBidXR0b25UaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0T3B0aW9ucyAmJiB0aGlzLmZvcm1hdE9wdGlvbnMuYnV0dG9uVGl0bGUpIHtcbiAgICAgICAgYnV0dG9uVGl0bGUgPSB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KHRoaXMuZm9ybWF0T3B0aW9ucy5idXR0b25UYnV0dG9uVGl0bGVleHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgYnV0dG9uQ2xhc3MgPSAodGhpcy5mb3JtYXRPcHRpb25zICYmIHRoaXMuZm9ybWF0T3B0aW9ucy5idXR0b25DbGFzcykgfHwgJ2J0biBidG4tbGlnaHQnO1xuICAgICAgLy8gcmV0dXJuIHRoZSBkcm9wZG93biBtZW51IHdpdGggMyBkb3RzXG4gICAgICByZXR1cm4gYDxkaXYgY2xhc3M9J2Ryb3Bkb3duIGRldGFpbHMtY29udHJvbCcgZGF0YS1pZD0nJHtkYXRhfSc+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiJHtidXR0b25DbGFzc30gZHJvcGRvd24tdG9nZ2xlXCIgaHJlZj1cIiNcIiByb2xlPVwiYnV0dG9uXCIgdGl0bGU9XCIke2J1dHRvblRpdGxlfVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJkcm9wZG93bk1lbnVCdXR0b24tJHtkYXRhfVwiIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICR7YnV0dG9uVGV4dH1cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duTWVudUJ1dHRvbi0ke2RhdGF9XCI+XG4gICAgICAgICAgICAgICAgICAgICAke2FjdGlvbnMubWFwKCh4KSA9PiB7XG4gICAgICAgIGlmICh4LnR5cGUgPT09ICdkaXZpZGVyJykge1xuICAgICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIj48L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4LmNvbW1hbmRzKSB7XG4gICAgICAgICAgY29uc3QgdXJsVHJlZSA9IHRoaXMuY3JlYXRlVXJsVHJlZShyb3csIHgpO1xuICAgICAgICAgIHJldHVybiBgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiMke3VybFRyZWUgJiYgdXJsVHJlZS50b1N0cmluZygpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5pbmplY3RvciAmJiB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KHgudGl0bGUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIke0FkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKHguaHJlZikocm93KX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmluamVjdG9yICYmIHRoaXMuaW5qZWN0b3IuZ2V0KFRyYW5zbGF0ZVNlcnZpY2UpLmluc3RhbnQoeC50aXRsZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+YDtcbiAgICAgIH0pXG4gICAgICAgICAgLmpvaW4oJycpfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyKGNlbGw6IGFueSwgY2VsbERhdGE6IGFueSwgcm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gYXNzaWduIGJvb3RzdHJhcCBkcm9wZG93biAoPylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uU3BsaXRCdXR0b25Gb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlclxuICBpbXBsZW1lbnRzIE9uQWR2YW5jZWRDb2x1bW5BZnRlclJlbmRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpOiBhbnkge1xuICAgIC8vIGdldCBjb2x1bW5cbiAgICBjb25zdCBjb2x1bW4gPSBtZXRhLnNldHRpbmdzLmFvQ29sdW1uc1ttZXRhLmNvbF07XG5cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5kYXRhKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5hY3Rpb25zIHx8IFtdO1xuICAgICAgbGV0IGluZGV4ID0gMTtcbiAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY3Rpb24sIHtcbiAgICAgICAgICBuYW1lOiBhY3Rpb24ubmFtZSB8fCBgYWN0aW9uJHtpbmRleH1gLFxuICAgICAgICB9KTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBidXR0b25DbGFzcyA9ICh0aGlzLmZvcm1hdE9wdGlvbnMgJiYgdGhpcy5mb3JtYXRPcHRpb25zLmJ1dHRvbkNsYXNzKSB8fCAnYnRuIGJ0bi1saWdodCc7XG4gICAgICAvLyByZXR1cm4gdGhlIGRyb3Bkb3duIG1lbnUgd2l0aCAzIGRvdHNcbiAgICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBhY3Rpb25zWzBdO1xuICAgICAgbGV0IGRlZmF1bHRBY3Rpb25IcmVmOiBzdHJpbmc7XG4gICAgICBpZiAoZGVmYXVsdEFjdGlvbiAmJiBkZWZhdWx0QWN0aW9uLmNvbW1hbmRzKSB7XG4gICAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLmNyZWF0ZVVybFRyZWUocm93LCBkZWZhdWx0QWN0aW9uKTtcbiAgICAgICAgZGVmYXVsdEFjdGlvbkhyZWYgPSAnIycgKyAodXJsVHJlZSAmJiB1cmxUcmVlLnRvU3RyaW5nKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdEFjdGlvbkhyZWYgPSBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZShkZWZhdWx0QWN0aW9uLmhyZWYpKHJvdyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiJHtidXR0b25DbGFzc31cIiBocmVmPVwiJHtkZWZhdWx0QWN0aW9uSHJlZn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuaW5qZWN0b3IgJiYgdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudChkZWZhdWx0QWN0aW9uLnRpdGxlKX1cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIiR7YnV0dG9uQ2xhc3N9IGRyb3Bkb3duLXRvZ2dsZSBkcm9wZG93bi10b2dnbGUtc3BsaXRcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPiR7dGhpcy5pbmplY3RvciAmJiB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KCdUb2dnbGUgRHJvcGRvd24nKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duTWVudUJ1dHRvbi0ke2RhdGF9XCI+XG4gICAgICAgICAgICAgICAgICAgICAke2FjdGlvbnMubWFwKCh4KSA9PiB7XG4gICAgICAgIGlmICh4LnRpdGxlID09PSAnLScpIHtcbiAgICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+PC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeC5jb21tYW5kcykge1xuICAgICAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLmNyZWF0ZVVybFRyZWUocm93LCB4KTtcbiAgICAgICAgICByZXR1cm4gYDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjJHt1cmxUcmVlICYmIHVybFRyZWUudG9TdHJpbmcoKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuaW5qZWN0b3IgJiYgdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCh4LnRpdGxlKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiJHtBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZSh4LmhyZWYpKHJvdyl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5pbmplY3RvciAmJiB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KHgudGl0bGUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPmA7XG4gICAgICB9KVxuICAgICAgICAgIC5qb2luKCcnKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBhZnRlclJlbmRlcihjZWxsOiBhbnksIGNlbGxEYXRhOiBhbnksIHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGFzc2lnbiBib290c3RyYXAgZHJvcGRvd24gKD8pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdFJvd0Zvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgcHVibGljIHJlbmRlcihkYXRhLCB0eXBlLCByb3csIG1ldGEpIHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmRhdGEpIHtcbiAgICAgIGNvbnN0IF90cGwgPSBgPGlucHV0IGNsYXNzPVwiY2hlY2tib3ggY2hlY2tib3gtdGhlbWVcIiB0eXBlPVwiY2hlY2tib3hcIlxuIGlkPVwicy0ke21ldGEucm93fVwiIC8+PGxhYmVsIGZvcj1cInMtJHttZXRhLnJvd31cIj4mbmJzcDs8L2xhYmVsPmA7XG4gICAgICByZXR1cm4gQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUoX3RwbCkocm93KTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVGb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpOiBhbnkge1xuICAgIC8vIGdldCBjb2x1bW5cbiAgICBjb25zdCBjb2x1bW4gPSBtZXRhLnNldHRpbmdzLmFvQ29sdW1uc1ttZXRhLmNvbF07XG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZGF0YSkge1xuICAgICAgcmV0dXJuIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLnRlbXBsYXRlKHRoaXMuZm9ybWF0U3RyaW5nIGFzIHN0cmluZykocm93KTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJ1ZUZhbHNlRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIge1xuXG4gIHB1YmxpYyByZW5kZXIoZGF0YSwgdHlwZSwgcm93LCBtZXRhKSB7XG4gICAgcmV0dXJuIGRhdGEgPyAodGhpcy5pbmplY3RvciAmJiB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KCdUcnVlRmFsc2UubG9uZy5ZZXMnKSkgOlxuICAgICAgKHRoaXMuaW5qZWN0b3IgJiYgdGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuaW5zdGFudCgnVHJ1ZUZhbHNlLmxvbmcuTm8nKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG5cbmRlY2xhcmUgaW50ZXJmYWNlIFRyYW5zbGF0aW9uRm9ybWF0dGVyVGVtcGxhdGUge1xuICB0cmFuc2xhdGVUZW1wbGF0ZT86IChkYXRhOiBhbnkpID0+IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0aW9uRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogc3RyaW5nLCByb3c6IGFueSwgbWV0YTogYW55KTogYW55IHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uOiBUcmFuc2xhdGlvbkZvcm1hdHRlclRlbXBsYXRlID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmIChjb2x1bW4gJiYgZGF0YSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmplY3RvciAmJiB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KFxuICAgICAgICBBZHZhbmNlZENvbHVtbkZvcm1hdHRlci50ZW1wbGF0ZSh0aGlzLmZvcm1hdFN0cmluZyBhcyBzdHJpbmcpKHtcbiAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbmplY3RvciAmJiB0aGlzLmluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKS5pbnN0YW50KCdVbmtub3duJyk7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0ZVRpbWVGb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG4gIHB1YmxpYyByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpOiBhbnkge1xuICAgIC8vIGdldCBjb2x1bW5cbiAgICBjb25zdCBjb2x1bW4gPSBtZXRhLnNldHRpbmdzLmFvQ29sdW1uc1ttZXRhLmNvbF07XG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZGF0YSAmJiB0aGlzLmluamVjdG9yKSB7XG4gICAgICBjb25zdCBkYXRlUGlwZTogRGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUodGhpcy5pbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSkuY3VycmVudExhbmcpO1xuICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyAmJiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9XFwrXFxkezJ9JC8udGVzdChkYXRhKSkge1xuICAgICAgICByZXR1cm4gZGF0ZVBpcGUudHJhbnNmb3JtKG5ldyBEYXRlKGRhdGEgKyAnOjAwJyksIHRoaXMuZm9ybWF0U3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRlUGlwZS50cmFuc2Zvcm0oZGF0YSwgdGhpcy5mb3JtYXRTdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOZ0NsYXNzRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGEsIHR5cGUsIHJvdywgbWV0YSkge1xuICAgIC8vIGdldCBjb2x1bW5cbiAgICBjb25zdCBjb2x1bW4gPSBtZXRhLnNldHRpbmdzLmFvQ29sdW1uc1ttZXRhLmNvbF07XG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uZGF0YSkge1xuICAgICAgLy8gZ2V0IGZvcm1hdE9wdGlvbnNcbiAgICAgIGlmICh0aGlzLmZvcm1hdE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbmdDbGFzcyA9IHRoaXMuZm9ybWF0T3B0aW9ucy5uZ0NsYXNzO1xuICAgICAgICAvLyBjaGVjayBjb25kaXRpb24gZm9yIGVhY2gga2V5XG4gICAgICAgIGNvbHVtbi5uZ0NsYXNzVGVtcGxhdGVzID0gY29sdW1uLm5nQ2xhc3NUZW1wbGF0ZXMgfHwge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG5nQ2xhc3MpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIudGVtcGxhdGUobmdDbGFzc1trZXldKShyb3cpO1xuICAgICAgICAgIGNvbnN0IGZuID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gJHtyZXN1bHR9O2ApO1xuICAgICAgICAgIC8vIGlmIGNvbmRpdGlvbiByZXR1cm5zIHRydWUgYWRkIGNsYXNzXG4gICAgICAgICAgaWYgKGZuKCkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCIke2tleX1cIj4ke2RhdGF9PC9zcGFuPmA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIExhbmd1YWdlRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIge1xuICBwdWJsaWMgcmVuZGVyKGRhdGEsIHR5cGUsIHJvdywgbWV0YSkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICByZXR1cm4gSVNPNjM5MS5nZXROYXRpdmVOYW1lKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG4iXX0=