@bizdoc/core 1.12.2 → 1.13.0-next.10

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 (58) hide show
  1. package/assets/bizdoc-schema.json +1 -14
  2. package/esm2020/lib/admin/diff/configuration-diff.component.mjs +5 -2
  3. package/esm2020/lib/admin/document-trace/trace-element.component.mjs +22 -26
  4. package/esm2020/lib/admin/form/workflow/node.component.mjs +3 -2
  5. package/esm2020/lib/app.component.mjs +1 -1
  6. package/esm2020/lib/browse/browse-items.component.mjs +44 -36
  7. package/esm2020/lib/browse/expanded-item/expanded-item.component.mjs +92 -57
  8. package/esm2020/lib/compose/action/action-picker.component.mjs +15 -14
  9. package/esm2020/lib/compose/action/action.base.mjs +9 -4
  10. package/esm2020/lib/compose/action/action.pane.dialog.exp.mjs +13 -12
  11. package/esm2020/lib/compose/action/assign-action.component.mjs +15 -7
  12. package/esm2020/lib/compose/form.component.mjs +6 -3
  13. package/esm2020/lib/compose/trace/flow.component.mjs +167 -139
  14. package/esm2020/lib/compose/trace/trace.base.mjs +6 -2
  15. package/esm2020/lib/compose/trace/trace.component.mjs +139 -162
  16. package/esm2020/lib/core/hub.service.mjs +1 -1
  17. package/esm2020/lib/core/mailbox.service.mjs +31 -6
  18. package/esm2020/lib/core/models.mjs +1 -1
  19. package/esm2020/lib/core/slots/slots.component.mjs +3 -3
  20. package/esm2020/lib/core/translations.mjs +25 -6
  21. package/esm2020/lib/cube/cube-info.service.mjs +3 -3
  22. package/esm2020/lib/cube/cube.service.mjs +7 -5
  23. package/esm2020/lib/cube/explore/explore-items.component.mjs +3 -2
  24. package/esm2020/lib/cube/explore/explore.pane.component.mjs +3 -1
  25. package/esm2020/lib/cube/matrix/matrix.base.mjs +1 -1
  26. package/esm2020/lib/cube/matrix/matrix.mobile.component.mjs +1 -1
  27. package/esm2020/lib/cube/matrix/matrix.pane.component.mjs +5 -3
  28. package/esm2020/lib/cube/matrix/popup.component.mjs +7 -5
  29. package/esm2020/lib/cube/matrix/table.component.mjs +136 -123
  30. package/esm2020/lib/home/home-base.component.mjs +2 -2
  31. package/esm2020/lib/shared.module.mjs +17 -2
  32. package/esm2020/lib/views/cube/matrix.component.mjs +1 -1
  33. package/fesm2015/bizdoc-core.mjs +869 -717
  34. package/fesm2015/bizdoc-core.mjs.map +1 -1
  35. package/fesm2020/bizdoc-core.mjs +859 -714
  36. package/fesm2020/bizdoc-core.mjs.map +1 -1
  37. package/lib/admin/diff/configuration-diff.component.d.ts +1 -0
  38. package/lib/admin/document-trace/trace-element.component.d.ts +1 -1
  39. package/lib/app.component.d.ts +2 -2
  40. package/lib/browse/browse-items.component.d.ts +3 -1
  41. package/lib/browse/expanded-item/expanded-item.component.d.ts +6 -6
  42. package/lib/compose/action/action-picker.component.d.ts +2 -1
  43. package/lib/compose/action/action.base.d.ts +3 -1
  44. package/lib/compose/action/action.pane.dialog.exp.d.ts +2 -1
  45. package/lib/compose/action/assign-action.component.d.ts +5 -2
  46. package/lib/compose/trace/flow.component.d.ts +0 -1
  47. package/lib/compose/trace/trace.base.d.ts +5 -2
  48. package/lib/compose/trace/trace.component.d.ts +1 -19
  49. package/lib/core/hub.service.d.ts +1 -0
  50. package/lib/core/mailbox.service.d.ts +4 -1
  51. package/lib/core/models.d.ts +11 -1
  52. package/lib/core/translations.d.ts +20 -1
  53. package/lib/cube/cube-info.service.d.ts +2 -0
  54. package/lib/cube/cube.service.d.ts +2 -1
  55. package/lib/cube/explore/explore-items.component.d.ts +1 -0
  56. package/lib/cube/matrix/matrix.base.d.ts +2 -0
  57. package/lib/cube/matrix/table.component.d.ts +10 -4
  58. package/package.json +10 -10
@@ -1,6 +1,6 @@
1
1
  import { Component, Input, Output, EventEmitter } from "@angular/core";
2
2
  import dayjs from 'dayjs';
3
- import { TraceBase } from "./trace.base";
3
+ import { TraceBase, You } from "./trace.base";
4
4
  import { itemAnimation, listAnimation } from "../../core/animations";
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "../../core/session.service";
@@ -18,7 +18,6 @@ import * as i12 from "../../core/pipes/sanitize-html.pipe";
18
18
  import * as i13 from "../../core/pipes/duration-format.pipe";
19
19
  import * as i14 from "../../core/pipes/duration.pipe";
20
20
  import * as i15 from "../../core/pipes/calendar.pipe";
21
- const You = 'you';
22
21
  /** component showing trace table */
23
22
  export class TraceViewComponent extends TraceBase {
24
23
  constructor(_session, _translate, _accounts, _chat, hub) {
@@ -41,10 +40,43 @@ export class TraceViewComponent extends TraceBase {
41
40
  this._initialise();
42
41
  }
43
42
  async _initialise() {
44
- const { ownerId, ownerById, issued, log, recipients, attachments } = this.model;
43
+ const { issued, log, recipients, attachments } = this.model;
44
+ const me = this;
45
+ function profileOf(id) {
46
+ return me._accounts.get(id).toPromise();
47
+ }
48
+ /**
49
+ * user name, chat anchor tag or You
50
+ * @param user
51
+ */
52
+ function nameOf(user) {
53
+ return me._chat.format(user);
54
+ }
55
+ async function actionBy(action, gender, toId) {
56
+ let name;
57
+ if (gender === You) {
58
+ const { gender } = me._session;
59
+ name = (gender === 'Male' ? (action.youMale || action.you) :
60
+ gender === 'Female' ? (action.youFemale || action.you) :
61
+ action.you) ||
62
+ action.past ||
63
+ action.title;
64
+ }
65
+ else
66
+ name = (gender === 'Male' ? (action.pastMale || action.past) :
67
+ gender === 'Female' ? (action.pastFemale || action.past) :
68
+ action.past)
69
+ || action.title;
70
+ if (toId) {
71
+ let to = await me._accounts.get(toId).toPromise();
72
+ return me._translate.get('ActionTo', name, nameOf(to));
73
+ }
74
+ else
75
+ return name;
76
+ }
45
77
  const trace = [];
46
78
  for (let l of log) {
47
- let action, attachment;
79
+ let action;
48
80
  switch (l.type) {
49
81
  case 'ActionTaken':
50
82
  {
@@ -57,7 +89,6 @@ export class TraceViewComponent extends TraceBase {
57
89
  case 'CheckOut':
58
90
  if (!this._showAll)
59
91
  continue;
60
- attachment = attachments.find(f => f.id === l.fileId);
61
92
  break;
62
93
  case 'ModelChange':
63
94
  if (!this._showAll)
@@ -66,135 +97,117 @@ export class TraceViewComponent extends TraceBase {
66
97
  case 'Submit':
67
98
  if (!this._showAll)
68
99
  continue;
69
- if (l.estimate)
70
- continue;
71
- const node = {
72
- type: 'Owner',
73
- time: l.time
74
- };
75
- if (ownerById) {
76
- const owner = await this._userOf(ownerId).toPromise();
77
- if (ownerById === this._session.userId)
78
- node.name = this._translate.get('ByYou', this._nameOf(owner));
79
- else {
80
- const by = await this._userOf(ownerById).toPromise();
81
- node.name = this._translate.get('By', this._nameOf(owner), this._nameOf(by));
82
- if (by.role)
83
- node.role = by.role;
84
- }
85
- }
86
- else {
87
- if (ownerId === this._session.userId)
88
- node.name = this._translate.get('You');
89
- else {
90
- const owner = await this._userOf(ownerId).toPromise();
91
- node.name = this._nameOf(owner);
92
- if (owner.role)
93
- node.role = owner.role;
94
- }
95
- }
96
- trace.push(node);
97
- continue;
100
+ break;
98
101
  default:
99
102
  continue;
100
103
  }
101
- const step = { ...l };
102
- if (attachment)
103
- step.fileName = attachment.fileName;
104
- const who = await this._userOf(l.userId).toPromise();
104
+ let step = { estimate: l.estimate, time: l.time, type: l.type, duration: l.duration, note: l.note, state: l.state };
105
+ trace.push(step);
106
+ switch (l.type) {
107
+ case 'CheckIn':
108
+ case 'CheckOut':
109
+ let attachment = attachments.find(f => f.id === l.fileId);
110
+ step.fileName = attachment.fileName;
111
+ break;
112
+ }
105
113
  if (l.recipientId) {
106
- const recipient = recipients.find(r => r.id === l.recipientId);
114
+ let recipient = recipients.find(r => r.id === l.recipientId);
107
115
  if (recipient.role)
108
116
  step.role = this._roleName(recipient.role);
109
- if (recipient.nodeId) {
110
- const node = this.model.workflow.nodes.find(n => n.id === recipient.nodeId);
111
- step.fyi = node && node.fyi;
112
- }
117
+ step.fyi = recipient.fyi;
113
118
  if (recipient.substitutingId) {
114
- let substituting = await this._userOf(recipient.substitutingId).toPromise();
115
- if (l.byId) {
116
- if (l.byId === this._session.userId) {
119
+ let substituting = await profileOf(recipient.substitutingId);
120
+ if (recipient.byId) {
121
+ if (recipient.byId === this._session.userId) {
122
+ let who = await profileOf(recipient.userId);
117
123
  if (recipient.substitutingId === this._session.userId)
118
- step.name = this._translate.get('ByYou', this._nameOf(who));
124
+ step.name = this._translate.get('ByYou', nameOf(who));
119
125
  else
120
- step.name = this._translate.personalize('SubstitutingByYou', who.gender, this._nameOf(who), this._nameOf(substituting));
126
+ step.name = this._translate.personalize('SubstitutingByYou', who.gender, nameOf(who), nameOf(substituting));
121
127
  if (action)
122
- step.action = action ? this._actionName(action, You) : l.action;
128
+ step.action = await actionBy(action, You, recipient.toId);
123
129
  }
124
130
  else {
125
- let by = await this._userOf(l.byId).toPromise();
126
- step.name = this._translate.get('SubstitutingBy', this._nameOf(who), this._nameOf(substituting), this._nameOf(by));
131
+ let by = await profileOf(recipient.byId);
132
+ let who = await profileOf(recipient.userId);
133
+ step.name = this._translate.get('SubstitutingBy', nameOf(who), nameOf(substituting), nameOf(by));
127
134
  if (by.role)
128
135
  step.role = by.role;
129
136
  if (action)
130
- step.action = action ? this._actionName(action, by) : l.action;
137
+ step.action = await actionBy(action, by.gender);
131
138
  }
132
139
  }
133
140
  else {
134
- if (recipient.substitutingId === this._session.userId)
135
- step.name = this._translate.personalize('SubstitutingForYou', who.gender, this._nameOf(who));
136
- else if (l.userId === this._session.userId)
137
- step.name = this._translate.personalize('YouSubstitute', this._session.profile.byGender, this._nameOf(who));
141
+ let who = await profileOf(recipient.userId);
142
+ if (recipient.substitutingId === this._session.userId) {
143
+ step.name = this._translate.personalize('SubstitutingForYou', who.gender, nameOf(who));
144
+ }
145
+ else if (recipient.userId === this._session.userId) {
146
+ step.name = this._translate.personalize('YouSubstitute', this._session.profile.byGender, nameOf(who));
147
+ if (action)
148
+ step.action = await actionBy(action, who.gender, recipient.toId);
149
+ }
138
150
  else {
139
- step.name = this._translate.personalize('Substituting', who.gender, this._nameOf(who), this._nameOf(substituting));
151
+ step.name = this._translate.personalize('Substituting', who.gender, nameOf(who), nameOf(substituting));
140
152
  if (who.role)
141
153
  step.role = who.role;
154
+ if (action)
155
+ step.action = await actionBy(action, who.gender, recipient.toId);
142
156
  }
143
- if (action)
144
- step.action = action ? this._actionName(action, who) : l.action;
145
157
  }
146
158
  }
147
- else if (l.byId) {
148
- if (l.byId === this._session.userId) {
149
- step.name = this._translate.get('ByYou', this._nameOf(who));
150
- if (action)
151
- step.action = action ? this._actionName(action, You) : l.action;
152
- }
159
+ else if (recipient.byId) {
160
+ let who = await profileOf(recipient.userId), by = await profileOf(recipient.byId);
161
+ if (recipient.byId === this._session.userId)
162
+ step.name = this._translate.get('ByYou', nameOf(who));
153
163
  else {
154
- let by = await this._userOf(l.byId).toPromise();
155
- step.name = this._translate.get('By', this._nameOf(who), this._nameOf(by));
164
+ step.name = this._translate.get('By', nameOf(who), nameOf(by));
156
165
  if (by.role)
157
166
  step.role = by.role;
158
- if (action)
159
- step.action = action ? this._actionName(action, by) : l.action;
160
167
  }
168
+ if (action)
169
+ step.action = await actionBy(action, by.gender, recipient.toId);
161
170
  }
162
- //else if (recipient.toId) {
163
- //}
164
171
  else {
165
- if (l.userId === this._session.userId)
172
+ if (recipient.userId === this._session.userId)
166
173
  step.name = this._translate.get('You');
167
174
  else {
168
- step.name = this._nameOf(who);
175
+ let who = await profileOf(recipient.userId);
176
+ step.name = nameOf(who);
169
177
  if (who.role)
170
178
  step.role = who.role;
179
+ if (action)
180
+ step.action = await actionBy(action, who.gender, recipient.toId);
171
181
  }
172
- if (action)
173
- step.action = action ? this._actionName(action, who) : l.action;
174
182
  }
175
183
  }
176
184
  else {
177
- if (l.userId === this._session.userId)
178
- step.name = this._translate.get('You');
185
+ if (l.userId === this._session.userId) {
186
+ step.name = this._session.isImpersonating ? this._session.profile.name : this._translate.get('You');
187
+ if (action)
188
+ step.action = await actionBy(action, You, l.toId);
189
+ }
179
190
  else {
180
- step.name = this._nameOf(who);
191
+ let who = await profileOf(l.userId);
192
+ step.name = nameOf(who);
181
193
  if (who.role)
182
194
  step.role = who.role;
183
- }
184
- if (action) {
185
- step.action = action ? this._actionName(action, who) : l.action;
195
+ if (action)
196
+ step.action = await actionBy(action, who.gender, l.toId);
186
197
  }
187
198
  }
188
- trace.push(step);
189
199
  }
190
- for (var r = 0; r < recipients.length; r++) {
191
- let recipient = recipients[r];
200
+ for (let recipient of recipients) {
192
201
  if (!recipient.pending && !recipient.estimate)
193
202
  continue;
194
- const step = {
195
- ...recipient,
196
- type: recipient.estimate ? 'Estimate' : 'Pending',
203
+ let step = {
197
204
  time: recipient.received,
205
+ fyi: recipient.fyi,
206
+ estimate: recipient.estimate,
207
+ pending: recipient.pending,
208
+ action: recipient.action,
209
+ note: recipient.note,
210
+ type: recipient.estimate ? 'Estimate' : 'Pending',
198
211
  duration: recipient.pending ? dayjs().diff(recipient.received, 's') : null,
199
212
  role: recipient.role ? this._roleName(recipient.role) : null
200
213
  };
@@ -207,72 +220,74 @@ export class TraceViewComponent extends TraceBase {
207
220
  step.durationMin = min,
208
221
  step.durationMax = max;
209
222
  }
210
- step.fyi = node.fyi;
223
+ step.fyi = recipient.fyi;
211
224
  }
212
225
  }
213
- let who = await this._userOf(recipient.userId).toPromise();
214
226
  if (recipient.substitutingId) {
227
+ let who = await profileOf(recipient.userId);
215
228
  if (recipient.byId) {
216
229
  if (recipient.byId === this._session.userId) {
217
230
  if (recipient.substitutingId === this._session.userId)
218
- step.name = this._translate.get('ByYou', this._nameOf(who));
231
+ step.name = this._translate.get('ByYou', nameOf(who));
219
232
  else {
220
- let substituting = await this._userOf(recipient.substitutingId).toPromise();
221
- step.name = this._translate.personalize('SubstitutingByYou', who.gender, this._nameOf(who), this._nameOf(substituting));
233
+ let substituting = await profileOf(recipient.substitutingId);
234
+ step.name = this._translate.personalize('SubstitutingByYou', who.gender, nameOf(who), nameOf(substituting));
222
235
  }
223
236
  }
224
237
  else {
225
- let substituting = await this._userOf(recipient.substitutingId).toPromise();
226
- let by = await this._userOf(recipient.byId).toPromise();
227
- step.name = this._translate.get('SubstitutingBy', this._nameOf(who), this._nameOf(substituting), this._nameOf(by));
238
+ let substituting = await profileOf(recipient.substitutingId);
239
+ let by = await profileOf(recipient.byId);
240
+ step.name = this._translate.get('SubstitutingBy', nameOf(who), nameOf(substituting), nameOf(by));
228
241
  if (by.role)
229
242
  step.role = by.role;
230
243
  }
231
244
  }
232
245
  else {
233
246
  if (recipient.substitutingId === this._session.userId)
234
- step.name = this._translate.personalize('SubstitutingForYou', who.gender, this._nameOf(who));
247
+ step.name = this._translate.personalize('SubstitutingForYou', who.gender, nameOf(who));
235
248
  else if (recipient.userId === this._session.userId)
236
- step.name = this._translate.personalize('YouSubstitute', this._session.profile.byGender, this._nameOf(who));
249
+ step.name = this._translate.personalize('YouSubstitute', this._session.profile.byGender, nameOf(who));
237
250
  else {
238
- let substituting = await this._userOf(recipient.substitutingId).toPromise();
239
- step.name = this._translate.personalize('Substituting', who.gender, this._nameOf(who), this._nameOf(substituting));
251
+ let substituting = await profileOf(recipient.substitutingId);
252
+ step.name = this._translate.personalize('Substituting', who.gender, nameOf(who), nameOf(substituting));
240
253
  if (who.role)
241
254
  step.role = who.role;
242
255
  }
243
256
  }
244
257
  }
245
258
  else if (recipient.byId) {
259
+ let who = await profileOf(recipient.userId);
246
260
  if (recipient.byId === this._session.userId)
247
- step.name = this._translate.get('ByYou', this._nameOf(who));
261
+ step.name = this._translate.get('ByYou', nameOf(who));
248
262
  else {
249
- let by = await this._userOf(recipient.byId).toPromise();
250
- step.name = this._translate.get('By', this._nameOf(who), this._nameOf(by));
263
+ let by = await profileOf(recipient.byId);
264
+ step.name = this._translate.get('By', nameOf(who), nameOf(by));
251
265
  if (by.role)
252
266
  step.role = by.role;
253
267
  }
254
268
  }
255
- else {
256
- const escalations = this.model.log.filter(l => l.time > issued && l.type === 'Escalation' && l.recipientId === recipient.id);
257
- if (escalations.length) {
258
- let escalate = [];
259
- for (let j = 0; j < escalations.length; j++) {
260
- let who = await this._userOf(escalations[j].userId);
261
- escalate.push(who);
262
- }
263
- if (escalations.length === 1 && escalate[0] === this._session.userId)
264
- step.name = this._translate.get('EscalatedByYou', this._nameOf(who));
265
- else
266
- step.name = this._translate.get('EscalatedBy', this._nameOf(who), this._translate.join(escalate.map(e => this._nameOf(e))));
269
+ else if (recipient.escalated) {
270
+ let escalations = this.model.log.filter(l => l.time > issued &&
271
+ l.type === 'Escalation' && l.recipientId === recipient.id);
272
+ let escalate = [];
273
+ for (let escalation of escalations) {
274
+ let who = await profileOf(escalation.userId);
275
+ escalate.push(who);
267
276
  }
277
+ let who = await profileOf(recipient.userId);
278
+ if (escalations.length === 1 && escalate[0] === this._session.userId)
279
+ step.name = this._translate.get('EscalatedByYou', nameOf(who));
280
+ else
281
+ step.name = this._translate.get('EscalatedBy', nameOf(who), this._translate.join(escalate.map(e => nameOf(e))));
282
+ }
283
+ else {
284
+ if (recipient.userId === this._session.userId)
285
+ step.name = this._translate.get('You');
268
286
  else {
269
- if (recipient.userId === this._session.userId)
270
- step.name = this._translate.get('You');
271
- else {
272
- step.name = this._nameOf(who);
273
- if (who.role)
274
- step.role = who.role;
275
- }
287
+ let who = await profileOf(recipient.userId);
288
+ step.name = nameOf(who);
289
+ if (who.role)
290
+ step.role = who.role;
276
291
  }
277
292
  }
278
293
  trace.push(step);
@@ -292,48 +307,10 @@ export class TraceViewComponent extends TraceBase {
292
307
  localStorage.setItem('traceAll', value ? 'true' : 'false');
293
308
  this._data && this._filter();
294
309
  }
295
- refresh() {
296
- this.ngOnChanges(null);
297
- }
298
- /**
299
- * user name, chat anchor tag or You
300
- * @param user
301
- */
302
- _nameOf(user) {
303
- return this._chat.format(user);
304
- }
305
- /**
306
- *
307
- * @param userId
308
- */
309
- _userOf(userId) {
310
- return this._accounts.get(userId);
311
- }
312
310
  _roleName(name) {
313
311
  const role = this._session.profile.roles.find(r => r.name === name);
314
312
  return role ? role.title : name;
315
313
  }
316
- /**
317
- *
318
- * @param action
319
- * @param user
320
- */
321
- _actionName(action, user) {
322
- if (user === You) {
323
- const { gender } = this._session;
324
- return (gender === 'Male' ? (action.youMale || action.you) :
325
- gender === 'Female' ? (action.youFemale || action.you) :
326
- action.you) ||
327
- action.past ||
328
- action.title;
329
- }
330
- else {
331
- return (user.gender === 'Male' ? (action.pastMale || action.past) :
332
- user.gender === 'Female' ? (action.pastFemale || action.past) :
333
- action.past)
334
- || action.title;
335
- }
336
- }
337
314
  chat(e) {
338
315
  const userId = e.srcElement.getAttribute('data-info');
339
316
  userId &&
@@ -348,13 +325,13 @@ export class TraceViewComponent extends TraceBase {
348
325
  }
349
326
  }
350
327
  TraceViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: TraceViewComponent, deps: [{ token: i1.SessionService }, { token: i2.TranslateService }, { token: i3.AccountService }, { token: i4.ChatInfo }, { token: i5.HubService }], target: i0.ɵɵFactoryTarget.Component });
351
- TraceViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: TraceViewComponent, selector: "bizdoc-trace", inputs: { model: "model" }, outputs: { versionSelected: "versionSelected" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"nav-toolbar row\">\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" [bizdocTooltip]=\"'ShowAll'|translate\"><mat-icon>filter_list</mat-icon></button>\r\n <mat-menu #menu> \r\n <button mat-menu-item (click)=\"showAll=false\">\r\n <mat-icon>{{ !showAll?'check':'' }}</mat-icon>\r\n <span>{{'Route' | translate }}</span>\r\n </button>\r\n <button mat-menu-item (click)=\"showAll=true\">\r\n <mat-icon>{{showAll?'check':''}}</mat-icon>\r\n <span>{{'Log' | translate }}</span>\r\n </button>\r\n </mat-menu>\r\n</div>\r\n<table class=\"mat-table\" @list>\r\n <tbody role=\"rowgroup\">\r\n <tr class=\"mat-row\" *ngFor=\"let l of data\" @item>\r\n <td class=\"mat-cell\">\r\n <span [innerHTML]=\"l.name | sanitizeHtml\" (click)=\"chat($event)\"></span>\r\n <span *ngIf=l.role>{{'JoinComma'|translate}}{{l.role}}</span>\r\n </td>\r\n <td class=\"mat-cell\">\r\n <ng-container [ngSwitch]=\"l.type\">\r\n <ng-container *ngSwitchCase=\"'ActionTaken'\">\r\n <span [innerHTML]=\"l.action | sanitizeHtml\" (click)=\"chat($event)\"></span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'Owner'\">{{'Issued' | translate}}</span>\r\n <span *ngSwitchCase=\"'Pending'\">{{'IsPending' | translate}}</span>\r\n <span *ngSwitchCase=\"'CheckOut'\">{{'CheckedIn' | translate : l.fileName}}</span>\r\n <span *ngSwitchCase=\"'CheckIn'\">{{'CheckedOut' | translate : l.fileName}}</span>\r\n <span *ngSwitchCase=\"'Estimate'\">{{'Estimate' | translate}}</span>\r\n <span *ngSwitchCase=\"'ModelChange'\">{{'Changed' | translate}}</span>\r\n </ng-container>\r\n <span *ngIf=\"l.fyi\">&nbsp;{{'FYI'|translate}}</span>\r\n </td>\r\n <td class=\"mat-cell\" [ngSwitch]=\"l.estimate\">\r\n <ng-container *ngSwitchCase=\"true\">\r\n <span *ngIf=\"l.durationMax && l.durationMax === l.durationMin\" [bizdocTooltip]=\"l.durationMax|amDurationFormat\">{{'EstimateTime'| translate : (l.durationMax | amDuration:'s')}}</span>\r\n <span *ngIf=\"l.durationMax && l.durationMax !== l.durationMin\"\r\n [bizdocTooltip]=\"l.durationMax|amDurationFormat\">{{'EstimateTimeRange'| translate : (l.durationMin | amDuration:'s') : (l.durationMax | amDuration:'s')}}</span>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <span>{{l.time | amCalendar : null : CALENDAR_SPEC }}</span>\r\n <span *ngIf=\"l.duration\" [bizdocTooltip]=\"l.duration|amDurationFormat\" class=\"duration\">&nbsp;({{l.duration | amDuration:'s'}})</span>\r\n </ng-container>\r\n </td>\r\n <td class=\"mat-cell\">\r\n <span *ngIf=\"l.note\">{{l.note}}</span>\r\n <button mat-icon-button *ngIf=\"l.model\" (click)=\"compare(l)\" [bizdocTooltip]=\"'Compare'|translate\" bizdocTooltipPosition=\"start\"><mat-icon>more_horiz</mat-icon></button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n", styles: [":host{width:100%}table{width:100%;background:transparent}table td{padding:0 4px}.duration{white-space:nowrap}\n"], components: [{ type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i8.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }], directives: [{ type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i9.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i10.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i10.NgSwitchDefault, selector: "[ngSwitchDefault]" }], pipes: { "translate": i11.TranslatePipe, "sanitizeHtml": i12.SanitizeHtmlPipe, "amDurationFormat": i13.DurationFormatPipe, "amDuration": i14.DurationPipe, "amCalendar": i15.CalendarPipe }, animations: [listAnimation, itemAnimation] });
328
+ TraceViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: TraceViewComponent, selector: "bizdoc-trace", inputs: { model: "model" }, outputs: { versionSelected: "versionSelected" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"nav-toolbar row\">\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" [bizdocTooltip]=\"'ShowAll'|translate\"><mat-icon>filter_list</mat-icon></button>\r\n <mat-menu #menu> \r\n <button mat-menu-item (click)=\"showAll=false\">\r\n <mat-icon>{{ !showAll?'check':'' }}</mat-icon>\r\n <span>{{'Route' | translate }}</span>\r\n </button>\r\n <button mat-menu-item (click)=\"showAll=true\">\r\n <mat-icon>{{showAll?'check':''}}</mat-icon>\r\n <span>{{'Everything' | translate }}</span>\r\n </button>\r\n </mat-menu>\r\n</div>\r\n<table class=\"mat-table\" @list>\r\n <tbody role=\"rowgroup\">\r\n <tr class=\"mat-row\" *ngFor=\"let l of data\" @item>\r\n <td class=\"mat-cell\">\r\n <span [innerHTML]=\"l.name | sanitizeHtml\" (click)=\"chat($event)\"></span>\r\n <span *ngIf=l.role>{{'JoinComma'|translate}}{{l.role}}</span>\r\n </td>\r\n <td class=\"mat-cell\">\r\n <ng-container [ngSwitch]=\"l.type\">\r\n <ng-container *ngSwitchCase=\"'ActionTaken'\">\r\n <span [innerHTML]=\"l.action | sanitizeHtml\" (click)=\"chat($event)\" class=\"to\"></span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'Submit'\">{{'Issued' | translate}}</span>\r\n <span *ngSwitchCase=\"'Pending'\">{{'IsPending' | translate}}</span>\r\n <span *ngSwitchCase=\"'CheckOut'\">{{'CheckedIn' | translate : l.fileName}}</span>\r\n <span *ngSwitchCase=\"'CheckIn'\">{{'CheckedOut' | translate : l.fileName}}</span>\r\n <span *ngSwitchCase=\"'Estimate'\">{{'Estimate' | translate}}</span>\r\n <span *ngSwitchCase=\"'ModelChange'\">{{'Changed' | translate}}</span>\r\n </ng-container>\r\n <span *ngIf=\"l.fyi\">&nbsp;{{'FYI'|translate}}</span>\r\n </td>\r\n <td class=\"mat-cell\" [ngSwitch]=\"l.estimate\">\r\n <ng-container *ngSwitchCase=\"true\">\r\n <span *ngIf=\"l.durationMax && l.durationMax === l.durationMin\" [bizdocTooltip]=\"l.durationMax|amDurationFormat\">{{'EstimateTime'| translate : (l.durationMax | amDuration:'s')}}</span>\r\n <span *ngIf=\"l.durationMax && l.durationMax !== l.durationMin\"\r\n [bizdocTooltip]=\"l.durationMax|amDurationFormat\">{{'EstimateTimeRange'| translate : (l.durationMin | amDuration:'s') : (l.durationMax | amDuration:'s')}}</span>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <span>{{l.time | amCalendar : null : CALENDAR_SPEC }}</span>\r\n <span *ngIf=\"l.duration\" [bizdocTooltip]=\"l.duration|amDurationFormat\" class=\"duration\">&nbsp;({{l.duration | amDuration:'s'}})</span>\r\n </ng-container>\r\n </td>\r\n <td class=\"mat-cell\">\r\n <span *ngIf=\"l.note\">{{l.note}}</span>\r\n <button mat-icon-button *ngIf=\"l.type==='ModelChange'\" (click)=\"compare(l)\" [bizdocTooltip]=\"'Compare'|translate\" bizdocTooltipPosition=\"start\"><mat-icon>more_horiz</mat-icon></button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n", styles: [":host{width:100%}table{width:100%;background:transparent}table td{padding:0 4px}.duration{white-space:nowrap}\n"], components: [{ type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i8.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }], directives: [{ type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i9.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i10.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i10.NgSwitchDefault, selector: "[ngSwitchDefault]" }], pipes: { "translate": i11.TranslatePipe, "sanitizeHtml": i12.SanitizeHtmlPipe, "amDurationFormat": i13.DurationFormatPipe, "amDuration": i14.DurationPipe, "amCalendar": i15.CalendarPipe }, animations: [listAnimation, itemAnimation] });
352
329
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: TraceViewComponent, decorators: [{
353
330
  type: Component,
354
- args: [{ selector: 'bizdoc-trace', animations: [listAnimation, itemAnimation], template: "<div class=\"nav-toolbar row\">\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" [bizdocTooltip]=\"'ShowAll'|translate\"><mat-icon>filter_list</mat-icon></button>\r\n <mat-menu #menu> \r\n <button mat-menu-item (click)=\"showAll=false\">\r\n <mat-icon>{{ !showAll?'check':'' }}</mat-icon>\r\n <span>{{'Route' | translate }}</span>\r\n </button>\r\n <button mat-menu-item (click)=\"showAll=true\">\r\n <mat-icon>{{showAll?'check':''}}</mat-icon>\r\n <span>{{'Log' | translate }}</span>\r\n </button>\r\n </mat-menu>\r\n</div>\r\n<table class=\"mat-table\" @list>\r\n <tbody role=\"rowgroup\">\r\n <tr class=\"mat-row\" *ngFor=\"let l of data\" @item>\r\n <td class=\"mat-cell\">\r\n <span [innerHTML]=\"l.name | sanitizeHtml\" (click)=\"chat($event)\"></span>\r\n <span *ngIf=l.role>{{'JoinComma'|translate}}{{l.role}}</span>\r\n </td>\r\n <td class=\"mat-cell\">\r\n <ng-container [ngSwitch]=\"l.type\">\r\n <ng-container *ngSwitchCase=\"'ActionTaken'\">\r\n <span [innerHTML]=\"l.action | sanitizeHtml\" (click)=\"chat($event)\"></span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'Owner'\">{{'Issued' | translate}}</span>\r\n <span *ngSwitchCase=\"'Pending'\">{{'IsPending' | translate}}</span>\r\n <span *ngSwitchCase=\"'CheckOut'\">{{'CheckedIn' | translate : l.fileName}}</span>\r\n <span *ngSwitchCase=\"'CheckIn'\">{{'CheckedOut' | translate : l.fileName}}</span>\r\n <span *ngSwitchCase=\"'Estimate'\">{{'Estimate' | translate}}</span>\r\n <span *ngSwitchCase=\"'ModelChange'\">{{'Changed' | translate}}</span>\r\n </ng-container>\r\n <span *ngIf=\"l.fyi\">&nbsp;{{'FYI'|translate}}</span>\r\n </td>\r\n <td class=\"mat-cell\" [ngSwitch]=\"l.estimate\">\r\n <ng-container *ngSwitchCase=\"true\">\r\n <span *ngIf=\"l.durationMax && l.durationMax === l.durationMin\" [bizdocTooltip]=\"l.durationMax|amDurationFormat\">{{'EstimateTime'| translate : (l.durationMax | amDuration:'s')}}</span>\r\n <span *ngIf=\"l.durationMax && l.durationMax !== l.durationMin\"\r\n [bizdocTooltip]=\"l.durationMax|amDurationFormat\">{{'EstimateTimeRange'| translate : (l.durationMin | amDuration:'s') : (l.durationMax | amDuration:'s')}}</span>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <span>{{l.time | amCalendar : null : CALENDAR_SPEC }}</span>\r\n <span *ngIf=\"l.duration\" [bizdocTooltip]=\"l.duration|amDurationFormat\" class=\"duration\">&nbsp;({{l.duration | amDuration:'s'}})</span>\r\n </ng-container>\r\n </td>\r\n <td class=\"mat-cell\">\r\n <span *ngIf=\"l.note\">{{l.note}}</span>\r\n <button mat-icon-button *ngIf=\"l.model\" (click)=\"compare(l)\" [bizdocTooltip]=\"'Compare'|translate\" bizdocTooltipPosition=\"start\"><mat-icon>more_horiz</mat-icon></button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n", styles: [":host{width:100%}table{width:100%;background:transparent}table td{padding:0 4px}.duration{white-space:nowrap}\n"] }]
331
+ args: [{ selector: 'bizdoc-trace', animations: [listAnimation, itemAnimation], template: "<div class=\"nav-toolbar row\">\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" [bizdocTooltip]=\"'ShowAll'|translate\"><mat-icon>filter_list</mat-icon></button>\r\n <mat-menu #menu> \r\n <button mat-menu-item (click)=\"showAll=false\">\r\n <mat-icon>{{ !showAll?'check':'' }}</mat-icon>\r\n <span>{{'Route' | translate }}</span>\r\n </button>\r\n <button mat-menu-item (click)=\"showAll=true\">\r\n <mat-icon>{{showAll?'check':''}}</mat-icon>\r\n <span>{{'Everything' | translate }}</span>\r\n </button>\r\n </mat-menu>\r\n</div>\r\n<table class=\"mat-table\" @list>\r\n <tbody role=\"rowgroup\">\r\n <tr class=\"mat-row\" *ngFor=\"let l of data\" @item>\r\n <td class=\"mat-cell\">\r\n <span [innerHTML]=\"l.name | sanitizeHtml\" (click)=\"chat($event)\"></span>\r\n <span *ngIf=l.role>{{'JoinComma'|translate}}{{l.role}}</span>\r\n </td>\r\n <td class=\"mat-cell\">\r\n <ng-container [ngSwitch]=\"l.type\">\r\n <ng-container *ngSwitchCase=\"'ActionTaken'\">\r\n <span [innerHTML]=\"l.action | sanitizeHtml\" (click)=\"chat($event)\" class=\"to\"></span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'Submit'\">{{'Issued' | translate}}</span>\r\n <span *ngSwitchCase=\"'Pending'\">{{'IsPending' | translate}}</span>\r\n <span *ngSwitchCase=\"'CheckOut'\">{{'CheckedIn' | translate : l.fileName}}</span>\r\n <span *ngSwitchCase=\"'CheckIn'\">{{'CheckedOut' | translate : l.fileName}}</span>\r\n <span *ngSwitchCase=\"'Estimate'\">{{'Estimate' | translate}}</span>\r\n <span *ngSwitchCase=\"'ModelChange'\">{{'Changed' | translate}}</span>\r\n </ng-container>\r\n <span *ngIf=\"l.fyi\">&nbsp;{{'FYI'|translate}}</span>\r\n </td>\r\n <td class=\"mat-cell\" [ngSwitch]=\"l.estimate\">\r\n <ng-container *ngSwitchCase=\"true\">\r\n <span *ngIf=\"l.durationMax && l.durationMax === l.durationMin\" [bizdocTooltip]=\"l.durationMax|amDurationFormat\">{{'EstimateTime'| translate : (l.durationMax | amDuration:'s')}}</span>\r\n <span *ngIf=\"l.durationMax && l.durationMax !== l.durationMin\"\r\n [bizdocTooltip]=\"l.durationMax|amDurationFormat\">{{'EstimateTimeRange'| translate : (l.durationMin | amDuration:'s') : (l.durationMax | amDuration:'s')}}</span>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <span>{{l.time | amCalendar : null : CALENDAR_SPEC }}</span>\r\n <span *ngIf=\"l.duration\" [bizdocTooltip]=\"l.duration|amDurationFormat\" class=\"duration\">&nbsp;({{l.duration | amDuration:'s'}})</span>\r\n </ng-container>\r\n </td>\r\n <td class=\"mat-cell\">\r\n <span *ngIf=\"l.note\">{{l.note}}</span>\r\n <button mat-icon-button *ngIf=\"l.type==='ModelChange'\" (click)=\"compare(l)\" [bizdocTooltip]=\"'Compare'|translate\" bizdocTooltipPosition=\"start\"><mat-icon>more_horiz</mat-icon></button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n", styles: [":host{width:100%}table{width:100%;background:transparent}table td{padding:0 4px}.duration{white-space:nowrap}\n"] }]
355
332
  }], ctorParameters: function () { return [{ type: i1.SessionService }, { type: i2.TranslateService }, { type: i3.AccountService }, { type: i4.ChatInfo }, { type: i5.HubService }]; }, propDecorators: { model: [{
356
333
  type: Input
357
334
  }], versionSelected: [{
358
335
  type: Output
359
336
  }] } });
360
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9jb21wb3NlL3RyYWNlL3RyYWNlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvY29tcG9zZS90cmFjZS90cmFjZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUVqRyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFNMUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQUVyRSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFJbEIsb0NBQW9DO0FBT3BDLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxTQUFTO0lBVy9DLFlBQW9CLFFBQXdCLEVBQ2xDLFVBQTRCLEVBQzVCLFNBQXlCLEVBQ3pCLEtBQWUsRUFDdkIsR0FBZTtRQUNmLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUxPLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLGNBQVMsR0FBVCxTQUFTLENBQWdCO1FBQ3pCLFVBQUssR0FBTCxLQUFLLENBQVU7UUFaTixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDOUQsU0FBSSxHQUFZLEVBQUUsQ0FBQztRQUVWLGtCQUFhLEdBQWlCO1lBQ3JDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTO1lBQ3RELFFBQVEsRUFBRSxZQUFZ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QWEsRUFBRSxhQUFhLENBQUM7aU5BR2pDLEtBQUs7c0JBQWIsS0FBSztnQkFDYSxlQUFlO3NCQUFqQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5pbXBvcnQgeyBDYWxlbmRhclNwZWMgfSBmcm9tIFwiLi4vLi4vY29yZS9waXBlcy9jYWxlbmRhci5waXBlXCI7XHJcbmltcG9ydCB7IFVzZXJJbmZvLCBMb2dUeXBlLCBEb2N1bWVudE1vZGVsLCBBY3Rpb24sIEF0dGFjaG1lbnQgfSBmcm9tIFwiLi4vLi4vY29yZS9tb2RlbHNcIjtcclxuaW1wb3J0IHsgU2Vzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9zZXNzaW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb3JlL3RyYW5zbGF0ZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvYWNjb3VudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRyYWNlQmFzZSB9IGZyb20gXCIuL3RyYWNlLmJhc2VcIjtcclxuaW1wb3J0IHsgSHViU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb3JlL2h1Yi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENoYXRJbmZvIH0gZnJvbSBcIi4uLy4uL2NoYXQvY2hhdC1pbmZvXCI7XHJcbmltcG9ydCB7IGl0ZW1BbmltYXRpb24sIGxpc3RBbmltYXRpb24gfSBmcm9tIFwiLi4vLi4vY29yZS9hbmltYXRpb25zXCI7XHJcblxyXG5jb25zdCBZb3UgPSAneW91JztcclxuXHJcbnR5cGUgVXNlckluZm9Zb3UgPSBVc2VySW5mbyB8ICd5b3UnO1xyXG5cclxuLyoqIGNvbXBvbmVudCBzaG93aW5nIHRyYWNlIHRhYmxlICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYml6ZG9jLXRyYWNlJyxcclxuICB0ZW1wbGF0ZVVybDogJ3RyYWNlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsndHJhY2UuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbbGlzdEFuaW1hdGlvbiwgaXRlbUFuaW1hdGlvbl1cclxufSlcclxuZXhwb3J0IGNsYXNzIFRyYWNlVmlld0NvbXBvbmVudCBleHRlbmRzIFRyYWNlQmFzZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgbW9kZWw6IERvY3VtZW50TW9kZWw8YW55PjtcclxuICBAT3V0cHV0KCkgcmVhZG9ubHkgdmVyc2lvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xyXG4gIGRhdGE6IFRyYWNlW10gPSBbXTtcclxuICBwcml2YXRlIF9kYXRhOiBUcmFjZVtdO1xyXG4gIHJlYWRvbmx5IENBTEVOREFSX1NQRUM6IENhbGVuZGFyU3BlYyA9IHtcclxuICAgIGxhc3REYXk6IGBbJHt0aGlzLl90cmFuc2xhdGUuZ2V0KCdZZXN0ZXJkYXknKX1dIEhIOm1tYCxcclxuICAgIGxhc3RXZWVrOiAnZGRkZCBISDptbScsXHJcbiAgICBzYW1lRGF5OiBgWyR7dGhpcy5fdHJhbnNsYXRlLmdldCgnVG9kYXknKX1dIEhIOm1tYCxcclxuICAgIHNhbWVFbHNlOiAnTU1NIERvIEhIOm1tJ1xyXG4gIH07XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hY2NvdW50czogQWNjb3VudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jaGF0OiBDaGF0SW5mbyxcclxuICAgIGh1YjogSHViU2VydmljZSkge1xyXG4gICAgc3VwZXIoaHViKTtcclxuICAgIHRoaXMuX3Nob3dBbGwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHJhY2VBbGwnKSAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIHRoaXMuX2luaXRpYWxpc2UoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBhc3luYyBfaW5pdGlhbGlzZSgpIHtcclxuICAgIGNvbnN0IHsgb3duZXJJZCwgb3duZXJCeUlkLCBpc3N1ZWQsIGxvZywgcmVjaXBpZW50cywgYXR0YWNobWVudHMgfSA9IHRoaXMubW9kZWw7XHJcblxyXG4gICAgY29uc3QgdHJhY2U6IFRyYWNlW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBsIG9mIGxvZykge1xyXG4gICAgICBsZXQgYWN0aW9uOiBBY3Rpb24sIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQ7XHJcblxyXG4gICAgICBzd2l0Y2ggKGwudHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ0FjdGlvblRha2VuJzpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYWN0aW9uID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLmFjdGlvbnMuZmluZChhID0+IGEubmFtZSA9PT0gbC5hY3Rpb24pO1xyXG4gICAgICAgICAgICBpZiAoYWN0aW9uLmxvZ2dhYmxlID09PSBmYWxzZSlcclxuICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgY2FzZSAnQ2hlY2tJbic6XHJcbiAgICAgICAgY2FzZSAnQ2hlY2tPdXQnOlxyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zaG93QWxsKSBjb250aW51ZTtcclxuICAgICAgICAgIGF0dGFjaG1lbnQgPSBhdHRhY2htZW50cy5maW5kKGYgPT4gZi5pZCA9PT0gbC5maWxlSWQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnTW9kZWxDaGFuZ2UnOlxyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zaG93QWxsKSBjb250aW51ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ1N1Ym1pdCc6XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Nob3dBbGwpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgaWYgKGwuZXN0aW1hdGUpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgY29uc3Qgbm9kZSA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ093bmVyJyxcclxuICAgICAgICAgICAgdGltZTogbC50aW1lXHJcbiAgICAgICAgICB9IGFzIFRyYWNlO1xyXG4gICAgICAgICAgaWYgKG93bmVyQnlJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBvd25lciA9IGF3YWl0IHRoaXMuX3VzZXJPZihvd25lcklkKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgaWYgKG93bmVyQnlJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpXHJcbiAgICAgICAgICAgICAgbm9kZS5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLmdldCgnQnlZb3UnLCB0aGlzLl9uYW1lT2Yob3duZXIpKTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgYnkgPSBhd2FpdCB0aGlzLl91c2VyT2Yob3duZXJCeUlkKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgICBub2RlLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUuZ2V0KCdCeScsIHRoaXMuX25hbWVPZihvd25lciksIHRoaXMuX25hbWVPZihieSkpO1xyXG4gICAgICAgICAgICAgIGlmIChieS5yb2xlKSBub2RlLnJvbGUgPSBieS5yb2xlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG93bmVySWQgPT09IHRoaXMuX3Nlc3Npb24udXNlcklkKVxyXG4gICAgICAgICAgICAgIG5vZGUubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ1lvdScpO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCBvd25lciA9IGF3YWl0IHRoaXMuX3VzZXJPZihvd25lcklkKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgICBub2RlLm5hbWUgPSB0aGlzLl9uYW1lT2Yob3duZXIpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAob3duZXIucm9sZSkgbm9kZS5yb2xlID0gb3duZXIucm9sZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdHJhY2UucHVzaChub2RlKTtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHN0ZXAgPSB7IC4uLmwgfSBhcyBUcmFjZTtcclxuXHJcbiAgICAgIGlmIChhdHRhY2htZW50KSBzdGVwLmZpbGVOYW1lID0gYXR0YWNobWVudC5maWxlTmFtZTtcclxuXHJcbiAgICAgIGNvbnN0IHdobyA9IGF3YWl0IHRoaXMuX3VzZXJPZihsLnVzZXJJZCkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgICBpZiAobC5yZWNpcGllbnRJZCkge1xyXG4gICAgICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHMuZmluZChyID0+IHIuaWQgPT09IGwucmVjaXBpZW50SWQpO1xyXG4gICAgICAgIGlmIChyZWNpcGllbnQucm9sZSkgc3RlcC5yb2xlID0gdGhpcy5fcm9sZU5hbWUocmVjaXBpZW50LnJvbGUpO1xyXG4gICAgICAgIGlmIChyZWNpcGllbnQubm9kZUlkKSB7XHJcbiAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5tb2RlbC53b3JrZmxvdy5ub2Rlcy5maW5kKG4gPT4gbi5pZCA9PT0gcmVjaXBpZW50Lm5vZGVJZCk7XHJcbiAgICAgICAgICBzdGVwLmZ5aSA9IG5vZGUgJiYgbm9kZS5meWk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVjaXBpZW50LnN1YnN0aXR1dGluZ0lkKSB7XHJcbiAgICAgICAgICBsZXQgc3Vic3RpdHV0aW5nID0gYXdhaXQgdGhpcy5fdXNlck9mKHJlY2lwaWVudC5zdWJzdGl0dXRpbmdJZCkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICBpZiAobC5ieUlkKSB7XHJcbiAgICAgICAgICAgIGlmIChsLmJ5SWQgPT09IHRoaXMuX3Nlc3Npb24udXNlcklkKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlY2lwaWVudC5zdWJzdGl0dXRpbmdJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpXHJcbiAgICAgICAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUuZ2V0KCdCeVlvdScsIHRoaXMuX25hbWVPZih3aG8pKTtcclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUucGVyc29uYWxpemUoJ1N1YnN0aXR1dGluZ0J5WW91Jywgd2hvLmdlbmRlciwgdGhpcy5fbmFtZU9mKHdobyksIHRoaXMuX25hbWVPZihzdWJzdGl0dXRpbmcpKTtcclxuICAgICAgICAgICAgICBpZiAoYWN0aW9uKVxyXG4gICAgICAgICAgICAgICAgc3RlcC5hY3Rpb24gPSBhY3Rpb24gPyB0aGlzLl9hY3Rpb25OYW1lKGFjdGlvbiwgWW91KSA6IGwuYWN0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBieSA9IGF3YWl0IHRoaXMuX3VzZXJPZihsLmJ5SWQpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ1N1YnN0aXR1dGluZ0J5JywgdGhpcy5fbmFtZU9mKHdobyksIHRoaXMuX25hbWVPZihzdWJzdGl0dXRpbmcpLCB0aGlzLl9uYW1lT2YoYnkpKTtcclxuICAgICAgICAgICAgICBpZiAoYnkucm9sZSlcclxuICAgICAgICAgICAgICAgIHN0ZXAucm9sZSA9IGJ5LnJvbGU7XHJcbiAgICAgICAgICAgICAgaWYgKGFjdGlvbilcclxuICAgICAgICAgICAgICAgIHN0ZXAuYWN0aW9uID0gYWN0aW9uID8gdGhpcy5fYWN0aW9uTmFtZShhY3Rpb24sIGJ5KSA6IGwuYWN0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHJlY2lwaWVudC5zdWJzdGl0dXRpbmdJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpXHJcbiAgICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLnBlcnNvbmFsaXplKCdTdWJzdGl0dXRpbmdGb3JZb3UnLCB3aG8uZ2VuZGVyLCB0aGlzLl9uYW1lT2Yod2hvKSk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGwudXNlcklkID09PSB0aGlzLl9zZXNzaW9uLnVzZXJJZClcclxuICAgICAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUucGVyc29uYWxpemUoJ1lvdVN1YnN0aXR1dGUnLCB0aGlzLl9zZXNzaW9uLnByb2ZpbGUuYnlHZW5kZXIsIHRoaXMuX25hbWVPZih3aG8pKTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLnBlcnNvbmFsaXplKCdTdWJzdGl0dXRpbmcnLCB3aG8uZ2VuZGVyLCB0aGlzLl9uYW1lT2Yod2hvKSwgdGhpcy5fbmFtZU9mKHN1YnN0aXR1dGluZykpO1xyXG4gICAgICAgICAgICAgIGlmICh3aG8ucm9sZSlcclxuICAgICAgICAgICAgICAgIHN0ZXAucm9sZSA9IHdoby5yb2xlO1xyXG4gICAgICAgICAgICB9IGlmIChhY3Rpb24pXHJcbiAgICAgICAgICAgICAgc3RlcC5hY3Rpb24gPSBhY3Rpb24gPyB0aGlzLl9hY3Rpb25OYW1lKGFjdGlvbiwgd2hvKSA6IGwuYWN0aW9uO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsLmJ5SWQpIHtcclxuICAgICAgICAgIGlmIChsLmJ5SWQgPT09IHRoaXMuX3Nlc3Npb24udXNlcklkKSB7XHJcbiAgICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ0J5WW91JywgdGhpcy5fbmFtZU9mKHdobykpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aW9uKVxyXG4gICAgICAgICAgICAgIHN0ZXAuYWN0aW9uID0gYWN0aW9uID8gdGhpcy5fYWN0aW9uTmFtZShhY3Rpb24sIFlvdSkgOiBsLmFjdGlvbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYnkgPSBhd2FpdCB0aGlzLl91c2VyT2YobC5ieUlkKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLmdldCgnQnknLCB0aGlzLl9uYW1lT2Yod2hvKSwgdGhpcy5fbmFtZU9mKGJ5KSk7XHJcbiAgICAgICAgICAgIGlmIChieS5yb2xlKVxyXG4gICAgICAgICAgICAgIHN0ZXAucm9sZSA9IGJ5LnJvbGU7XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb24pXHJcbiAgICAgICAgICAgICAgc3RlcC5hY3Rpb24gPSBhY3Rpb24gPyB0aGlzLl9hY3Rpb25OYW1lKGFjdGlvbiwgYnkpIDogbC5hY3Rpb247XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vZWxzZSBpZiAocmVjaXBpZW50LnRvSWQpIHtcclxuICAgICAgICAvL31cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmIChsLnVzZXJJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpXHJcbiAgICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ1lvdScpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX25hbWVPZih3aG8pO1xyXG4gICAgICAgICAgICBpZiAod2hvLnJvbGUpXHJcbiAgICAgICAgICAgICAgc3RlcC5yb2xlID0gd2hvLnJvbGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoYWN0aW9uKVxyXG4gICAgICAgICAgICBzdGVwLmFjdGlvbiA9IGFjdGlvbiA/IHRoaXMuX2FjdGlvbk5hbWUoYWN0aW9uLCB3aG8pIDogbC5hY3Rpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChsLnVzZXJJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpXHJcbiAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUuZ2V0KCdZb3UnKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX25hbWVPZih3aG8pO1xyXG4gICAgICAgICAgaWYgKHdoby5yb2xlKVxyXG4gICAgICAgICAgICBzdGVwLnJvbGUgPSB3aG8ucm9sZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFjdGlvbikge1xyXG4gICAgICAgICAgc3RlcC5hY3Rpb24gPSBhY3Rpb24gPyB0aGlzLl9hY3Rpb25OYW1lKGFjdGlvbiwgd2hvKSA6IGwuYWN0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0cmFjZS5wdXNoKHN0ZXApO1xyXG4gICAgfVxyXG4gICAgZm9yICh2YXIgciA9IDA7IHIgPCByZWNpcGllbnRzLmxlbmd0aDsgcisrKSB7XHJcbiAgICAgIGxldCByZWNpcGllbnQgPSByZWNpcGllbnRzW3JdO1xyXG4gICAgICBpZiAoIXJlY2lwaWVudC5wZW5kaW5nICYmICFyZWNpcGllbnQuZXN0aW1hdGUpIGNvbnRpbnVlO1xyXG4gICAgICBjb25zdCBzdGVwID0ge1xyXG4gICAgICAgIC4uLnJlY2lwaWVudCxcclxuICAgICAgICB0eXBlOiByZWNpcGllbnQuZXN0aW1hdGUgPyAnRXN0aW1hdGUnIDogJ1BlbmRpbmcnLFxyXG4gICAgICAgIHRpbWU6IHJlY2lwaWVudC5yZWNlaXZlZCxcclxuICAgICAgICBkdXJhdGlvbjogcmVjaXBpZW50LnBlbmRpbmcgPyBkYXlqcygpLmRpZmYocmVjaXBpZW50LnJlY2VpdmVkLCAncycpIDogbnVsbCxcclxuICAgICAgICByb2xlOiByZWNpcGllbnQucm9sZSA/IHRoaXMuX3JvbGVOYW1lKHJlY2lwaWVudC5yb2xlKSA6IG51bGxcclxuICAgICAgfSBhcyBUcmFjZTtcclxuXHJcbiAgICAgIGlmIChyZWNpcGllbnQubm9kZUlkKSB7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMubW9kZWwud29ya2Zsb3cubm9kZXMuZmluZChuID0+IG4uaWQgPT09IHJlY2lwaWVudC5ub2RlSWQpO1xyXG4gICAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgICBpZiAocmVjaXBpZW50LmVzdGltYXRlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgbWluLCBtYXggfSA9IHN1cGVyLl9lc3RpbWF0ZVRpbWUobm9kZSk7XHJcbiAgICAgICAgICAgIGlmIChtYXgpXHJcbiAgICAgICAgICAgICAgc3RlcC5kdXJhdGlvbk1pbiA9IG1pbixcclxuICAgICAgICAgICAgICAgIHN0ZXAuZHVyYXRpb25NYXggPSBtYXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzdGVwLmZ5aSA9IG5vZGUuZnlpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHdobyA9IGF3YWl0IHRoaXMuX3VzZXJPZihyZWNpcGllbnQudXNlcklkKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgIGlmIChyZWNpcGllbnQuc3Vic3RpdHV0aW5nSWQpIHtcclxuICAgICAgICBpZiAocmVjaXBpZW50LmJ5SWQpIHtcclxuICAgICAgICAgIGlmIChyZWNpcGllbnQuYnlJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpIHtcclxuICAgICAgICAgICAgaWYgKHJlY2lwaWVudC5zdWJzdGl0dXRpbmdJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpXHJcbiAgICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLmdldCgnQnlZb3UnLCB0aGlzLl9uYW1lT2Yod2hvKSk7XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJzdGl0dXRpbmcgPSBhd2FpdCB0aGlzLl91c2VyT2YocmVjaXBpZW50LnN1YnN0aXR1dGluZ0lkKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUucGVyc29uYWxpemUoJ1N1YnN0aXR1dGluZ0J5WW91Jywgd2hvLmdlbmRlciwgdGhpcy5fbmFtZU9mKHdobyksIHRoaXMuX25hbWVPZihzdWJzdGl0dXRpbmcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBzdWJzdGl0dXRpbmcgPSBhd2FpdCB0aGlzLl91c2VyT2YocmVjaXBpZW50LnN1YnN0aXR1dGluZ0lkKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgbGV0IGJ5ID0gYXdhaXQgdGhpcy5fdXNlck9mKHJlY2lwaWVudC5ieUlkKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLmdldCgnU3Vic3RpdHV0aW5nQnknLCB0aGlzLl9uYW1lT2Yod2hvKSwgdGhpcy5fbmFtZU9mKHN1YnN0aXR1dGluZyksIHRoaXMuX25hbWVPZihieSkpO1xyXG4gICAgICAgICAgICBpZiAoYnkucm9sZSlcclxuICAgICAgICAgICAgICBzdGVwLnJvbGUgPSBieS5yb2xlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmIChyZWNpcGllbnQuc3Vic3RpdHV0aW5nSWQgPT09IHRoaXMuX3Nlc3Npb24udXNlcklkKVxyXG4gICAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUucGVyc29uYWxpemUoJ1N1YnN0aXR1dGluZ0ZvcllvdScsIHdoby5nZW5kZXIsIHRoaXMuX25hbWVPZih3aG8pKTtcclxuICAgICAgICAgIGVsc2UgaWYgKHJlY2lwaWVudC51c2VySWQgPT09IHRoaXMuX3Nlc3Npb24udXNlcklkKVxyXG4gICAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUucGVyc29uYWxpemUoJ1lvdVN1YnN0aXR1dGUnLCB0aGlzLl9zZXNzaW9uLnByb2ZpbGUuYnlHZW5kZXIsIHRoaXMuX25hbWVPZih3aG8pKTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgc3Vic3RpdHV0aW5nID0gYXdhaXQgdGhpcy5fdXNlck9mKHJlY2lwaWVudC5zdWJzdGl0dXRpbmdJZCkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5wZXJzb25hbGl6ZSgnU3Vic3RpdHV0aW5nJywgd2hvLmdlbmRlciwgdGhpcy5fbmFtZU9mKHdobyksIHRoaXMuX25hbWVPZihzdWJzdGl0dXRpbmcpKTtcclxuICAgICAgICAgICAgaWYgKHdoby5yb2xlKVxyXG4gICAgICAgICAgICAgIHN0ZXAucm9sZSA9IHdoby5yb2xlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChyZWNpcGllbnQuYnlJZCkge1xyXG4gICAgICAgIGlmIChyZWNpcGllbnQuYnlJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpXHJcbiAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUuZ2V0KCdCeVlvdScsIHRoaXMuX25hbWVPZih3aG8pKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBieSA9IGF3YWl0IHRoaXMuX3VzZXJPZihyZWNpcGllbnQuYnlJZCkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUuZ2V0KCdCeScsIHRoaXMuX25hbWVPZih3aG8pLCB0aGlzLl9uYW1lT2YoYnkpKTtcclxuICAgICAgICAgIGlmIChieS5yb2xlKVxyXG4gICAgICAgICAgICBzdGVwLnJvbGUgPSBieS5yb2xlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBlc2NhbGF0aW9ucyA9IHRoaXMubW9kZWwubG9nLmZpbHRlcihsID0+IGwudGltZSA+IGlzc3VlZCAmJiBsLnR5cGUgPT09ICdFc2NhbGF0aW9uJyAmJiBsLnJlY2lwaWVudElkID09PSByZWNpcGllbnQuaWQpO1xyXG5cclxuICAgICAgICBpZiAoZXNjYWxhdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBsZXQgZXNjYWxhdGUgPSBbXTtcclxuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZXNjYWxhdGlvbnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgbGV0IHdobyA9IGF3YWl0IHRoaXMuX3VzZXJPZihlc2NhbGF0aW9uc1tqXS51c2VySWQpO1xyXG4gICAgICAgICAgICBlc2NhbGF0ZS5wdXNoKHdobyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZXNjYWxhdGlvbnMubGVuZ3RoID09PSAxICYmIGVzY2FsYXRlWzBdID09PSB0aGlzLl9zZXNzaW9uLnVzZXJJZClcclxuICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLmdldCgnRXNjYWxhdGVkQnlZb3UnLCB0aGlzLl9uYW1lT2Yod2hvKSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ0VzY2FsYXRlZEJ5JywgdGhpcy5fbmFtZU9mKHdobyksIHRoaXMuX3RyYW5zbGF0ZS5qb2luKGVzY2FsYXRlLm1hcChlID0+IHRoaXMuX25hbWVPZihlKSkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAocmVjaXBpZW50LnVzZXJJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpXHJcbiAgICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ1lvdScpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX25hbWVPZih3aG8pO1xyXG4gICAgICAgICAgICBpZiAod2hvLnJvbGUpXHJcbiAgICAgICAgICAgICAgc3RlcC5yb2xlID0gd2hvLnJvbGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRyYWNlLnB1c2goc3RlcCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZGF0YSA9IHRyYWNlLnNvcnQoKGEsIGIpID0+IGEudGltZSA+IGIudGltZSA/IDEgOiBhLnRpbWUgPT09IGIudGltZSA/IDAgOiAtMSk7XHJcbiAgICB0aGlzLl9maWx0ZXIoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfZmlsdGVyKCkge1xyXG4gICAgdGhpcy5kYXRhID0gdGhpcy5fc2hvd0FsbCA/IHRoaXMuX2RhdGEgOiB0aGlzLl9kYXRhLmZpbHRlcihsID0+IGwudHlwZSA9PT0gJ0FjdGlvblRha2VuJ1xyXG4gICAgICB8fCBsLnR5cGUgPT09ICdFc3RpbWF0ZScgfHwgbC50eXBlID09PSAnUGVuZGluZycpO1xyXG4gIH1cclxuICBwcml2YXRlIF9zaG93QWxsOiBib29sZWFuO1xyXG5cclxuICBwdWJsaWMgZ2V0IHNob3dBbGwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2hvd0FsbDtcclxuICB9XHJcbiAgcHVibGljIHNldCBzaG93QWxsKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93QWxsID0gdmFsdWU7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndHJhY2VBbGwnLCB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZScpO1xyXG4gICAgdGhpcy5fZGF0YSAmJiB0aGlzLl9maWx0ZXIoKTtcclxuICB9XHJcbiAgcHVibGljIHJlZnJlc2goKSB7XHJcbiAgICB0aGlzLm5nT25DaGFuZ2VzKG51bGwpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiB1c2VyIG5hbWUsIGNoYXQgYW5jaG9yIHRhZyBvciBZb3VcclxuICAgKiBAcGFyYW0gdXNlclxyXG4gICAqL1xyXG4gIHByaXZhdGUgX25hbWVPZih1c2VyOiBVc2VySW5mbyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hhdC5mb3JtYXQodXNlcik7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB1c2VySWRcclxuICAgKi9cclxuICBwcml2YXRlIF91c2VyT2YodXNlcklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVzZXJJbmZvPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWNjb3VudHMuZ2V0KHVzZXJJZCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3JvbGVOYW1lKG5hbWUpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgcm9sZSA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5yb2xlcy5maW5kKHIgPT4gci5uYW1lID09PSBuYW1lKTtcclxuICAgIHJldHVybiByb2xlID8gcm9sZS50aXRsZSA6IG5hbWU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBhY3Rpb25cclxuICAgKiBAcGFyYW0gdXNlclxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2FjdGlvbk5hbWUoYWN0aW9uOiBBY3Rpb24sIHVzZXI6IFVzZXJJbmZvWW91KTogc3RyaW5nIHtcclxuICAgIGlmICh1c2VyID09PSBZb3UpIHtcclxuICAgICAgY29uc3QgeyBnZW5kZXIgfSA9IHRoaXMuX3Nlc3Npb247XHJcbiAgICAgIHJldHVybiAoZ2VuZGVyID09PSAnTWFsZScgPyAoYWN0aW9uLnlvdU1hbGUgfHwgYWN0aW9uLnlvdSkgOlxyXG4gICAgICAgIGdlbmRlciA9PT0gJ0ZlbWFsZScgPyAoYWN0aW9uLnlvdUZlbWFsZSB8fCBhY3Rpb24ueW91KSA6XHJcbiAgICAgICAgICBhY3Rpb24ueW91KSB8fFxyXG4gICAgICAgIGFjdGlvbi5wYXN0IHx8XHJcbiAgICAgICAgYWN0aW9uLnRpdGxlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiAodXNlci5nZW5kZXIgPT09ICdNYWxlJyA/IChhY3Rpb24ucGFzdE1hbGUgfHwgYWN0aW9uLnBhc3QpIDpcclxuICAgICAgICB1c2VyLmdlbmRlciA9PT0gJ0ZlbWFsZScgPyAoYWN0aW9uLnBhc3RGZW1hbGUgfHwgYWN0aW9uLnBhc3QpIDpcclxuICAgICAgICAgIGFjdGlvbi5wYXN0KVxyXG4gICAgICAgIHx8IGFjdGlvbi50aXRsZTtcclxuICAgIH1cclxuICB9XHJcbiAgY2hhdChlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBjb25zdCB1c2VySWQgPSAoZS5zcmNFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW5mbycpO1xyXG4gICAgdXNlcklkICYmXHJcbiAgICAgIHRoaXMuX2NoYXQub3Blbih1c2VySWQpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBtb2RlbCB2ZXJzaW9uIGNvbXBhcmUsIGZvcm0gY29tcG9uZW50IGluICdjb21wYXJlJyB2aWV3IG1vZGVcclxuICAgKiBAcGFyYW0gbG9nXHJcbiAgICovXHJcbiAgY29tcGFyZShsb2c6IFRyYWNlKSB7XHJcbiAgICB0aGlzLnZlcnNpb25TZWxlY3RlZC5lbWl0KGxvZy50aW1lKTtcclxuICB9XHJcbn1cclxuaW50ZXJmYWNlIFRyYWNlIHtcclxuICBmeWk/OiBib29sZWFuO1xyXG4gIHR5cGU6IExvZ1R5cGUgfCAnT3duZXInIHwgJ1BlbmRpbmcnIHwgJ0VzdGltYXRlJztcclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIGVzdGltYXRlPzogYm9vbGVhbjtcclxuICBwZW5kaW5nPzogYm9vbGVhbjtcclxuICBhY3Rpb24/OiBzdHJpbmc7XHJcbiAgcm9sZT86IHN0cmluZztcclxuICBub3RlPzogc3RyaW5nO1xyXG4gIGR1cmF0aW9uPzogbnVtYmVyO1xyXG4gIGR1cmF0aW9uTWluPzogbnVtYmVyO1xyXG4gIGR1cmF0aW9uTWF4PzogbnVtYmVyO1xyXG4gIGZpbGVOYW1lPzogc3RyaW5nO1xyXG4gIHRpbWU/OiBEYXRlO1xyXG4gIG1vZGVsPzoge307XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm5hdi10b29sYmFyIHJvd1wiPlxyXG4gIDxzcGFuIGNsYXNzPVwiZGl2aWRlclwiPjwvc3Bhbj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiIFtiaXpkb2NUb29sdGlwXT1cIidTaG93QWxsJ3x0cmFuc2xhdGVcIj48bWF0LWljb24+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gIDxtYXQtbWVudSAjbWVudT4gXHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNob3dBbGw9ZmFsc2VcIj5cclxuICAgICAgPG1hdC1pY29uPnt7ICFzaG93QWxsPydjaGVjayc6JycgfX08L21hdC1pY29uPlxyXG4gICAgICA8c3Bhbj57eydSb3V0ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic2hvd0FsbD10cnVlXCI+XHJcbiAgICAgIDxtYXQtaWNvbj57e3Nob3dBbGw/J2NoZWNrJzonJ319PC9tYXQtaWNvbj5cclxuICAgICAgPHNwYW4+e3snTG9nJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvbWF0LW1lbnU+XHJcbjwvZGl2PlxyXG48dGFibGUgY2xhc3M9XCJtYXQtdGFibGVcIiBAbGlzdD5cclxuICA8dGJvZHkgcm9sZT1cInJvd2dyb3VwXCI+XHJcbiAgICA8dHIgY2xhc3M9XCJtYXQtcm93XCIgKm5nRm9yPVwibGV0IGwgb2YgZGF0YVwiIEBpdGVtPlxyXG4gICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPlxyXG4gICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwibC5uYW1lIHwgc2FuaXRpemVIdG1sXCIgKGNsaWNrKT1cImNoYXQoJGV2ZW50KVwiPjwvc3Bhbj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1sLnJvbGU+e3snSm9pbkNvbW1hJ3x0cmFuc2xhdGV9fXt7bC5yb2xlfX08L3NwYW4+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICAgIDx0ZCBjbGFzcz1cIm1hdC1jZWxsXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwibC50eXBlXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInQWN0aW9uVGFrZW4nXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwibC5hY3Rpb24gfCBzYW5pdGl6ZUh0bWxcIiAoY2xpY2spPVwiY2hhdCgkZXZlbnQpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ093bmVyJ1wiPnt7J0lzc3VlZCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInUGVuZGluZydcIj57eydJc1BlbmRpbmcnIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ0NoZWNrT3V0J1wiPnt7J0NoZWNrZWRJbicgfCB0cmFuc2xhdGUgOiBsLmZpbGVOYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ0NoZWNrSW4nXCI+e3snQ2hlY2tlZE91dCcgfCB0cmFuc2xhdGUgOiBsLmZpbGVOYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ0VzdGltYXRlJ1wiPnt7J0VzdGltYXRlJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidNb2RlbENoYW5nZSdcIj57eydDaGFuZ2VkJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibC5meWlcIj4mbmJzcDt7eydGWUknfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L3RkPlxyXG4gICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiIFtuZ1N3aXRjaF09XCJsLmVzdGltYXRlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJsLmR1cmF0aW9uTWF4ICYmIGwuZHVyYXRpb25NYXggPT09IGwuZHVyYXRpb25NaW5cIiBbYml6ZG9jVG9vbHRpcF09XCJsLmR1cmF0aW9uTWF4fGFtRHVyYXRpb25Gb3JtYXRcIj57eydFc3RpbWF0ZVRpbWUnfCB0cmFuc2xhdGUgOiAobC5kdXJhdGlvbk1heCB8IGFtRHVyYXRpb246J3MnKX19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJsLmR1cmF0aW9uTWF4ICYmIGwuZHVyYXRpb25NYXggIT09IGwuZHVyYXRpb25NaW5cIlxyXG4gICAgICAgICAgICAgICAgW2JpemRvY1Rvb2x0aXBdPVwibC5kdXJhdGlvbk1heHxhbUR1cmF0aW9uRm9ybWF0XCI+e3snRXN0aW1hdGVUaW1lUmFuZ2UnfCB0cmFuc2xhdGUgOiAobC5kdXJhdGlvbk1pbiB8IGFtRHVyYXRpb246J3MnKSA6IChsLmR1cmF0aW9uTWF4IHwgYW1EdXJhdGlvbjoncycpfX08L3NwYW4+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgPHNwYW4+e3tsLnRpbWUgfCBhbUNhbGVuZGFyIDogbnVsbCA6IENBTEVOREFSX1NQRUMgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImwuZHVyYXRpb25cIiBbYml6ZG9jVG9vbHRpcF09XCJsLmR1cmF0aW9ufGFtRHVyYXRpb25Gb3JtYXRcIiBjbGFzcz1cImR1cmF0aW9uXCI+Jm5ic3A7KHt7bC5kdXJhdGlvbiB8IGFtRHVyYXRpb246J3MnfX0pPC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3RkPlxyXG4gICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibC5ub3RlXCI+e3tsLm5vdGV9fTwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cImwubW9kZWxcIiAoY2xpY2spPVwiY29tcGFyZShsKVwiIFtiaXpkb2NUb29sdGlwXT1cIidDb21wYXJlJ3x0cmFuc2xhdGVcIiBiaXpkb2NUb29sdGlwUG9zaXRpb249XCJzdGFydFwiPjxtYXQtaWNvbj5tb3JlX2hvcml6PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgPC90ZD5cclxuICAgIDwvdHI+XHJcbiAgPC90Ym9keT5cclxuPC90YWJsZT5cclxuIl19
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9jb21wb3NlL3RyYWNlL3RyYWNlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvY29tcG9zZS90cmFjZS90cmFjZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFNMUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFckUsb0NBQW9DO0FBT3BDLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxTQUFTO0lBVy9DLFlBQW9CLFFBQXdCLEVBQ2xDLFVBQTRCLEVBQzVCLFNBQXlCLEVBQ3pCLEtBQWUsRUFDdkIsR0FBZTtRQUNmLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUxPLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLGNBQVMsR0FBVCxTQUFTLENBQWdCO1FBQ3pCLFVBQUssR0FBTCxLQUFLLENBQVU7UUFaTixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDOUQsU0FBSSxHQUFZLEVBQUUsQ0FBQztRQUVWLGtCQUFhLEdBQWlCO1lBQ3JDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTO1lBQ3RELFFBQVEsRUFBRSxZQUFZO1lBQ3RCLE9BQU8sRUFBRSxJQUFJ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IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5pbXBvcnQgeyBDYWxlbmRhclNwZWMgfSBmcm9tIFwiLi4vLi4vY29yZS9waXBlcy9jYWxlbmRhci5waXBlXCI7XHJcbmltcG9ydCB7IFVzZXJJbmZvLCBMb2dUeXBlLCBEb2N1bWVudE1vZGVsLCBBY3Rpb24sIExvZywgR2VuZGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvbW9kZWxzXCI7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvc2Vzc2lvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS90cmFuc2xhdGUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gXCIuLi8uLi9jb3JlL2FjY291bnQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBUcmFjZUJhc2UsIFlvdSB9IGZyb20gXCIuL3RyYWNlLmJhc2VcIjtcclxuaW1wb3J0IHsgSHViU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb3JlL2h1Yi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENoYXRJbmZvIH0gZnJvbSBcIi4uLy4uL2NoYXQvY2hhdC1pbmZvXCI7XHJcbmltcG9ydCB7IGl0ZW1BbmltYXRpb24sIGxpc3RBbmltYXRpb24gfSBmcm9tIFwiLi4vLi4vY29yZS9hbmltYXRpb25zXCI7XHJcblxyXG4vKiogY29tcG9uZW50IHNob3dpbmcgdHJhY2UgdGFibGUgKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdiaXpkb2MtdHJhY2UnLFxyXG4gIHRlbXBsYXRlVXJsOiAndHJhY2UuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWyd0cmFjZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtsaXN0QW5pbWF0aW9uLCBpdGVtQW5pbWF0aW9uXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHJhY2VWaWV3Q29tcG9uZW50IGV4dGVuZHMgVHJhY2VCYXNlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBtb2RlbDogRG9jdW1lbnRNb2RlbDxhbnk+O1xyXG4gIEBPdXRwdXQoKSByZWFkb25seSB2ZXJzaW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XHJcbiAgZGF0YTogVHJhY2VbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2RhdGE6IFRyYWNlW107XHJcbiAgcmVhZG9ubHkgQ0FMRU5EQVJfU1BFQzogQ2FsZW5kYXJTcGVjID0ge1xyXG4gICAgbGFzdERheTogYFske3RoaXMuX3RyYW5zbGF0ZS5nZXQoJ1llc3RlcmRheScpfV0gSEg6bW1gLFxyXG4gICAgbGFzdFdlZWs6ICdkZGRkIEhIOm1tJyxcclxuICAgIHNhbWVEYXk6IGBbJHt0aGlzLl90cmFuc2xhdGUuZ2V0KCdUb2RheScpfV0gSEg6bW1gLFxyXG4gICAgc2FtZUVsc2U6ICdNTU0gRG8gSEg6bW0nXHJcbiAgfTtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zZXNzaW9uOiBTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgX2FjY291bnRzOiBBY2NvdW50U2VydmljZSxcclxuICAgIHByaXZhdGUgX2NoYXQ6IENoYXRJbmZvLFxyXG4gICAgaHViOiBIdWJTZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihodWIpO1xyXG4gICAgdGhpcy5fc2hvd0FsbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0cmFjZUFsbCcpICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBuZ09uQ2hhbmdlcyhfY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5faW5pdGlhbGlzZSgpO1xyXG4gIH1cclxuICBwcml2YXRlIGFzeW5jIF9pbml0aWFsaXNlKCkge1xyXG4gICAgY29uc3QgeyBpc3N1ZWQsIGxvZywgcmVjaXBpZW50cywgYXR0YWNobWVudHMgfSA9IHRoaXMubW9kZWw7XHJcblxyXG4gICAgY29uc3QgbWUgPSB0aGlzO1xyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBwcm9maWxlT2YoaWQpIHtcclxuICAgICAgcmV0dXJuIG1lLl9hY2NvdW50cy5nZXQoaWQpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiB1c2VyIG5hbWUsIGNoYXQgYW5jaG9yIHRhZyBvciBZb3VcclxuICAgICAqIEBwYXJhbSB1c2VyXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIG5hbWVPZih1c2VyOiBVc2VySW5mbyk6IHN0cmluZyB7XHJcbiAgICAgIHJldHVybiBtZS5fY2hhdC5mb3JtYXQodXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZnVuY3Rpb24gYWN0aW9uQnkoYWN0aW9uOiBBY3Rpb24sIGdlbmRlcjogR2VuZGVyIHwgJ3lvdScsIHRvSWQ/OiBzdHJpbmcpIHtcclxuICAgICAgbGV0IG5hbWU6IHN0cmluZztcclxuICAgICAgaWYgKGdlbmRlciA9PT0gWW91KSB7XHJcbiAgICAgICAgY29uc3QgeyBnZW5kZXIgfSA9IG1lLl9zZXNzaW9uO1xyXG4gICAgICAgIG5hbWUgPSAoZ2VuZGVyID09PSAnTWFsZScgPyAoYWN0aW9uLnlvdU1hbGUgfHwgYWN0aW9uLnlvdSkgOlxyXG4gICAgICAgICAgZ2VuZGVyID09PSAnRmVtYWxlJyA/IChhY3Rpb24ueW91RmVtYWxlIHx8IGFjdGlvbi55b3UpIDpcclxuICAgICAgICAgICAgYWN0aW9uLnlvdSkgfHxcclxuICAgICAgICAgIGFjdGlvbi5wYXN0IHx8XHJcbiAgICAgICAgICBhY3Rpb24udGl0bGU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIG5hbWUgPSAoZ2VuZGVyID09PSAnTWFsZScgPyAoYWN0aW9uLnBhc3RNYWxlIHx8IGFjdGlvbi5wYXN0KSA6XHJcbiAgICAgICAgICBnZW5kZXIgPT09ICdGZW1hbGUnID8gKGFjdGlvbi5wYXN0RmVtYWxlIHx8IGFjdGlvbi5wYXN0KSA6XHJcbiAgICAgICAgICAgIGFjdGlvbi5wYXN0KVxyXG4gICAgICAgICAgfHwgYWN0aW9uLnRpdGxlO1xyXG5cclxuICAgICAgaWYgKHRvSWQpIHtcclxuICAgICAgICBsZXQgdG8gPSBhd2FpdCBtZS5fYWNjb3VudHMuZ2V0KHRvSWQpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiBtZS5fdHJhbnNsYXRlLmdldCgnQWN0aW9uVG8nLCBuYW1lLCBuYW1lT2YodG8pKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0cmFjZTogVHJhY2VbXSA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGwgb2YgbG9nKSB7XHJcbiAgICAgIGxldCBhY3Rpb246IEFjdGlvbjtcclxuXHJcbiAgICAgIHN3aXRjaCAobC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnQWN0aW9uVGFrZW4nOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBhY3Rpb24gPSB0aGlzLl9zZXNzaW9uLnByb2ZpbGUuYWN0aW9ucy5maW5kKGEgPT4gYS5uYW1lID09PSBsLmFjdGlvbik7XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb24ubG9nZ2FibGUgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICBjYXNlICdDaGVja0luJzpcclxuICAgICAgICBjYXNlICdDaGVja091dCc6XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Nob3dBbGwpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnTW9kZWxDaGFuZ2UnOlxyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zaG93QWxsKSBjb250aW51ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ1N1Ym1pdCc6XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Nob3dBbGwpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgc3RlcCA9IHsgZXN0aW1hdGU6IGwuZXN0aW1hdGUsIHRpbWU6IGwudGltZSwgdHlwZTogbC50eXBlLCBkdXJhdGlvbjogbC5kdXJhdGlvbiwgbm90ZTogbC5ub3RlLCBzdGF0ZTogbC5zdGF0ZSB9IGFzIFRyYWNlO1xyXG5cclxuICAgICAgdHJhY2UucHVzaChzdGVwKTtcclxuXHJcbiAgICAgIHN3aXRjaCAobC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnQ2hlY2tJbic6XHJcbiAgICAgICAgY2FzZSAnQ2hlY2tPdXQnOlxyXG4gICAgICAgICAgbGV0IGF0dGFjaG1lbnQgPSBhdHRhY2htZW50cy5maW5kKGYgPT4gZi5pZCA9PT0gbC5maWxlSWQpO1xyXG4gICAgICAgICAgc3RlcC5maWxlTmFtZSA9IGF0dGFjaG1lbnQuZmlsZU5hbWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGwucmVjaXBpZW50SWQpIHtcclxuICAgICAgICBsZXQgcmVjaXBpZW50ID0gcmVjaXBpZW50cy5maW5kKHIgPT4gci5pZCA9PT0gbC5yZWNpcGllbnRJZCk7XHJcbiAgICAgICAgaWYgKHJlY2lwaWVudC5yb2xlKVxyXG4gICAgICAgICAgc3RlcC5yb2xlID0gdGhpcy5fcm9sZU5hbWUocmVjaXBpZW50LnJvbGUpO1xyXG4gICAgICAgIHN0ZXAuZnlpID0gcmVjaXBpZW50LmZ5aTtcclxuXHJcbiAgICAgICAgaWYgKHJlY2lwaWVudC5zdWJzdGl0dXRpbmdJZCkge1xyXG4gICAgICAgICAgbGV0IHN1YnN0aXR1dGluZyA9IGF3YWl0IHByb2ZpbGVPZihyZWNpcGllbnQuc3Vic3RpdHV0aW5nSWQpO1xyXG4gICAgICAgICAgaWYgKHJlY2lwaWVudC5ieUlkKSB7XHJcbiAgICAgICAgICAgIGlmIChyZWNpcGllbnQuYnlJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpIHtcclxuICAgICAgICAgICAgICBsZXQgd2hvID0gYXdhaXQgcHJvZmlsZU9mKHJlY2lwaWVudC51c2VySWQpO1xyXG4gICAgICAgICAgICAgIGlmIChyZWNpcGllbnQuc3Vic3RpdHV0aW5nSWQgPT09IHRoaXMuX3Nlc3Npb24udXNlcklkKVxyXG4gICAgICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLmdldCgnQnlZb3UnLCBuYW1lT2Yod2hvKSk7XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLnBlcnNvbmFsaXplKCdTdWJzdGl0dXRpbmdCeVlvdScsIHdoby5nZW5kZXIsIG5hbWVPZih3aG8pLCBuYW1lT2Yoc3Vic3RpdHV0aW5nKSk7XHJcbiAgICAgICAgICAgICAgaWYgKGFjdGlvbilcclxuICAgICAgICAgICAgICAgIHN0ZXAuYWN0aW9uID0gYXdhaXQgYWN0aW9uQnkoYWN0aW9uLCBZb3UsIHJlY2lwaWVudC50b0lkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBsZXQgYnkgPSBhd2FpdCBwcm9maWxlT2YocmVjaXBpZW50LmJ5SWQpO1xyXG4gICAgICAgICAgICAgIGxldCB3aG8gPSBhd2FpdCBwcm9maWxlT2YocmVjaXBpZW50LnVzZXJJZCk7XHJcbiAgICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLmdldCgnU3Vic3RpdHV0aW5nQnknLCBuYW1lT2Yod2hvKSwgbmFtZU9mKHN1YnN0aXR1dGluZyksIG5hbWVPZihieSkpO1xyXG4gICAgICAgICAgICAgIGlmIChieS5yb2xlKVxyXG4gICAgICAgICAgICAgICAgc3RlcC5yb2xlID0gYnkucm9sZTtcclxuICAgICAgICAgICAgICBpZiAoYWN0aW9uKVxyXG4gICAgICAgICAgICAgICAgc3RlcC5hY3Rpb24gPSBhd2FpdCBhY3Rpb25CeShhY3Rpb24sIGJ5LmdlbmRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgd2hvID0gYXdhaXQgcHJvZmlsZU9mKHJlY2lwaWVudC51c2VySWQpO1xyXG4gICAgICAgICAgICBpZiAocmVjaXBpZW50LnN1YnN0aXR1dGluZ0lkID09PSB0aGlzLl9zZXNzaW9uLnVzZXJJZCkge1xyXG4gICAgICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5wZXJzb25hbGl6ZSgnU3Vic3RpdHV0aW5nRm9yWW91Jywgd2hvLmdlbmRlciwgbmFtZU9mKHdobykpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlY2lwaWVudC51c2VySWQgPT09IHRoaXMuX3Nlc3Npb24udXNlcklkKSB7XHJcbiAgICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLnBlcnNvbmFsaXplKCdZb3VTdWJzdGl0dXRlJywgdGhpcy5fc2Vzc2lvbi5wcm9maWxlLmJ5R2VuZGVyLCBuYW1lT2Yod2hvKSk7XHJcbiAgICAgICAgICAgICAgaWYgKGFjdGlvbilcclxuICAgICAgICAgICAgICAgIHN0ZXAuYWN0aW9uID0gYXdhaXQgYWN0aW9uQnkoYWN0aW9uLCB3aG8uZ2VuZGVyLCByZWNpcGllbnQudG9JZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLnBlcnNvbmFsaXplKCdTdWJzdGl0dXRpbmcnLCB3aG8uZ2VuZGVyLCBuYW1lT2Yod2hvKSwgbmFtZU9mKHN1YnN0aXR1dGluZykpO1xyXG4gICAgICAgICAgICAgIGlmICh3aG8ucm9sZSlcclxuICAgICAgICAgICAgICAgIHN0ZXAucm9sZSA9IHdoby5yb2xlO1xyXG4gICAgICAgICAgICAgIGlmIChhY3Rpb24pXHJcbiAgICAgICAgICAgICAgICBzdGVwLmFjdGlvbiA9IGF3YWl0IGFjdGlvbkJ5KGFjdGlvbiwgd2hvLmdlbmRlciwgcmVjaXBpZW50LnRvSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJlY2lwaWVudC5ieUlkKSB7XHJcbiAgICAgICAgICBsZXQgd2hvID0gYXdhaXQgcHJvZmlsZU9mKHJlY2lwaWVudC51c2VySWQpLFxyXG4gICAgICAgICAgICBieSA9IGF3YWl0IHByb2ZpbGVPZihyZWNpcGllbnQuYnlJZCk7XHJcbiAgICAgICAgICBpZiAocmVjaXBpZW50LmJ5SWQgPT09IHRoaXMuX3Nlc3Npb24udXNlcklkKVxyXG4gICAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUuZ2V0KCdCeVlvdScsIG5hbWVPZih3aG8pKTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUuZ2V0KCdCeScsIG5hbWVPZih3aG8pLCBuYW1lT2YoYnkpKTtcclxuICAgICAgICAgICAgaWYgKGJ5LnJvbGUpXHJcbiAgICAgICAgICAgICAgc3RlcC5yb2xlID0gYnkucm9sZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChhY3Rpb24pXHJcbiAgICAgICAgICAgIHN0ZXAuYWN0aW9uID0gYXdhaXQgYWN0aW9uQnkoYWN0aW9uLCBieS5nZW5kZXIsIHJlY2lwaWVudC50b0lkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAocmVjaXBpZW50LnVzZXJJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpXHJcbiAgICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ1lvdScpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB3aG8gPSBhd2FpdCBwcm9maWxlT2YocmVjaXBpZW50LnVzZXJJZCk7XHJcbiAgICAgICAgICAgIHN0ZXAubmFtZSA9IG5hbWVPZih3aG8pO1xyXG4gICAgICAgICAgICBpZiAod2hvLnJvbGUpXHJcbiAgICAgICAgICAgICAgc3RlcC5yb2xlID0gd2hvLnJvbGU7XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb24pXHJcbiAgICAgICAgICAgICAgc3RlcC5hY3Rpb24gPSBhd2FpdCBhY3Rpb25CeShhY3Rpb24sIHdoby5nZW5kZXIsIHJlY2lwaWVudC50b0lkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGwudXNlcklkID09PSB0aGlzLl9zZXNzaW9uLnVzZXJJZCkge1xyXG4gICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fc2Vzc2lvbi5pc0ltcGVyc29uYXRpbmcgPyB0aGlzLl9zZXNzaW9uLnByb2ZpbGUubmFtZSA6IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ1lvdScpO1xyXG4gICAgICAgICAgaWYgKGFjdGlvbilcclxuICAgICAgICAgICAgc3RlcC5hY3Rpb24gPSBhd2FpdCBhY3Rpb25CeShhY3Rpb24sIFlvdSwgbC50b0lkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgd2hvID0gYXdhaXQgcHJvZmlsZU9mKGwudXNlcklkKTtcclxuICAgICAgICAgIHN0ZXAubmFtZSA9IG5hbWVPZih3aG8pO1xyXG4gICAgICAgICAgaWYgKHdoby5yb2xlKVxyXG4gICAgICAgICAgICBzdGVwLnJvbGUgPSB3aG8ucm9sZTtcclxuICAgICAgICAgIGlmIChhY3Rpb24pXHJcbiAgICAgICAgICAgIHN0ZXAuYWN0aW9uID0gYXdhaXQgYWN0aW9uQnkoYWN0aW9uLCB3aG8uZ2VuZGVyLCBsLnRvSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgcmVjaXBpZW50IG9mIHJlY2lwaWVudHMpIHtcclxuICAgICAgaWYgKCFyZWNpcGllbnQucGVuZGluZyAmJiAhcmVjaXBpZW50LmVzdGltYXRlKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGxldCBzdGVwID0ge1xyXG4gICAgICAgIHRpbWU6IHJlY2lwaWVudC5yZWNlaXZlZCxcclxuICAgICAgICBmeWk6IHJlY2lwaWVudC5meWksXHJcbiAgICAgICAgZXN0aW1hdGU6IHJlY2lwaWVudC5lc3RpbWF0ZSxcclxuICAgICAgICBwZW5kaW5nOiByZWNpcGllbnQucGVuZGluZyxcclxuICAgICAgICBhY3Rpb246IHJlY2lwaWVudC5hY3Rpb24sXHJcbiAgICAgICAgbm90ZTogcmVjaXBpZW50Lm5vdGUsXHJcbiAgICAgICAgdHlwZTogcmVjaXBpZW50LmVzdGltYXRlID8gJ0VzdGltYXRlJyA6ICdQZW5kaW5nJyxcclxuICAgICAgICBkdXJhdGlvbjogcmVjaXBpZW50LnBlbmRpbmcgPyBkYXlqcygpLmRpZmYocmVjaXBpZW50LnJlY2VpdmVkLCAncycpIDogbnVsbCxcclxuICAgICAgICByb2xlOiByZWNpcGllbnQucm9sZSA/IHRoaXMuX3JvbGVOYW1lKHJlY2lwaWVudC5yb2xlKSA6IG51bGxcclxuICAgICAgfSBhcyBUcmFjZTtcclxuXHJcbiAgICAgIGlmIChyZWNpcGllbnQubm9kZUlkKSB7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMubW9kZWwud29ya2Zsb3cubm9kZXMuZmluZChuID0+IG4uaWQgPT09IHJlY2lwaWVudC5ub2RlSWQpO1xyXG4gICAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgICBpZiAocmVjaXBpZW50LmVzdGltYXRlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgbWluLCBtYXggfSA9IHN1cGVyLl9lc3RpbWF0ZVRpbWUobm9kZSk7XHJcbiAgICAgICAgICAgIGlmIChtYXgpXHJcbiAgICAgICAgICAgICAgc3RlcC5kdXJhdGlvbk1pbiA9IG1pbixcclxuICAgICAgICAgICAgICAgIHN0ZXAuZHVyYXRpb25NYXggPSBtYXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzdGVwLmZ5aSA9IHJlY2lwaWVudC5meWk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVjaXBpZW50LnN1YnN0aXR1dGluZ0lkKSB7XHJcbiAgICAgICAgbGV0IHdobyA9IGF3YWl0IHByb2ZpbGVPZihyZWNpcGllbnQudXNlcklkKTtcclxuICAgICAgICBpZiAocmVjaXBpZW50LmJ5SWQpIHtcclxuICAgICAgICAgIGlmIChyZWNpcGllbnQuYnlJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpIHtcclxuICAgICAgICAgICAgaWYgKHJlY2lwaWVudC5zdWJzdGl0dXRpbmdJZCA9PT0gdGhpcy5fc2Vzc2lvbi51c2VySWQpXHJcbiAgICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLmdldCgnQnlZb3UnLCBuYW1lT2Yod2hvKSk7XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJzdGl0dXRpbmcgPSBhd2FpdCBwcm9maWxlT2YocmVjaXBpZW50LnN1YnN0aXR1dGluZ0lkKTtcclxuICAgICAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUucGVyc29uYWxpemUoJ1N1YnN0aXR1dGluZ0J5WW91Jywgd2hvLmdlbmRlciwgbmFtZU9mKHdobyksIG5hbWVPZihzdWJzdGl0dXRpbmcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBzdWJzdGl0dXRpbmcgPSBhd2FpdCBwcm9maWxlT2YocmVjaXBpZW50LnN1YnN0aXR1dGluZ0lkKTtcclxuICAgICAgICAgICAgbGV0IGJ5ID0gYXdhaXQgcHJvZmlsZU9mKHJlY2lwaWVudC5ieUlkKTtcclxuICAgICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLmdldCgnU3Vic3RpdHV0aW5nQnknLCBuYW1lT2Yod2hvKSwgbmFtZU9mKHN1YnN0aXR1dGluZyksIG5hbWVPZihieSkpO1xyXG4gICAgICAgICAgICBpZiAoYnkucm9sZSlcclxuICAgICAgICAgICAgICBzdGVwLnJvbGUgPSBieS5yb2xlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmIChyZWNpcGllbnQuc3Vic3RpdHV0aW5nSWQgPT09IHRoaXMuX3Nlc3Npb24udXNlcklkKVxyXG4gICAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUucGVyc29uYWxpemUoJ1N1YnN0aXR1dGluZ0ZvcllvdScsIHdoby5nZW5kZXIsIG5hbWVPZih3aG8pKTtcclxuICAgICAgICAgIGVsc2UgaWYgKHJlY2lwaWVudC51c2VySWQgPT09IHRoaXMuX3Nlc3Npb24udXNlcklkKVxyXG4gICAgICAgICAgICBzdGVwLm5hbWUgPSB0aGlzLl90cmFuc2xhdGUucGVyc29uYWxpemUoJ1lvdVN1YnN0aXR1dGUnLCB0aGlzLl9zZXNzaW9uLnByb2ZpbGUuYnlHZW5kZXIsIG5hbWVPZih3aG8pKTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgc3Vic3RpdHV0aW5nID0gYXdhaXQgcHJvZmlsZU9mKHJlY2lwaWVudC5zdWJzdGl0dXRpbmdJZCk7XHJcbiAgICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5wZXJzb25hbGl6ZSgnU3Vic3RpdHV0aW5nJywgd2hvLmdlbmRlciwgbmFtZU9mKHdobyksIG5hbWVPZihzdWJzdGl0dXRpbmcpKTtcclxuICAgICAgICAgICAgaWYgKHdoby5yb2xlKVxyXG4gICAgICAgICAgICAgIHN0ZXAucm9sZSA9IHdoby5yb2xlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChyZWNpcGllbnQuYnlJZCkge1xyXG4gICAgICAgIGxldCB3aG8gPSBhd2FpdCBwcm9maWxlT2YocmVjaXBpZW50LnVzZXJJZCk7XHJcbiAgICAgICAgaWYgKHJlY2lwaWVudC5ieUlkID09PSB0aGlzLl9zZXNzaW9uLnVzZXJJZClcclxuICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ0J5WW91JywgbmFtZU9mKHdobykpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGJ5ID0gYXdhaXQgcHJvZmlsZU9mKHJlY2lwaWVudC5ieUlkKTtcclxuICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ0J5JywgbmFtZU9mKHdobyksIG5hbWVPZihieSkpO1xyXG4gICAgICAgICAgaWYgKGJ5LnJvbGUpXHJcbiAgICAgICAgICAgIHN0ZXAucm9sZSA9IGJ5LnJvbGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHJlY2lwaWVudC5lc2NhbGF0ZWQpIHtcclxuICAgICAgICBsZXQgZXNjYWxhdGlvbnMgPSB0aGlzLm1vZGVsLmxvZy5maWx0ZXIobCA9PiBsLnRpbWUgPiBpc3N1ZWQgJiZcclxuICAgICAgICAgIGwudHlwZSA9PT0gJ0VzY2FsYXRpb24nICYmIGwucmVjaXBpZW50SWQgPT09IHJlY2lwaWVudC5pZCk7XHJcblxyXG4gICAgICAgIGxldCBlc2NhbGF0ZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGVzY2FsYXRpb24gb2YgZXNjYWxhdGlvbnMpIHtcclxuICAgICAgICAgIGxldCB3aG8gPSBhd2FpdCBwcm9maWxlT2YoZXNjYWxhdGlvbi51c2VySWQpO1xyXG4gICAgICAgICAgZXNjYWxhdGUucHVzaCh3aG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgd2hvID0gYXdhaXQgcHJvZmlsZU9mKHJlY2lwaWVudC51c2VySWQpO1xyXG4gICAgICAgIGlmIChlc2NhbGF0aW9ucy5sZW5ndGggPT09IDEgJiYgZXNjYWxhdGVbMF0gPT09IHRoaXMuX3Nlc3Npb24udXNlcklkKVxyXG4gICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLmdldCgnRXNjYWxhdGVkQnlZb3UnLCBuYW1lT2Yod2hvKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgc3RlcC5uYW1lID0gdGhpcy5fdHJhbnNsYXRlLmdldCgnRXNjYWxhdGVkQnknLCBuYW1lT2Yod2hvKSwgdGhpcy5fdHJhbnNsYXRlLmpvaW4oZXNjYWxhdGUubWFwKGUgPT4gbmFtZU9mKGUpKSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChyZWNpcGllbnQudXNlcklkID09PSB0aGlzLl9zZXNzaW9uLnVzZXJJZClcclxuICAgICAgICAgIHN0ZXAubmFtZSA9IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ1lvdScpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHdobyA9IGF3YWl0IHByb2ZpbGVPZihyZWNpcGllbnQudXNlcklkKTtcclxuICAgICAgICAgIHN0ZXAubmFtZSA9IG5hbWVPZih3aG8pO1xyXG4gICAgICAgICAgaWYgKHdoby5yb2xlKVxyXG4gICAgICAgICAgICBzdGVwLnJvbGUgPSB3aG8ucm9sZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdHJhY2UucHVzaChzdGVwKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9kYXRhID0gdHJhY2Uuc29ydCgoYSwgYikgPT4gYS50aW1lID4gYi50aW1lID8gMSA6IGEudGltZSA9PT0gYi50aW1lID8gMCA6IC0xKTtcclxuXHJcbiAgICB0aGlzLl9maWx0ZXIoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfZmlsdGVyKCkge1xyXG4gICAgdGhpcy5kYXRhID0gdGhpcy5fc2hvd0FsbCA/IHRoaXMuX2RhdGEgOiB0aGlzLl9kYXRhLmZpbHRlcihsID0+IGwudHlwZSA9PT0gJ0FjdGlvblRha2VuJ1xyXG4gICAgICB8fCBsLnR5cGUgPT09ICdFc3RpbWF0ZScgfHwgbC50eXBlID09PSAnUGVuZGluZycpO1xyXG4gIH1cclxuICBwcml2YXRlIF9zaG93QWxsOiBib29sZWFuO1xyXG5cclxuICBwdWJsaWMgZ2V0IHNob3dBbGwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2hvd0FsbDtcclxuICB9XHJcbiAgcHVibGljIHNldCBzaG93QWxsKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93QWxsID0gdmFsdWU7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndHJhY2VBbGwnLCB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZScpO1xyXG4gICAgdGhpcy5fZGF0YSAmJiB0aGlzLl9maWx0ZXIoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcm9sZU5hbWUobmFtZSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByb2xlID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLnJvbGVzLmZpbmQociA9PiByLm5hbWUgPT09IG5hbWUpO1xyXG4gICAgcmV0dXJuIHJvbGUgPyByb2xlLnRpdGxlIDogbmFtZTtcclxuICB9XHJcbiAgY2hhdChlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBjb25zdCB1c2VySWQgPSAoZS5zcmNFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW5mbycpO1xyXG4gICAgdXNlcklkICYmXHJcbiAgICAgIHRoaXMuX2NoYXQub3Blbih1c2VySWQpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBtb2RlbCB2ZXJzaW9uIGNvbXBhcmUsIGZvcm0gY29tcG9uZW50IGluICdjb21wYXJlJyB2aWV3IG1vZGVcclxuICAgKiBAcGFyYW0gbG9nXHJcbiAgICovXHJcbiAgY29tcGFyZShsb2c6IFRyYWNlKSB7XHJcbiAgICB0aGlzLnZlcnNpb25TZWxlY3RlZC5lbWl0KGxvZy50aW1lKTtcclxuICB9XHJcbn1cclxuaW50ZXJmYWNlIFRyYWNlIHtcclxuICBmeWk/OiBib29sZWFuO1xyXG4gIHR5cGU6IExvZ1R5cGUgfCAnUGVuZGluZycgfCAnRXN0aW1hdGUnO1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgZXN0aW1hdGU/OiBib29sZWFuO1xyXG4gIHBlbmRpbmc/OiBib29sZWFuO1xyXG4gIGFjdGlvbj86IHN0cmluZztcclxuICByb2xlPzogc3RyaW5nO1xyXG4gIG5vdGU/OiBzdHJpbmc7XHJcbiAgZHVyYXRpb24/OiBudW1iZXI7XHJcbiAgZHVyYXRpb25NaW4/OiBudW1iZXI7XHJcbiAgZHVyYXRpb25NYXg/OiBudW1iZXI7XHJcbiAgZmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgdGltZT86IERhdGU7XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm5hdi10b29sYmFyIHJvd1wiPlxyXG4gIDxzcGFuIGNsYXNzPVwiZGl2aWRlclwiPjwvc3Bhbj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiIFtiaXpkb2NUb29sdGlwXT1cIidTaG93QWxsJ3x0cmFuc2xhdGVcIj48bWF0LWljb24+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gIDxtYXQtbWVudSAjbWVudT4gXHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNob3dBbGw9ZmFsc2VcIj5cclxuICAgICAgPG1hdC1pY29uPnt7ICFzaG93QWxsPydjaGVjayc6JycgfX08L21hdC1pY29uPlxyXG4gICAgICA8c3Bhbj57eydSb3V0ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic2hvd0FsbD10cnVlXCI+XHJcbiAgICAgIDxtYXQtaWNvbj57e3Nob3dBbGw/J2NoZWNrJzonJ319PC9tYXQtaWNvbj5cclxuICAgICAgPHNwYW4+e3snRXZlcnl0aGluZycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L21hdC1tZW51PlxyXG48L2Rpdj5cclxuPHRhYmxlIGNsYXNzPVwibWF0LXRhYmxlXCIgQGxpc3Q+XHJcbiAgPHRib2R5IHJvbGU9XCJyb3dncm91cFwiPlxyXG4gICAgPHRyIGNsYXNzPVwibWF0LXJvd1wiICpuZ0Zvcj1cImxldCBsIG9mIGRhdGFcIiBAaXRlbT5cclxuICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGxcIj5cclxuICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImwubmFtZSB8IHNhbml0aXplSHRtbFwiIChjbGljayk9XCJjaGF0KCRldmVudClcIj48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9bC5yb2xlPnt7J0pvaW5Db21tYSd8dHJhbnNsYXRlfX17e2wucm9sZX19PC9zcGFuPlxyXG4gICAgICA8L3RkPlxyXG4gICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImwudHlwZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0FjdGlvblRha2VuJ1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImwuYWN0aW9uIHwgc2FuaXRpemVIdG1sXCIgKGNsaWNrKT1cImNoYXQoJGV2ZW50KVwiIGNsYXNzPVwidG9cIj48L3NwYW4+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInU3VibWl0J1wiPnt7J0lzc3VlZCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInUGVuZGluZydcIj57eydJc1BlbmRpbmcnIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ0NoZWNrT3V0J1wiPnt7J0NoZWNrZWRJbicgfCB0cmFuc2xhdGUgOiBsLmZpbGVOYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ0NoZWNrSW4nXCI+e3snQ2hlY2tlZE91dCcgfCB0cmFuc2xhdGUgOiBsLmZpbGVOYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ0VzdGltYXRlJ1wiPnt7J0VzdGltYXRlJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidNb2RlbENoYW5nZSdcIj57eydDaGFuZ2VkJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibC5meWlcIj4mbmJzcDt7eydGWUknfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L3RkPlxyXG4gICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiIFtuZ1N3aXRjaF09XCJsLmVzdGltYXRlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJsLmR1cmF0aW9uTWF4ICYmIGwuZHVyYXRpb25NYXggPT09IGwuZHVyYXRpb25NaW5cIiBbYml6ZG9jVG9vbHRpcF09XCJsLmR1cmF0aW9uTWF4fGFtRHVyYXRpb25Gb3JtYXRcIj57eydFc3RpbWF0ZVRpbWUnfCB0cmFuc2xhdGUgOiAobC5kdXJhdGlvbk1heCB8IGFtRHVyYXRpb246J3MnKX19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJsLmR1cmF0aW9uTWF4ICYmIGwuZHVyYXRpb25NYXggIT09IGwuZHVyYXRpb25NaW5cIlxyXG4gICAgICAgICAgICAgICAgW2JpemRvY1Rvb2x0aXBdPVwibC5kdXJhdGlvbk1heHxhbUR1cmF0aW9uRm9ybWF0XCI+e3snRXN0aW1hdGVUaW1lUmFuZ2UnfCB0cmFuc2xhdGUgOiAobC5kdXJhdGlvbk1pbiB8IGFtRHVyYXRpb246J3MnKSA6IChsLmR1cmF0aW9uTWF4IHwgYW1EdXJhdGlvbjoncycpfX08L3NwYW4+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgPHNwYW4+e3tsLnRpbWUgfCBhbUNhbGVuZGFyIDogbnVsbCA6IENBTEVOREFSX1NQRUMgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImwuZHVyYXRpb25cIiBbYml6ZG9jVG9vbHRpcF09XCJsLmR1cmF0aW9ufGFtRHVyYXRpb25Gb3JtYXRcIiBjbGFzcz1cImR1cmF0aW9uXCI+Jm5ic3A7KHt7bC5kdXJhdGlvbiB8IGFtRHVyYXRpb246J3MnfX0pPC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3RkPlxyXG4gICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbFwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibC5ub3RlXCI+e3tsLm5vdGV9fTwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cImwudHlwZT09PSdNb2RlbENoYW5nZSdcIiAoY2xpY2spPVwiY29tcGFyZShsKVwiIFtiaXpkb2NUb29sdGlwXT1cIidDb21wYXJlJ3x0cmFuc2xhdGVcIiBiaXpkb2NUb29sdGlwUG9zaXRpb249XCJzdGFydFwiPjxtYXQtaWNvbj5tb3JlX2hvcml6PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgPC90ZD5cclxuICAgIDwvdHI+XHJcbiAgPC90Ym9keT5cclxuPC90YWJsZT5cclxuIl19