@vgip/meta-ui 1.1.7 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/{esm2015/lib/common/fieldNormalizer/boolean.js → esm2020/lib/common/fieldNormalizer/boolean.mjs} +0 -0
  2. package/{esm2015/lib/common/fieldNormalizer/datetime.js → esm2020/lib/common/fieldNormalizer/datetime.mjs} +0 -0
  3. package/{esm2015/lib/common/fieldNormalizer/index.js → esm2020/lib/common/fieldNormalizer/index.mjs} +0 -0
  4. package/{esm2015/lib/common/fieldNormalizer/number.js → esm2020/lib/common/fieldNormalizer/number.mjs} +0 -0
  5. package/{esm2015/lib/common/fieldNormalizer/options.js → esm2020/lib/common/fieldNormalizer/options.mjs} +0 -0
  6. package/{esm2015/lib/common/fieldNormalizer/radio.js → esm2020/lib/common/fieldNormalizer/radio.mjs} +0 -0
  7. package/{esm2015/lib/common/fieldNormalizer/reference.js → esm2020/lib/common/fieldNormalizer/reference.mjs} +0 -0
  8. package/{esm2015/lib/common/fieldNormalizer/richtext.js → esm2020/lib/common/fieldNormalizer/richtext.mjs} +0 -0
  9. package/{esm2015/lib/common/fieldNormalizer/string.js → esm2020/lib/common/fieldNormalizer/string.mjs} +0 -0
  10. package/{esm2015/lib/common/fieldNormalizer/text.js → esm2020/lib/common/fieldNormalizer/text.mjs} +0 -0
  11. package/{esm2015/lib/common/fieldNormalizer/uniqueNameFilter.js → esm2020/lib/common/fieldNormalizer/uniqueNameFilter.mjs} +0 -0
  12. package/esm2020/lib/common/metaAutofocus.directive.mjs +35 -0
  13. package/esm2020/lib/common/metaIcons.pipe.mjs +29 -0
  14. package/esm2020/lib/common/metaModel.pipe.mjs +25 -0
  15. package/esm2020/lib/common/metaNormalizer.mjs +309 -0
  16. package/esm2020/lib/common/metaStripHtml.pipe.mjs +22 -0
  17. package/{esm2015/lib/common/utils/colorThemes.js → esm2020/lib/common/utils/colorThemes.mjs} +0 -0
  18. package/{esm2015/lib/common/utils/indexedDbStore/index.js → esm2020/lib/common/utils/indexedDbStore/index.mjs} +0 -0
  19. package/esm2020/lib/common/utils/relativeTimeBuilder.mjs +49 -0
  20. package/{esm2015/lib/common/utils/templateBuilder.js → esm2020/lib/common/utils/templateBuilder.mjs} +0 -0
  21. package/esm2020/lib/field.mjs +2175 -0
  22. package/esm2020/lib/fieldAbstract.mjs +198 -0
  23. package/esm2020/lib/fieldBoolean/index.mjs +51 -0
  24. package/esm2020/lib/fieldDatetime/index.mjs +337 -0
  25. package/esm2020/lib/fieldInput/index.mjs +444 -0
  26. package/esm2020/lib/fieldRadio/index.mjs +87 -0
  27. package/esm2020/lib/fieldRichtext/index.mjs +85 -0
  28. package/esm2020/lib/fieldText/index.mjs +65 -0
  29. package/esm2020/lib/fieldUnknown/index.mjs +19 -0
  30. package/esm2020/lib/index.mjs +165 -0
  31. package/esm2020/lib/services/metaContext/index.mjs +35 -0
  32. package/esm2020/lib/services/metaMsg/index.mjs +84 -0
  33. package/esm2020/lib/services/metaReference/index.mjs +94 -0
  34. package/esm2020/lib/services/metaResource/index.mjs +139 -0
  35. package/esm2020/lib/services/metaResource/metaHttpClient.mjs +64 -0
  36. package/esm2020/lib/services/metaTracker/index.mjs +31 -0
  37. package/esm2020/lib/services/resourceDrafts/index.mjs +68 -0
  38. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  39. package/{esm2015/vgip-meta-ui.js → esm2020/vgip-meta-ui.mjs} +0 -0
  40. package/fesm2015/vgip-meta-ui.mjs +5207 -0
  41. package/fesm2015/vgip-meta-ui.mjs.map +1 -0
  42. package/fesm2020/vgip-meta-ui.mjs +5207 -0
  43. package/fesm2020/vgip-meta-ui.mjs.map +1 -0
  44. package/lib/common/metaAutofocus.directive.d.ts +3 -0
  45. package/lib/common/metaIcons.pipe.d.ts +3 -0
  46. package/lib/common/metaModel.pipe.d.ts +3 -0
  47. package/lib/common/metaStripHtml.pipe.d.ts +3 -0
  48. package/lib/field.d.ts +260 -1
  49. package/lib/fieldAbstract.d.ts +3 -0
  50. package/lib/fieldBoolean/index.d.ts +3 -0
  51. package/lib/fieldDatetime/index.d.ts +3 -0
  52. package/lib/fieldInput/index.d.ts +3 -0
  53. package/lib/fieldRadio/index.d.ts +3 -0
  54. package/lib/fieldRichtext/index.d.ts +3 -0
  55. package/lib/fieldText/index.d.ts +3 -0
  56. package/lib/fieldUnknown/index.d.ts +3 -0
  57. package/lib/index.d.ts +28 -8
  58. package/lib/services/metaContext/index.d.ts +3 -0
  59. package/lib/services/metaMsg/index.d.ts +3 -0
  60. package/lib/services/metaReference/index.d.ts +3 -0
  61. package/lib/services/metaResource/index.d.ts +3 -0
  62. package/lib/services/metaResource/metaHttpClient.d.ts +3 -0
  63. package/lib/services/metaTracker/index.d.ts +3 -0
  64. package/lib/services/resourceDrafts/index.d.ts +3 -0
  65. package/package.json +19 -7
  66. package/vgip-meta-ui.d.ts +1 -0
  67. package/bundles/vgip-meta-ui.umd.js +0 -6370
  68. package/bundles/vgip-meta-ui.umd.js.map +0 -1
  69. package/esm2015/lib/common/metaAutofocus.directive.js +0 -35
  70. package/esm2015/lib/common/metaIcons.pipe.js +0 -28
  71. package/esm2015/lib/common/metaModel.pipe.js +0 -22
  72. package/esm2015/lib/common/metaNormalizer.js +0 -311
  73. package/esm2015/lib/common/metaStripHtml.pipe.js +0 -18
  74. package/esm2015/lib/common/utils/relativeTimeBuilder.js +0 -51
  75. package/esm2015/lib/field.js +0 -157
  76. package/esm2015/lib/fieldAbstract.js +0 -195
  77. package/esm2015/lib/fieldBoolean/index.js +0 -50
  78. package/esm2015/lib/fieldComposite/index.js +0 -41
  79. package/esm2015/lib/fieldDatetime/index.js +0 -334
  80. package/esm2015/lib/fieldInput/index.js +0 -444
  81. package/esm2015/lib/fieldList/index.js +0 -68
  82. package/esm2015/lib/fieldRadio/index.js +0 -85
  83. package/esm2015/lib/fieldReference/index.js +0 -817
  84. package/esm2015/lib/fieldRichtext/index.js +0 -82
  85. package/esm2015/lib/fieldSelect/index.js +0 -448
  86. package/esm2015/lib/fieldText/index.js +0 -66
  87. package/esm2015/lib/fieldUnknown/index.js +0 -16
  88. package/esm2015/lib/index.js +0 -105
  89. package/esm2015/lib/layout/index.js +0 -155
  90. package/esm2015/lib/refDialog/index.js +0 -133
  91. package/esm2015/lib/resource/index.js +0 -428
  92. package/esm2015/lib/resourceCard/index.js +0 -56
  93. package/esm2015/lib/services/metaContext/index.js +0 -34
  94. package/esm2015/lib/services/metaMsg/index.js +0 -86
  95. package/esm2015/lib/services/metaReference/index.js +0 -98
  96. package/esm2015/lib/services/metaResource/index.js +0 -141
  97. package/esm2015/lib/services/metaResource/metaHttpClient.js +0 -65
  98. package/esm2015/lib/services/metaTracker/index.js +0 -30
  99. package/esm2015/lib/services/resourceDrafts/index.js +0 -70
  100. package/fesm2015/vgip-meta-ui.js +0 -5272
  101. package/fesm2015/vgip-meta-ui.js.map +0 -1
  102. package/lib/fieldComposite/index.d.ts +0 -8
  103. package/lib/fieldList/index.d.ts +0 -10
  104. package/lib/fieldReference/index.d.ts +0 -69
  105. package/lib/fieldSelect/index.d.ts +0 -38
  106. package/lib/layout/index.d.ts +0 -35
  107. package/lib/refDialog/index.d.ts +0 -30
  108. package/lib/resource/index.d.ts +0 -55
  109. package/lib/resourceCard/index.d.ts +0 -15
  110. package/vgip-meta-ui.metadata.json +0 -1
@@ -0,0 +1,444 @@
1
+ /*
2
+ * @Author: Alexander.Vangelov@vonage.com
3
+ * @Date: 2019-09-19 17:35:09
4
+ * @Last Modified by: Alexander.Vangelov@vonage.com
5
+ * @Last Modified time: 2020-05-12 17:45:46
6
+ */
7
+ import { Component } from '@angular/core';
8
+ import { ControlContainer, NgForm } from '@angular/forms';
9
+ import { FieldAbstract } from '../fieldAbstract';
10
+ // import { IMetaFieldInut } from '../definitions/fields/IMetaFieldInput';
11
+ import { templateBuilder } from '../common/utils/templateBuilder';
12
+ import { relativeTimeBuilder } from '../common/utils/relativeTimeBuilder';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../services/metaContext";
15
+ import * as i2 from "@angular/common";
16
+ import * as i3 from "@angular/forms";
17
+ import * as i4 from "../common/metaModel.pipe";
18
+ // import { MetaValidations } from '../common/decorators/metaValidations.decorator';
19
+ export class FieldInput extends FieldAbstract {
20
+ constructor(metaContext) {
21
+ super();
22
+ this.metaContext = metaContext;
23
+ this.clickout = (event) => {
24
+ if (event.target.className === 'Vlt-dropdown__link' && this.elementRef.nativeElement.contains(event.target)) {
25
+ this.focus();
26
+ // this.dismissDropdown();
27
+ // this.parent[this.meta.name] = event.target.textContent;
28
+ }
29
+ else if (event.target !== this.input && event.target.className !== 'Vlt-dropdown__title') {
30
+ this.dismissDropdown();
31
+ }
32
+ else {
33
+ this.focus();
34
+ }
35
+ };
36
+ this.keydown = (event) => {
37
+ switch (event.key) {
38
+ case 'ArrowDown': {
39
+ if (['datetime', 'time', 'date', 'datetime-local'].indexOf(this.meta.subtype || this.meta.type) !== -1) {
40
+ break;
41
+ }
42
+ this.showDropdown();
43
+ event.preventDefault();
44
+ if (typeof (this.activeSuggestionIndex) === 'undefined') {
45
+ this.activeSuggestionIndex = 0;
46
+ }
47
+ else {
48
+ this.activeSuggestionIndex++;
49
+ if (this.activeSuggestionIndex >= this.suggestions.length) {
50
+ this.activeSuggestionIndex = 0;
51
+ }
52
+ }
53
+ break;
54
+ }
55
+ case 'ArrowUp': {
56
+ if (['datetime', 'time', 'date', 'datetime-local'].indexOf(this.meta.subtype || this.meta.type) !== -1) {
57
+ break;
58
+ }
59
+ this.showDropdown();
60
+ event.preventDefault();
61
+ if (typeof (this.activeSuggestionIndex) === 'undefined') {
62
+ this.activeSuggestionIndex = this.suggestions.length - 1;
63
+ }
64
+ else {
65
+ this.activeSuggestionIndex--;
66
+ if (this.activeSuggestionIndex < 0) {
67
+ this.activeSuggestionIndex = this.suggestions.length - 1;
68
+ }
69
+ }
70
+ break;
71
+ }
72
+ case 'Space':
73
+ case 'Enter': {
74
+ if (typeof (this.activeSuggestionIndex) !== 'undefined') {
75
+ event.preventDefault();
76
+ event.stopPropagation();
77
+ this.onSuggestionSelect(event, this.suggestions[this.activeSuggestionIndex]);
78
+ delete this.activeSuggestionIndex;
79
+ }
80
+ break;
81
+ }
82
+ case 'Escape': {
83
+ event.preventDefault();
84
+ event.stopPropagation();
85
+ this.dismissDropdown();
86
+ break;
87
+ }
88
+ default: {
89
+ setTimeout(() => {
90
+ if (!this.model) {
91
+ delete this.activeSuggestionIndex;
92
+ delete this.asyncSuggestions;
93
+ }
94
+ else if (typeof (this.model) === 'string') {
95
+ this.asyncSuggestions = (this.meta.suggestions || []).filter((s) => {
96
+ const suggestionText = (s.id || s.value || s || '').toLowerCase();
97
+ return suggestionText.indexOf(this.model.toLowerCase()) !== -1;
98
+ });
99
+ }
100
+ });
101
+ }
102
+ }
103
+ };
104
+ }
105
+ ngOnInit() {
106
+ this.multiple = (this.meta.type === 'multistring') || this.meta.multiple;
107
+ // console.log('FieldInput init', this.meta.name);
108
+ this.validationAttributes = ['pattern', 'required', 'minlength', 'maxlength', 'min', 'max', 'step'];
109
+ if (this.meta.picklist) { // just for test! all metadata should be transformed to v3 protocol
110
+ this.meta.suggestions = (this.meta.picklist || []).map((s) => s.label);
111
+ }
112
+ if (this.meta.type === 'number') {
113
+ if (this.meta.subtype === 'float' && !this.meta.step) {
114
+ this.meta.step = '0.01';
115
+ }
116
+ this.meta.subtype = 'number';
117
+ }
118
+ if (['date', 'time', 'datetime'].indexOf(this.meta.type) !== -1) {
119
+ this.meta.subtype = this.meta.type;
120
+ if (this.meta.type === 'datetime') {
121
+ this.meta.subtype = 'datetime-local';
122
+ }
123
+ delete this.multiple; // no multiple support for timestamps
124
+ }
125
+ this.showClear = !this.multiple && [
126
+ '', 'string', 'url', 'email', 'password', 'tel', 'date', 'datetime-local', 'time'
127
+ ].indexOf(this.meta.subtype || '') !== -1;
128
+ const origValue = this.parent[this.meta.name];
129
+ Object.defineProperty(this.parent, this.meta.name, {
130
+ set: (value) => {
131
+ if (this.multiple) {
132
+ if (typeof (value) !== 'undefined') {
133
+ const values = (value instanceof Array) ? value : [value];
134
+ this.model = [];
135
+ for (let v of values) {
136
+ if (!this.model) {
137
+ this.model = [];
138
+ }
139
+ if (typeof (v) === 'object' && v !== null) {
140
+ v = v.id || v.value;
141
+ }
142
+ this.model.push(v);
143
+ }
144
+ this.value = this.model;
145
+ }
146
+ }
147
+ else {
148
+ if (typeof (value) !== 'undefined'
149
+ && !(value === null && ((typeof (this.meta.type) === 'undefined') || ['string', 'number'].indexOf(this.meta.type) !== -1))) {
150
+ if (this.meta.type === 'number' && typeof (value) === 'string') {
151
+ value = parseInt(value, 10);
152
+ }
153
+ else if (typeof (value) === 'object' && value !== null) {
154
+ value = value.id || value.value;
155
+ }
156
+ if (['datetime', 'date', 'datetime-local'].indexOf(this.meta.subtype || this.meta.type) !== -1 && value) {
157
+ try {
158
+ let date;
159
+ if ((typeof (value) === 'number')) {
160
+ date = new Date(parseInt(value, 10));
161
+ }
162
+ else {
163
+ if ('date' === (this.meta.subtype || this.meta.type)) {
164
+ date = new Date(Date.parse(value));
165
+ }
166
+ else {
167
+ date = new Date(Date.parse(`${value}Z`) + (new Date().getTimezoneOffset() * 60000));
168
+ }
169
+ }
170
+ if (typeof (value) === 'number') {
171
+ switch (this.meta.subtype || this.meta.type) {
172
+ case 'datetime-local':
173
+ case 'datetime': {
174
+ this.model = `${date.getFullYear()}-${('00' + (date.getMonth() + 1)).slice(-2)}-${('00' + date.getDate()).slice(-2)}`;
175
+ this.model += `T${('00' + date.getHours()).slice(-2)}:${('00' + date.getMinutes()).slice(-2)}`;
176
+ break;
177
+ }
178
+ case 'date': {
179
+ this.model = date.toISOString().split('T')[0];
180
+ break;
181
+ }
182
+ }
183
+ }
184
+ if (this.meta.valueType === 'string') {
185
+ if ((this.meta.subtype || this.meta.type) === 'date') {
186
+ this.value = date.toISOString().split('T')[0];
187
+ }
188
+ else {
189
+ this.value = date.toISOString();
190
+ }
191
+ }
192
+ else {
193
+ if ((this.meta.subtype || this.meta.type) === 'date') {
194
+ date.setFullYear(date.getUTCFullYear());
195
+ date.setMonth(date.getUTCMonth());
196
+ date.setDate(date.getUTCDate());
197
+ date.setMinutes(0);
198
+ date.setHours(0);
199
+ date.setSeconds(0);
200
+ date.setMilliseconds(0);
201
+ }
202
+ this.value = date.getTime();
203
+ }
204
+ }
205
+ catch (e) {
206
+ console.error('Date parse error', e.message, `"${value}"`, `(${typeof (value)})`);
207
+ }
208
+ }
209
+ else if ('time' === (this.meta.subtype || this.meta.type)) {
210
+ try {
211
+ let date;
212
+ if (typeof (value) === 'number') {
213
+ date = new Date(parseInt(value, 10));
214
+ }
215
+ else {
216
+ date = new Date(Date.parse(new Date().toISOString().replace(/T.*Z/, `T${value}Z`)) + (new Date().getTimezoneOffset() * 60000));
217
+ }
218
+ this.model = date.toTimeString().split(' ')[0];
219
+ this.value = date.getTime();
220
+ }
221
+ catch (e) {
222
+ console.error('Date parse error', e.message, `"${value}"`, `(${typeof (value)})`);
223
+ }
224
+ }
225
+ else {
226
+ if (!value && (typeof (this.prevModel) === 'string') && this.isPersistedParent) {
227
+ value = '';
228
+ }
229
+ this.model = value;
230
+ this.value = value;
231
+ }
232
+ }
233
+ else {
234
+ delete this.model;
235
+ delete this.value;
236
+ }
237
+ }
238
+ this.meta.$optional = this.isOptional;
239
+ },
240
+ get: () => this.value,
241
+ enumerable: this.sendToServer,
242
+ configurable: true
243
+ });
244
+ if (typeof (origValue) !== 'undefined') {
245
+ this.parent[this.meta.name] = origValue;
246
+ }
247
+ const d = this.meta.default || this.meta.defaultValue;
248
+ if (d && typeof (this.model) === 'undefined') {
249
+ if (this.multiple) {
250
+ this.parent[this.meta.name] = [];
251
+ if (d.length) {
252
+ for (const dv of this.default) { // TODO ???
253
+ const defaultValueItem = (typeof (dv) === 'string' || dv === null) ? dv : (dv.id || dv.value);
254
+ if (defaultValueItem || defaultValueItem === 0) {
255
+ this.parent[this.meta.name].push(defaultValueItem);
256
+ }
257
+ }
258
+ }
259
+ }
260
+ else {
261
+ const defaultValue = (typeof (d) === 'string') ? d : (d.id || d.value);
262
+ if (defaultValue || defaultValue === 0) {
263
+ if (/^(date|time)/.test(this.meta.subtype) && typeof (defaultValue) === 'string') {
264
+ this.parent[this.meta.name] = relativeTimeBuilder(this.meta.subtype, defaultValue, this.validations.step);
265
+ }
266
+ else {
267
+ if (this.meta.type === 'string' && defaultValue) {
268
+ this.parent[this.meta.name] = templateBuilder(this.metaContext, defaultValue);
269
+ }
270
+ else {
271
+ this.parent[this.meta.name] = defaultValue;
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
+ }
278
+ onActivated(ev) {
279
+ this.input = ev.srcElement;
280
+ if (!this.dropdown) {
281
+ this.dropdown = ev.srcElement.parentNode.parentNode;
282
+ }
283
+ this.showDropdown();
284
+ }
285
+ clear(ev) {
286
+ delete this.model;
287
+ delete this.activeSuggestionIndex;
288
+ delete this.asyncSuggestions;
289
+ this.onModelChange(this.model);
290
+ if (ev) {
291
+ ev.preventDefault();
292
+ ev.stopPropagation();
293
+ this.focus();
294
+ return false;
295
+ }
296
+ }
297
+ onBlur(ev) {
298
+ let internalControl = false;
299
+ if (ev.relatedTarget) {
300
+ if (!this.elementRef.nativeElement.contains(ev.relatedTarget)) {
301
+ this.dismissDropdown();
302
+ }
303
+ else {
304
+ internalControl = true;
305
+ }
306
+ }
307
+ if (this.keyListenerActive && !internalControl) {
308
+ this.input.removeEventListener('keydown', this.keydown);
309
+ setTimeout(() => {
310
+ if (!this.keyListenerActive) {
311
+ document.removeEventListener('click', this.clickout);
312
+ }
313
+ }, 400);
314
+ delete this.keyListenerActive;
315
+ }
316
+ }
317
+ onAdd(ev) {
318
+ console.log('onAdd', this.addText);
319
+ if (this.addText) {
320
+ if ((this.model || []).indexOf(this.addText) === -1) {
321
+ this.onSuggestionSelect(ev, this.addText);
322
+ if (!this.meta.suggestions) {
323
+ this.meta.suggestions = [];
324
+ }
325
+ this.meta.suggestions.unshift(this.addText);
326
+ }
327
+ else {
328
+ ev.preventDefault();
329
+ ev.stopPropagation();
330
+ this.focus();
331
+ }
332
+ delete this.addText;
333
+ }
334
+ }
335
+ remove(ev, item) {
336
+ ev.preventDefault();
337
+ ev.stopPropagation();
338
+ const optionIndex = this.model.indexOf(item);
339
+ if (optionIndex !== -1) {
340
+ this.model.splice(optionIndex, 1);
341
+ if (!this.model.length) {
342
+ delete this.model;
343
+ delete this.value;
344
+ }
345
+ this.onModelChange(this.model);
346
+ }
347
+ }
348
+ onSuggestionSelect(ev, suggestion) {
349
+ if (!suggestion) {
350
+ return;
351
+ }
352
+ ev.preventDefault();
353
+ ev.stopPropagation();
354
+ this.focus();
355
+ let suggestionValue = suggestion.id || suggestion.value || suggestion;
356
+ if (typeof (suggestionValue) === 'string') {
357
+ if (/^(date|time)/.test(this.meta.subtype)) {
358
+ suggestionValue = relativeTimeBuilder(this.meta.subtype, suggestionValue, this.validations.step);
359
+ }
360
+ else if (this.meta.type === 'string') {
361
+ suggestionValue = templateBuilder(this.metaContext, suggestionValue);
362
+ }
363
+ else {
364
+ suggestionValue = suggestion;
365
+ }
366
+ }
367
+ if (this.multiple) {
368
+ if (!this.model) {
369
+ this.model = [];
370
+ }
371
+ let existingItemIndex = this.model.indexOf(suggestionValue);
372
+ if (existingItemIndex === -1) {
373
+ this.model.push(suggestionValue);
374
+ }
375
+ else {
376
+ this.model.splice(existingItemIndex, 1);
377
+ existingItemIndex = undefined;
378
+ }
379
+ this.onModelChange(this.model);
380
+ }
381
+ else {
382
+ this.dismissDropdown();
383
+ this.model = suggestionValue;
384
+ this.onModelChange(suggestionValue);
385
+ this.activeSuggestionIndex = this.suggestions.indexOf(suggestion);
386
+ }
387
+ }
388
+ textToSpeech() { }
389
+ dismissDropdown(event) {
390
+ if (event) {
391
+ this.focus();
392
+ }
393
+ if (this.dropdown) {
394
+ this.dropdown.classList.remove('Vlt-dropdown--expanded');
395
+ }
396
+ }
397
+ ensureDropdownIsVisible() {
398
+ setTimeout(() => {
399
+ const holder = this.dropdown.closest('.Vlt-card__content');
400
+ const el = this.elementRef.nativeElement.querySelector('.Vlt-dropdown__panel');
401
+ if (el) {
402
+ const elRect = el.getBoundingClientRect();
403
+ const holderRect = holder.getBoundingClientRect();
404
+ if (holderRect.top + holderRect.height < elRect.top + elRect.height) {
405
+ el.scrollIntoView({ block: 'end' });
406
+ }
407
+ }
408
+ }, 400);
409
+ }
410
+ showDropdown() {
411
+ if (this.meta.suggestions && this.meta.suggestions.length) {
412
+ this.dropdown.classList.add('Vlt-dropdown--expanded');
413
+ this.ensureDropdownIsVisible();
414
+ }
415
+ if (!this.keyListenerActive) {
416
+ this.input.addEventListener('keydown', this.keydown);
417
+ setTimeout(() => {
418
+ document.addEventListener('click', this.clickout);
419
+ }, 200);
420
+ this.keyListenerActive = true;
421
+ }
422
+ if (typeof (this.activeSuggestionIndex) === 'undefined') {
423
+ if (this.model && this.suggestions.length) {
424
+ for (let suggestionIndex = 0; suggestionIndex < this.suggestions.length; suggestionIndex++) {
425
+ if (this.model === this.suggestions[suggestionIndex]) {
426
+ this.activeSuggestionIndex = suggestionIndex;
427
+ return;
428
+ }
429
+ }
430
+ delete this.activeSuggestionIndex;
431
+ }
432
+ }
433
+ }
434
+ get suggestions() {
435
+ return this.asyncSuggestions || this.meta.suggestions || [];
436
+ }
437
+ }
438
+ FieldInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.2", ngImport: i0, type: FieldInput, deps: [{ token: i1.MetaContextService }], target: i0.ɵɵFactoryTarget.Component });
439
+ FieldInput.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.2", type: FieldInput, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class='vgip-meta-field-preview' *ngIf='preview && model'>\n <div class='vgip-meta-field-label'>{{meta.label || meta.name}}</div>\n <div class='vgip-meta-field-value __gu'>{{model}}</div>\n</div>\n<div *ngIf='!preview' class=\"Vlt-form__element Vlt-form__element--big\" [ngClass]=\"{'Vlt-form__element--error': f.invalid && ((f | metaModel)._parent.submitted || (f | metaModel ).touched), 'multiple': multiple, 'has-value': f.value, active: keyListenerActive }\">\n <div *ngIf='multiple' class='items-container'>\n <div *ngIf='model' class='badges-container keep-focus' (click)='focus()'>\n <div *ngFor='let item of model' class=\"Vlt-badge Vlt-badge--app Vlt-badge--large keep-focus\">\n {{item}}\n <button class=\"Vlt-badge__dismiss keep-focus\" (click)='remove($event, item)'></button>\n </div>\n </div>\n </div>\n <div class=\"Vlt-input Vlt-dropdown\" style='display: block;'>\n <label class='wrapper'>\n <input class='main model' [pattern]=\"validations.pattern ? validations.pattern.value || validations.pattern : null\" [required]='validations.required' [minlength]='validations.minlength' [maxlength]='validations.maxlength' [min]='validations.min' [max]='validations.max' [step]='validations.step' [disabled]='disabled' [readonly]=\"readonly\" [(ngModel)]='model' (ngModelChange)=\"onModelChange($event)\" #f='ngModel' [name]='name' [type]=\"multiple ? 'hidden' : (meta.subtype || 'text')\" placeholder=\" \" (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)'/>\n <input *ngIf='multiple' class='main' [pattern]=\"validations.pattern ? validations.pattern.value || validations.pattern : null\" [minlength]='validations.minlength' [maxlength]='validations.maxlength' [min]='validations.min' [max]='validations.max' [(ngModel)]='addText' [ngModelOptions]=\"{ standalone: true }\" [type]=\"meta.subtype || 'text'\" [disabled]='disabled' [readonly]='readonly' placeholder=\"+Add\" (keydown.enter)='onAdd($event)' (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)'/>\n <label class='Vlt-truncate'>{{meta.label || meta.name}}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span class='Vlt-black' *ngIf='model && multiple'>({{model.length}})</span></label>\n </label>\n <div class='Vlt-composite__append right-actions'>\n <div *ngIf='model && showClear' class=\"Vlt-composite__append--icon\" (click)='clear($event)'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div>\n </div>\n <!-- <div *ngIf=\"!meta.subtype || meta.subtype == 'text'\" class=\"Vlt-composite__append Vlt-composite__append--icon\" style='bottom: 7px; right: 10px; padding: 3px; width: initial; height: initial; cursor: pointer;'>\n <div *ngIf=\"!meta.type || meta.type === 'string'\" class=\"Vlt-composite__icon\" (click)='textToSpeech()'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-microphone\"/></svg>\n </div>\n </div> -->\n <div *ngIf=\"suggestions.length\" class=\"Vlt-dropdown__panel\">\n <div class=\"Vlt-dropdown__panel__content Vlt-dropdown__panel__content--scroll-area suggestions\">\n <!-- <div class=\"Vlt-dropdown__title\" style='padding-left: 13px;'>\n Suggestions\n <div class=\"Vlt-dropdown__close Vlt-white\" (click)='dismissDropdown($event)'>\n <svg class='Vlt-icon Vlt-icon--small'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div> -->\n <div class=\"Vlt-dropdown__block\"></div>\n <div *ngIf='dropdown' class=\"Vlt-dropdown__scroll\">\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': (activeSuggestionIndex === i) }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of suggestions; let i = index' class=\"Vlt-dropdown__link\" style='padding: 0;'>\n <div *ngIf='multiple' class=\"Vlt-checkbox\" style='width: 100%;'>\n <label [title]='suggestion.label || suggestion'>\n <span class=\"Vlt-checkbox__button\">\n <input type=\"checkbox\" [checked]='model && model.indexOf(suggestion) !== -1'/>\n <span class=\"Vlt-checkbox__icon\"></span>\n </span>\n {{suggestion.label || suggestion}}\n </label>\n </div>\n <div *ngIf='!multiple' style='padding: 12px 20px;'>\n {{suggestion.label || suggestion}}\n </div>\n </div>\n </div>\n <div *ngIf='!multiple' class=\"Vlt-dropdown__block\"></div>\n <div *ngIf='multiple' class=\"Vlt-dropdown__block Vlt-dropdown__block--nowrap\" style='padding: 8px 16px 16px;'>\n <button (click)='clear($event)' type='button' class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--small Vlt-btn--outline\">Clear all</button>\n <button (click)='dismissDropdown($event)' type='button' class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--small\">Done</button>\n </div>\n </div>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((f | metaModel ).touched && keyListenerActive))' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required.&nbsp;</span>\n <span *ngIf=\"f.errors.minlength\">Must be longer than {{validations.minlength}} characters.&nbsp;</span>\n <span *ngIf=\"f.errors.maxlength\">Must be lest than {{validations.maxlength}} characters.&nbsp;</span>\n <span *ngIf=\"f.errors.pattern\">{{ validations.pattern.text || \"Should match '\"+validations.pattern+\"' pattern.\" }}.&nbsp;</span>\n </small>\n <small *ngIf='meta.hint' class=\"Vlt-form__element__hint\">{{meta.hint}}</small>\n</div>\n", styles: [".Vlt-form__element--big .Vlt-input input{padding-right:40px;text-overflow:ellipsis}@media screen and (-webkit-min-device-pixel-ratio: 0){.Vlt-form__element--big .Vlt-input input{line-height:20px}}.Vlt-form__element--big .Vlt-input input:disabled{cursor:not-allowed}.Vlt-form__element--big:hover .items-container,.Vlt-form__element--big:hover .main,.Vlt-form__element--big:hover input,.Vlt-form__element--big.active .items-container,.Vlt-form__element--big.active .main,.Vlt-form__element--big.active input{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.multiple .Vlt-composite.Vlt-dropdown{margin-top:3px}.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) input,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) input{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.multiple .items-container{background-color:var(--vgip-meta-input-bg-color);border:1px solid var(--vgip-meta-input-border-color);border-bottom:0;border-top-left-radius:6px;border-top-right-radius:6px}.Vlt-form__element--big.multiple .items-container.creatable{margin-right:62px}.Vlt-form__element--big.multiple .items-container .badges-container{overflow:auto;max-height:140px;padding:6px 4px 0 6px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge{margin-bottom:3px;margin-left:0;margin-right:3px;overflow:hidden;max-width:100%}.Vlt-form__element--big.multiple:not(.has-value) .items-container{border:0}.Vlt-form__element--big.multiple.has-value .main,.Vlt-form__element--big.multiple.has-value input{border-top:0;border-top-left-radius:0;border-top-right-radius:0;box-shadow:none}.Vlt-form__element--big.Vlt-form__element--error .items-container,.Vlt-form__element--big.Vlt-form__element--error .main,.Vlt-form__element--big.Vlt-form__element--error input{border-color:#f25a6b;background:var(--vgip-meta-input-bg-color)}label.Vlt-truncate{padding-right:42px}.Vlt-dropdown__panel{width:100%}.Vlt-dropdown__panel .Vlt-dropdown__link--selected{background:rgba(44,45,48,.05)}.Vlt-dropdown__panel label{margin-top:0;padding:12px 20px;top:0;left:0;pointer-events:initial;position:initial;color:initial;font-size:inherit;transition:none;cursor:pointer}.Vlt-dropdown__panel label input{height:0}.Vlt-composite__append.right-actions{position:absolute;top:5px;right:10px;cursor:pointer}.Vlt-composite__append.right-actions .Vlt-composite__append--icon{width:36px;outline:none;position:initial;display:inline-block}.Vlt-composite__append.right-actions .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-composite__append.right-actions .Vlt-composite__append--icon:hover svg,.Vlt-composite__append.right-actions .Vlt-composite__append--icon:focus svg{fill:var(--vgip-meta-input-accent-color)}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i3.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "metaModel": i4.MetaModelPipe }, viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
440
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.2", ngImport: i0, type: FieldInput, decorators: [{
441
+ type: Component,
442
+ args: [{ viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div class='vgip-meta-field-preview' *ngIf='preview && model'>\n <div class='vgip-meta-field-label'>{{meta.label || meta.name}}</div>\n <div class='vgip-meta-field-value __gu'>{{model}}</div>\n</div>\n<div *ngIf='!preview' class=\"Vlt-form__element Vlt-form__element--big\" [ngClass]=\"{'Vlt-form__element--error': f.invalid && ((f | metaModel)._parent.submitted || (f | metaModel ).touched), 'multiple': multiple, 'has-value': f.value, active: keyListenerActive }\">\n <div *ngIf='multiple' class='items-container'>\n <div *ngIf='model' class='badges-container keep-focus' (click)='focus()'>\n <div *ngFor='let item of model' class=\"Vlt-badge Vlt-badge--app Vlt-badge--large keep-focus\">\n {{item}}\n <button class=\"Vlt-badge__dismiss keep-focus\" (click)='remove($event, item)'></button>\n </div>\n </div>\n </div>\n <div class=\"Vlt-input Vlt-dropdown\" style='display: block;'>\n <label class='wrapper'>\n <input class='main model' [pattern]=\"validations.pattern ? validations.pattern.value || validations.pattern : null\" [required]='validations.required' [minlength]='validations.minlength' [maxlength]='validations.maxlength' [min]='validations.min' [max]='validations.max' [step]='validations.step' [disabled]='disabled' [readonly]=\"readonly\" [(ngModel)]='model' (ngModelChange)=\"onModelChange($event)\" #f='ngModel' [name]='name' [type]=\"multiple ? 'hidden' : (meta.subtype || 'text')\" placeholder=\" \" (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)'/>\n <input *ngIf='multiple' class='main' [pattern]=\"validations.pattern ? validations.pattern.value || validations.pattern : null\" [minlength]='validations.minlength' [maxlength]='validations.maxlength' [min]='validations.min' [max]='validations.max' [(ngModel)]='addText' [ngModelOptions]=\"{ standalone: true }\" [type]=\"meta.subtype || 'text'\" [disabled]='disabled' [readonly]='readonly' placeholder=\"+Add\" (keydown.enter)='onAdd($event)' (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)'/>\n <label class='Vlt-truncate'>{{meta.label || meta.name}}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span class='Vlt-black' *ngIf='model && multiple'>({{model.length}})</span></label>\n </label>\n <div class='Vlt-composite__append right-actions'>\n <div *ngIf='model && showClear' class=\"Vlt-composite__append--icon\" (click)='clear($event)'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div>\n </div>\n <!-- <div *ngIf=\"!meta.subtype || meta.subtype == 'text'\" class=\"Vlt-composite__append Vlt-composite__append--icon\" style='bottom: 7px; right: 10px; padding: 3px; width: initial; height: initial; cursor: pointer;'>\n <div *ngIf=\"!meta.type || meta.type === 'string'\" class=\"Vlt-composite__icon\" (click)='textToSpeech()'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-microphone\"/></svg>\n </div>\n </div> -->\n <div *ngIf=\"suggestions.length\" class=\"Vlt-dropdown__panel\">\n <div class=\"Vlt-dropdown__panel__content Vlt-dropdown__panel__content--scroll-area suggestions\">\n <!-- <div class=\"Vlt-dropdown__title\" style='padding-left: 13px;'>\n Suggestions\n <div class=\"Vlt-dropdown__close Vlt-white\" (click)='dismissDropdown($event)'>\n <svg class='Vlt-icon Vlt-icon--small'><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div> -->\n <div class=\"Vlt-dropdown__block\"></div>\n <div *ngIf='dropdown' class=\"Vlt-dropdown__scroll\">\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': (activeSuggestionIndex === i) }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of suggestions; let i = index' class=\"Vlt-dropdown__link\" style='padding: 0;'>\n <div *ngIf='multiple' class=\"Vlt-checkbox\" style='width: 100%;'>\n <label [title]='suggestion.label || suggestion'>\n <span class=\"Vlt-checkbox__button\">\n <input type=\"checkbox\" [checked]='model && model.indexOf(suggestion) !== -1'/>\n <span class=\"Vlt-checkbox__icon\"></span>\n </span>\n {{suggestion.label || suggestion}}\n </label>\n </div>\n <div *ngIf='!multiple' style='padding: 12px 20px;'>\n {{suggestion.label || suggestion}}\n </div>\n </div>\n </div>\n <div *ngIf='!multiple' class=\"Vlt-dropdown__block\"></div>\n <div *ngIf='multiple' class=\"Vlt-dropdown__block Vlt-dropdown__block--nowrap\" style='padding: 8px 16px 16px;'>\n <button (click)='clear($event)' type='button' class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--small Vlt-btn--outline\">Clear all</button>\n <button (click)='dismissDropdown($event)' type='button' class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--app Vlt-btn--small\">Done</button>\n </div>\n </div>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((f | metaModel ).touched && keyListenerActive))' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required.&nbsp;</span>\n <span *ngIf=\"f.errors.minlength\">Must be longer than {{validations.minlength}} characters.&nbsp;</span>\n <span *ngIf=\"f.errors.maxlength\">Must be lest than {{validations.maxlength}} characters.&nbsp;</span>\n <span *ngIf=\"f.errors.pattern\">{{ validations.pattern.text || \"Should match '\"+validations.pattern+\"' pattern.\" }}.&nbsp;</span>\n </small>\n <small *ngIf='meta.hint' class=\"Vlt-form__element__hint\">{{meta.hint}}</small>\n</div>\n", styles: [".Vlt-form__element--big .Vlt-input input{padding-right:40px;text-overflow:ellipsis}@media screen and (-webkit-min-device-pixel-ratio: 0){.Vlt-form__element--big .Vlt-input input{line-height:20px}}.Vlt-form__element--big .Vlt-input input:disabled{cursor:not-allowed}.Vlt-form__element--big:hover .items-container,.Vlt-form__element--big:hover .main,.Vlt-form__element--big:hover input,.Vlt-form__element--big.active .items-container,.Vlt-form__element--big.active .main,.Vlt-form__element--big.active input{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.multiple .Vlt-composite.Vlt-dropdown{margin-top:3px}.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) input,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) input{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.multiple .items-container{background-color:var(--vgip-meta-input-bg-color);border:1px solid var(--vgip-meta-input-border-color);border-bottom:0;border-top-left-radius:6px;border-top-right-radius:6px}.Vlt-form__element--big.multiple .items-container.creatable{margin-right:62px}.Vlt-form__element--big.multiple .items-container .badges-container{overflow:auto;max-height:140px;padding:6px 4px 0 6px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge{margin-bottom:3px;margin-left:0;margin-right:3px;overflow:hidden;max-width:100%}.Vlt-form__element--big.multiple:not(.has-value) .items-container{border:0}.Vlt-form__element--big.multiple.has-value .main,.Vlt-form__element--big.multiple.has-value input{border-top:0;border-top-left-radius:0;border-top-right-radius:0;box-shadow:none}.Vlt-form__element--big.Vlt-form__element--error .items-container,.Vlt-form__element--big.Vlt-form__element--error .main,.Vlt-form__element--big.Vlt-form__element--error input{border-color:#f25a6b;background:var(--vgip-meta-input-bg-color)}label.Vlt-truncate{padding-right:42px}.Vlt-dropdown__panel{width:100%}.Vlt-dropdown__panel .Vlt-dropdown__link--selected{background:rgba(44,45,48,.05)}.Vlt-dropdown__panel label{margin-top:0;padding:12px 20px;top:0;left:0;pointer-events:initial;position:initial;color:initial;font-size:inherit;transition:none;cursor:pointer}.Vlt-dropdown__panel label input{height:0}.Vlt-composite__append.right-actions{position:absolute;top:5px;right:10px;cursor:pointer}.Vlt-composite__append.right-actions .Vlt-composite__append--icon{width:36px;outline:none;position:initial;display:inline-block}.Vlt-composite__append.right-actions .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-composite__append.right-actions .Vlt-composite__append--icon:hover svg,.Vlt-composite__append.right-actions .Vlt-composite__append--icon:focus svg{fill:var(--vgip-meta-input-accent-color)}\n"] }]
443
+ }], ctorParameters: function () { return [{ type: i1.MetaContextService }]; } });
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvZmllbGRJbnB1dC9pbmRleC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21ldGEtdWkvc3JjL2xpYi9maWVsZElucHV0L3ZpZXcuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCwwRUFBMEU7QUFDMUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7QUFHMUUsb0ZBQW9GO0FBT3BGLE1BQU0sT0FBTyxVQUFXLFNBQVEsYUFBYTtJQVUzQyxZQUFxQixXQUErQjtRQUNsRCxLQUFLLEVBQUUsQ0FBQztRQURXLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQXFVNUMsYUFBUSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0IsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUMzRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2IsMEJBQTBCO2dCQUMxQiwwREFBMEQ7YUFFM0Q7aUJBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUsscUJBQXFCLEVBQUU7Z0JBQzFGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDZDtRQUNILENBQUMsQ0FBQztRQUVNLFlBQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzFCLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDakIsS0FBSyxXQUFXLENBQUMsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ3RHLE1BQU07cUJBQ1A7b0JBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNwQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLFdBQVcsRUFBRTt3QkFDdkQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQztxQkFDaEM7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7d0JBQzdCLElBQUksSUFBSSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFOzRCQUN6RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO3lCQUNoQztxQkFDRjtvQkFDRCxNQUFNO2lCQUNQO2dCQUNELEtBQUssU0FBUyxDQUFDLENBQUM7b0JBQ2QsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ3RHLE1BQU07cUJBQ1A7b0JBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNwQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLFdBQVcsRUFBRTt3QkFDdkQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztxQkFDMUQ7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7d0JBQzdCLElBQUksSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsRUFBRTs0QkFDbEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzt5QkFDMUQ7cUJBQ0Y7b0JBQ0QsTUFBTTtpQkFDUDtnQkFDRCxLQUFLLE9BQU8sQ0FBQztnQkFDYixLQUFLLE9BQU8sQ0FBQyxDQUFDO29CQUNaLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLFdBQVcsRUFBRTt3QkFDdkQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQ3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO3dCQUM3RSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztxQkFDbkM7b0JBQ0QsTUFBTTtpQkFDUDtnQkFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDO29CQUNiLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3ZCLE1BQU07aUJBQ1A7Z0JBQ0QsT0FBTyxDQUFDLENBQUM7b0JBQ1AsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTs0QkFDZixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQzs0QkFDbEMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7eUJBQzlCOzZCQUFNLElBQUksT0FBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLEVBQUU7NEJBQzFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dDQUNqRSxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0NBQ2xFLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7NEJBQ2pFLENBQUMsQ0FBQyxDQUFDO3lCQUNKO29CQUNILENBQUMsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7UUFDSCxDQUFDLENBQUM7SUFoWkYsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDekUsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxtRUFBbUU7WUFDM0YsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4RTtRQUNELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQzthQUN6QjtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztTQUM5QjtRQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25DLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQzthQUN0QztZQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHFDQUFxQztTQUM1RDtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJO1lBQ2pDLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNO1NBQ2xGLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDakQsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNqQixJQUFJLE9BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxXQUFXLEVBQUU7d0JBQ2pDLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzFELElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixLQUFLLElBQUksQ0FBQyxJQUFJLE1BQU0sRUFBRTs0QkFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0NBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7NkJBQ2pCOzRCQUNELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO2dDQUN6QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDOzZCQUNyQjs0QkFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDcEI7d0JBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO3FCQUN6QjtpQkFDRjtxQkFBTTtvQkFDTCxJQUFJLE9BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxXQUFXOzJCQUM1QixDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUN6SDt3QkFDQSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFOzRCQUM3RCxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzt5QkFDN0I7NkJBQU0sSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7NEJBQ3hELEtBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7eUJBQ2pDO3dCQUNELElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFOzRCQUN2RyxJQUFJO2dDQUNGLElBQUksSUFBVSxDQUFDO2dDQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxDQUFDLEVBQUU7b0NBQ2pDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUNBQzdDO3FDQUFNO29DQUNMLElBQUksTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTt3Q0FDcEQsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztxQ0FDcEM7eUNBQU07d0NBQ0wsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7cUNBQ3JGO2lDQUNGO2dDQUNELElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLFFBQVEsRUFBRTtvQ0FDL0IsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTt3Q0FDM0MsS0FBSyxnQkFBZ0IsQ0FBQzt3Q0FDdEIsS0FBSyxVQUFVLENBQUMsQ0FBQzs0Q0FDZixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0Q0FDdEgsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7NENBQy9GLE1BQU07eUNBQ1A7d0NBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQzs0Q0FDWCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NENBQzlDLE1BQU07eUNBQ1A7cUNBQ0Y7aUNBQ0Y7Z0NBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLEVBQUU7b0NBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLE1BQU0sRUFBRTt3Q0FDcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FDQUMvQzt5Q0FBTTt3Q0FDTCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQ0FDakM7aUNBQ0Y7cUNBQU07b0NBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssTUFBTSxFQUFFO3dDQUNwRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dDQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO3dDQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO3dDQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dDQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dDQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dDQUNuQixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FDQUN6QjtvQ0FDRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQ0FDN0I7NkJBQ0Y7NEJBQUMsT0FBTyxDQUFDLEVBQUU7Z0NBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzZCQUNuRjt5QkFDRjs2QkFBTSxJQUFJLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQzNELElBQUk7Z0NBQ0YsSUFBSSxJQUFVLENBQUM7Z0NBQ2YsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFO29DQUMvQixJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lDQUM3QztxQ0FBTTtvQ0FDTCxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQzlHLENBQUM7aUNBQ0g7Z0NBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs2QkFDN0I7NEJBQUMsT0FBTyxDQUFDLEVBQUU7Z0NBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzZCQUNuRjt5QkFDRjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0NBQzdFLEtBQUssR0FBRyxFQUFFLENBQUM7NkJBQ1o7NEJBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7NEJBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO3lCQUNwQjtxQkFDRjt5QkFBTTt3QkFDTCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7d0JBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztxQkFDbkI7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUM3QixZQUFZLEVBQUUsSUFBSTtTQUNuQixDQUFDLENBQUM7UUFDSCxJQUFJLE9BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxXQUFXLEVBQUU7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztTQUN6QztRQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3RELElBQUksQ0FBQyxJQUFJLE9BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssV0FBVyxFQUFFO1lBQzNDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFO29CQUNaLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFdBQVc7d0JBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssUUFBUSxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUM5RixJQUFJLGdCQUFnQixJQUFJLGdCQUFnQixLQUFLLENBQUMsRUFBRTs0QkFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3lCQUNwRDtxQkFDRjtpQkFDRjthQUNGO2lCQUFNO2dCQUNMLE1BQU0sWUFBWSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksWUFBWSxJQUFJLFlBQVksS0FBSyxDQUFDLEVBQUU7b0JBQ3RDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxRQUFRLEVBQUU7d0JBQy9FLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDM0c7eUJBQU07d0JBQ0wsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksWUFBWSxFQUFFOzRCQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7eUJBQy9FOzZCQUFNOzRCQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUM7eUJBQzVDO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsRUFBRTtRQUNaLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztTQUNyRDtRQUNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLEVBQUc7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxFQUFFLEVBQUU7WUFDTixFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQUU7UUFDUCxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxFQUFFLENBQUMsYUFBYSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUM3RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDeEI7aUJBQU07Z0JBQ0wsZUFBZSxHQUFHLElBQUksQ0FBQzthQUN4QjtTQUNGO1FBQ0QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFDM0IsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3REO1lBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ1IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLEVBQUU7UUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztpQkFDNUI7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3QztpQkFBTTtnQkFDTCxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BCLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2Q7WUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJO1FBQ2IsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNuQjtZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLEVBQUUsRUFBRSxVQUFVO1FBQy9CLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksZUFBZSxHQUFHLFVBQVUsQ0FBQyxFQUFFLElBQUksVUFBVSxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUM7UUFDdEUsSUFBSSxPQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ3hDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUMxQyxlQUFlLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbEc7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQ3RDLGVBQWUsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQzthQUN0RTtpQkFBTTtnQkFDTCxlQUFlLEdBQUcsVUFBVSxDQUFDO2FBQzlCO1NBQ0Y7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7YUFDakI7WUFDRCxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzVELElBQUksaUJBQWlCLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2FBQ2xDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7YUFDL0I7WUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDO1lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ25FO0lBQ0gsQ0FBQztJQUVELFlBQVksS0FBSyxDQUFDO0lBRWxCLGVBQWUsQ0FBQyxLQUFNO1FBQ3BCLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Q7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDMUQ7SUFDSCxDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzNELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQy9FLElBQUksRUFBRSxFQUFFO2dCQUNOLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxVQUFVLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFO29CQUNuRSxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7aUJBQ3JDO2FBQ0Y7UUFDSCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztTQUNoQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ1IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztTQUMvQjtRQUNELElBQUksT0FBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLFdBQVcsRUFBRTtZQUN0RCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3pDLEtBQUssSUFBSSxlQUFlLEdBQUcsQ0FBQyxFQUFFLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsRUFBRTtvQkFDMUYsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLEVBQUU7d0JBQ3BELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxlQUFlLENBQUM7d0JBQzdDLE9BQU87cUJBQ1I7aUJBQ0Y7Z0JBQ0QsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUM7YUFDbkM7U0FDRjtJQUNILENBQUM7SUFpRkQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO0lBQzlELENBQUM7O3VHQWhhVSxVQUFVOzJGQUFWLFVBQVUsMkVDdkJ2QixpdUxBd0VBLHFoSkRuRGlCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOzJGQUV4RCxVQUFVO2tCQUx0QixTQUFTO29DQUdPLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIEBBdXRob3I6IEFsZXhhbmRlci5WYW5nZWxvdkB2b25hZ2UuY29tXG4gKiBARGF0ZTogMjAxOS0wOS0xOSAxNzozNTowOVxuICogQExhc3QgTW9kaWZpZWQgYnk6IEFsZXhhbmRlci5WYW5nZWxvdkB2b25hZ2UuY29tXG4gKiBATGFzdCBNb2RpZmllZCB0aW1lOiAyMDIwLTA1LTEyIDE3OjQ1OjQ2XG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgRmllbGRBYnN0cmFjdCB9IGZyb20gJy4uL2ZpZWxkQWJzdHJhY3QnO1xuLy8gaW1wb3J0IHsgSU1ldGFGaWVsZEludXQgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9maWVsZHMvSU1ldGFGaWVsZElucHV0JztcbmltcG9ydCB7IHRlbXBsYXRlQnVpbGRlciB9IGZyb20gJy4uL2NvbW1vbi91dGlscy90ZW1wbGF0ZUJ1aWxkZXInO1xuaW1wb3J0IHsgcmVsYXRpdmVUaW1lQnVpbGRlciB9IGZyb20gJy4uL2NvbW1vbi91dGlscy9yZWxhdGl2ZVRpbWVCdWlsZGVyJztcbmltcG9ydCB7IE1ldGFDb250ZXh0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL21ldGFDb250ZXh0JztcblxuLy8gaW1wb3J0IHsgTWV0YVZhbGlkYXRpb25zIH0gZnJvbSAnLi4vY29tbW9uL2RlY29yYXRvcnMvbWV0YVZhbGlkYXRpb25zLmRlY29yYXRvcic7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vdmlldy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3R5bGUuc2NzcyddLFxuICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1dXG59KVxuZXhwb3J0IGNsYXNzIEZpZWxkSW5wdXQgZXh0ZW5kcyBGaWVsZEFic3RyYWN0IGltcGxlbWVudHMgT25Jbml0IHtcbiAgaW5wdXQ6IGFueTtcbiAgZHJvcGRvd246IGFueTtcbiAgYWN0aXZlU3VnZ2VzdGlvbkluZGV4OiBudW1iZXI7XG4gIHZhbHVlOiBhbnk7XG4gIG11bHRpcGxlOiBib29sZWFuO1xuICBhZGRUZXh0O1xuICBzaG93Q2xlYXI6IGJvb2xlYW47XG4gIGFzeW5jU3VnZ2VzdGlvbnM6IEFycmF5PGFueT47XG5cbiAgY29uc3RydWN0b3IoIHByaXZhdGUgbWV0YUNvbnRleHQ6IE1ldGFDb250ZXh0U2VydmljZSApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5tdWx0aXBsZSA9ICh0aGlzLm1ldGEudHlwZSA9PT0gJ211bHRpc3RyaW5nJykgfHwgdGhpcy5tZXRhLm11bHRpcGxlO1xuICAgIC8vIGNvbnNvbGUubG9nKCdGaWVsZElucHV0IGluaXQnLCB0aGlzLm1ldGEubmFtZSk7XG4gICAgdGhpcy52YWxpZGF0aW9uQXR0cmlidXRlcyA9IFsncGF0dGVybicsICdyZXF1aXJlZCcsICdtaW5sZW5ndGgnLCAnbWF4bGVuZ3RoJywgJ21pbicsICdtYXgnLCAnc3RlcCddO1xuICAgIGlmICh0aGlzLm1ldGEucGlja2xpc3QpIHsgLy8ganVzdCBmb3IgdGVzdCEgYWxsIG1ldGFkYXRhIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCB0byB2MyBwcm90b2NvbFxuICAgICAgdGhpcy5tZXRhLnN1Z2dlc3Rpb25zID0gKHRoaXMubWV0YS5waWNrbGlzdCB8fCBbXSkubWFwKChzKSA9PiBzLmxhYmVsKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWV0YS50eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHRoaXMubWV0YS5zdWJ0eXBlID09PSAnZmxvYXQnICYmICF0aGlzLm1ldGEuc3RlcCkge1xuICAgICAgICB0aGlzLm1ldGEuc3RlcCA9ICcwLjAxJztcbiAgICAgIH1cbiAgICAgIHRoaXMubWV0YS5zdWJ0eXBlID0gJ251bWJlcic7XG4gICAgfVxuICAgIGlmIChbJ2RhdGUnLCAndGltZScsICdkYXRldGltZSddLmluZGV4T2YodGhpcy5tZXRhLnR5cGUpICE9PSAtMSkge1xuICAgICAgdGhpcy5tZXRhLnN1YnR5cGUgPSB0aGlzLm1ldGEudHlwZTtcbiAgICAgIGlmICh0aGlzLm1ldGEudHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICB0aGlzLm1ldGEuc3VidHlwZSA9ICdkYXRldGltZS1sb2NhbCc7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5tdWx0aXBsZTsgLy8gbm8gbXVsdGlwbGUgc3VwcG9ydCBmb3IgdGltZXN0YW1wc1xuICAgIH1cbiAgICB0aGlzLnNob3dDbGVhciA9ICF0aGlzLm11bHRpcGxlICYmIFtcbiAgICAgICcnLCAnc3RyaW5nJywgJ3VybCcsICdlbWFpbCcsICdwYXNzd29yZCcsICd0ZWwnLCAnZGF0ZScsICdkYXRldGltZS1sb2NhbCcsICd0aW1lJ1xuICAgIF0uaW5kZXhPZih0aGlzLm1ldGEuc3VidHlwZSB8fCAnJykgIT09IC0xO1xuICAgIGNvbnN0IG9yaWdWYWx1ZSA9IHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5wYXJlbnQsIHRoaXMubWV0YS5uYW1lLCB7XG4gICAgICBzZXQ6ICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIGlmICh0eXBlb2YodmFsdWUpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgdiBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgKHYpID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdiA9IHYuaWQgfHwgdi52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLm1vZGVsLnB1c2godik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tb2RlbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgIT09ICd1bmRlZmluZWQnIFxuICAgICAgICAgICAgJiYgISh2YWx1ZSA9PT0gbnVsbCAmJiAoKHR5cGVvZih0aGlzLm1ldGEudHlwZSkgPT09ICd1bmRlZmluZWQnKSB8fCBbJ3N0cmluZycsICdudW1iZXInXS5pbmRleE9mKHRoaXMubWV0YS50eXBlKSAhPT0gLTEpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWV0YS50eXBlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YodmFsdWUpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAodmFsdWUpID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmlkIHx8IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFsnZGF0ZXRpbWUnLCAnZGF0ZScsICdkYXRldGltZS1sb2NhbCddLmluZGV4T2YodGhpcy5tZXRhLnN1YnR5cGUgfHwgdGhpcy5tZXRhLnR5cGUpICE9PSAtMSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRlOiBEYXRlO1xuICAgICAgICAgICAgICAgIGlmICgodHlwZW9mICh2YWx1ZSkgPT09ICdudW1iZXInKSkge1xuICAgICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KHZhbHVlIGFzIGFueSwgMTApKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKCdkYXRlJyA9PT0gKHRoaXMubWV0YS5zdWJ0eXBlIHx8IHRoaXMubWV0YS50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5wYXJzZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKERhdGUucGFyc2UoYCR7dmFsdWV9WmApICsgKG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5tZXRhLnN1YnR5cGUgfHwgdGhpcy5tZXRhLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGF0ZXRpbWUtbG9jYWwnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkYXRldGltZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0keygnMDAnICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpKS5zbGljZSgtMil9LSR7KCcwMCcgKyBkYXRlLmdldERhdGUoKSkuc2xpY2UoLTIpfWA7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbCArPSBgVCR7KCcwMCcgKyBkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKX06JHsoJzAwJyArIGRhdGUuZ2V0TWludXRlcygpKS5zbGljZSgtMil9YDtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkYXRlJzoge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwgPSBkYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tZXRhLnZhbHVlVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5tZXRhLnN1YnR5cGUgfHwgdGhpcy5tZXRhLnR5cGUpID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGUudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLm1ldGEuc3VidHlwZSB8fCB0aGlzLm1ldGEudHlwZSkgPT09ICdkYXRlJykge1xuICAgICAgICAgICAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGUuc2V0TW9udGgoZGF0ZS5nZXRVVENNb250aCgpKTtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZS5zZXRNaW51dGVzKDApO1xuICAgICAgICAgICAgICAgICAgICBkYXRlLnNldEhvdXJzKDApO1xuICAgICAgICAgICAgICAgICAgICBkYXRlLnNldFNlY29uZHMoMCk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzKDApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RhdGUgcGFyc2UgZXJyb3InLCBlLm1lc3NhZ2UsIGBcIiR7dmFsdWV9XCJgLCBgKCR7dHlwZW9mICh2YWx1ZSl9KWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCd0aW1lJyA9PT0gKHRoaXMubWV0YS5zdWJ0eXBlIHx8IHRoaXMubWV0YS50eXBlKSkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRlOiBEYXRlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShwYXJzZUludCh2YWx1ZSBhcyBhbnksIDEwKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgRGF0ZS5wYXJzZShuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvVC4qWi8sIGBUJHt2YWx1ZX1aYCkpICsgKG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwKVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCA9IGRhdGUudG9UaW1lU3RyaW5nKCkuc3BsaXQoJyAnKVswXTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdEYXRlIHBhcnNlIGVycm9yJywgZS5tZXNzYWdlLCBgXCIke3ZhbHVlfVwiYCwgYCgke3R5cGVvZiAodmFsdWUpfSlgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCF2YWx1ZSAmJiAodHlwZW9mKHRoaXMucHJldk1vZGVsKSA9PT0gJ3N0cmluZycpICYmIHRoaXMuaXNQZXJzaXN0ZWRQYXJlbnQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMubW9kZWwgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5tb2RlbDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1ldGEuJG9wdGlvbmFsID0gdGhpcy5pc09wdGlvbmFsO1xuICAgICAgfSxcbiAgICAgIGdldDogKCkgPT4gdGhpcy52YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRoaXMuc2VuZFRvU2VydmVyLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZihvcmlnVmFsdWUpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdID0gb3JpZ1ZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBkID0gdGhpcy5tZXRhLmRlZmF1bHQgfHwgdGhpcy5tZXRhLmRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoZCAmJiB0eXBlb2YodGhpcy5tb2RlbCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB0aGlzLnBhcmVudFt0aGlzLm1ldGEubmFtZV0gPSBbXTtcbiAgICAgICAgaWYgKGQubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBkdiBvZiB0aGlzLmRlZmF1bHQpIHsgLy8gVE9ETyA/Pz9cbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZUl0ZW0gPSAodHlwZW9mIChkdikgPT09ICdzdHJpbmcnIHx8IGR2ID09PSBudWxsKSA/IGR2IDogKGR2LmlkIHx8IGR2LnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWVJdGVtIHx8IGRlZmF1bHRWYWx1ZUl0ZW0gPT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdLnB1c2goZGVmYXVsdFZhbHVlSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSAodHlwZW9mIChkKSA9PT0gJ3N0cmluZycpID8gZCA6IChkLmlkIHx8IGQudmFsdWUpO1xuICAgICAgICBpZiAoZGVmYXVsdFZhbHVlIHx8IGRlZmF1bHRWYWx1ZSA9PT0gMCkge1xuICAgICAgICAgIGlmICgvXihkYXRlfHRpbWUpLy50ZXN0KHRoaXMubWV0YS5zdWJ0eXBlKSAmJiB0eXBlb2YoZGVmYXVsdFZhbHVlKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IHJlbGF0aXZlVGltZUJ1aWxkZXIodGhpcy5tZXRhLnN1YnR5cGUsIGRlZmF1bHRWYWx1ZSwgdGhpcy52YWxpZGF0aW9ucy5zdGVwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMubWV0YS50eXBlID09PSAnc3RyaW5nJyAmJiBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRbdGhpcy5tZXRhLm5hbWVdID0gdGVtcGxhdGVCdWlsZGVyKHRoaXMubWV0YUNvbnRleHQsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnBhcmVudFt0aGlzLm1ldGEubmFtZV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25BY3RpdmF0ZWQoZXYpIHtcbiAgICB0aGlzLmlucHV0ID0gZXYuc3JjRWxlbWVudDtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuZHJvcGRvd24gPSBldi5zcmNFbGVtZW50LnBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgfVxuXG4gIGNsZWFyKGV2Pykge1xuICAgIGRlbGV0ZSB0aGlzLm1vZGVsO1xuICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleDtcbiAgICBkZWxldGUgdGhpcy5hc3luY1N1Z2dlc3Rpb25zO1xuICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLm1vZGVsKTtcbiAgICBpZiAoZXYpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBvbkJsdXIoZXYpIHtcbiAgICBsZXQgaW50ZXJuYWxDb250cm9sID0gZmFsc2U7XG4gICAgaWYgKGV2LnJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIGlmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXYucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVybmFsQ29udHJvbCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmtleUxpc3RlbmVyQWN0aXZlICYmICFpbnRlcm5hbENvbnRyb2wpIHtcbiAgICAgIHRoaXMuaW5wdXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmtleUxpc3RlbmVyQWN0aXZlKSB7XG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrb3V0KTtcbiAgICAgICAgfVxuICAgICAgfSwgNDAwKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmtleUxpc3RlbmVyQWN0aXZlO1xuICAgIH1cbiAgfVxuXG4gIG9uQWRkKGV2KSB7XG4gICAgY29uc29sZS5sb2coJ29uQWRkJywgdGhpcy5hZGRUZXh0KTtcbiAgICBpZiAodGhpcy5hZGRUZXh0KSB7XG4gICAgICBpZiAoKHRoaXMubW9kZWwgfHwgW10pLmluZGV4T2YodGhpcy5hZGRUZXh0KSA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5vblN1Z2dlc3Rpb25TZWxlY3QoZXYsIHRoaXMuYWRkVGV4dCk7XG4gICAgICAgIGlmICghdGhpcy5tZXRhLnN1Z2dlc3Rpb25zKSB7XG4gICAgICAgICAgdGhpcy5tZXRhLnN1Z2dlc3Rpb25zID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXRhLnN1Z2dlc3Rpb25zLnVuc2hpZnQodGhpcy5hZGRUZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5hZGRUZXh0O1xuICAgIH1cbiAgfVxuICByZW1vdmUoZXYsIGl0ZW0pIHtcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IG9wdGlvbkluZGV4ID0gdGhpcy5tb2RlbC5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChvcHRpb25JbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMubW9kZWwuc3BsaWNlKG9wdGlvbkluZGV4LCAxKTtcbiAgICAgIGlmICghdGhpcy5tb2RlbC5sZW5ndGgpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMubW9kZWw7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMubW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIG9uU3VnZ2VzdGlvblNlbGVjdChldiwgc3VnZ2VzdGlvbikge1xuICAgIGlmICghc3VnZ2VzdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgICBsZXQgc3VnZ2VzdGlvblZhbHVlID0gc3VnZ2VzdGlvbi5pZCB8fCBzdWdnZXN0aW9uLnZhbHVlIHx8IHN1Z2dlc3Rpb247XG4gICAgaWYgKHR5cGVvZihzdWdnZXN0aW9uVmFsdWUpID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKC9eKGRhdGV8dGltZSkvLnRlc3QodGhpcy5tZXRhLnN1YnR5cGUpKSB7XG4gICAgICAgIHN1Z2dlc3Rpb25WYWx1ZSA9IHJlbGF0aXZlVGltZUJ1aWxkZXIodGhpcy5tZXRhLnN1YnR5cGUsIHN1Z2dlc3Rpb25WYWx1ZSwgdGhpcy52YWxpZGF0aW9ucy5zdGVwKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tZXRhLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN1Z2dlc3Rpb25WYWx1ZSA9IHRlbXBsYXRlQnVpbGRlcih0aGlzLm1ldGFDb250ZXh0LCBzdWdnZXN0aW9uVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VnZ2VzdGlvblZhbHVlID0gc3VnZ2VzdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIGlmICghdGhpcy5tb2RlbCkge1xuICAgICAgICB0aGlzLm1vZGVsID0gW107XG4gICAgICB9XG4gICAgICBsZXQgZXhpc3RpbmdJdGVtSW5kZXggPSB0aGlzLm1vZGVsLmluZGV4T2Yoc3VnZ2VzdGlvblZhbHVlKTtcbiAgICAgIGlmIChleGlzdGluZ0l0ZW1JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5wdXNoKHN1Z2dlc3Rpb25WYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1vZGVsLnNwbGljZShleGlzdGluZ0l0ZW1JbmRleCwgMSk7XG4gICAgICAgIGV4aXN0aW5nSXRlbUluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMubW9kZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc21pc3NEcm9wZG93bigpO1xuICAgICAgdGhpcy5tb2RlbCA9IHN1Z2dlc3Rpb25WYWx1ZTtcbiAgICAgIHRoaXMub25Nb2RlbENoYW5nZShzdWdnZXN0aW9uVmFsdWUpO1xuICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSB0aGlzLnN1Z2dlc3Rpb25zLmluZGV4T2Yoc3VnZ2VzdGlvbik7XG4gICAgfVxuICB9XG5cbiAgdGV4dFRvU3BlZWNoKCkgeyB9XG5cbiAgZGlzbWlzc0Ryb3Bkb3duKGV2ZW50Pykge1xuICAgIGlmIChldmVudCkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kcm9wZG93bikge1xuICAgICAgdGhpcy5kcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKCdWbHQtZHJvcGRvd24tLWV4cGFuZGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVEcm9wZG93bklzVmlzaWJsZSgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhvbGRlciA9IHRoaXMuZHJvcGRvd24uY2xvc2VzdCgnLlZsdC1jYXJkX19jb250ZW50Jyk7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5WbHQtZHJvcGRvd25fX3BhbmVsJyk7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgY29uc3QgZWxSZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGhvbGRlclJlY3QgPSBob2xkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmIChob2xkZXJSZWN0LnRvcCArIGhvbGRlclJlY3QuaGVpZ2h0IDwgZWxSZWN0LnRvcCArIGVsUmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDQwMCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dEcm9wZG93bigpIHtcbiAgICBpZiAodGhpcy5tZXRhLnN1Z2dlc3Rpb25zICYmIHRoaXMubWV0YS5zdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnVmx0LWRyb3Bkb3duLS1leHBhbmRlZCcpO1xuICAgICAgdGhpcy5lbnN1cmVEcm9wZG93bklzVmlzaWJsZSgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMua2V5TGlzdGVuZXJBY3RpdmUpIHtcbiAgICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrb3V0KTtcbiAgICAgIH0sIDIwMCk7XG4gICAgICB0aGlzLmtleUxpc3RlbmVyQWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZih0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbCAmJiB0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGxldCBzdWdnZXN0aW9uSW5kZXggPSAwOyBzdWdnZXN0aW9uSW5kZXggPCB0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aDsgc3VnZ2VzdGlvbkluZGV4KyspIHtcbiAgICAgICAgICBpZiAodGhpcy5tb2RlbCA9PT0gdGhpcy5zdWdnZXN0aW9uc1tzdWdnZXN0aW9uSW5kZXhdKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9IHN1Z2dlc3Rpb25JbmRleDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xpY2tvdXQgPSAoZXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNsYXNzTmFtZSA9PT0gJ1ZsdC1kcm9wZG93bl9fbGluaycgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgLy8gdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICAgIC8vIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IGV2ZW50LnRhcmdldC50ZXh0Q29udGVudDtcblxuICAgIH0gZWxzZSBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmlucHV0ICYmIGV2ZW50LnRhcmdldC5jbGFzc05hbWUgIT09ICdWbHQtZHJvcGRvd25fX3RpdGxlJykge1xuICAgICAgdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzoge1xuICAgICAgICBpZiAoWydkYXRldGltZScsICd0aW1lJywgJ2RhdGUnLCAnZGF0ZXRpbWUtbG9jYWwnXS5pbmRleE9mKHRoaXMubWV0YS5zdWJ0eXBlIHx8IHRoaXMubWV0YS50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dEcm9wZG93bigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4Kys7XG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID49IHRoaXMuc3VnZ2VzdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgaWYgKFsnZGF0ZXRpbWUnLCAndGltZScsICdkYXRlJywgJ2RhdGV0aW1lLWxvY2FsJ10uaW5kZXhPZih0aGlzLm1ldGEuc3VidHlwZSB8fCB0aGlzLm1ldGEudHlwZSkgIT09IC0xKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXgpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID0gdGhpcy5zdWdnZXN0aW9ucy5sZW5ndGggLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4LS07XG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSB0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnU3BhY2UnOlxuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4KSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMub25TdWdnZXN0aW9uU2VsZWN0KGV2ZW50LCB0aGlzLnN1Z2dlc3Rpb25zW3RoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4XSk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRXNjYXBlJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5tb2RlbCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4O1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYXN5bmNTdWdnZXN0aW9ucztcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZih0aGlzLm1vZGVsKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuYXN5bmNTdWdnZXN0aW9ucyA9ICh0aGlzLm1ldGEuc3VnZ2VzdGlvbnMgfHwgW10pLmZpbHRlcigocykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzdWdnZXN0aW9uVGV4dCA9IChzLmlkIHx8IHMudmFsdWUgfHwgcyB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHN1Z2dlc3Rpb25UZXh0LmluZGV4T2YodGhpcy5tb2RlbC50b0xvd2VyQ2FzZSgpKSAhPT0gLTE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBnZXQgc3VnZ2VzdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXN5bmNTdWdnZXN0aW9ucyB8fCB0aGlzLm1ldGEuc3VnZ2VzdGlvbnMgfHwgW107XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9J3ZnaXAtbWV0YS1maWVsZC1wcmV2aWV3JyAqbmdJZj0ncHJldmlldyAmJiBtb2RlbCc+XG4gIDxkaXYgY2xhc3M9J3ZnaXAtbWV0YS1maWVsZC1sYWJlbCc+e3ttZXRhLmxhYmVsIHx8IG1ldGEubmFtZX19PC9kaXY+XG4gIDxkaXYgY2xhc3M9J3ZnaXAtbWV0YS1maWVsZC12YWx1ZSBfX2d1Jz57e21vZGVsfX08L2Rpdj5cbjwvZGl2PlxuPGRpdiAqbmdJZj0nIXByZXZpZXcnIGNsYXNzPVwiVmx0LWZvcm1fX2VsZW1lbnQgVmx0LWZvcm1fX2VsZW1lbnQtLWJpZ1wiIFtuZ0NsYXNzXT1cInsnVmx0LWZvcm1fX2VsZW1lbnQtLWVycm9yJzogZi5pbnZhbGlkICYmICgoZiB8IG1ldGFNb2RlbCkuX3BhcmVudC5zdWJtaXR0ZWQgfHwgKGYgfCBtZXRhTW9kZWwgKS50b3VjaGVkKSwgJ211bHRpcGxlJzogbXVsdGlwbGUsICdoYXMtdmFsdWUnOiBmLnZhbHVlLCBhY3RpdmU6IGtleUxpc3RlbmVyQWN0aXZlIH1cIj5cbiAgPGRpdiAqbmdJZj0nbXVsdGlwbGUnIGNsYXNzPSdpdGVtcy1jb250YWluZXInPlxuICAgIDxkaXYgKm5nSWY9J21vZGVsJyBjbGFzcz0nYmFkZ2VzLWNvbnRhaW5lciBrZWVwLWZvY3VzJyAoY2xpY2spPSdmb2N1cygpJz5cbiAgICAgIDxkaXYgKm5nRm9yPSdsZXQgaXRlbSBvZiBtb2RlbCcgY2xhc3M9XCJWbHQtYmFkZ2UgVmx0LWJhZGdlLS1hcHAgVmx0LWJhZGdlLS1sYXJnZSBrZWVwLWZvY3VzXCI+XG4gICAgICAgIHt7aXRlbX19XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJWbHQtYmFkZ2VfX2Rpc21pc3Mga2VlcC1mb2N1c1wiIChjbGljayk9J3JlbW92ZSgkZXZlbnQsIGl0ZW0pJz48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIlZsdC1pbnB1dCBWbHQtZHJvcGRvd25cIiBzdHlsZT0nZGlzcGxheTogYmxvY2s7Jz5cbiAgICA8bGFiZWwgY2xhc3M9J3dyYXBwZXInPlxuICAgICAgPGlucHV0IGNsYXNzPSdtYWluIG1vZGVsJyBbcGF0dGVybl09XCJ2YWxpZGF0aW9ucy5wYXR0ZXJuID8gdmFsaWRhdGlvbnMucGF0dGVybi52YWx1ZSB8fCB2YWxpZGF0aW9ucy5wYXR0ZXJuIDogbnVsbFwiIFtyZXF1aXJlZF09J3ZhbGlkYXRpb25zLnJlcXVpcmVkJyBbbWlubGVuZ3RoXT0ndmFsaWRhdGlvbnMubWlubGVuZ3RoJyBbbWF4bGVuZ3RoXT0ndmFsaWRhdGlvbnMubWF4bGVuZ3RoJyBbbWluXT0ndmFsaWRhdGlvbnMubWluJyBbbWF4XT0ndmFsaWRhdGlvbnMubWF4JyBbc3RlcF09J3ZhbGlkYXRpb25zLnN0ZXAnIFtkaXNhYmxlZF09J2Rpc2FibGVkJyBbcmVhZG9ubHldPVwicmVhZG9ubHlcIiBbKG5nTW9kZWwpXT0nbW9kZWwnIChuZ01vZGVsQ2hhbmdlKT1cIm9uTW9kZWxDaGFuZ2UoJGV2ZW50KVwiICNmPSduZ01vZGVsJyBbbmFtZV09J25hbWUnIFt0eXBlXT1cIm11bHRpcGxlID8gJ2hpZGRlbicgOiAobWV0YS5zdWJ0eXBlIHx8ICd0ZXh0JylcIiBwbGFjZWhvbGRlcj1cIiBcIiAoY2xpY2spPSdvbkFjdGl2YXRlZCgkZXZlbnQpJyAoZm9jdXMpPSdvbkFjdGl2YXRlZCgkZXZlbnQpJyAoYmx1cik9J29uQmx1cigkZXZlbnQpJy8+XG4gICAgICA8aW5wdXQgKm5nSWY9J211bHRpcGxlJyBjbGFzcz0nbWFpbicgW3BhdHRlcm5dPVwidmFsaWRhdGlvbnMucGF0dGVybiA/IHZhbGlkYXRpb25zLnBhdHRlcm4udmFsdWUgfHwgdmFsaWRhdGlvbnMucGF0dGVybiA6IG51bGxcIiBbbWlubGVuZ3RoXT0ndmFsaWRhdGlvbnMubWlubGVuZ3RoJyBbbWF4bGVuZ3RoXT0ndmFsaWRhdGlvbnMubWF4bGVuZ3RoJyBbbWluXT0ndmFsaWRhdGlvbnMubWluJyBbbWF4XT0ndmFsaWRhdGlvbnMubWF4JyBbKG5nTW9kZWwpXT0nYWRkVGV4dCcgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCIgW3R5cGVdPVwibWV0YS5zdWJ0eXBlIHx8ICd0ZXh0J1wiIFtkaXNhYmxlZF09J2Rpc2FibGVkJyBbcmVhZG9ubHldPSdyZWFkb25seScgcGxhY2Vob2xkZXI9XCIrQWRkXCIgKGtleWRvd24uZW50ZXIpPSdvbkFkZCgkZXZlbnQpJyAoY2xpY2spPSdvbkFjdGl2YXRlZCgkZXZlbnQpJyAoZm9jdXMpPSdvbkFjdGl2YXRlZCgkZXZlbnQpJyAoYmx1cik9J29uQmx1cigkZXZlbnQpJy8+XG4gICAgICA8bGFiZWwgY2xhc3M9J1ZsdC10cnVuY2F0ZSc+e3ttZXRhLmxhYmVsIHx8IG1ldGEubmFtZX19PHNwYW4gKm5nSWY9J3ZhbGlkYXRpb25zLnJlcXVpcmVkJyBjbGFzcz0nVmx0LXJlZCc+Kjwvc3Bhbj4mbmJzcDs8c3BhbiBjbGFzcz0nVmx0LWJsYWNrJyAqbmdJZj0nbW9kZWwgJiYgbXVsdGlwbGUnPih7e21vZGVsLmxlbmd0aH19KTwvc3Bhbj48L2xhYmVsPlxuICAgIDwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz0nVmx0LWNvbXBvc2l0ZV9fYXBwZW5kIHJpZ2h0LWFjdGlvbnMnPlxuICAgICAgPGRpdiAqbmdJZj0nbW9kZWwgJiYgc2hvd0NsZWFyJyBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX2FwcGVuZC0taWNvblwiIChjbGljayk9J2NsZWFyKCRldmVudCknPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWNvbXBvc2l0ZV9faWNvblwiPlxuICAgICAgICAgIDxzdmc+PHVzZSB4bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLWNyb3NzXCIvPjwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gPGRpdiAqbmdJZj1cIiFtZXRhLnN1YnR5cGUgfHwgbWV0YS5zdWJ0eXBlID09ICd0ZXh0J1wiIGNsYXNzPVwiVmx0LWNvbXBvc2l0ZV9fYXBwZW5kIFZsdC1jb21wb3NpdGVfX2FwcGVuZC0taWNvblwiIHN0eWxlPSdib3R0b206IDdweDsgcmlnaHQ6IDEwcHg7IHBhZGRpbmc6IDNweDsgd2lkdGg6IGluaXRpYWw7IGhlaWdodDogaW5pdGlhbDsgY3Vyc29yOiBwb2ludGVyOyc+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIW1ldGEudHlwZSB8fCBtZXRhLnR5cGUgPT09ICdzdHJpbmcnXCIgY2xhc3M9XCJWbHQtY29tcG9zaXRlX19pY29uXCIgKGNsaWNrKT0ndGV4dFRvU3BlZWNoKCknPlxuICAgICAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1taWNyb3Bob25lXCIvPjwvc3ZnPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJzdWdnZXN0aW9ucy5sZW5ndGhcIiBjbGFzcz1cIlZsdC1kcm9wZG93bl9fcGFuZWxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJWbHQtZHJvcGRvd25fX3BhbmVsX19jb250ZW50IFZsdC1kcm9wZG93bl9fcGFuZWxfX2NvbnRlbnQtLXNjcm9sbC1hcmVhIHN1Z2dlc3Rpb25zXCI+XG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIlZsdC1kcm9wZG93bl9fdGl0bGVcIiBzdHlsZT0ncGFkZGluZy1sZWZ0OiAxM3B4Oyc+XG4gICAgICAgICAgU3VnZ2VzdGlvbnNcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX19jbG9zZSBWbHQtd2hpdGVcIiAoY2xpY2spPSdkaXNtaXNzRHJvcGRvd24oJGV2ZW50KSc+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPSdWbHQtaWNvbiBWbHQtaWNvbi0tc21hbGwnPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1jcm9zc1wiLz48L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWRyb3Bkb3duX19ibG9ja1wiPjwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPSdkcm9wZG93bicgY2xhc3M9XCJWbHQtZHJvcGRvd25fX3Njcm9sbFwiPlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyAnVmx0LWRyb3Bkb3duX19saW5rLS1zZWxlY3RlZCc6IChhY3RpdmVTdWdnZXN0aW9uSW5kZXggPT09IGkpIH1cIiAoY2xpY2spPSdvblN1Z2dlc3Rpb25TZWxlY3QoJGV2ZW50LCBzdWdnZXN0aW9uKScgKm5nRm9yPSdsZXQgc3VnZ2VzdGlvbiBvZiBzdWdnZXN0aW9uczsgbGV0IGkgPSBpbmRleCcgY2xhc3M9XCJWbHQtZHJvcGRvd25fX2xpbmtcIiBzdHlsZT0ncGFkZGluZzogMDsnPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj0nbXVsdGlwbGUnIGNsYXNzPVwiVmx0LWNoZWNrYm94XCIgc3R5bGU9J3dpZHRoOiAxMDAlOyc+XG4gICAgICAgICAgICAgIDxsYWJlbCBbdGl0bGVdPSdzdWdnZXN0aW9uLmxhYmVsIHx8IHN1Z2dlc3Rpb24nPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiVmx0LWNoZWNrYm94X19idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09J21vZGVsICYmIG1vZGVsLmluZGV4T2Yoc3VnZ2VzdGlvbikgIT09IC0xJy8+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIlZsdC1jaGVja2JveF9faWNvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAge3tzdWdnZXN0aW9uLmxhYmVsIHx8IHN1Z2dlc3Rpb259fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPSchbXVsdGlwbGUnIHN0eWxlPSdwYWRkaW5nOiAxMnB4IDIwcHg7Jz5cbiAgICAgICAgICAgICAge3tzdWdnZXN0aW9uLmxhYmVsIHx8IHN1Z2dlc3Rpb259fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPSchbXVsdGlwbGUnIGNsYXNzPVwiVmx0LWRyb3Bkb3duX19ibG9ja1wiPjwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPSdtdWx0aXBsZScgY2xhc3M9XCJWbHQtZHJvcGRvd25fX2Jsb2NrIFZsdC1kcm9wZG93bl9fYmxvY2stLW5vd3JhcFwiIHN0eWxlPSdwYWRkaW5nOiA4cHggMTZweCAxNnB4Oyc+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPSdjbGVhcigkZXZlbnQpJyB0eXBlPSdidXR0b24nIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS1zZWNvbmRhcnkgVmx0LWJ0bi0tYXBwIFZsdC1idG4tLXNtYWxsIFZsdC1idG4tLW91dGxpbmVcIj5DbGVhciBhbGw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9J2Rpc21pc3NEcm9wZG93bigkZXZlbnQpJyB0eXBlPSdidXR0b24nIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS1zZWNvbmRhcnkgVmx0LWJ0bi0tYXBwIFZsdC1idG4tLXNtYWxsXCI+RG9uZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPHNtYWxsICpuZ0lmPSdmLmludmFsaWQgJiYgKChmIHwgbWV0YU1vZGVsKS5fcGFyZW50LnN1Ym1pdHRlZCB8fCAoKGYgfCBtZXRhTW9kZWwgKS50b3VjaGVkICYmIGtleUxpc3RlbmVyQWN0aXZlKSknIGNsYXNzPVwiVmx0LWZvcm1fX2VsZW1lbnRfX2Vycm9yXCI+XG4gICAgPHNwYW4gKm5nSWY9XCJmLmVycm9ycy5yZXF1aXJlZFwiPlJlcXVpcmVkLiZuYnNwOzwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cImYuZXJyb3JzLm1pbmxlbmd0aFwiPk11c3QgYmUgbG9uZ2VyIHRoYW4ge3t2YWxpZGF0aW9ucy5taW5sZW5ndGh9fSBjaGFyYWN0ZXJzLiZuYnNwOzwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cImYuZXJyb3JzLm1heGxlbmd0aFwiPk11c3QgYmUgbGVzdCB0aGFuIHt7dmFsaWRhdGlvbnMubWF4bGVuZ3RofX0gY2hhcmFjdGVycy4mbmJzcDs8L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCJmLmVycm9ycy5wYXR0ZXJuXCI+e3sgdmFsaWRhdGlvbnMucGF0dGVybi50ZXh0IHx8IFwiU2hvdWxkIG1hdGNoICdcIit2YWxpZGF0aW9ucy5wYXR0ZXJuK1wiJyBwYXR0ZXJuLlwiIH19LiZuYnNwOzwvc3Bhbj5cbiAgPC9zbWFsbD5cbiAgPHNtYWxsICpuZ0lmPSdtZXRhLmhpbnQnIGNsYXNzPVwiVmx0LWZvcm1fX2VsZW1lbnRfX2hpbnRcIj57e21ldGEuaGludH19PC9zbWFsbD5cbjwvZGl2PlxuIl19