ps-toolkit-ui 1.21.42 → 1.21.51

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 (169) hide show
  1. package/bundles/ps-toolkit-ui.umd.js +10321 -0
  2. package/bundles/ps-toolkit-ui.umd.js.map +1 -0
  3. package/bundles/ps-toolkit-ui.umd.min.js +2 -0
  4. package/bundles/ps-toolkit-ui.umd.min.js.map +1 -0
  5. package/esm2015/lib/classes/addModal.class.js +36 -0
  6. package/esm2015/lib/classes/chart.class.js +165 -0
  7. package/esm2015/lib/classes/currentDataClass.js +17 -0
  8. package/esm2015/lib/classes/enum.class.js +253 -0
  9. package/esm2015/lib/classes/excel.class.js +56 -0
  10. package/esm2015/lib/classes/form.class.js +667 -0
  11. package/esm2015/lib/classes/header.class.js +16 -0
  12. package/esm2015/lib/classes/helper.class.js +650 -0
  13. package/esm2015/lib/classes/lang.class.js +35 -0
  14. package/esm2015/lib/classes/login.class.js +29 -0
  15. package/esm2015/lib/classes/modal.class.js +49 -0
  16. package/esm2015/lib/classes/permission.class.js +63 -0
  17. package/esm2015/lib/classes/request.class.js +155 -0
  18. package/esm2015/lib/classes/safehtml.class.js +17 -0
  19. package/esm2015/lib/classes/safestyle.class.js +17 -0
  20. package/esm2015/lib/classes/sidebar.class.js +16 -0
  21. package/esm2015/lib/classes/steps.class.js +45 -0
  22. package/esm2015/lib/classes/string.class.js +251 -0
  23. package/esm2015/lib/classes/table.class.js +593 -0
  24. package/esm2015/lib/components/accordion/accordion.component.js +45 -0
  25. package/esm2015/lib/components/alert/alert.component.js +39 -0
  26. package/esm2015/lib/components/base.component.js +54 -0
  27. package/esm2015/lib/components/calendar/calendar.component.js +98 -0
  28. package/esm2015/lib/components/chart/chart.component.js +17 -0
  29. package/esm2015/lib/components/clock/clock.component.js +33 -0
  30. package/esm2015/lib/components/confirm/confirm.component.js +50 -0
  31. package/esm2015/lib/components/error/error.component.js +26 -0
  32. package/esm2015/lib/components/footer/footer.component.js +23 -0
  33. package/esm2015/lib/components/form/bank-card/form.bank-card.component.js +200 -0
  34. package/esm2015/lib/components/form/button/form.button.component.js +68 -0
  35. package/esm2015/lib/components/form/checkbox/form.checkbox.component.js +67 -0
  36. package/esm2015/lib/components/form/ckeditor/form.ckeditor.component.js +90 -0
  37. package/esm2015/lib/components/form/date/form.date.component.js +314 -0
  38. package/esm2015/lib/components/form/datetime/form.datetime.component.js +106 -0
  39. package/esm2015/lib/components/form/file/form.file.component.js +124 -0
  40. package/esm2015/lib/components/form/finger/form.finger.component.js +140 -0
  41. package/esm2015/lib/components/form/hidden/form.hidden.component.js +31 -0
  42. package/esm2015/lib/components/form/icon/form.icon.component.js +84 -0
  43. package/esm2015/lib/components/form/index/form.component.js +51 -0
  44. package/esm2015/lib/components/form/label/form.label.component.js +32 -0
  45. package/esm2015/lib/components/form/plaque/form.plaque.component.js +258 -0
  46. package/esm2015/lib/components/form/plaque/select/form.plaque.select.component.js +468 -0
  47. package/esm2015/lib/components/form/radio/form.radio.component.js +82 -0
  48. package/esm2015/lib/components/form/select/form.select.component.js +452 -0
  49. package/esm2015/lib/components/form/select/item/form.select.item.component.js +27 -0
  50. package/esm2015/lib/components/form/slide/form.slide.component.js +84 -0
  51. package/esm2015/lib/components/form/star/form.star.component.js +66 -0
  52. package/esm2015/lib/components/form/table/form.table.component.js +96 -0
  53. package/esm2015/lib/components/form/tag/form.tag.component.js +100 -0
  54. package/esm2015/lib/components/form/textarea/form.textarea.component.js +83 -0
  55. package/esm2015/lib/components/form/textbox/form.textbox.component.js +227 -0
  56. package/esm2015/lib/components/form/time/form.time.component.js +149 -0
  57. package/esm2015/lib/components/form/toggle/form.toggle.component.js +72 -0
  58. package/esm2015/lib/components/form/tree/form.tree.component.js +157 -0
  59. package/esm2015/lib/components/form/tree/item/form.tree.item.component.js +50 -0
  60. package/esm2015/lib/components/form/uploader/form.uploader.component.js +159 -0
  61. package/esm2015/lib/components/form/vehicle/form.vehicle.component.js +104 -0
  62. package/esm2015/lib/components/form/vehicle/search/form.vehicle.search.component.js +237 -0
  63. package/esm2015/lib/components/header/header.component.js +28 -0
  64. package/esm2015/lib/components/header/sub/sub.header.component.js +14 -0
  65. package/esm2015/lib/components/layout/layout.component.js +18 -0
  66. package/esm2015/lib/components/loading/loading.component.js +22 -0
  67. package/esm2015/lib/components/login/login.component.js +159 -0
  68. package/esm2015/lib/components/modal/modal.component.js +25 -0
  69. package/esm2015/lib/components/notfound/notfound.component.js +29 -0
  70. package/esm2015/lib/components/notification/notification.component.js +14 -0
  71. package/esm2015/lib/components/sidebar/item/sidebar.item.component.js +55 -0
  72. package/esm2015/lib/components/sidebar/sidebar.component.js +98 -0
  73. package/esm2015/lib/components/steps/steps.component.js +88 -0
  74. package/esm2015/lib/components/table/loading/table.loading.component.js +17 -0
  75. package/esm2015/lib/components/table/pagination/table.pagination.component.js +84 -0
  76. package/esm2015/lib/components/table/row/table.row.component.js +450 -0
  77. package/esm2015/lib/components/table/table.component.js +240 -0
  78. package/esm2015/lib/components/tooltip/tooltip.component.js +19 -0
  79. package/esm2015/lib/ps-toolkit-ui.module.js +105 -0
  80. package/esm2015/lib/services/config.service.js +14 -0
  81. package/esm2015/lib/services/sidebar.service.js +21 -0
  82. package/esm2015/ps-toolkit-ui.js +21 -0
  83. package/esm2015/public-api.js +64 -0
  84. package/fesm2015/ps-toolkit-ui.js +8926 -0
  85. package/fesm2015/ps-toolkit-ui.js.map +1 -0
  86. package/lib/classes/addModal.class.d.ts +14 -0
  87. package/lib/classes/chart.class.d.ts +15 -0
  88. package/lib/classes/currentDataClass.d.ts +10 -0
  89. package/lib/classes/enum.class.d.ts +221 -0
  90. package/lib/classes/excel.class.d.ts +8 -0
  91. package/lib/classes/form.class.d.ts +193 -0
  92. package/lib/classes/header.class.d.ts +8 -0
  93. package/lib/classes/helper.class.d.ts +50 -0
  94. package/lib/classes/lang.class.d.ts +5 -0
  95. package/lib/classes/login.class.d.ts +21 -0
  96. package/lib/classes/modal.class.d.ts +19 -0
  97. package/lib/classes/permission.class.d.ts +35 -0
  98. package/lib/classes/request.class.d.ts +10 -0
  99. package/lib/classes/safehtml.class.d.ts +7 -0
  100. package/lib/classes/safestyle.class.d.ts +7 -0
  101. package/lib/classes/sidebar.class.d.ts +14 -0
  102. package/lib/classes/steps.class.d.ts +31 -0
  103. package/lib/classes/string.class.d.ts +249 -0
  104. package/lib/classes/table.class.d.ts +88 -0
  105. package/lib/components/accordion/accordion.component.d.ts +7 -0
  106. package/lib/components/alert/alert.component.d.ts +10 -0
  107. package/lib/components/base.component.d.ts +17 -0
  108. package/lib/components/calendar/calendar.component.d.ts +26 -0
  109. package/lib/components/chart/chart.component.d.ts +5 -0
  110. package/lib/components/clock/clock.component.d.ts +11 -0
  111. package/lib/components/confirm/confirm.component.d.ts +14 -0
  112. package/lib/components/error/error.component.d.ts +7 -0
  113. package/lib/components/footer/footer.component.d.ts +6 -0
  114. package/lib/components/form/bank-card/form.bank-card.component.d.ts +28 -0
  115. package/lib/components/form/button/form.button.component.d.ts +15 -0
  116. package/lib/components/form/checkbox/form.checkbox.component.d.ts +14 -0
  117. package/lib/components/form/ckeditor/form.ckeditor.component.d.ts +14 -0
  118. package/lib/components/form/date/form.date.component.d.ts +45 -0
  119. package/lib/components/form/datetime/form.datetime.component.d.ts +13 -0
  120. package/lib/components/form/file/form.file.component.d.ts +18 -0
  121. package/lib/components/form/finger/form.finger.component.d.ts +15 -0
  122. package/lib/components/form/hidden/form.hidden.component.d.ts +7 -0
  123. package/lib/components/form/icon/form.icon.component.d.ts +16 -0
  124. package/lib/components/form/index/form.component.d.ts +10 -0
  125. package/lib/components/form/label/form.label.component.d.ts +8 -0
  126. package/lib/components/form/plaque/form.plaque.component.d.ts +21 -0
  127. package/lib/components/form/plaque/select/form.plaque.select.component.d.ts +38 -0
  128. package/lib/components/form/radio/form.radio.component.d.ts +13 -0
  129. package/lib/components/form/select/form.select.component.d.ts +45 -0
  130. package/lib/components/form/select/item/form.select.item.component.d.ts +12 -0
  131. package/lib/components/form/slide/form.slide.component.d.ts +13 -0
  132. package/lib/components/form/star/form.star.component.d.ts +13 -0
  133. package/lib/components/form/table/form.table.component.d.ts +9 -0
  134. package/lib/components/form/tag/form.tag.component.d.ts +16 -0
  135. package/lib/components/form/textarea/form.textarea.component.d.ts +13 -0
  136. package/lib/components/form/textbox/form.textbox.component.d.ts +20 -0
  137. package/lib/components/form/time/form.time.component.d.ts +25 -0
  138. package/lib/components/form/toggle/form.toggle.component.d.ts +13 -0
  139. package/lib/components/form/tree/form.tree.component.d.ts +21 -0
  140. package/lib/components/form/tree/item/form.tree.item.component.d.ts +19 -0
  141. package/lib/components/form/uploader/form.uploader.component.d.ts +21 -0
  142. package/lib/components/form/vehicle/form.vehicle.component.d.ts +18 -0
  143. package/lib/components/form/vehicle/search/form.vehicle.search.component.d.ts +22 -0
  144. package/lib/components/header/header.component.d.ts +10 -0
  145. package/lib/components/header/sub/sub.header.component.d.ts +3 -0
  146. package/lib/components/layout/layout.component.d.ts +7 -0
  147. package/lib/components/loading/loading.component.d.ts +5 -0
  148. package/lib/components/login/login.component.d.ts +15 -0
  149. package/lib/components/modal/modal.component.d.ts +9 -0
  150. package/lib/components/notfound/notfound.component.d.ts +8 -0
  151. package/lib/components/notification/notification.component.d.ts +3 -0
  152. package/lib/components/sidebar/item/sidebar.item.component.d.ts +14 -0
  153. package/lib/components/sidebar/sidebar.component.d.ts +22 -0
  154. package/lib/components/steps/steps.component.d.ts +16 -0
  155. package/lib/components/table/loading/table.loading.component.d.ts +5 -0
  156. package/lib/components/table/pagination/table.pagination.component.d.ts +15 -0
  157. package/lib/components/table/row/table.row.component.d.ts +44 -0
  158. package/lib/components/table/table.component.d.ts +43 -0
  159. package/lib/components/tooltip/tooltip.component.d.ts +5 -0
  160. package/lib/ps-toolkit-ui.module.d.ts +4 -0
  161. package/lib/services/config.service.d.ts +6 -0
  162. package/lib/services/sidebar.service.d.ts +9 -0
  163. package/package.json +12 -16
  164. package/ps-toolkit-ui.d.ts +20 -0
  165. package/ps-toolkit-ui.metadata.json +1 -0
  166. package/public-api.d.ts +60 -0
  167. package/fesm2022/ps-toolkit-ui.mjs +0 -9472
  168. package/fesm2022/ps-toolkit-ui.mjs.map +0 -1
  169. package/types/ps-toolkit-ui.d.ts +0 -1671
@@ -0,0 +1,667 @@
1
+ import { EnumUtils, InputError, InputType, Method, ResultStatusEnum } from './enum.class';
2
+ import { HelperClass } from './helper.class';
3
+ import { RequestClass } from './request.class';
4
+ import * as $ from 'jquery';
5
+ import * as _ from 'lodash';
6
+ export class Progress {
7
+ constructor(secs) {
8
+ this.percent = 100;
9
+ this.onEnd = null;
10
+ this.onStart = null;
11
+ this.onTick = null;
12
+ this.start = () => {
13
+ this.remainSecs = this.secs;
14
+ this.percent = 100;
15
+ if (this.onStart) {
16
+ this.onStart();
17
+ }
18
+ this.interVal = setInterval(() => {
19
+ this.percent = (this.remainSecs / this.secs) * 100;
20
+ if (this.remainSecs === 0) {
21
+ clearInterval(this.interVal);
22
+ if (this.onEnd) {
23
+ this.onEnd();
24
+ }
25
+ return;
26
+ }
27
+ if (Number.isInteger(this.remainSecs)) {
28
+ const m = Math.floor(this.remainSecs / 60);
29
+ const s = this.remainSecs % 60;
30
+ this.onTick(m, s);
31
+ }
32
+ this.remainSecs -= 0.5;
33
+ }, 500);
34
+ };
35
+ this.secs = this.remainSecs = secs;
36
+ }
37
+ }
38
+ export class FormClass {
39
+ constructor(environment, l, name = null, permission = true, url = null, cls = null) {
40
+ this.environment = null;
41
+ this.isEdit = false;
42
+ this.subName = null;
43
+ this.method = Method.Post;
44
+ this.loading = false;
45
+ this.onTop = false;
46
+ this.displayLabel = true;
47
+ this.request = null;
48
+ this.inputs = [];
49
+ this.onSuccessBase = null;
50
+ this.onSuccess = null;
51
+ this.onFailed = null;
52
+ this.onLoad = null;
53
+ this.onBeforeSubmit = null;
54
+ this.onHideModal = null;
55
+ this.onShowModal = null;
56
+ this.environment = environment;
57
+ this.l = l;
58
+ this.url = url;
59
+ this.baseUrl = url;
60
+ this.class = cls;
61
+ this.permission = permission;
62
+ this.name = name;
63
+ this.id = this.name;
64
+ }
65
+ loadData(url) {
66
+ this.loading = true;
67
+ new RequestClass(this.environment, this.l).send(url, Method.Post, null, null, (result) => {
68
+ setTimeout(() => {
69
+ this.setData(result);
70
+ this.loading = false;
71
+ if (this.onLoad) {
72
+ this.onLoad(result);
73
+ }
74
+ }, 500);
75
+ }, (m) => {
76
+ if (m === 'FormBaseErrorAccess' || m === 'FormBaseErrorPermission') {
77
+ this.permission = false;
78
+ this.loading = false;
79
+ }
80
+ });
81
+ }
82
+ focus() {
83
+ const i = this.inputs.find(x => !x.disabled && x.type !== InputType.Label && x.type !== InputType.Hidden &&
84
+ x.type !== InputType.Constant && x.type !== InputType.Submit && x.type !== InputType.Button && x.type !== InputType.Icon &&
85
+ x.type !== InputType.Check);
86
+ if (i) {
87
+ i.focus();
88
+ }
89
+ }
90
+ submit(onSubmit = null) {
91
+ if (!this.check()) {
92
+ return;
93
+ }
94
+ if (this.onBeforeSubmit && !this.onBeforeSubmit()) {
95
+ return;
96
+ }
97
+ const btns = this.inputs.filter(x => x.type === InputType.Submit);
98
+ for (const btn of btns) {
99
+ if (btn.loading) {
100
+ return;
101
+ }
102
+ btn.loading = true;
103
+ }
104
+ const data = this.data();
105
+ if (onSubmit) {
106
+ for (const btn of btns) {
107
+ btn.loading = false;
108
+ }
109
+ onSubmit(data);
110
+ if (this.onSuccess) {
111
+ this.onSuccess(data);
112
+ }
113
+ return;
114
+ }
115
+ this.request = new RequestClass(this.environment).getClient(this.request, this.url, this.method, data, (res) => {
116
+ if (res.status === ResultStatusEnum.Success) {
117
+ if (this.onSuccess) {
118
+ this.onSuccess(res.result);
119
+ }
120
+ if (this.onSuccessBase) {
121
+ this.onSuccessBase(res.result);
122
+ }
123
+ }
124
+ else {
125
+ let m = '';
126
+ if (res.status === ResultStatusEnum.NotRegistered) {
127
+ m = this.l('FormBaseErrorNotRegistered');
128
+ }
129
+ else if (res.status === ResultStatusEnum.ExpiredRegistered) {
130
+ m = this.l('FormBaseErrorExpiredRegistered');
131
+ }
132
+ else if (res.status === ResultStatusEnum.InvalidIp) {
133
+ m = this.l('FormBaseErrorInvalidIp');
134
+ }
135
+ else if (res.status === ResultStatusEnum.NoCredit) {
136
+ m = this.l('FormBaseErrorNoCredit');
137
+ }
138
+ else if (res.status === ResultStatusEnum.Unauthorized) {
139
+ m = this.l('FormBaseErrorExpired');
140
+ HelperClass.eraseCookie('TOKEN');
141
+ }
142
+ else if (res.status === ResultStatusEnum.NotAccess) {
143
+ m = this.l('FormBaseErrorAccess');
144
+ }
145
+ else if (res.status === ResultStatusEnum.NotPermission) {
146
+ m = this.l('FormBaseErrorPermission');
147
+ }
148
+ else {
149
+ if (typeof res.message === 'string') {
150
+ const am = res.message.split(':');
151
+ m = this.l(am[0], am.length > 1 ? am.slice(1) : null);
152
+ }
153
+ else {
154
+ // tslint:disable-next-line:forin
155
+ for (const msg in res.message) {
156
+ // noinspection JSUnfilteredForInLoop
157
+ m = this.l(msg, res.message[msg]);
158
+ }
159
+ }
160
+ this.setError(res);
161
+ }
162
+ if (m) {
163
+ HelperClass.addNotification(m);
164
+ }
165
+ if (this.onFailed) {
166
+ this.onFailed(res.message);
167
+ }
168
+ }
169
+ for (const btn of btns) {
170
+ btn.loading = false;
171
+ }
172
+ }, () => {
173
+ HelperClass.addNotification(this.l('Error'));
174
+ if (this.onFailed) {
175
+ this.onFailed('Error');
176
+ }
177
+ for (const btn of btns) {
178
+ btn.loading = false;
179
+ }
180
+ });
181
+ }
182
+ check() {
183
+ let valid = true;
184
+ this.inputs.forEach(inp => {
185
+ if (!inp.isValid()) {
186
+ if (valid) {
187
+ inp.focus();
188
+ }
189
+ valid = false;
190
+ }
191
+ });
192
+ return valid;
193
+ }
194
+ clear(insertAccess = true) {
195
+ this.method = Method.Post;
196
+ this.url = this.baseUrl;
197
+ this.setButtons(this.onTop, false, insertAccess, false);
198
+ this.clearInputs();
199
+ if (this.onTop && !this.isEdit) {
200
+ this.focus();
201
+ }
202
+ this.isEdit = false;
203
+ }
204
+ clearInputs() {
205
+ this.inputs.filter(x => x.type !== InputType.Constant).forEach(inp => {
206
+ inp.clear();
207
+ });
208
+ }
209
+ setButtons(formOnTop, edit, insertAccess = false, updateAccess = false) {
210
+ const s = this.inputs.find(x => x.type === InputType.Submit);
211
+ if (!s) {
212
+ return;
213
+ }
214
+ s.disabled = !((edit && updateAccess) || (!edit && insertAccess));
215
+ s.name = s.name != null ? (edit ? 'Accept' : 'Save') : null;
216
+ s.class = edit ? s.class.replace('green', 'blue') : s.class.replace('blue', 'green');
217
+ }
218
+ addButtons(name = 'Save', cls = 'green', clear = true, insertAccess = true, onSubmit = null) {
219
+ var _a;
220
+ const submit = (_a = this.inputs.find(x => x.type === InputType.Submit)) !== null && _a !== void 0 ? _a : null;
221
+ if (submit != null) {
222
+ submit.disabled = !insertAccess;
223
+ return;
224
+ }
225
+ const br = new InputClass(this.environment, this.l, null, null, InputType.Label, this.onTop ? 'space' : 'underline');
226
+ const save = new InputClass(this.environment, this.l, name, 'fad fa-check', InputType.Submit, 'save-form-btn ' + (this.onTop ? 'h-25 ' : 'h-30 ') + cls);
227
+ save.onClick = () => {
228
+ this.submit(onSubmit);
229
+ };
230
+ save.disabled = !insertAccess;
231
+ if (!cls.includes('only-icon')) {
232
+ this.inputs.push(br);
233
+ }
234
+ else {
235
+ save.class = save.class.replace('save-form-btn ', '').replace('h-25 ', 'h-30 ');
236
+ }
237
+ this.inputs.push(save);
238
+ if (clear) {
239
+ const erase = new InputClass(this.environment, this.l, null, 'fad fa-eraser', InputType.Button, 'f-l w-u grey erase-form-btn ' + (this.onTop ? 'h-25 ' : 'h-30 '));
240
+ erase.onClick = () => {
241
+ if (this.onTop) {
242
+ this.clear(insertAccess);
243
+ }
244
+ else {
245
+ this.clearInputs();
246
+ }
247
+ };
248
+ this.inputs.push(erase);
249
+ }
250
+ }
251
+ data(d = null) {
252
+ if (this.inputs.findIndex(x => x.type === InputType.File || x.type === InputType.Uploader) === -1) {
253
+ if (d == null) {
254
+ d = {};
255
+ }
256
+ }
257
+ else {
258
+ if (d == null) {
259
+ d = new FormData();
260
+ }
261
+ }
262
+ const setD = (n, vl) => {
263
+ if (d instanceof FormData) {
264
+ if (vl instanceof Array) {
265
+ for (const v of vl) {
266
+ d.append(n, v);
267
+ }
268
+ }
269
+ else {
270
+ d.append(n, vl);
271
+ }
272
+ }
273
+ else {
274
+ if (d[n] === undefined) {
275
+ _.set(d, n, vl);
276
+ }
277
+ else {
278
+ if (d[n] instanceof Array) {
279
+ d[n].push(vl);
280
+ }
281
+ else {
282
+ d[n] = [d[n], vl];
283
+ }
284
+ }
285
+ }
286
+ };
287
+ this.inputs.forEach(inp => {
288
+ const vl = inp.data();
289
+ if (vl !== null) {
290
+ if (typeof vl === 'object' && !(vl instanceof Array)) {
291
+ for (const [key, value] of Object.entries(vl)) {
292
+ setD(key, value);
293
+ }
294
+ }
295
+ else {
296
+ setD(inp.name, vl);
297
+ }
298
+ }
299
+ });
300
+ return d;
301
+ }
302
+ json(d = null) {
303
+ if (d == null) {
304
+ d = {};
305
+ }
306
+ this.inputs.forEach(inp => {
307
+ const vl = inp.data();
308
+ if (vl !== null && vl !== '') {
309
+ if (vl instanceof Array) {
310
+ for (const v of vl) {
311
+ d[inp.name] = v;
312
+ }
313
+ }
314
+ else {
315
+ d[inp.name] = vl;
316
+ }
317
+ }
318
+ });
319
+ return d;
320
+ }
321
+ setData(d) {
322
+ this.inputs.forEach(inp => {
323
+ var _a;
324
+ const iv = (_a = _.get(d, inp.name)) !== null && _a !== void 0 ? _a : null;
325
+ if (inp.type === InputType.Vehicle) {
326
+ const ivt = _.get(d, inp.name + 'Type');
327
+ inp.setValue({ Value: iv, Type: ivt }, true);
328
+ }
329
+ else if (inp.type === InputType.VehicleSearch) {
330
+ const ivs = _.get(d, inp.name.replace('Id', ''));
331
+ const ivt = _.get(d, inp.name.replace('Id', 'Type'));
332
+ inp.setValue({ Search: ivs, Value: iv, Type: ivt }, true);
333
+ }
334
+ else if (inp.type !== InputType.Label || iv != null) {
335
+ inp.setValue(iv, true);
336
+ }
337
+ if (inp.type === InputType.SelectAutoCompletePlaque || inp.type === InputType.SelectAutoComplete) {
338
+ const ivs = _.get(d, inp.name.replace('Id', ''));
339
+ inp.setSearch(ivs);
340
+ }
341
+ });
342
+ }
343
+ setError(res) {
344
+ if (res.error != null) {
345
+ let f = false;
346
+ // tslint:disable-next-line:forin
347
+ for (const err in res.error) {
348
+ // noinspection JSUnfilteredForInLoop
349
+ const i = this.inputs.find(x => x.name === err);
350
+ if (i) {
351
+ // noinspection JSUnfilteredForInLoop
352
+ i.error = InputError[InputError[res.error[err]]];
353
+ if (!f) {
354
+ i.focus();
355
+ f = true;
356
+ }
357
+ }
358
+ }
359
+ }
360
+ }
361
+ }
362
+ export class InputClass {
363
+ constructor(environment, l, name, icon = null, type = InputType.Text, cls = '', value = null, required = true, minLength = -1, maxLength = -1) {
364
+ this.environment = null;
365
+ this.url = null;
366
+ this.queryParams = null;
367
+ this.urlNewTab = false;
368
+ this.placeholder = null;
369
+ this.addNew = false;
370
+ this.description = null;
371
+ this.value = null;
372
+ this.search = null;
373
+ this.default = null;
374
+ this.disabled = false;
375
+ this.inEditDisabled = false;
376
+ this.inEditVisible = true;
377
+ this.inEditRequired = true;
378
+ this.displayLabel = true;
379
+ this.label = null;
380
+ this.withClear = false;
381
+ this.minLength = -1;
382
+ this.maxLength = -1;
383
+ this.error = null;
384
+ this.addModal = null;
385
+ this.loading = false;
386
+ this.button = null;
387
+ this.hasBarcodeReader = false;
388
+ this.onBarcodeReaderChange = null;
389
+ this.onClickButton = null;
390
+ this.progress = null;
391
+ this.onClick = null;
392
+ this.onKeyUp = null;
393
+ this.onKeyDown = null;
394
+ this.options = [];
395
+ this.match = null;
396
+ this.rel = null;
397
+ this.relUrl = null;
398
+ this.style = {};
399
+ this.position = 'bottom';
400
+ this.onChange = null;
401
+ this.hover = -1;
402
+ this.visible = true;
403
+ this.open = false;
404
+ this.multiple = false;
405
+ this.onlyChild = true;
406
+ this.allowed = null;
407
+ this.row = null;
408
+ this.rows = [];
409
+ this.level = null;
410
+ this.modal = null;
411
+ this.request = null;
412
+ this.nameFun = null;
413
+ this.onFocusIn = null;
414
+ this.onFocusOut = null;
415
+ this.changeType = () => { };
416
+ this.setValue = (v, isEdit) => { this.value = v; };
417
+ this.setSearch = () => { };
418
+ this.clear = () => { this.value = null; };
419
+ this.focusOut = () => { };
420
+ this.data = () => {
421
+ return this.value;
422
+ };
423
+ this.isValid = () => {
424
+ return true;
425
+ };
426
+ this.environment = environment;
427
+ this.l = l;
428
+ this.name = name;
429
+ this.id = name;
430
+ this.loadingName = name;
431
+ this.placeholder = name;
432
+ this.icon = icon;
433
+ this.class = cls + ([InputType.Mobile, InputType.Phone, InputType.Password, InputType.Email, InputType.Number, InputType.Price,
434
+ InputType.NationalCode, InputType.NationalNum, InputType.NationalCodeNum, InputType.EconomicNum, InputType.Sheba,
435
+ InputType.PostalCode, InputType.Date, InputType.Time, InputType.BillNumber, InputType.Username, InputType.Url].includes(type) ? ' ltr' : '');
436
+ this.type = type;
437
+ this.value = value;
438
+ this.default = value == null ? null : (typeof value === 'number' || typeof value === 'string' ? _.cloneDeep(value) : HelperClass.clone(value));
439
+ this.baseRequired = required;
440
+ this.required = required;
441
+ this.inEditRequired = required;
442
+ this.minLength = type === InputType.Mobile || type === InputType.Phone || type === InputType.NationalNum || type === InputType.EconomicNum ? 11 :
443
+ type === InputType.NationalCode || type === InputType.PostalCode || type === InputType.NationalCodeNum ? 10 :
444
+ type === InputType.Username ? 5 :
445
+ type === InputType.Sheba ? 24 : minLength;
446
+ this.maxLength = type === InputType.Mobile || type === InputType.Phone || type === InputType.NationalNum || type === InputType.NationalCodeNum ? 11 :
447
+ type === InputType.NationalCode || type === InputType.PostalCode ? 10 :
448
+ type === InputType.EconomicNum ? 14 :
449
+ type === InputType.Username ? 30 :
450
+ type === InputType.Sheba ? 24 : maxLength;
451
+ }
452
+ focus(changeIndex = false) { }
453
+ load(u = null, done = null) {
454
+ u = u ? u : this.url;
455
+ if (u) {
456
+ this.options = [];
457
+ this.hover = -1;
458
+ this.rows = [];
459
+ if (typeof u === 'string') {
460
+ if (!u.includes('{}')) {
461
+ this.loading = true;
462
+ this.request = new RequestClass(this.environment, this.l).send(u ? u : this.url, Method.Post, null, null, (result) => {
463
+ if (this.type === InputType.SelectSearchRadio || this.type === InputType.SelectSearch || this.type === InputType.Select || this.type === InputType.SelectAutoComplete ||
464
+ this.type === InputType.SelectAutoCompletePlaque || this.type === InputType.SelectAutoCompletePlaqueM ||
465
+ this.type === InputType.SelectAutoCompletePlaqueF || this.type === InputType.SelectAutoCompletePlaqueG || this.type === InputType.Radio) {
466
+ const r = this.getOptions(result, null);
467
+ const s = result.find(x => x.Selected);
468
+ if (s) {
469
+ this.value = s.Id.toString();
470
+ }
471
+ this.setOptions(r);
472
+ }
473
+ else if (this.type === InputType.Tree || this.type === InputType.TreeRadio) {
474
+ this.rows = this.getRows(result, null);
475
+ if (this.value != null) {
476
+ setTimeout(() => {
477
+ this.setValue(this.value, true);
478
+ }, 500);
479
+ }
480
+ }
481
+ if (done) {
482
+ done();
483
+ }
484
+ this.loading = false;
485
+ }, () => {
486
+ this.loading = false;
487
+ }, this.request);
488
+ }
489
+ }
490
+ else {
491
+ const result = [];
492
+ EnumUtils.getKeysAndValues(u).forEach((k) => {
493
+ result.push({ Name: this.l(k.key), Id: k.value.toString() });
494
+ });
495
+ if (this.type === InputType.SelectSearchRadio || this.type === InputType.SelectSearch || this.type === InputType.Select || this.type === InputType.SelectAutoComplete ||
496
+ this.type === InputType.SelectAutoCompletePlaque || this.type === InputType.SelectAutoCompletePlaqueM ||
497
+ this.type === InputType.SelectAutoCompletePlaqueF || this.type === InputType.SelectAutoCompletePlaqueG ||
498
+ this.type === InputType.Radio || this.type === InputType.Slide) {
499
+ const r = this.getOptions(result, null);
500
+ this.setOptions(r);
501
+ }
502
+ else if (this.type === InputType.Tree || this.type === InputType.TreeRadio) {
503
+ this.rows = this.getRows(result, null);
504
+ }
505
+ }
506
+ }
507
+ }
508
+ setOptions(r) {
509
+ this.options = r;
510
+ if (this.value != null) {
511
+ setTimeout(() => {
512
+ this.setValue(this.value, true);
513
+ }, 500);
514
+ }
515
+ }
516
+ getSelectedOptionData() {
517
+ var _a, _b;
518
+ return (_b = (_a = this.options.find(x => x.value === this.value)) === null || _a === void 0 ? void 0 : _a.option) !== null && _b !== void 0 ? _b : null;
519
+ }
520
+ getOptions(r, p, tree = true) {
521
+ return r.filter(x => (p == null && !x.ParentId) || x.ParentId === p || !tree)
522
+ .map((x) => {
523
+ const o = new OptionClass(x.Name, x.Id.toString());
524
+ if (this.type === InputType.SelectAutoCompletePlaque || this.type === InputType.SelectAutoCompletePlaqueM ||
525
+ this.type === InputType.SelectAutoCompletePlaqueF || this.type === InputType.SelectAutoCompletePlaqueG || this.name === 'CarId') {
526
+ o.name = HelperClass.ToReadablePlaque(o.name);
527
+ }
528
+ o.search = x.Search;
529
+ o.option = x;
530
+ o.options = tree ? this.getOptions(r, x.Id) : [];
531
+ return o;
532
+ });
533
+ }
534
+ getRows(r, p) {
535
+ const l = [];
536
+ r.filter(x => (p == null && !x.ParentId) || x.ParentId === p).forEach((x) => {
537
+ let c = this.getRows(r, x.Id);
538
+ c = c.length > 0 ? c : x.Children ? x.Children.map(a => new TreeRowClass(a.Name, a.Id, a.Selected)) : [];
539
+ let s = x.Selected === true;
540
+ if (this.onlyChild) {
541
+ s = c.length === 0 ? x.Selected : (c.find(y => y.selected === false || y.selected === null) == null ? true :
542
+ (c.find(y => y.selected === true || y.selected === null) != null ? null : false));
543
+ }
544
+ const n = this.nameFun ? this.nameFun(x) : x.Name;
545
+ l.push(new TreeRowClass(n, x.Id, s, c));
546
+ });
547
+ return l;
548
+ }
549
+ getLabel() {
550
+ return HelperClass.getLabel(this);
551
+ }
552
+ getSelected(opts = this.options) {
553
+ return this.getSelectedOptions(opts).map(x => x.value);
554
+ }
555
+ getSelectedName(opts = this.options) {
556
+ return this.getSelectedOptions(opts).map(x => x.search);
557
+ }
558
+ getSelectedOptions(opts = this.options) {
559
+ let l = [];
560
+ for (const f of opts) {
561
+ if (f.selected && (!this.onlyChild || f.options.length === 0)) {
562
+ l.push(f);
563
+ }
564
+ const rs = this.getSelectedOptions(f.options);
565
+ l = l.concat(rs);
566
+ }
567
+ return l;
568
+ }
569
+ getSelectedRows(rows = this.rows) {
570
+ let l = [];
571
+ for (const f of rows) {
572
+ if (f.selected && (!this.onlyChild || f.children.length === 0)) {
573
+ l.push(f);
574
+ }
575
+ const rs = this.getSelectedRows(f.children);
576
+ l = l.concat(rs);
577
+ }
578
+ return l;
579
+ }
580
+ getAllRows(rows = this.rows) {
581
+ let l = [];
582
+ for (const f of rows) {
583
+ if (!this.onlyChild || f.children.length === 0) {
584
+ l.push(f);
585
+ }
586
+ const rs = this.getAllRows(f.children);
587
+ l = l.concat(rs);
588
+ }
589
+ return l;
590
+ }
591
+ }
592
+ export class OptionClass {
593
+ constructor(name, value, options = [], cls = null, dis = false) {
594
+ this.show = true;
595
+ this.selected = false;
596
+ this.parent = null;
597
+ this.loading = false;
598
+ this.disabled = false;
599
+ this.name = name;
600
+ this.value = value;
601
+ this.options = options;
602
+ this.class = cls;
603
+ this.disabled = dis;
604
+ }
605
+ }
606
+ export class DayClass {
607
+ constructor(day, today, selected, active) {
608
+ this.class = null;
609
+ this.day = day;
610
+ this.today = today;
611
+ this.selected = selected;
612
+ this.active = active;
613
+ }
614
+ }
615
+ export class TreeRowClass {
616
+ constructor(name, value, selected = false, children = []) {
617
+ this.name = name;
618
+ this.value = value;
619
+ this.selected = selected;
620
+ this.children = children;
621
+ }
622
+ }
623
+ export class AccordionClass {
624
+ constructor(l, name, cls = '', rows) {
625
+ this.hasDelete = false;
626
+ this.displayLabel = false;
627
+ this.loading = false;
628
+ this.access = true;
629
+ this.onDelete = null;
630
+ this.l = l;
631
+ this.name = name;
632
+ this.class = cls;
633
+ this.rows = rows;
634
+ }
635
+ check() {
636
+ for (const row of this.rows) {
637
+ if (!row.form.check()) {
638
+ row.open();
639
+ return false;
640
+ }
641
+ }
642
+ return true;
643
+ }
644
+ }
645
+ export class AccordionRowClass {
646
+ constructor(id, name, form = null, table = null) {
647
+ this.show = true;
648
+ this.firstTable = true;
649
+ this.id = id;
650
+ this.name = name;
651
+ this.form = form;
652
+ this.table = table;
653
+ }
654
+ toggle() {
655
+ setTimeout(() => {
656
+ $('#AccordionRow' + this.id + ' > .header').click();
657
+ }, 100);
658
+ }
659
+ open() {
660
+ setTimeout(() => {
661
+ if (!$('#AccordionRow' + this.id + ' > .content').hasClass('open')) {
662
+ $('#AccordionRow' + this.id + ' > .header').click();
663
+ }
664
+ }, 100);
665
+ }
666
+ }
667
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiJEOi9Qc1Rvb2xraXQvVUkvcHJvamVjdHMvcHMtdG9vbGtpdC11aS9zcmMvIiwic291cmNlcyI6WyJsaWIvY2xhc3Nlcy9mb3JtLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFDVCxNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFHNUIsTUFBTSxPQUFPLFFBQVE7SUFDbkIsWUFBWSxJQUFZO1FBS3hCLFlBQU8sR0FBRyxHQUFHLENBQUM7UUFFZCxVQUFLLEdBQWUsSUFBSSxDQUFDO1FBQ3pCLFlBQU8sR0FBZSxJQUFJLENBQUM7UUFDM0IsV0FBTSxHQUFtQyxJQUFJLENBQUM7UUFDOUMsVUFBSyxHQUFHLEdBQUcsRUFBRTtZQUNYLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztZQUNuQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUM7Z0JBQ2YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUUsR0FBRyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUNuRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssQ0FBQyxFQUFDO29CQUN4QixhQUFh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QUMsTUFBTSxDQUFDLEVBQUM7Z0JBQ2pFLENBQUMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNyRDtRQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRW51bVV0aWxzLFxyXG4gIElucHV0RXJyb3IsXHJcbiAgSW5wdXRUeXBlLFxyXG4gIE1ldGhvZCxcclxuICBSZXN1bHRTdGF0dXNFbnVtXHJcbn0gZnJvbSAnLi9lbnVtLmNsYXNzJztcclxuaW1wb3J0IHtIZWxwZXJDbGFzc30gZnJvbSAnLi9oZWxwZXIuY2xhc3MnO1xyXG5pbXBvcnQge1JlcXVlc3RDbGFzc30gZnJvbSAnLi9yZXF1ZXN0LmNsYXNzJztcclxuaW1wb3J0IHtUYWJsZUNsYXNzfSBmcm9tICcuL3RhYmxlLmNsYXNzJztcclxuaW1wb3J0ICogYXMgJCBmcm9tICdqcXVlcnknO1xyXG5pbXBvcnQge01vZGFsQ2xhc3N9IGZyb20gJy4vbW9kYWwuY2xhc3MnO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7Q2hhcnRDbGFzc30gZnJvbSAnLi9jaGFydC5jbGFzcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3Mge1xyXG4gIGNvbnN0cnVjdG9yKHNlY3M6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZWNzID0gdGhpcy5yZW1haW5TZWNzID0gc2VjcztcclxuICB9XHJcbiAgc2VjczogbnVtYmVyO1xyXG4gIHJlbWFpblNlY3M6IG51bWJlcjtcclxuICBwZXJjZW50ID0gMTAwO1xyXG4gIGludGVyVmFsO1xyXG4gIG9uRW5kOiAoKSA9PiB2b2lkID0gbnVsbDtcclxuICBvblN0YXJ0OiAoKSA9PiB2b2lkID0gbnVsbDtcclxuICBvblRpY2s6IChtOiBudW1iZXIsIHM6IG51bWJlcikgPT4gdm9pZCA9IG51bGw7XHJcbiAgc3RhcnQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLnJlbWFpblNlY3MgPSB0aGlzLnNlY3M7XHJcbiAgICB0aGlzLnBlcmNlbnQgPSAxMDA7XHJcbiAgICBpZiAodGhpcy5vblN0YXJ0KXtcclxuICAgICAgdGhpcy5vblN0YXJ0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmludGVyVmFsID0gc2V0SW50ZXJ2YWwoICgpID0+IHtcclxuICAgICAgdGhpcy5wZXJjZW50ID0gKHRoaXMucmVtYWluU2VjcyAvIHRoaXMuc2VjcykgKiAxMDA7XHJcbiAgICAgIGlmICh0aGlzLnJlbWFpblNlY3MgPT09IDApe1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlclZhbCk7XHJcbiAgICAgICAgaWYgKHRoaXMub25FbmQpe1xyXG4gICAgICAgICAgdGhpcy5vbkVuZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodGhpcy5yZW1haW5TZWNzKSl7XHJcbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IodGhpcy5yZW1haW5TZWNzIC8gNjApO1xyXG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLnJlbWFpblNlY3MgJSA2MDtcclxuICAgICAgICB0aGlzLm9uVGljayhtLCBzKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlbWFpblNlY3MgLT0gMC41O1xyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIEZvcm1DbGFzcyB7XHJcbiAgY29uc3RydWN0b3IoZW52aXJvbm1lbnQ6IGFueSwgbDogKGssIHY/KSA9PiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IG51bGwsIHBlcm1pc3Npb246IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgICAgICAgICAgIHVybDogc3RyaW5nID0gbnVsbCwgY2xzOiBzdHJpbmcgPSBudWxsKSB7XHJcbiAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7XHJcbiAgICB0aGlzLmwgPSBsO1xyXG4gICAgdGhpcy51cmwgPSB1cmw7XHJcbiAgICB0aGlzLmJhc2VVcmwgPSB1cmw7XHJcbiAgICB0aGlzLmNsYXNzID0gY2xzO1xyXG4gICAgdGhpcy5wZXJtaXNzaW9uID0gcGVybWlzc2lvbjtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB0aGlzLmlkID0gdGhpcy5uYW1lO1xyXG4gIH1cclxuICBsOiAoaywgdj8pID0+IHN0cmluZztcclxuICBwZXJtaXNzaW9uOiBib29sZWFuO1xyXG4gIGVudmlyb25tZW50OiBhbnkgPSBudWxsO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpc0VkaXQgPSBmYWxzZTtcclxuICBzdWJOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgY2xhc3M6IHN0cmluZztcclxuICBiYXNlVXJsOiBzdHJpbmc7XHJcbiAgdXJsOiBzdHJpbmc7XHJcbiAgbWV0aG9kOiBNZXRob2QgPSBNZXRob2QuUG9zdDtcclxuICBsb2FkaW5nID0gZmFsc2U7XHJcbiAgc3R5bGU6IHt9O1xyXG4gIG9uVG9wID0gZmFsc2U7XHJcbiAgZGlzcGxheUxhYmVsID0gdHJ1ZTtcclxuICByZXF1ZXN0OiBhbnkgPSBudWxsO1xyXG4gIGlucHV0czogSW5wdXRDbGFzc1tdID0gW107XHJcbiAgb25TdWNjZXNzQmFzZTogKHJlc3VsdCkgPT4gdm9pZCA9IG51bGw7XHJcbiAgb25TdWNjZXNzOiAocmVzdWx0KSA9PiB2b2lkID0gbnVsbDtcclxuICBvbkZhaWxlZDogKHJlc3VsdCkgPT4gdm9pZCA9IG51bGw7XHJcbiAgb25Mb2FkOiAocmVzdWx0KSA9PiB2b2lkID0gbnVsbDtcclxuICBvbkJlZm9yZVN1Ym1pdDogKCkgPT4gYm9vbGVhbiA9IG51bGw7XHJcbiAgb25IaWRlTW9kYWw6ICgpID0+IHZvaWQgPSBudWxsO1xyXG4gIG9uU2hvd01vZGFsOiAoKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgbG9hZERhdGEodXJsKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgbmV3IFJlcXVlc3RDbGFzcyh0aGlzLmVudmlyb25tZW50LCB0aGlzLmwpLnNlbmQodXJsLCBNZXRob2QuUG9zdCwgbnVsbCwgbnVsbCwgKHJlc3VsdCkgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnNldERhdGEocmVzdWx0KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5vbkxvYWQpe1xyXG4gICAgICAgICAgdGhpcy5vbkxvYWQocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDUwMCk7XHJcbiAgICB9LCAobSkgPT4ge1xyXG4gICAgICBpZiAobSA9PT0gJ0Zvcm1CYXNlRXJyb3JBY2Nlc3MnIHx8IG0gPT09ICdGb3JtQmFzZUVycm9yUGVybWlzc2lvbicpe1xyXG4gICAgICAgIHRoaXMucGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZm9jdXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBpID0gdGhpcy5pbnB1dHMuZmluZCh4ID0+ICF4LmRpc2FibGVkICYmIHgudHlwZSAhPT0gSW5wdXRUeXBlLkxhYmVsICYmIHgudHlwZSAhPT0gSW5wdXRUeXBlLkhpZGRlbiAmJlxyXG4gICAgICB4LnR5cGUgIT09IElucHV0VHlwZS5Db25zdGFudCAmJiB4LnR5cGUgIT09IElucHV0VHlwZS5TdWJtaXQgJiYgeC50eXBlICE9PSBJbnB1dFR5cGUuQnV0dG9uICYmIHgudHlwZSAhPT0gSW5wdXRUeXBlLkljb24gJiZcclxuICAgICAgeC50eXBlICE9PSBJbnB1dFR5cGUuQ2hlY2spO1xyXG4gICAgaWYgKGkpe1xyXG4gICAgICBpLmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN1Ym1pdChvblN1Ym1pdCA9IG51bGwpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jaGVjaygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9uQmVmb3JlU3VibWl0ICYmICF0aGlzLm9uQmVmb3JlU3VibWl0KCkpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBidG5zID0gdGhpcy5pbnB1dHMuZmlsdGVyKHggPT4geC50eXBlID09PSBJbnB1dFR5cGUuU3VibWl0KTtcclxuICAgIGZvciAoY29uc3QgYnRuIG9mIGJ0bnMpe1xyXG4gICAgICBpZiAoYnRuLmxvYWRpbmcpe1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBidG4ubG9hZGluZyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhKCk7XHJcbiAgICBpZiAob25TdWJtaXQpe1xyXG4gICAgICBmb3IgKGNvbnN0IGJ0biBvZiBidG5zKXtcclxuICAgICAgICBidG4ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIG9uU3VibWl0KGRhdGEpO1xyXG4gICAgICBpZiAodGhpcy5vblN1Y2Nlc3MpIHtcclxuICAgICAgICB0aGlzLm9uU3VjY2VzcyhkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlcXVlc3QgPSBuZXcgUmVxdWVzdENsYXNzKHRoaXMuZW52aXJvbm1lbnQpLmdldENsaWVudCh0aGlzLnJlcXVlc3QsIHRoaXMudXJsLCB0aGlzLm1ldGhvZCwgZGF0YSxcclxuICAgICAgKHJlcykgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuc3RhdHVzID09PSBSZXN1bHRTdGF0dXNFbnVtLlN1Y2Nlc3MpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm9uU3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLm9uU3VjY2VzcyhyZXMucmVzdWx0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLm9uU3VjY2Vzc0Jhc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3NCYXNlKHJlcy5yZXN1bHQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgbSA9ICcnO1xyXG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IFJlc3VsdFN0YXR1c0VudW0uTm90UmVnaXN0ZXJlZCkge1xyXG4gICAgICAgICAgICBtID0gdGhpcy5sKCdGb3JtQmFzZUVycm9yTm90UmVnaXN0ZXJlZCcpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzID09PSBSZXN1bHRTdGF0dXNFbnVtLkV4cGlyZWRSZWdpc3RlcmVkKSB7XHJcbiAgICAgICAgICAgIG0gPSB0aGlzLmwoJ0Zvcm1CYXNlRXJyb3JFeHBpcmVkUmVnaXN0ZXJlZCcpO1xyXG4gICAgICAgICAgfSAgZWxzZSBpZiAocmVzLnN0YXR1cyA9PT0gUmVzdWx0U3RhdHVzRW51bS5JbnZhbGlkSXApIHtcclxuICAgICAgICAgICAgbSA9IHRoaXMubCgnRm9ybUJhc2VFcnJvckludmFsaWRJcCcpO1xyXG4gICAgICAgICAgfSAgZWxzZSBpZiAocmVzLnN0YXR1cyA9PT0gUmVzdWx0U3RhdHVzRW51bS5Ob0NyZWRpdCkge1xyXG4gICAgICAgICAgICBtID0gdGhpcy5sKCdGb3JtQmFzZUVycm9yTm9DcmVkaXQnKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzLnN0YXR1cyA9PT0gUmVzdWx0U3RhdHVzRW51bS5VbmF1dGhvcml6ZWQpIHtcclxuICAgICAgICAgICAgbSA9IHRoaXMubCgnRm9ybUJhc2VFcnJvckV4cGlyZWQnKTtcclxuICAgICAgICAgICAgSGVscGVyQ2xhc3MuZXJhc2VDb29raWUoJ1RPS0VOJyk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXMgPT09IFJlc3VsdFN0YXR1c0VudW0uTm90QWNjZXNzKSB7XHJcbiAgICAgICAgICAgIG0gPSB0aGlzLmwoJ0Zvcm1CYXNlRXJyb3JBY2Nlc3MnKTtcclxuICAgICAgICAgIH0gIGVsc2UgaWYgKHJlcy5zdGF0dXMgPT09IFJlc3VsdFN0YXR1c0VudW0uTm90UGVybWlzc2lvbikge1xyXG4gICAgICAgICAgICBtID0gdGhpcy5sKCdGb3JtQmFzZUVycm9yUGVybWlzc2lvbicpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXMubWVzc2FnZSA9PT0gJ3N0cmluZycpe1xyXG4gICAgICAgICAgICAgIGNvbnN0IGFtID0gcmVzLm1lc3NhZ2Uuc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgICBtID0gdGhpcy5sKGFtWzBdLCBhbS5sZW5ndGggPiAxID8gYW0uc2xpY2UoMSkgOiBudWxsKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmZvcmluXHJcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtc2cgaW4gcmVzLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VuZmlsdGVyZWRGb3JJbkxvb3BcclxuICAgICAgICAgICAgICAgIG0gPSB0aGlzLmwobXNnLCByZXMubWVzc2FnZVttc2ddKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZXRFcnJvcihyZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG0pIHtcclxuICAgICAgICAgICAgSGVscGVyQ2xhc3MuYWRkTm90aWZpY2F0aW9uKG0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMub25GYWlsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkZhaWxlZChyZXMubWVzc2FnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgYnRuIG9mIGJ0bnMpe1xyXG4gICAgICAgICAgYnRuLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICBIZWxwZXJDbGFzcy5hZGROb3RpZmljYXRpb24odGhpcy5sKCdFcnJvcicpKTtcclxuICAgICAgICBpZiAodGhpcy5vbkZhaWxlZCkge1xyXG4gICAgICAgICAgdGhpcy5vbkZhaWxlZCgnRXJyb3InKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCBidG4gb2YgYnRucyl7XHJcbiAgICAgICAgICBidG4ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgY2hlY2soKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xyXG4gICAgdGhpcy5pbnB1dHMuZm9yRWFjaChpbnAgPT4ge1xyXG4gICAgICBpZiAoIWlucC5pc1ZhbGlkKCkpIHtcclxuICAgICAgICBpZiAodmFsaWQpe1xyXG4gICAgICAgICAgaW5wLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhbGlkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHZhbGlkO1xyXG4gIH1cclxuICBjbGVhcihpbnNlcnRBY2Nlc3MgPSB0cnVlKTogdm9pZCB7XHJcbiAgICB0aGlzLm1ldGhvZCA9IE1ldGhvZC5Qb3N0O1xyXG4gICAgdGhpcy51cmwgPSB0aGlzLmJhc2VVcmw7XHJcbiAgICB0aGlzLnNldEJ1dHRvbnModGhpcy5vblRvcCwgZmFsc2UsIGluc2VydEFjY2VzcywgZmFsc2UpO1xyXG4gICAgdGhpcy5jbGVhcklucHV0cygpO1xyXG4gICAgaWYgKHRoaXMub25Ub3AgJiYgIXRoaXMuaXNFZGl0KXtcclxuICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0VkaXQgPSBmYWxzZTtcclxuICB9XHJcbiAgY2xlYXJJbnB1dHMoKTogdm9pZHtcclxuICAgIHRoaXMuaW5wdXRzLmZpbHRlcih4ID0+IHgudHlwZSAhPT0gSW5wdXRUeXBlLkNvbnN0YW50KS5mb3JFYWNoKGlucCA9PiB7XHJcbiAgICAgIGlucC5jbGVhcigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHNldEJ1dHRvbnMoZm9ybU9uVG9wLCBlZGl0OiBib29sZWFuLCBpbnNlcnRBY2Nlc3MgPSBmYWxzZSwgdXBkYXRlQWNjZXNzID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IHMgPSB0aGlzLmlucHV0cy5maW5kKHggPT4geC50eXBlID09PSBJbnB1dFR5cGUuU3VibWl0KTtcclxuICAgIGlmICghcyl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHMuZGlzYWJsZWQgPSAhKChlZGl0ICYmIHVwZGF0ZUFjY2VzcykgfHwgKCFlZGl0ICYmIGluc2VydEFjY2VzcykpO1xyXG4gICAgcy5uYW1lID0gcy5uYW1lICE9IG51bGwgPyAoZWRpdCA/ICdBY2NlcHQnIDogJ1NhdmUnKSA6IG51bGw7XHJcbiAgICBzLmNsYXNzID0gZWRpdCA/IHMuY2xhc3MucmVwbGFjZSgnZ3JlZW4nLCAnYmx1ZScpIDogcy5jbGFzcy5yZXBsYWNlKCdibHVlJywgJ2dyZWVuJyk7XHJcbiAgfVxyXG4gIGFkZEJ1dHRvbnMobmFtZSA9ICdTYXZlJywgY2xzID0gJ2dyZWVuJywgY2xlYXIgPSB0cnVlLCBpbnNlcnRBY2Nlc3MgPSB0cnVlLCBvblN1Ym1pdCA9IG51bGwpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN1Ym1pdCA9IHRoaXMuaW5wdXRzLmZpbmQoeCA9PiB4LnR5cGUgPT09IElucHV0VHlwZS5TdWJtaXQpID8/IG51bGw7XHJcbiAgICBpZiAoc3VibWl0ICE9IG51bGwpe1xyXG4gICAgICBzdWJtaXQuZGlzYWJsZWQgPSAhaW5zZXJ0QWNjZXNzO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBiciA9IG5ldyBJbnB1dENsYXNzKHRoaXMuZW52aXJvbm1lbnQsIHRoaXMubCwgbnVsbCwgbnVsbCwgSW5wdXRUeXBlLkxhYmVsLFxyXG4gICAgICB0aGlzLm9uVG9wID8gJ3NwYWNlJyA6ICd1bmRlcmxpbmUnKTtcclxuICAgIGNvbnN0IHNhdmUgPSBuZXcgSW5wdXRDbGFzcyh0aGlzLmVudmlyb25tZW50LCB0aGlzLmwsIG5hbWUsICdmYWQgZmEtY2hlY2snLCBJbnB1dFR5cGUuU3VibWl0LFxyXG4gICAgICAnc2F2ZS1mb3JtLWJ0biAnICsgKHRoaXMub25Ub3AgPyAnaC0yNSAnIDogJ2gtMzAgJykgKyBjbHMpO1xyXG4gICAgc2F2ZS5vbkNsaWNrID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLnN1Ym1pdChvblN1Ym1pdCk7XHJcbiAgICB9O1xyXG4gICAgc2F2ZS5kaXNhYmxlZCA9ICFpbnNlcnRBY2Nlc3M7XHJcbiAgICBpZiAoIWNscy5pbmNsdWRlcygnb25seS1pY29uJykpe1xyXG4gICAgICB0aGlzLmlucHV0cy5wdXNoKGJyKTtcclxuICAgIH0gZWxzZXtcclxuICAgICAgc2F2ZS5jbGFzcyA9IHNhdmUuY2xhc3MucmVwbGFjZSgnc2F2ZS1mb3JtLWJ0biAnLCAnJykucmVwbGFjZSgnaC0yNSAnLCAnaC0zMCAnKTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5wdXRzLnB1c2goc2F2ZSk7XHJcbiAgICBpZiAoY2xlYXIpe1xyXG4gICAgICBjb25zdCBlcmFzZSA9IG5ldyBJbnB1dENsYXNzKHRoaXMuZW52aXJvbm1lbnQsIHRoaXMubCwgbnVsbCwgJ2ZhZCBmYS1lcmFzZXInLCBJbnB1dFR5cGUuQnV0dG9uLFxyXG4gICAgICAgICdmLWwgdy11IGdyZXkgZXJhc2UtZm9ybS1idG4gJyArICh0aGlzLm9uVG9wID8gJ2gtMjUgJyA6ICdoLTMwICcpKTtcclxuICAgICAgZXJhc2Uub25DbGljayA9ICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5vblRvcCl7XHJcbiAgICAgICAgICB0aGlzLmNsZWFyKGluc2VydEFjY2Vzcyk7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLmNsZWFySW5wdXRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmlucHV0cy5wdXNoKGVyYXNlKTtcclxuICAgIH1cclxuICB9XHJcbiAgZGF0YShkID0gbnVsbCk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5pbnB1dHMuZmluZEluZGV4KHggPT4geC50eXBlID09PSBJbnB1dFR5cGUuRmlsZSB8fCB4LnR5cGUgPT09IElucHV0VHlwZS5VcGxvYWRlcikgPT09IC0xKXtcclxuICAgICAgaWYgKGQgPT0gbnVsbCl7XHJcbiAgICAgICAgZCA9IHt9O1xyXG4gICAgICB9XHJcbiAgICB9ZWxzZXtcclxuICAgICAgaWYgKGQgPT0gbnVsbCl7XHJcbiAgICAgICAgZCA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZXREID0gKG4sIHZsKSA9PiB7XHJcbiAgICAgIGlmIChkIGluc3RhbmNlb2YgRm9ybURhdGEpe1xyXG4gICAgICAgIGlmICh2bCBpbnN0YW5jZW9mIEFycmF5KXtcclxuICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2bCl7XHJcbiAgICAgICAgICAgIGQuYXBwZW5kKG4sIHYpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgZC5hcHBlbmQobiwgdmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoZFtuXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBfLnNldChkLCBuLCB2bCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChkW25dIGluc3RhbmNlb2YgQXJyYXkpe1xyXG4gICAgICAgICAgICBkW25dLnB1c2godmwpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZFtuXSA9IFtkW25dLCB2bF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhpcy5pbnB1dHMuZm9yRWFjaChpbnAgPT4ge1xyXG4gICAgICBjb25zdCB2bCA9IGlucC5kYXRhKCk7XHJcbiAgICAgIGlmICh2bCAhPT0gbnVsbCl7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2bCA9PT0gJ29iamVjdCcgJiYgISh2bCBpbnN0YW5jZW9mIEFycmF5KSl7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IFsga2V5LCB2YWx1ZSBdIG9mIE9iamVjdC5lbnRyaWVzKHZsKSkge1xyXG4gICAgICAgICAgICBzZXREKGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXREKGlucC5uYW1lLCB2bCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkO1xyXG4gIH1cclxuICBqc29uKGQgPSBudWxsKToge30ge1xyXG4gICAgaWYgKGQgPT0gbnVsbCl7XHJcbiAgICAgIGQgPSB7fTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5wdXRzLmZvckVhY2goaW5wID0+IHtcclxuICAgICAgY29uc3QgdmwgPSBpbnAuZGF0YSgpO1xyXG4gICAgICBpZiAodmwgIT09IG51bGwgJiYgdmwgIT09ICcnKXtcclxuICAgICAgICBpZiAodmwgaW5zdGFuY2VvZiBBcnJheSl7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IHYgb2Ygdmwpe1xyXG4gICAgICAgICAgICBkW2lucC5uYW1lXSA9IHY7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBkW2lucC5uYW1lXSA9IHZsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZDtcclxuICB9XHJcbiAgc2V0RGF0YShkKTogdm9pZCB7XHJcbiAgICB0aGlzLmlucHV0cy5mb3JFYWNoKGlucCA9PiB7XHJcbiAgICAgIGNvbnN0IGl2ID0gXy5nZXQoZCwgaW5wLm5hbWUpID8/IG51bGw7XHJcbiAgICAgIGlmIChpbnAudHlwZSA9PT0gSW5wdXRUeXBlLlZlaGljbGUpe1xyXG4gICAgICAgIGNvbnN0IGl2dCA9IF8uZ2V0KGQsIGlucC5uYW1lICsgJ1R5cGUnKTtcclxuICAgICAgICBpbnAuc2V0VmFsdWUoe1ZhbHVlOiBpdiwgVHlwZTogaXZ0fSwgdHJ1ZSk7XHJcbiAgICAgIH1lbHNlIGlmIChpbnAudHlwZSA9PT0gSW5wdXRUeXBlLlZlaGljbGVTZWFyY2gpe1xyXG4gICAgICAgIGNvbnN0IGl2cyA9IF8uZ2V0KGQsIGlucC5uYW1lLnJlcGxhY2UoJ0lkJywgJycpKTtcclxuICAgICAgICBjb25zdCBpdnQgPSBfLmdldChkLCBpbnAubmFtZS5yZXBsYWNlKCdJZCcsICdUeXBlJykpO1xyXG4gICAgICAgIGlucC5zZXRWYWx1ZSh7U2VhcmNoOiBpdnMsIFZhbHVlOiBpdiwgVHlwZTogaXZ0fSwgdHJ1ZSk7XHJcbiAgICAgIH1lbHNlIGlmIChpbnAudHlwZSAhPT0gSW5wdXRUeXBlLkxhYmVsIHx8IGl2ICE9IG51bGwpe1xyXG4gICAgICAgIGlucC5zZXRWYWx1ZShpdiwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlucC50eXBlID09PSBJbnB1dFR5cGUuU2VsZWN0QXV0b0NvbXBsZXRlUGxhcXVlIHx8IGlucC50eXBlID09PSBJbnB1dFR5cGUuU2VsZWN0QXV0b0NvbXBsZXRlKXtcclxuICAgICAgICBjb25zdCBpdnMgPSBfLmdldChkLCBpbnAubmFtZS5yZXBsYWNlKCdJZCcsICcnKSk7XHJcbiAgICAgICAgaW5wLnNldFNlYXJjaChpdnMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc2V0RXJyb3IocmVzKTogdm9pZCB7XHJcbiAgICBpZiAocmVzLmVycm9yICE9IG51bGwpe1xyXG4gICAgICBsZXQgZiA9IGZhbHNlO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cclxuICAgICAgZm9yIChjb25zdCBlcnIgaW4gcmVzLmVycm9yKSB7XHJcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5maWx0ZXJlZEZvckluTG9vcFxyXG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmlucHV0cy5maW5kKHggPT4geC5uYW1lID09PSBlcnIpO1xyXG4gICAgICAgIGlmIChpKXtcclxuICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VuZmlsdGVyZWRGb3JJbkxvb3BcclxuICAgICAgICAgIGkuZXJyb3IgPSBJbnB1dEVycm9yW0lucHV0RXJyb3JbcmVzLmVycm9yW2Vycl1dXTtcclxuICAgICAgICAgIGlmICghZil7XHJcbiAgICAgICAgICAgIGkuZm9jdXMoKTtcclxuICAgICAgICAgICAgZiA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXRDbGFzcyB7XHJcbiAgY29uc3RydWN0b3IoZW52aXJvbm1lbnQ6IGFueSwgbDogKGssIHY/KSA9PiBzdHJpbmcsIG5hbWU6IHN0cmluZywgaWNvbjogc3RyaW5nID0gbnVsbCxcclxuICAgICAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUgPSBJbnB1dFR5cGUuVGV4dCwgY2xzOiBzdHJpbmcgPSAnJywgdmFsdWUgPSBudWxsLFxyXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiBib29sZWFuID0gdHJ1ZSwgbWluTGVuZ3RoID0gLTEsIG1heExlbmd0aCA9IC0xKSB7XHJcbiAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7XHJcbiAgICB0aGlzLmwgPSBsO1xyXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgIHRoaXMuaWQgPSBuYW1lO1xyXG4gICAgdGhpcy5sb2FkaW5nTmFtZSA9IG5hbWU7XHJcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gbmFtZTtcclxuICAgIHRoaXMuaWNvbiA9IGljb247XHJcbiAgICB0aGlzLmNsYXNzID0gY2xzICsgKFtJbnB1dFR5cGUuTW9iaWxlLCBJbnB1dFR5cGUuUGhvbmUsIElucHV0VHlwZS5QYXNzd29yZCwgSW5wdXRUeXBlLkVtYWlsLCBJbnB1dFR5cGUuTnVtYmVyLCBJbnB1dFR5cGUuUHJpY2UsXHJcbiAgICAgIElucHV0VHlwZS5OYXRpb25hbENvZGUsIElucHV0VHlwZS5OYXRpb25hbE51bSwgSW5wdXRUeXBlLk5hdGlvbmFsQ29kZU51bSwgSW5wdXRUeXBlLkVjb25vbWljTnVtLCBJbnB1dFR5cGUuU2hlYmEsXHJcbiAgICAgIElucHV0VHlwZS5Qb3N0YWxDb2RlLCBJbnB1dFR5cGUuRGF0ZSwgSW5wdXRUeXBlLlRpbWUsIElucHV0VHlwZS5CaWxsTnVtYmVyLCBJbnB1dFR5cGUuVXNlcm5hbWUsIElucHV0VHlwZS5VcmxdLmluY2x1ZGVzKHR5cGUpID8gJyBsdHInIDogJycpO1xyXG4gICAgdGhpcy50eXBlID0gdHlwZTtcclxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuZGVmYXVsdCA9IHZhbHVlID09IG51bGwgPyBudWxsIDogKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IF8uY2xvbmVEZWVwKHZhbHVlKSA6IEhlbHBlckNsYXNzLmNsb25lKHZhbHVlKSk7XHJcbiAgICB0aGlzLmJhc2VSZXF1aXJlZCA9IHJlcXVpcmVkO1xyXG4gICAgdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkO1xyXG4gICAgdGhpcy5pbkVkaXRSZXF1aXJlZCA9IHJlcXVpcmVkO1xyXG4gICAgdGhpcy5taW5MZW5ndGggPSB0eXBlID09PSBJbnB1dFR5cGUuTW9iaWxlIHx8IHR5cGUgPT09IElucHV0VHlwZS5QaG9uZSB8fCB0eXBlID09PSBJbnB1dFR5cGUuTmF0aW9uYWxOdW0gfHwgdHlwZSA9PT0gSW5wdXRUeXBlLkVjb25vbWljTnVtID8gMTEgOlxyXG4gICAgICB0eXBlID09PSBJbnB1dFR5cGUuTmF0aW9uYWxDb2RlIHx8IHR5cGUgPT09IElucHV0VHlwZS5Qb3N0YWxDb2RlIHx8IHR5cGUgPT09IElucHV0VHlwZS5OYXRpb25hbENvZGVOdW0gPyAxMCA6XHJcbiAgICAgIHR5cGUgPT09IElucHV0VHlwZS5Vc2VybmFtZSA/IDUgOlxyXG4gICAgICB0eXBlID09PSBJbnB1dFR5cGUuU2hlYmEgPyAyNCA6IG1pbkxlbmd0aDtcclxuICAgIHRoaXMubWF4TGVuZ3RoID0gdHlwZSA9PT0gSW5wdXRUeXBlLk1vYmlsZSB8fCB0eXBlID09PSBJbnB1dFR5cGUuUGhvbmUgfHwgdHlwZSA9PT0gSW5wdXRUeXBlLk5hdGlvbmFsTnVtIHx8IHR5cGUgPT09IElucHV0VHlwZS5OYXRpb25hbENvZGVOdW0gPyAxMSA6XHJcbiAgICAgIHR5cGUgPT09IElucHV0VHlwZS5OYXRpb25hbENvZGUgfHwgdHlwZSA9PT0gSW5wdXRUeXBlLlBvc3RhbENvZGUgPyAxMCA6XHJcbiAgICAgIHR5cGUgPT09IElucHV0VHlwZS5FY29ub21pY051bSA/IDE0IDpcclxuICAgICAgdHlwZSA9PT0gSW5wdXRUeXBlLlVzZXJuYW1lID8gMzAgOlxyXG4gICAgICB0eXBlID09PSBJbnB1dFR5cGUuU2hlYmEgPyAyNCA6IG1heExlbmd0aDtcclxuICB9XHJcbiAgZW52aXJvbm1lbnQ6IGFueSA9IG51bGw7XHJcbiAgbDogKGssIHY/KSA9PiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHVybCA9IG51bGw7XHJcbiAgcXVlcnlQYXJhbXMgPSBudWxsO1xyXG4gIHVybE5ld1RhYiA9IGZhbHNlO1xyXG4gIGxvYWRpbmdOYW1lOiBzdHJpbmc7XHJcbiAgcGxhY2Vob2xkZXI6IHN0cmluZyA9IG51bGw7XHJcbiAgdG9vbHRpcDogc3RyaW5nO1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgaWNvbjogc3RyaW5nO1xyXG4gIGFkZE5ldyA9IGZhbHNlO1xyXG4gIGNsYXNzOiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb246IHN0cmluZyA9IG51bGw7XHJcbiAgdHlwZTogSW5wdXRUeXBlO1xyXG4gIHZhbHVlID0gbnVsbDtcclxuICBzZWFyY2ggPSBudWxsO1xyXG4gIGRlZmF1bHQgPSBudWxsO1xyXG4gIGJhc2VSZXF1aXJlZDogYm9vbGVhbjtcclxuICByZXF1aXJlZDogYm9vbGVhbjtcclxuICBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gIGluRWRpdERpc2FibGVkID0gZmFsc2U7XHJcbiAgaW5FZGl0VmlzaWJsZSA9IHRydWU7XHJcbiAgaW5FZGl0UmVxdWlyZWQgPSB0cnVlO1xyXG4gIGRpc3BsYXlMYWJlbCA9IHRydWU7XHJcbiAgbGFiZWw6IHN0cmluZyA9IG51bGw7XHJcbiAgd2l0aENsZWFyID0gZmFsc2U7XHJcbiAgbWluTGVuZ3RoID0gLTE7XHJcbiAgbWF4TGVuZ3RoID0gLTE7XHJcbiAgZXJyb3I6IElucHV0RXJyb3IgPSBudWxsO1xyXG4gIGFkZE1vZGFsOiBNb2RhbENsYXNzID0gbnVsbDtcclxuICBsb2FkaW5nID0gZmFsc2U7XHJcbiAgYnV0dG9uID0gbnVsbDtcclxuICBoYXNCYXJjb2RlUmVhZGVyID0gZmFsc2U7XHJcbiAgb25CYXJjb2RlUmVhZGVyQ2hhbmdlID0gbnVsbDtcclxuICBvbkNsaWNrQnV0dG9uOiAoaW5wKSA9PiB2b2lkID0gbnVsbDtcclxuICBwcm9ncmVzczogUHJvZ3Jlc3MgPSBudWxsO1xyXG4gIG9uQ2xpY2s6IChidG4pID0+IHZvaWQgPSBudWxsO1xyXG4gIG9uS2V5VXA6IChpbnApID0+IHZvaWQgPSBudWxsO1xyXG4gIG9uS2V5RG93bjogKGUpID0+IHZvaWQgPSBudWxsO1xyXG4gIG9wdGlvbnM6IE9wdGlvbkNsYXNzW10gPSBbXTtcclxuICBtYXRjaDogSW5wdXRDbGFzcyA9IG51bGw7XHJcbiAgcmVsOiBJbnB1dENsYXNzID0gbnVsbDtcclxuICByZWxVcmw6IHN0cmluZyA9IG51bGw7XHJcbiAgdGFibGU6IFRhYmxlQ2xhc3M7XHJcbiAgc3R5bGUgPSB7fTtcclxuICBwb3NpdGlvbiA9ICdib3R0b20nO1xyXG4gIG9uQ2hhbmdlOiAodiwgZT8pID0+IHZvaWQgPSBudWxsO1xyXG4gIGhvdmVyID0gLTE7XHJcbiAgdmlzaWJsZSA9IHRydWU7XHJcbiAgb3BlbiA9IGZhbHNlO1xyXG4gIG11bHRpcGxlID0gZmFsc2U7XHJcbiAgb25seUNoaWxkID0gdHJ1ZTtcclxuICBhbGxvd2VkID0gbnVsbDtcclxuICByb3cgPSBudWxsO1xyXG4gIHJvd3MgPSBbXTtcclxuICBsZXZlbCA9IG51bGw7XHJcbiAgbW9kYWw6IE1vZGFsQ2xhc3MgPSBudWxsO1xyXG4gIHJlcXVlc3Q6IGFueSA9IG51bGw7XHJcbiAgbmFtZUZ1bjogKHIpID0+IHZvaWQgPSBudWxsO1xyXG4gIG9uRm9jdXNJbjogKGUpID0+IHZvaWQgPSBudWxsO1xyXG4gIG9uRm9jdXNPdXQ6IChlKSA9PiB2b2lkID0gbnVsbDtcclxuICBmb2N1cyhjaGFuZ2VJbmRleDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7fVxyXG4gIGNoYW5nZVR5cGU6ICh0OiBJbnB1dFR5cGUpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuICBzZXRWYWx1ZTogKHYsIGlzRWRpdCkgPT4gdm9pZCA9ICh2LCBpc0VkaXQpID0+IHsgdGhpcy52YWx1ZSA9IHY7IH07XHJcbiAgc2V0U2VhcmNoOiAodikgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIGNsZWFyOiAoKSA9PiB2b2lkID0gKCkgPT4geyB0aGlzLnZhbHVlID0gbnVsbDsgfTtcclxuICBmb2N1c091dDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIGRhdGE6ICgpID0+IGFueSA9ICgpID0+IHtcclxuICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gIH1cclxuICBpc1ZhbGlkOiAoKSA9PiBib29sZWFuID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIGxvYWQodSA9IG51bGwsIGRvbmU6ICgpID0+IHZvaWQgPSBudWxsKTogdm9pZHtcclxuICAgIHUgPSB1ID8gdSA6IHRoaXMudXJsO1xyXG4gICAgaWYgKHUpe1xyXG4gICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcclxuICAgICAgdGhpcy5ob3ZlciA9IC0xO1xyXG4gICAgICB0aGlzLnJvd3MgPSBbXTtcclxuICAgICAgaWYgKHR5cGVvZiB1ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGlmICghdS5pbmNsdWRlcygne30nKSl7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gbmV3IFJlcXVlc3RDbGFzcyh0aGlzLmVudmlyb25tZW50LCB0aGlzLmwpLnNlbmQodSA/IHUgOiB0aGlzLnVybCwgTWV0aG9kLlBvc3QsIG51bGwsIG51bGwsIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gSW5wdXRUeXBlLlNlbGVjdFNlYXJjaFJhZGlvIHx8IHRoaXMudHlwZSA9PT0gSW5wdXRUeXBlLlNlbGVjdFNlYXJjaCB8fCB0aGlzLnR5cGUgPT09IElucHV0VHlwZS5TZWxlY3QgfHwgdGhpcy50eXBlID09PSBJbnB1dFR5cGUuU2VsZWN0QXV0b0NvbXBsZXRlIHx8XHJcbiAgICAgICAgICAgICAgdGhpcy50eXBlID09PSBJbnB1dFR5cGUuU2VsZWN0QXV0b0NvbXBsZXRlUGxhcXVlIHx8IHRoaXMudHlwZSA9PT0gSW5wdXRUeXBlLlNlbGVjdEF1dG9Db21wbGV0ZVBsYXF1ZU0gfHxcclxuICAgICAgICAgICAgICB0aGlzLnR5cGUgPT09IElucHV0VHlwZS5TZWxlY3RBdXRvQ29tcGxldGVQbGFxdWVGIHx8IHRoaXMudHlwZSA9PT0gSW5wdXRUeXBlLlNlbGVjdEF1dG9Db21wbGV0ZVBsYXF1ZUcgfHwgdGhpcy50eXBlID09PSBJbnB1dFR5cGUuUmFkaW8pIHtcclxuICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5nZXRPcHRpb25zKHJlc3VsdCwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgcyA9IHJlc3VsdC5maW5kKHggPT4geC5TZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgaWYgKHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBzLklkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9ucyhyKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IElucHV0VHlwZS5UcmVlIHx8IHRoaXMudHlwZSA9PT0gSW5wdXRUeXBlLlRyZWVSYWRpbykge1xyXG4gICAgICAgICAgICAgIHRoaXMucm93cyA9IHRoaXMuZ2V0Um93cyhyZXN1bHQsIG51bGwpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZG9uZSkge1xyXG4gICAgICAgICAgICAgIGRvbmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIH0sICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sIHRoaXMucmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuICAgICAgICBFbnVtVXRpbHMuZ2V0S2V5c0FuZFZhbHVlcyh1KS5mb3JFYWNoKChrKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaCh7TmFtZTogdGhpcy5sKGsua2V5KSwgSWQ6IGsudmFsdWUudG9TdHJpbmcoKX0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IElucHV0VHlwZS5TZWxlY3RTZWFyY2hSYWRpbyB8fCB0aGlzLnR5cGUgPT09IElucHV0VHlwZS5TZWxlY3RTZWFyY2ggfHwgdGhpcy50eXBlID09PSBJbnB1dFR5cGUuU2VsZWN0IHx8IHRoaXMudHlwZSA9PT0gSW5wdXRUeXBlLlNlbGVjdEF1dG9Db21wbGV0ZSB8fFxyXG4gICAgICAgICAgdGhpcy50eXBlID09PSBJbnB1dFR5cGUuU2VsZWN0QXV0b0NvbXBsZXRlUGxhcXVlIHx8IHRoaXMudHlwZSA9PT0gSW5wdXRUeXBlLlNlbGVjdEF1dG9Db21wbGV0ZVBsYXF1ZU0gfHxcclxuICAgICAgICAgIHRoaXMudHlwZSA9PT0gSW5wdXRUeXBlLlNlbGVjdEF1dG9Db21wbGV0ZVBsYXF1ZUYgfHwgdGhpcy50eXBlID09PSBJbnB1dFR5cGUuU2VsZWN0QXV0b0NvbXBsZXRlUGxhcXVlRyB8fFxyXG4gICAgICAgICAgdGhpcy50eXBlID09PSBJbnB1dFR5cGUuUmFkaW8gfHwgdGhpcy50eXBlID09PSBJbnB1dFR5cGUuU2xpZGUpIHtcclxuICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldE9wdGlvbnMocmVzdWx0LCBudWxsKTtcclxuICAgICAgICAgIHRoaXMuc2V0T3B0aW9ucyhyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gSW5wdXRUeXBlLlRyZWUgfHwgdGhpcy50eXBlID09PSBJbnB1dFR5cGUuVHJlZVJhZGlvKSB7XHJcbiAgICAgICAgICB0aGlzLnJvd3MgPSB0aGlzLmdldFJvd3MocmVzdWx0LCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgc2V0T3B0aW9ucyhyKTogdm9pZHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHI7XHJcbiAgICBpZiAodGhpcy52YWx1ZSAhPSBudWxsKXtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlLCB0cnVlKTtcclxuICAgICAgfSwgNTAwKTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0U2VsZWN0ZWRPcHRpb25EYXRhKCk6IGFueXtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZCh4ID0+IHgudmFsdWUgPT09IHRoaXMudmFsdWUpPy5vcHRpb24gPz8gbnVsbDtcclxuICB9XHJcbiAgZ2V0T3B0aW9ucyhyLCBwLCB0cmVlID0gdHJ1ZSk6IE9wdGlvbkNsYXNzW117XHJcbiAgICByZXR1cm4gci5maWx0ZXIoeCA9PiAocCA9PSBudWxsICYmICF4LlBhcmVudElkKSB8fCB4LlBhcmVudElkID09PSBwIHx8ICF0cmVlKVxyXG4gICAgICAubWFwKCh4KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbyA9IG5ldyBPcHRpb25DbGFzcyh4Lk5hbWUsIHguSWQudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gSW5wdXRUeXBlLlNlbGVjdEF1dG9Db21wbGV0ZVBsYXF1ZSB8fCB0aGlzLnR5cGUgPT09IElucHV0VHlwZS5TZWxlY3RBdXRvQ29tcGxldGVQbGFxdWVNIHx8XHJcbiAgICAgICAgICB0aGlzLnR5cGUgPT09IElucHV0VHlwZS5TZWxlY3RBdXRvQ29tcGxldGVQbGFxdWVGIHx8IHRoaXMudHlwZSA9PT0gSW5wdXRUeXBlLlNlbGVjdEF1dG9Db21wbGV0ZVBsYXF1ZUcgfHwgdGhpcy5uYW1lID09PSAnQ2FySWQnKXtcclxuICAgICAgICAgIG8ubmFtZSA9IEhlbHBlckNsYXNzLlRvUmVhZGFibGVQbGFxdWUoby5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgby5zZWFyY2ggPSB4LlNlYXJjaDtcclxuICAgICAgICBvLm9wdGlvbiA9IHg7XHJcbiAgICAgICAgby5vcHRpb25zID0gdHJlZSA/IHRoaXMuZ2V0T3B0aW9ucyhyLCB4LklkKSA6IFtdO1xyXG4gICAgICAgIHJldHVybiBvO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgZ2V0Um93cyhyLCBwKTogVHJlZVJvd0NsYXNzW117XHJcbiAgICBjb25zdCBsID0gW107XHJcbiAgICByLmZpbHRlcih4ID0+IChwID09IG51bGwgJiYgIXguUGFyZW50SWQpIHx8IHguUGFyZW50SWQgPT09IHApLmZvckVhY2goKHgpID0+IHtcclxuICAgICAgbGV0IGMgPSB0aGlzLmdldFJvd3MociwgeC5JZCk7XHJcbiAgICAgIGMgPSBjLmxlbmd0aCA+IDAgPyBjIDogeC5DaGlsZHJlbiA/IHguQ2hpbGRyZW4ubWFwKGEgPT4gbmV3IFRyZWVSb3dDbGFzcyhhLk5hbWUsIGEuSWQsIGEuU2VsZWN0ZWQpKSA6IFtdO1xyXG4gICAgICBsZXQgcyA9IHguU2VsZWN0ZWQgPT09IHRydWU7XHJcbiAgICAgIGlmICh0aGlzLm9ubHlDaGlsZCl7XHJcbiAgICAgICAgcyA9IGMubGVuZ3RoID09PSAwID8geC5TZWxlY3RlZCA6IChjLmZpbmQoeSA9PiB5LnNlbGVjdGVkID09PSBmYWxzZSB8fCB5LnNlbGVjdGVkID09PSBudWxsKSA9PSBudWxsID8gdHJ1ZSA6XHJcbiAgICAgICAgICAoYy5maW5kKHkgPT4geS5zZWxlY3RlZCA9PT0gdHJ1ZSB8fCB5LnNlbGVjdGVkID09PSBudWxsKSAhPSBudWxsID8gbnVsbCA6IGZhbHNlKSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbiA9IHRoaXMubmFtZUZ1biA/IHRoaXMubmFtZUZ1bih4KSA6IHguTmFtZTtcclxuICAgICAgbC5wdXNoKG5ldyBUcmVlUm93Q2xhc3MobiwgeC5JZCwgcywgYykpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbDtcclxuICB9XHJcbiAgZ2V0TGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBIZWxwZXJDbGFzcy5nZXRMYWJlbCh0aGlzKTtcclxuICB9XHJcbiAgZ2V0U2VsZWN0ZWQob3B0czogT3B0aW9uQ2xhc3NbXSA9IHRoaXMub3B0aW9ucyk6IGFueVtde1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRPcHRpb25zKG9wdHMpLm1hcCh4ID0+IHgudmFsdWUpO1xyXG4gIH1cclxuICBnZXRTZWxlY3RlZE5hbWUob3B0czogT3B0aW9uQ2xhc3NbXSA9IHRoaXMub3B0aW9ucyk6IGFueVtde1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRPcHRpb25zKG9wdHMpLm1hcCh4ID0+IHguc2VhcmNoKTtcclxuICB9XHJcbiAgZ2V0U2VsZWN0ZWRPcHRpb25zKG9wdHM6IE9wdGlvbkNsYXNzW10gPSB0aGlzLm9wdGlvbnMpOiBhbnlbXXtcclxuICAgIGxldCBsID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGYgb2Ygb3B0cyl7XHJcbiAgICAgIGlmIChmLnNlbGVjdGVkICYmICghdGhpcy5vbmx5Q2hpbGQgfHwgZi5vcHRpb25zLmxlbmd0aCA9PT0gMCkpe1xyXG4gICAgICAgIGwucHVzaChmKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBycyA9IHRoaXMuZ2V0U2VsZWN0ZWRPcHRpb25zKGYub3B0aW9ucyk7XHJcbiAgICAgIGwgPSBsLmNvbmNhdChycyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbDtcclxuICB9XHJcbiAgZ2V0U2VsZWN0ZWRSb3dzKHJvd3M6IGFueVtdID0gdGhpcy5yb3dzKTogYW55W117XHJcbiAgICBsZXQgbCA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBmIG9mIHJvd3Mpe1xyXG4gICAgICBpZiAoZi5zZWxlY3RlZCAmJiAoIXRoaXMub25seUNoaWxkIHx8IGYuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSl7XHJcbiAgICAgICAgbC5wdXNoKGYpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoZi5jaGlsZHJlbik7XHJcbiAgICAgIGwgPSBsLmNvbmNhdChycyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbDtcclxuICB9XHJcbiAgZ2V0QWxsUm93cyhyb3dzOiBhbnlbXSA9IHRoaXMucm93cyk6IGFueVtde1xyXG4gICAgbGV0IGwgPSBbXTtcclxuICAgIGZvciAoY29uc3QgZiBvZiByb3dzKXtcclxuICAgICAgaWYgKCF0aGlzLm9ubHlDaGlsZCB8fCBmLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCl7XHJcbiAgICAgICAgbC5wdXNoKGYpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJzID0gdGhpcy5nZXRBbGxSb3dzKGYuY2hpbGRyZW4pO1xyXG4gICAgICBsID0gbC5jb25jYXQocnMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGw7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgT3B0aW9uQ2xhc3Mge1xyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9uczogT3B0aW9uQ2xhc3NbXSA9IFtdLCBjbHM6IHN0cmluZyA9IG51bGwsIGRpczogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuY2xhc3MgPSBjbHM7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gZGlzO1xyXG4gIH1cclxuICBvcHRpb247XHJcbiAgc2VhcmNoOiBzdHJpbmc7XHJcbiAgY2xhc3M6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICBzaG93ID0gdHJ1ZTtcclxuICBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gIHBhcmVudDogT3B0aW9uQ2xhc3MgPSBudWxsO1xyXG4gIG9wdGlvbnM6IE9wdGlvbkNsYXNzW107XHJcbiAgbG9hZGluZyA9IGZhbHNlO1xyXG4gIGRpc2FibGVkID0gZmFsc2U7XHJcbn1cclxuZXhwb3J0IGNsYXNzIERheUNsYXNzIHtcclxuICBjb25zdHJ1Y3RvcihkYXk6IG51bWJlciwgdG9kYXk6IGJvb2xlYW4sIHNlbGVjdGVkOiBib29sZWFuLCBhY3RpdmU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZGF5ID0gZGF5O1xyXG4gICAgdGhpcy50b2RheSA9IHRvZGF5O1xyXG4gICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkO1xyXG4gICAgdGhpcy5hY3RpdmUgPSBhY3RpdmU7XHJcbiAgfVxyXG4gIGRheTogbnVtYmVyO1xyXG4gIHRvZGF5OiBib29sZWFuO1xyXG4gIHNlbGVjdGVkOiBib29sZWFuO1xyXG4gIGFjdGl2ZTogYm9vbGVhbjtcclxuICBjbGFzczogc3RyaW5nID0gbnVsbDtcclxufVxyXG5leHBvcnQgY2xhc3MgVHJlZVJvd0NsYXNzIHtcclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2UsIGNoaWxkcmVuOiBUcmVlUm93Q2xhc3NbXSA9IFtdKSB7XHJcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkO1xyXG4gICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xyXG4gIH1cclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICBzZWxlY3RlZDogYm9vbGVhbjtcclxuICBwYXJlbnQ6IFRyZWVSb3dDbGFzcztcclxuICBjaGlsZHJlbjogVHJlZVJvd0NsYXNzW107XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBY2NvcmRpb25DbGFzcyB7XHJcbiAgY29uc3RydWN0b3IobDogKGssIHY/KSA9PiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY2xzOiBzdHJpbmcgPSAnJywgcm93czogQWNjb3JkaW9uUm93Q2xhc3NbXSkge1xyXG4gICAgdGhpcy5sID0gbDtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB0aGlzLmNsYXNzID0gY2xzO1xyXG4gICAgdGhpcy5yb3dzID0gcm93cztcclxuICB9XHJcbiAgbDogKGssIHY/KSA9PiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGNsYXNzOiBzdHJpbmc7XHJcbiAgcm93czogQWNjb3JkaW9uUm93Q2xhc3NbXTtcclxuICBoYXNEZWxldGUgPSBmYWxzZTtcclxuICBkaXNwbGF5TGFiZWwgPSBmYWxzZTtcclxuICBsb2FkaW5nID0gZmFsc2U7XHJcbiAgYWNjZXNzID0gdHJ1ZTtcclxuICBvbkRlbGV0ZTogKHJvdykgPT4gdm9pZCA9IG51bGw7XHJcbiAgY2hlY2soKTogYm9vbGVhbntcclxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucm93cyl7XHJcbiAgICAgIGlmICghcm93LmZvcm0uY2hlY2soKSl7XHJcbiAgICAgICAgcm93Lm9wZW4oKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFjY29yZGlvblJvd0NsYXNzIHtcclxuICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGZvcm06IEZvcm1DbGFzcyA9IG51bGwsIHRhYmxlOiBUYWJsZUNsYXNzID0gbnVsbCkge1xyXG4gICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgIHRoaXMuZm9ybSA9IGZvcm07XHJcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XHJcbiAgfVxyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHNob3cgPSB0cnVlO1xyXG4gIGZpcnN0VGFibGUgPSB0cnVlO1xyXG4gIGZvcm06IEZvcm1DbGFzcztcclxuICBjaGFydDogQ2hhcnRDbGFzcztcclxuICB0YWJsZTogVGFibGVDbGFzcztcclxuICB0b2dnbGUoKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgJCgnI0FjY29yZGlvblJvdycgKyB0aGlzLmlkICsgJyA+IC5oZWFkZXInKS5jbGljaygpO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcbiAgb3BlbigpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoISQoJyNBY2NvcmRpb25Sb3cnICsgdGhpcy5pZCArICcgPiAuY29udGVudCcpLmhhc0NsYXNzKCdvcGVuJykpe1xyXG4gICAgICAgICQoJyNBY2NvcmRpb25Sb3cnICsgdGhpcy5pZCArICcgPiAuaGVhZGVyJykuY2xpY2soKTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcbn1cclxuIl19