@po-ui/ng-components 16.4.1 → 16.5.0

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 (42) hide show
  1. package/esm2022/lib/components/po-field/po-field.module.mjs +17 -13
  2. package/esm2022/lib/components/po-field/po-lookup/po-lookup-modal/po-lookup-modal.component.mjs +4 -4
  3. package/esm2022/lib/components/po-field/po-multiselect/po-multiselect-base.component.mjs +30 -7
  4. package/esm2022/lib/components/po-field/po-multiselect/po-multiselect-dropdown/po-multiselect-dropdown.component.mjs +4 -4
  5. package/esm2022/lib/components/po-field/po-multiselect/po-multiselect-literals.interface.mjs +1 -1
  6. package/esm2022/lib/components/po-field/po-multiselect/po-multiselect.component.mjs +220 -51
  7. package/esm2022/lib/components/po-field/po-rich-text/po-rich-text-toolbar/po-rich-text-toolbar.component.mjs +3 -3
  8. package/esm2022/lib/components/po-listbox/po-item-list/po-item-list.component.mjs +2 -2
  9. package/esm2022/lib/components/po-table/po-table-base.component.mjs +5 -5
  10. package/esm2022/lib/components/po-tag/index.mjs +2 -1
  11. package/esm2022/lib/components/po-tag/interfaces/po-tag-literals.interface.mjs +2 -0
  12. package/esm2022/lib/components/po-tag/po-tag-base.component.mjs +70 -4
  13. package/esm2022/lib/components/po-tag/po-tag.component.mjs +52 -44
  14. package/esm2022/lib/enums/po-key-code.enum.mjs +5 -1
  15. package/fesm2022/po-ui-ng-components.mjs +701 -532
  16. package/fesm2022/po-ui-ng-components.mjs.map +1 -1
  17. package/lib/components/po-field/po-field.module.d.ts +44 -44
  18. package/lib/components/po-field/po-multiselect/po-multiselect-base.component.d.ts +21 -2
  19. package/lib/components/po-field/po-multiselect/po-multiselect-literals.interface.d.ts +2 -0
  20. package/lib/components/po-field/po-multiselect/po-multiselect.component.d.ts +18 -6
  21. package/lib/components/po-table/po-table-base.component.d.ts +2 -2
  22. package/lib/components/po-tag/index.d.ts +1 -0
  23. package/lib/components/po-tag/interfaces/po-tag-literals.interface.d.ts +11 -0
  24. package/lib/components/po-tag/po-tag-base.component.d.ts +50 -2
  25. package/lib/components/po-tag/po-tag.component.d.ts +6 -6
  26. package/lib/enums/po-key-code.enum.d.ts +5 -1
  27. package/package.json +4 -4
  28. package/po-ui-ng-components-16.5.0.tgz +0 -0
  29. package/schematics/ng-add/index.js +1 -1
  30. package/schematics/ng-update/v14/index.js +1 -1
  31. package/schematics/ng-update/v15/index.js +1 -1
  32. package/schematics/ng-update/v16/index.js +1 -1
  33. package/schematics/ng-update/v2/index.js +1 -1
  34. package/schematics/ng-update/v3/index.js +1 -1
  35. package/schematics/ng-update/v4/index.js +1 -1
  36. package/schematics/ng-update/v5/index.js +1 -1
  37. package/schematics/ng-update/v6/index.js +1 -1
  38. package/esm2022/lib/components/po-field/po-multiselect/po-multiselect-search/po-multiselect-search.component.mjs +0 -91
  39. package/esm2022/lib/components/po-tag/po-tag.literals.mjs +0 -15
  40. package/lib/components/po-field/po-multiselect/po-multiselect-search/po-multiselect-search.component.d.ts +0 -40
  41. package/lib/components/po-tag/po-tag.literals.d.ts +0 -14
  42. package/po-ui-ng-components-16.4.1.tgz +0 -0
@@ -1,10 +1,11 @@
1
- import { ChangeDetectionStrategy, Component, ElementRef, forwardRef, ViewChild, ContentChild } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, ViewChild, forwardRef } from '@angular/core';
2
2
  import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { of } from 'rxjs';
4
- import { tap, catchError } from 'rxjs/operators';
5
- import { isMobile } from './../../../utils/util';
6
- import { PoControlPositionService } from './../../../services/po-control-position/po-control-position.service';
3
+ import { Subscription, fromEvent, of } from 'rxjs';
4
+ import { catchError, tap } from 'rxjs/operators';
7
5
  import { PoKeyCodeEnum } from './../../../enums/po-key-code.enum';
6
+ import { PoControlPositionService } from './../../../services/po-control-position/po-control-position.service';
7
+ import { isMobile } from './../../../utils/util';
8
+ import { poLocaleDefault } from '../../../services/po-language/po-language.constant';
8
9
  import { PoMultiselectBaseComponent } from './po-multiselect-base.component';
9
10
  import { PoMultiselectFilterService } from './po-multiselect-filter.service';
10
11
  import { PoMultiselectOptionTemplateDirective } from './po-multiselect-option-template/po-multiselect-option-template.directive';
@@ -22,18 +23,19 @@ function PoMultiselectComponent_span_5_Template(rf, ctx) { if (rf & 1) {
22
23
  } if (rf & 2) {
23
24
  const ctx_r2 = i0.ɵɵnextContext();
24
25
  i0.ɵɵadvance(1);
25
- i0.ɵɵtextInterpolate1(" ", ctx_r2.placeholder, " ");
26
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.placeholder ? ctx_r2.placeholder : ctx_r2.literals.selectItem, " ");
26
27
  } }
27
- function PoMultiselectComponent_po_disclaimer_6_Template(rf, ctx) { if (rf & 1) {
28
- const _r14 = i0.ɵɵgetCurrentView();
29
- i0.ɵɵelementStart(0, "po-disclaimer", 16);
30
- i0.ɵɵlistener("click", function PoMultiselectComponent_po_disclaimer_6_Template_po_disclaimer_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r14); const disclaimer_r12 = restoredCtx.$implicit; const ctx_r13 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r13.openDropdown(disclaimer_r12[ctx_r13.fieldValue] === "")); })("p-close-action", function PoMultiselectComponent_po_disclaimer_6_Template_po_disclaimer_p_close_action_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r14); const disclaimer_r12 = restoredCtx.$implicit; const ctx_r15 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r15.closeDisclaimer(disclaimer_r12[ctx_r15.fieldValue])); });
28
+ function PoMultiselectComponent_po_tag_6_Template(rf, ctx) { if (rf & 1) {
29
+ const _r15 = i0.ɵɵgetCurrentView();
30
+ i0.ɵɵelementStart(0, "po-tag", 16);
31
+ i0.ɵɵlistener("p-close", function PoMultiselectComponent_po_tag_6_Template_po_tag_p_close_0_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r15); const tag_r12 = restoredCtx.$implicit; const ctx_r14 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r14.closeTag(tag_r12[ctx_r14.fieldValue], $event)); });
31
32
  i0.ɵɵelementEnd();
32
33
  } if (rf & 2) {
33
- const disclaimer_r12 = ctx.$implicit;
34
+ const tag_r12 = ctx.$implicit;
35
+ const i_r13 = ctx.index;
34
36
  const ctx_r3 = i0.ɵɵnextContext();
35
- i0.ɵɵclassProp("po-clickable", disclaimer_r12[ctx_r3.fieldValue] === "" && !ctx_r3.disabled);
36
- i0.ɵɵproperty("p-label", disclaimer_r12[ctx_r3.fieldLabel])("p-value", disclaimer_r12[ctx_r3.fieldValue])("p-hide-close", disclaimer_r12[ctx_r3.fieldValue] === "" || ctx_r3.disabled);
37
+ i0.ɵɵclassProp("po-clickable", tag_r12[ctx_r3.fieldValue] === "" && !ctx_r3.disabled);
38
+ i0.ɵɵproperty("p-value", tag_r12[ctx_r3.fieldLabel])("p-literals", i_r13 + 1 === ctx_r3.visibleTags.length && ctx_r3.hasMoreTag ? ctx_r3.literalsTag : undefined)("p-removable", true)("p-disabled", ctx_r3.disabled);
37
39
  } }
38
40
  function PoMultiselectComponent_ng_container_10_Template(rf, ctx) { if (rf & 1) {
39
41
  i0.ɵɵelementContainer(0);
@@ -68,7 +70,7 @@ function PoMultiselectComponent_ng_template_13_Template(rf, ctx) { if (rf & 1) {
68
70
  function PoMultiselectComponent_ng_template_16_Template(rf, ctx) { if (rf & 1) {
69
71
  const _r21 = i0.ɵɵgetCurrentView();
70
72
  i0.ɵɵelementStart(0, "po-multiselect-dropdown", 19, 20);
71
- i0.ɵɵlistener("p-change", function PoMultiselectComponent_ng_template_16_Template_po_multiselect_dropdown_p_change_0_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r20 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r20.changeItems($event)); })("p-change-search", function PoMultiselectComponent_ng_template_16_Template_po_multiselect_dropdown_p_change_search_0_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r22 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r22.changeSearch($event)); })("p-close-dropdown", function PoMultiselectComponent_ng_template_16_Template_po_multiselect_dropdown_p_close_dropdown_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r23 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r23.controlDropdownVisibility(false)); });
73
+ i0.ɵɵlistener("p-change", function PoMultiselectComponent_ng_template_16_Template_po_multiselect_dropdown_p_change_0_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r20 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r20.changeItems($event)); })("p-change-search", function PoMultiselectComponent_ng_template_16_Template_po_multiselect_dropdown_p_change_search_0_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r22 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r22.changeSearch($event)); })("p-close-dropdown", function PoMultiselectComponent_ng_template_16_Template_po_multiselect_dropdown_p_close_dropdown_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r23 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r23.controlDropdownVisibility(false)); })("keydown", function PoMultiselectComponent_ng_template_16_Template_po_multiselect_dropdown_keydown_0_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r24 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r24.onKeyDownDropdown($event, 0)); });
72
74
  i0.ɵɵelementEnd();
73
75
  } if (rf & 2) {
74
76
  const ctx_r11 = i0.ɵɵnextContext();
@@ -76,6 +78,22 @@ function PoMultiselectComponent_ng_template_16_Template(rf, ctx) { if (rf & 1) {
76
78
  } }
77
79
  const poMultiselectContainerOffset = 8;
78
80
  const poMultiselectContainerPositionDefault = 'bottom';
81
+ const poMultiselectInputPaddingRight = 52;
82
+ const poMultiselectSpaceBetweenTags = 8;
83
+ const literalsTagRemoveOthers = {
84
+ pt: {
85
+ remove: 'Remover todos os itens selecionados'
86
+ },
87
+ ru: {
88
+ remove: 'Удалить все выбранные элементы'
89
+ },
90
+ es: {
91
+ remove: 'Eliminar todos los elementos seleccionados'
92
+ },
93
+ en: {
94
+ remove: 'Clear all selected items'
95
+ }
96
+ };
79
97
  /* istanbul ignore next */
80
98
  const providers = [
81
99
  PoMultiselectFilterService,
@@ -146,13 +164,16 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
146
164
  dropdown;
147
165
  iconElement;
148
166
  inputElement;
149
- disclaimerOffset = 0;
167
+ literalsTag;
150
168
  dropdownIcon = 'po-icon-arrow-down';
151
169
  dropdownOpen = false;
152
170
  initialized = false;
153
- positionDisclaimerExtra;
171
+ hasMoreTag;
154
172
  timeoutResize;
155
173
  visibleElement = false;
174
+ subscription = new Subscription();
175
+ enterCloseTag = false;
176
+ initCalculateItems = true;
156
177
  isCalculateVisibleItems = true;
157
178
  cacheOptions;
158
179
  constructor(renderer, changeDetector, el, controlPosition, defaultService, languageService) {
@@ -162,6 +183,11 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
162
183
  this.el = el;
163
184
  this.controlPosition = controlPosition;
164
185
  this.defaultService = defaultService;
186
+ const language = languageService.getShortLanguage();
187
+ this.literalsTag = {
188
+ ...literalsTagRemoveOthers[poLocaleDefault],
189
+ ...literalsTagRemoveOthers[language]
190
+ };
165
191
  }
166
192
  ngAfterViewInit() {
167
193
  if (this.autoFocus) {
@@ -176,7 +202,7 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
176
202
  }
177
203
  ngDoCheck() {
178
204
  const inputWidth = this.inputElement.nativeElement.offsetWidth;
179
- // Permite que os disclaimers sejam calculados na primeira vez que o componente torna-se visível,
205
+ // Permite que as tags sejam calculadas na primeira vez que o componente torna-se visível,
180
206
  // evitando com isso, problemas com Tabs ou Divs que iniciem escondidas.
181
207
  if ((inputWidth && !this.visibleElement && this.initialized) || (inputWidth && this.isCalculateVisibleItems)) {
182
208
  this.debounceResize();
@@ -187,6 +213,7 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
187
213
  this.removeListeners();
188
214
  this.getObjectsByValuesSubscription?.unsubscribe();
189
215
  this.filterSubject?.unsubscribe();
216
+ this.subscription.unsubscribe();
190
217
  }
191
218
  /**
192
219
  * Função que atribui foco ao componente.
@@ -211,46 +238,54 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
211
238
  }
212
239
  }
213
240
  getInputWidth() {
214
- return this.el.nativeElement.querySelector('.po-input').offsetWidth - 40;
241
+ return this.el.nativeElement.querySelector('.po-multiselect-input').offsetWidth - poMultiselectInputPaddingRight;
215
242
  }
216
- getDisclaimersWidth() {
217
- const disclaimers = this.el.nativeElement.querySelectorAll('po-disclaimer');
218
- return Array.from(disclaimers).map(disclaimer => disclaimer['offsetWidth']);
243
+ getTagsWidth() {
244
+ const tags = this.el.nativeElement.querySelectorAll('po-tag');
245
+ return Array.from(tags).map(tag => tag['offsetWidth']);
219
246
  }
220
247
  calculateVisibleItems() {
221
- const disclaimersWidth = this.getDisclaimersWidth();
248
+ this.hasMoreTag = false;
249
+ const tagsWidth = this.getTagsWidth();
222
250
  const inputWidth = this.getInputWidth();
223
- const extraDisclaimerSize = 38;
224
- const disclaimersVisible = disclaimersWidth[0];
225
- this.visibleDisclaimers = [];
251
+ const extraTagSize = 63;
252
+ const tagsVisible = tagsWidth[0];
253
+ this.visibleTags = [];
226
254
  if (inputWidth > 0) {
227
255
  let sum = 0;
228
256
  let i = 0;
229
257
  for (i = 0; i < this.selectedOptions.length; i++) {
230
- sum += disclaimersWidth[i];
231
- this.visibleDisclaimers.push(this.selectedOptions[i]);
258
+ sum += tagsWidth[i] + poMultiselectSpaceBetweenTags;
259
+ this.visibleTags.push(this.selectedOptions[i]);
232
260
  if (sum > inputWidth) {
233
- sum -= disclaimersWidth[i];
261
+ sum -= tagsWidth[i];
234
262
  this.isCalculateVisibleItems = false;
235
263
  break;
236
264
  }
237
265
  }
238
- if (disclaimersVisible || !this.selectedOptions.length) {
266
+ if (tagsVisible || !this.selectedOptions.length) {
239
267
  if (i === this.selectedOptions.length) {
240
268
  this.isCalculateVisibleItems = false;
241
269
  return;
242
270
  }
243
- if (sum + extraDisclaimerSize > inputWidth) {
244
- this.visibleDisclaimers.splice(-2, 2);
271
+ this.hasMoreTag = true;
272
+ if (sum + extraTagSize > inputWidth) {
273
+ this.visibleTags.splice(-2, 2);
245
274
  const label = '+' + (this.selectedOptions.length + 1 - i).toString();
246
- this.visibleDisclaimers.push({ [this.fieldValue]: '', [this.fieldLabel]: label });
275
+ this.visibleTags.push({ [this.fieldValue]: '', [this.fieldLabel]: label });
247
276
  }
248
277
  else {
249
- this.visibleDisclaimers.splice(-1, 1);
278
+ this.visibleTags.splice(-1, 1);
250
279
  const label = '+' + (this.selectedOptions.length - i).toString();
251
- this.visibleDisclaimers.push({ [this.fieldValue]: '', [this.fieldLabel]: label });
280
+ this.visibleTags.push({ [this.fieldValue]: '', [this.fieldLabel]: label });
252
281
  }
253
282
  }
283
+ if (this.initCalculateItems) {
284
+ setTimeout(() => {
285
+ this.handleKeyboardNavigationTag();
286
+ }, 300);
287
+ }
288
+ this.initCalculateItems = false;
254
289
  }
255
290
  this.changeDetector.markForCheck();
256
291
  }
@@ -261,10 +296,13 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
261
296
  this.changeDetector.detectChanges();
262
297
  this.adjustContainerPosition();
263
298
  }
299
+ setTimeout(() => {
300
+ this.handleKeyboardNavigationTag();
301
+ }, 300);
264
302
  }
265
303
  updateVisibleItems() {
266
304
  if (this.selectedOptions) {
267
- this.visibleDisclaimers = [].concat(this.selectedOptions);
305
+ this.visibleTags = [].concat(this.selectedOptions);
268
306
  }
269
307
  this.debounceResize();
270
308
  // quando estiver dentro de modal
@@ -282,17 +320,45 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
282
320
  this.changeDetector.markForCheck();
283
321
  }
284
322
  onBlur() {
323
+ if (typeof this.inputElement.nativeElement.getAttribute('aria-label') === 'string' &&
324
+ this.inputElement.nativeElement.getAttribute('aria-label').includes('Unselected')) {
325
+ this.inputElement.nativeElement.setAttribute('aria-label', this.label ? this.label : '');
326
+ }
285
327
  this.onModelTouched?.();
286
328
  }
287
329
  onKeyDown(event) {
288
- if (event.keyCode === PoKeyCodeEnum.arrowUp || event.keyCode === PoKeyCodeEnum.arrowDown) {
330
+ if ((event.keyCode === PoKeyCodeEnum.tab && this.visibleTags.length > 1) ||
331
+ (event.keyCode === PoKeyCodeEnum.tab && this.visibleTags.length < 1)) {
332
+ return;
333
+ }
334
+ if (event.keyCode === PoKeyCodeEnum.esc) {
335
+ event.preventDefault();
336
+ this.controlDropdownVisibility(false);
337
+ return;
338
+ }
339
+ if (event.keyCode === PoKeyCodeEnum.arrowDown && this.visibleTags.length > 0) {
289
340
  event.preventDefault();
290
341
  this.controlDropdownVisibility(true);
342
+ this.dropdown?.listbox?.setFocus();
291
343
  return;
292
344
  }
293
- if (event.keyCode === PoKeyCodeEnum.tab) {
294
- this.controlDropdownVisibility(false);
345
+ if (event.keyCode === PoKeyCodeEnum.enter && !this.enterCloseTag) {
346
+ if (this.visibleTags.length === 0) {
347
+ this.toggleDropdownVisibility();
348
+ this.focus();
349
+ return;
350
+ }
351
+ else {
352
+ event.preventDefault();
353
+ this.toggleDropdownVisibility();
354
+ return;
355
+ }
356
+ }
357
+ if (event.keyCode === PoKeyCodeEnum.space) {
358
+ event.preventDefault();
359
+ this.toggleDropdownVisibility();
295
360
  }
361
+ this.enterCloseTag = false;
296
362
  }
297
363
  toggleDropdownVisibility() {
298
364
  if (this.disabled) {
@@ -303,6 +369,13 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
303
369
  }
304
370
  this.controlDropdownVisibility(!this.dropdownOpen);
305
371
  }
372
+ onKeyDownDropdown(event, index) {
373
+ if (event.key === 'Escape') {
374
+ event.preventDefault();
375
+ this.controlDropdownVisibility(false);
376
+ this.inputElement.nativeElement.focus();
377
+ }
378
+ }
306
379
  openDropdown(toOpen) {
307
380
  if (toOpen && !this.disabled) {
308
381
  this.controlDropdownVisibility(true);
@@ -336,11 +409,29 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
336
409
  // timeout necessário para reposicionar corretamente quando dropdown estiver pra cima do input e realizar busca no input
337
410
  setTimeout(() => this.adjustContainerPosition());
338
411
  }
339
- closeDisclaimer(value) {
340
- const index = this.selectedOptions.findIndex(option => option[this.fieldValue] === value);
341
- this.selectedOptions.splice(index, 1);
342
- this.updateVisibleItems();
343
- this.callOnChange(this.selectedOptions);
412
+ closeTag(value, event) {
413
+ let index;
414
+ this.enterCloseTag = true;
415
+ if (!value || (typeof value === 'string' && value.includes('+'))) {
416
+ index = null;
417
+ const itemsNotInVisibleTags = this.selectedOptions.filter(option => !this.visibleTags.includes(option));
418
+ for (const option of this.visibleTags) {
419
+ if (!this.selectedOptions.includes(option)) {
420
+ this.selectedOptions.splice(this.visibleTags.length - 1, itemsNotInVisibleTags.length);
421
+ this.updateVisibleItems();
422
+ this.callOnChange(this.selectedOptions);
423
+ }
424
+ }
425
+ }
426
+ else {
427
+ index = this.selectedOptions.findIndex(option => option[this.fieldValue] === value);
428
+ this.selectedOptions.splice(index, 1);
429
+ this.updateVisibleItems();
430
+ this.callOnChange(this.selectedOptions);
431
+ }
432
+ setTimeout(() => {
433
+ this.focusOnNextTag(index, event);
434
+ }, 300);
344
435
  }
345
436
  wasClickedOnToggle(event) {
346
437
  if (this.dropdownOpen &&
@@ -389,6 +480,84 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
389
480
  this.setVisibleOptionsDropdown(this.options);
390
481
  this.removeListeners();
391
482
  }
483
+ focusOnNextTag(indexClosed, clickOrEnter) {
484
+ if (clickOrEnter === 'enter') {
485
+ const tagRemoveElements = this.el.nativeElement.querySelectorAll('.po-tag-remove');
486
+ indexClosed = indexClosed || indexClosed === 0 ? indexClosed : tagRemoveElements.length;
487
+ if (tagRemoveElements.length === 0) {
488
+ this.inputElement.nativeElement.focus();
489
+ this.inputElement.nativeElement.setAttribute('aria-label', `Unselected items ${this.label}`);
490
+ this.controlDropdownVisibility(true);
491
+ }
492
+ this.focusOnRemoveTag(tagRemoveElements, indexClosed);
493
+ }
494
+ else {
495
+ indexClosed = 0;
496
+ }
497
+ this.handleKeyboardNavigationTag(indexClosed);
498
+ }
499
+ focusOnRemoveTag(tag, indexClosed) {
500
+ if (tag.length === indexClosed) {
501
+ tag[indexClosed - 1]?.focus();
502
+ }
503
+ else {
504
+ tag[indexClosed]?.focus();
505
+ }
506
+ }
507
+ handleKeyboardNavigationTag(initialIndex = 0) {
508
+ this.subscription.unsubscribe();
509
+ this.subscription = new Subscription();
510
+ const tagRemoveElements = this.el.nativeElement.querySelectorAll('.po-tag-remove');
511
+ this.initializeTagRemoveElements(tagRemoveElements, initialIndex);
512
+ }
513
+ setTabIndex(element, tabIndex) {
514
+ element.setAttribute('tabindex', tabIndex);
515
+ }
516
+ handleArrowLeft(tagRemoveElements, index) {
517
+ if (index > 0) {
518
+ this.setTabIndex(tagRemoveElements[index], -1);
519
+ tagRemoveElements[index - 1].focus();
520
+ this.setTabIndex(tagRemoveElements[index - 1], 0);
521
+ }
522
+ }
523
+ handleArrowRight(tagRemoveElements, index) {
524
+ if (index < tagRemoveElements.length - 1) {
525
+ this.setTabIndex(tagRemoveElements[index], -1);
526
+ tagRemoveElements[index + 1].focus();
527
+ this.setTabIndex(tagRemoveElements[index + 1], 0);
528
+ }
529
+ }
530
+ handleKeyDown(event, tagRemoveElements, index) {
531
+ const KEY_SPACE = 'Space';
532
+ const KEY_ARROW_LEFT = 'ArrowLeft';
533
+ const KEY_ARROW_RIGHT = 'ArrowRight';
534
+ if (event.code === KEY_SPACE) {
535
+ event.preventDefault();
536
+ event.stopPropagation();
537
+ }
538
+ if (event.key === KEY_ARROW_LEFT) {
539
+ this.handleArrowLeft(tagRemoveElements, index);
540
+ }
541
+ else if (event.key === KEY_ARROW_RIGHT) {
542
+ this.handleArrowRight(tagRemoveElements, index);
543
+ }
544
+ }
545
+ initializeTagRemoveElements(tagRemoveElements, initialIndex) {
546
+ tagRemoveElements.forEach((tagRemoveElement, index) => {
547
+ if (index === initialIndex) {
548
+ this.setTabIndex(tagRemoveElements[initialIndex], 0);
549
+ }
550
+ else if (tagRemoveElements.length === initialIndex) {
551
+ this.setTabIndex(tagRemoveElements[initialIndex - 1], 0);
552
+ }
553
+ else {
554
+ this.setTabIndex(tagRemoveElement, -1);
555
+ }
556
+ this.subscription.add(fromEvent(tagRemoveElement, 'keydown').subscribe((event) => {
557
+ this.handleKeyDown(event, tagRemoveElements, index);
558
+ }));
559
+ });
560
+ }
392
561
  initializeListeners() {
393
562
  this.clickOutListener = this.renderer.listen('document', 'click', (event) => {
394
563
  this.wasClickedOnToggle(event);
@@ -443,11 +612,11 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
443
612
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dropdown = _t.first);
444
613
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.iconElement = _t.first);
445
614
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.inputElement = _t.first);
446
- } }, features: [i0.ɵɵProvidersFeature(providers), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 18, vars: 28, consts: [[3, "p-disabled", "p-label", "p-optional", "p-required", "p-show-required"], ["cdkOverlayOrigin", "", 1, "po-field-container-content"], ["trigger", "cdkOverlayOrigin"], [1, "po-input", "po-input-icon-right", "po-multiselect-input", "po-clickable", 3, "tabindex", "keyup.enter", "keydown", "click", "blur"], ["inputElement", ""], ["class", "po-multiselect-input-placeholder", 4, "ngIf"], ["class", "po-multiselect-input-disclaimer", 3, "p-label", "p-value", "p-hide-close", "po-clickable", "click", "p-close-action", 4, "ngFor", "ngForOf"], [1, "po-field-icon-container-right"], [3, "ngClass"], ["iconElement", ""], [4, "ngIf", "ngIfThen", "ngIfElse"], ["dropdownDefault", ""], ["dropdownCDK", ""], [3, "p-help", "p-disabled"], ["dropdownListbox", ""], [1, "po-multiselect-input-placeholder"], [1, "po-multiselect-input-disclaimer", 3, "p-label", "p-value", "p-hide-close", "click", "p-close-action"], [4, "ngTemplateOutlet"], ["cdkConnectedOverlay", "", 3, "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen"], [3, "p-searching", "p-hide-search", "p-hide-select-all", "p-literals", "p-options", "p-visible-options", "p-selected-options", "p-placeholder-search", "p-field-value", "p-field-label", "p-multiselect-template", "p-change", "p-change-search", "p-close-dropdown"], ["dropdownElement", ""]], template: function PoMultiselectComponent_Template(rf, ctx) { if (rf & 1) {
615
+ } }, features: [i0.ɵɵProvidersFeature(providers), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 18, vars: 30, consts: [[3, "p-disabled", "p-label", "p-optional", "p-required", "p-show-required"], ["cdkOverlayOrigin", "", 1, "po-field-container-content"], ["trigger", "cdkOverlayOrigin"], [1, "po-input-icon-right", "po-multiselect-input", 3, "tabindex", "keydown", "click", "blur"], ["inputElement", ""], ["class", "po-multiselect-input-placeholder", "aria-hidden", "true", 4, "ngIf"], [3, "p-value", "p-literals", "p-removable", "po-clickable", "p-disabled", "p-close", 4, "ngFor", "ngForOf"], [1, "po-field-icon-container-right"], [3, "ngClass"], ["iconElement", ""], [4, "ngIf", "ngIfThen", "ngIfElse"], ["dropdownDefault", ""], ["dropdownCDK", ""], [3, "p-help", "p-disabled"], ["dropdownListbox", ""], ["aria-hidden", "true", 1, "po-multiselect-input-placeholder"], [3, "p-value", "p-literals", "p-removable", "p-disabled", "p-close"], [4, "ngTemplateOutlet"], ["cdkConnectedOverlay", "", 3, "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen"], [3, "p-searching", "p-hide-search", "p-hide-select-all", "p-literals", "p-options", "p-visible-options", "p-selected-options", "p-placeholder-search", "p-field-value", "p-field-label", "p-multiselect-template", "p-change", "p-change-search", "p-close-dropdown", "keydown"], ["dropdownElement", ""]], template: function PoMultiselectComponent_Template(rf, ctx) { if (rf & 1) {
447
616
  i0.ɵɵelementStart(0, "po-field-container", 0)(1, "div", 1, 2)(3, "div", 3, 4);
448
- i0.ɵɵlistener("keyup.enter", function PoMultiselectComponent_Template_div_keyup_enter_3_listener() { return ctx.toggleDropdownVisibility(); })("keydown", function PoMultiselectComponent_Template_div_keydown_3_listener($event) { return ctx.onKeyDown($event); })("click", function PoMultiselectComponent_Template_div_click_3_listener() { return ctx.toggleDropdownVisibility(); })("blur", function PoMultiselectComponent_Template_div_blur_3_listener() { return ctx.onBlur(); });
617
+ i0.ɵɵlistener("keydown", function PoMultiselectComponent_Template_div_keydown_3_listener($event) { return ctx.onKeyDown($event); })("click", function PoMultiselectComponent_Template_div_click_3_listener() { return ctx.toggleDropdownVisibility(); })("blur", function PoMultiselectComponent_Template_div_blur_3_listener() { return ctx.onBlur(); });
449
618
  i0.ɵɵtemplate(5, PoMultiselectComponent_span_5_Template, 2, 1, "span", 5);
450
- i0.ɵɵtemplate(6, PoMultiselectComponent_po_disclaimer_6_Template, 1, 5, "po-disclaimer", 6);
619
+ i0.ɵɵtemplate(6, PoMultiselectComponent_po_tag_6_Template, 1, 6, "po-tag", 6);
451
620
  i0.ɵɵelementStart(7, "div", 7);
452
621
  i0.ɵɵelement(8, "span", 8, 9);
453
622
  i0.ɵɵelementEnd()()();
@@ -464,13 +633,13 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
464
633
  i0.ɵɵadvance(1);
465
634
  i0.ɵɵclassProp("po-multiselect-show", ctx.dropdownOpen);
466
635
  i0.ɵɵadvance(2);
467
- i0.ɵɵclassProp("po-multiselect-input-auto", ctx.autoHeight)("po-multiselect-input-static", !ctx.autoHeight)("po-multiselect-input-disabled", ctx.disabled);
636
+ i0.ɵɵclassProp("po-multiselect-input-auto", ctx.autoHeight)("po-multiselect-input-static", !ctx.autoHeight)("po-multiselect-input-disabled", ctx.disabled)("po-multiselect-input-font", !ctx.disabled && !(ctx.visibleTags == null ? null : ctx.visibleTags.length));
468
637
  i0.ɵɵproperty("tabindex", ctx.disabled ? -1 : 0);
469
638
  i0.ɵɵattribute("disabled", ctx.disabled)("aria-label", ctx.label);
470
639
  i0.ɵɵadvance(2);
471
- i0.ɵɵproperty("ngIf", ctx.placeholder && !ctx.disabled && !(ctx.visibleDisclaimers == null ? null : ctx.visibleDisclaimers.length));
640
+ i0.ɵɵproperty("ngIf", !ctx.disabled && !(ctx.visibleTags == null ? null : ctx.visibleTags.length));
472
641
  i0.ɵɵadvance(1);
473
- i0.ɵɵproperty("ngForOf", ctx.visibleDisclaimers);
642
+ i0.ɵɵproperty("ngForOf", ctx.visibleTags);
474
643
  i0.ɵɵadvance(2);
475
644
  i0.ɵɵclassMapInterpolate2("po-icon po-field-icon ", ctx.dropdownIcon, " ", ctx.disabled ? "po-icon-input-disabled" : "po-icon-input", "");
476
645
  i0.ɵɵproperty("ngClass", ctx.disabled ? "po-field-icon-disabled" : "");
@@ -482,7 +651,7 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
482
651
  }
483
652
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoMultiselectComponent, [{
484
653
  type: Component,
485
- args: [{ selector: 'po-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, providers: providers, template: "<po-field-container\n [p-disabled]=\"disabled\"\n [p-label]=\"label\"\n [p-optional]=\"optional\"\n [p-required]=\"required\"\n [p-show-required]=\"showRequired\"\n>\n <div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"po-field-container-content\"\n [class.po-multiselect-show]=\"dropdownOpen\"\n >\n <div\n #inputElement\n [tabindex]=\"disabled ? -1 : 0\"\n [attr.disabled]=\"disabled\"\n [attr.aria-label]=\"label\"\n class=\"po-input po-input-icon-right po-multiselect-input po-clickable\"\n [class.po-multiselect-input-auto]=\"autoHeight\"\n [class.po-multiselect-input-static]=\"!autoHeight\"\n [class.po-multiselect-input-disabled]=\"disabled\"\n (keyup.enter)=\"toggleDropdownVisibility()\"\n (keydown)=\"onKeyDown($event)\"\n (click)=\"toggleDropdownVisibility()\"\n (blur)=\"onBlur()\"\n >\n <span *ngIf=\"placeholder && !disabled && !visibleDisclaimers?.length\" class=\"po-multiselect-input-placeholder\">\n {{ placeholder }}\n </span>\n\n <po-disclaimer\n *ngFor=\"let disclaimer of visibleDisclaimers\"\n class=\"po-multiselect-input-disclaimer\"\n [p-label]=\"disclaimer[fieldLabel]\"\n [p-value]=\"disclaimer[fieldValue]\"\n [p-hide-close]=\"disclaimer[fieldValue] === '' || disabled\"\n [class.po-clickable]=\"disclaimer[fieldValue] === '' && !disabled\"\n (click)=\"openDropdown(disclaimer[fieldValue] === '')\"\n (p-close-action)=\"closeDisclaimer(disclaimer[fieldValue])\"\n >\n </po-disclaimer>\n\n <div class=\"po-field-icon-container-right\">\n <span\n #iconElement\n class=\"po-icon po-field-icon {{ dropdownIcon }} {{ disabled ? 'po-icon-input-disabled' : 'po-icon-input' }}\"\n [ngClass]=\"disabled ? 'po-field-icon-disabled' : ''\"\n >\n </span>\n </div>\n </div>\n </div>\n\n <ng-container *ngIf=\"appendBox; then dropdownCDK; else dropdownDefault\"> </ng-container>\n\n <ng-template #dropdownDefault>\n <ng-container *ngTemplateOutlet=\"dropdownListbox\"> </ng-container>\n </ng-template>\n\n <ng-template #dropdownCDK>\n <ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"trigger\" [cdkConnectedOverlayOpen]=\"true\">\n <ng-container *ngTemplateOutlet=\"dropdownListbox\"></ng-container>\n </ng-template>\n </ng-template>\n\n <po-field-container-bottom [p-help]=\"help\" [p-disabled]=\"disabled\"></po-field-container-bottom>\n</po-field-container>\n\n<ng-template #dropdownListbox>\n <po-multiselect-dropdown\n #dropdownElement\n [p-searching]=\"isServerSearching\"\n [p-hide-search]=\"hideSearch\"\n [p-hide-select-all]=\"hideSelectAll\"\n [p-literals]=\"literals\"\n [p-options]=\"options\"\n [p-visible-options]=\"visibleOptionsDropdown\"\n [p-selected-options]=\"selectedOptions\"\n [p-placeholder-search]=\"placeholderSearch\"\n [p-field-value]=\"fieldValue\"\n [p-field-label]=\"fieldLabel\"\n [p-multiselect-template]=\"multiselectOptionTemplate\"\n (p-change)=\"changeItems($event)\"\n (p-change-search)=\"changeSearch($event)\"\n (p-close-dropdown)=\"controlDropdownVisibility(false)\"\n >\n </po-multiselect-dropdown>\n</ng-template>\n" }]
654
+ args: [{ selector: 'po-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, providers: providers, template: "<po-field-container\n [p-disabled]=\"disabled\"\n [p-label]=\"label\"\n [p-optional]=\"optional\"\n [p-required]=\"required\"\n [p-show-required]=\"showRequired\"\n>\n <div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"po-field-container-content\"\n [class.po-multiselect-show]=\"dropdownOpen\"\n >\n <div\n #inputElement\n [tabindex]=\"disabled ? -1 : 0\"\n [attr.disabled]=\"disabled\"\n [attr.aria-label]=\"label\"\n class=\"po-input-icon-right po-multiselect-input\"\n [class.po-multiselect-input-auto]=\"autoHeight\"\n [class.po-multiselect-input-static]=\"!autoHeight\"\n [class.po-multiselect-input-disabled]=\"disabled\"\n [class.po-multiselect-input-font]=\"!disabled && !visibleTags?.length\"\n (keydown)=\"onKeyDown($event)\"\n (click)=\"toggleDropdownVisibility()\"\n (blur)=\"onBlur()\"\n >\n <span *ngIf=\"!disabled && !visibleTags?.length\" class=\"po-multiselect-input-placeholder\" aria-hidden=\"true\">\n {{ placeholder ? placeholder : literals.selectItem }}\n </span>\n\n <po-tag\n *ngFor=\"let tag of visibleTags; index as i\"\n [p-value]=\"tag[fieldLabel]\"\n [p-literals]=\"i + 1 === visibleTags.length && hasMoreTag ? literalsTag : undefined\"\n [p-removable]=\"true\"\n [class.po-clickable]=\"tag[fieldValue] === '' && !disabled\"\n [p-disabled]=\"disabled\"\n (p-close)=\"closeTag(tag[fieldValue], $event)\"\n ></po-tag>\n\n <div class=\"po-field-icon-container-right\">\n <span\n #iconElement\n class=\"po-icon po-field-icon {{ dropdownIcon }} {{ disabled ? 'po-icon-input-disabled' : 'po-icon-input' }}\"\n [ngClass]=\"disabled ? 'po-field-icon-disabled' : ''\"\n >\n </span>\n </div>\n </div>\n </div>\n\n <ng-container *ngIf=\"appendBox; then dropdownCDK; else dropdownDefault\"> </ng-container>\n\n <ng-template #dropdownDefault>\n <ng-container *ngTemplateOutlet=\"dropdownListbox\"> </ng-container>\n </ng-template>\n\n <ng-template #dropdownCDK>\n <ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"trigger\" [cdkConnectedOverlayOpen]=\"true\">\n <ng-container *ngTemplateOutlet=\"dropdownListbox\"></ng-container>\n </ng-template>\n </ng-template>\n\n <po-field-container-bottom [p-help]=\"help\" [p-disabled]=\"disabled\"></po-field-container-bottom>\n</po-field-container>\n\n<ng-template #dropdownListbox>\n <po-multiselect-dropdown\n #dropdownElement\n [p-searching]=\"isServerSearching\"\n [p-hide-search]=\"hideSearch\"\n [p-hide-select-all]=\"hideSelectAll\"\n [p-literals]=\"literals\"\n [p-options]=\"options\"\n [p-visible-options]=\"visibleOptionsDropdown\"\n [p-selected-options]=\"selectedOptions\"\n [p-placeholder-search]=\"placeholderSearch\"\n [p-field-value]=\"fieldValue\"\n [p-field-label]=\"fieldLabel\"\n [p-multiselect-template]=\"multiselectOptionTemplate\"\n (p-change)=\"changeItems($event)\"\n (p-change-search)=\"changeSearch($event)\"\n (p-close-dropdown)=\"controlDropdownVisibility(false)\"\n (keydown)=\"onKeyDownDropdown($event, 0)\"\n >\n </po-multiselect-dropdown>\n</ng-template>\n" }]
486
655
  }], function () { return [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.PoControlPositionService }, { type: i2.PoMultiselectFilterService }, { type: i3.PoLanguageService }]; }, { multiselectOptionTemplate: [{
487
656
  type: ContentChild,
488
657
  args: [PoMultiselectOptionTemplateDirective, { static: true }]
@@ -499,4 +668,4 @@ export class PoMultiselectComponent extends PoMultiselectBaseComponent {
499
668
  type: ViewChild,
500
669
  args: ['inputElement', { read: ElementRef, static: true }]
501
670
  }] }); })();
502
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tbXVsdGlzZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jb21wb25lbnRzL3BvLWZpZWxkL3BvLW11bHRpc2VsZWN0L3BvLW11bHRpc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvY29tcG9uZW50cy9wby1maWVsZC9wby1tdWx0aXNlbGVjdC9wby1tdWx0aXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsVUFBVSxFQUtWLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxFLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDL0csT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR2xFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTdFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLDJFQUEyRSxDQUFDOzs7Ozs7Ozs7SUNEM0gsZ0NBQStHO0lBQzdHLFlBQ0Y7SUFBQSxpQkFBTzs7O0lBREwsZUFDRjtJQURFLG1EQUNGOzs7O0lBRUEseUNB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bUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3BCLFFBQVE7a0JBQXJDLFNBQVM7bUJBQUMsaUJBQWlCO1lBQ2tDLFdBQVc7a0JBQXhFLFNBQVM7bUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO1lBQ0csWUFBWTtrQkFBMUUsU0FBUzttQkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBDb250ZW50Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgaXNNb2JpbGUgfSBmcm9tICcuLy4uLy4uLy4uL3V0aWxzL3V0aWwnO1xuaW1wb3J0IHsgUG9Db250cm9sUG9zaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi8uLi9zZXJ2aWNlcy9wby1jb250cm9sLXBvc2l0aW9uL3BvLWNvbnRyb2wtcG9zaXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQb0tleUNvZGVFbnVtIH0gZnJvbSAnLi8uLi8uLi8uLi9lbnVtcy9wby1rZXktY29kZS5lbnVtJztcbmltcG9ydCB7IFBvTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcG8tbGFuZ3VhZ2UvcG8tbGFuZ3VhZ2Uuc2VydmljZSc7XG5cbmltcG9ydCB7IFBvTXVsdGlzZWxlY3RCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9wby1tdWx0aXNlbGVjdC1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQb011bHRpc2VsZWN0T3B0aW9uIH0gZnJvbSAnLi9wby1tdWx0aXNlbGVjdC1vcHRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvTXVsdGlzZWxlY3RGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9wby1tdWx0aXNlbGVjdC1maWx0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQb011bHRpc2VsZWN0T3B0aW9uVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL3BvLW11bHRpc2VsZWN0LW9wdGlvbi10ZW1wbGF0ZS9wby1tdWx0aXNlbGVjdC1vcHRpb24tdGVtcGxhdGUuZGlyZWN0aXZlJztcblxuY29uc3QgcG9NdWx0aXNlbGVjdENvbnRhaW5lck9mZnNldCA9IDg7XG5jb25zdCBwb011bHRpc2VsZWN0Q29udGFpbmVyUG9zaXRpb25EZWZhdWx0ID0gJ2JvdHRvbSc7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jb25zdCBwcm92aWRlcnMgPSBbXG4gIFBvTXVsdGlzZWxlY3RGaWx0ZXJTZXJ2aWNlLFxuICBQb0NvbnRyb2xQb3NpdGlvblNlcnZpY2UsXG4gIHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBQb011bHRpc2VsZWN0Q29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxuICB9LFxuICB7XG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBQb011bHRpc2VsZWN0Q29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxuICB9XG5dO1xuXG4vKipcbiAqIEBkb2NzRXh0ZW5kcyBQb011bHRpc2VsZWN0QmFzZUNvbXBvbmVudFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogPGV4YW1wbGUgbmFtZT1cInBvLW11bHRpc2VsZWN0LWJhc2ljXCIgdGl0bGU9XCJQTyBNdWx0aXNlbGVjdCBCYXNpY1wiPlxuICogICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLW11bHRpc2VsZWN0LWJhc2ljL3NhbXBsZS1wby1tdWx0aXNlbGVjdC1iYXNpYy5jb21wb25lbnQuaHRtbFwiPiA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tbXVsdGlzZWxlY3QtYmFzaWMvc2FtcGxlLXBvLW11bHRpc2VsZWN0LWJhc2ljLmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogPGV4YW1wbGUgbmFtZT1cInBvLW11bHRpc2VsZWN0LWxhYnNcIiB0aXRsZT1cIlBPIE11bHRpc2VsZWN0IExhYnNcIj5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC1sYWJzL3NhbXBsZS1wby1tdWx0aXNlbGVjdC1sYWJzLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC1sYWJzL3NhbXBsZS1wby1tdWx0aXNlbGVjdC1sYWJzLmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogPGV4YW1wbGUgbmFtZT1cInBvLW11bHRpc2VsZWN0LXZhY2F0aW9uXCIgdGl0bGU9XCJQTyBNdWx0aXNlbGVjdCAtIFZhY2F0aW9uXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tbXVsdGlzZWxlY3QtdmFjYXRpb24vc2FtcGxlLXBvLW11bHRpc2VsZWN0LXZhY2F0aW9uLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC12YWNhdGlvbi9zYW1wbGUtcG8tbXVsdGlzZWxlY3QtdmFjYXRpb24uY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tbXVsdGlzZWxlY3QtdmFjYXRpb24tcmVhY3RpdmUtZm9ybVwiIHRpdGxlPVwiUE8gTXVsdGlzZWxlY3QgLSBWYWNhdGlvbiBSZWFjdGl2ZSBGb3JtXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tbXVsdGlzZWxlY3QtdmFjYXRpb24tcmVhY3RpdmUtZm9ybS9zYW1wbGUtcG8tbXVsdGlzZWxlY3QtdmFjYXRpb24tcmVhY3RpdmUtZm9ybS5jb21wb25lbnQuaHRtbFwiPiA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tbXVsdGlzZWxlY3QtdmFjYXRpb24tcmVhY3RpdmUtZm9ybS9zYW1wbGUtcG8tbXVsdGlzZWxlY3QtdmFjYXRpb24tcmVhY3RpdmUtZm9ybS5jb21wb25lbnQudHNcIj4gPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJwby1tdWx0aXNlbGVjdC10ZW1wbGF0ZVwiIHRpdGxlPVwiUE8gTXVsdGlzZWxlY3QgLSBUZW1wbGF0ZVwiPlxuICogICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLW11bHRpc2VsZWN0LXRlbXBsYXRlL3NhbXBsZS1wby1tdWx0aXNlbGVjdC10ZW1wbGF0ZS5jb21wb25lbnQuaHRtbFwiPiA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tbXVsdGlzZWxlY3QtdGVtcGxhdGUvc2FtcGxlLXBvLW11bHRpc2VsZWN0LXRlbXBsYXRlLmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogPGV4YW1wbGUgbmFtZT1cInBvLW11bHRpc2VsZWN0LWhlcm9lc1wiIHRpdGxlPVwiUE8gTXVsdGlzZWxlY3QgLSBIZXJvZXMgLSB1c2luZyBBUElcIj5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC1oZXJvZXMvc2FtcGxlLXBvLW11bHRpc2VsZWN0LWhlcm9lcy5jb21wb25lbnQuaHRtbFwiPiA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tbXVsdGlzZWxlY3QtaGVyb2VzL3NhbXBsZS1wby1tdWx0aXNlbGVjdC1oZXJvZXMuY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC1oZXJvZXMvc2FtcGxlLXBvLW11bHRpc2VsZWN0LWhlcm9lcy5zZXJ2aWNlLnRzXCI+IDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tbXVsdGlzZWxlY3QtYW55LWFycmF5XCIgdGl0bGU9XCJQTyBNdWx0aXNlbGVjdCAtIEFycmF5IEFueVwiPlxuICogICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLW11bHRpc2VsZWN0LWFueS1hcnJheS9zYW1wbGUtcG8tbXVsdGlzZWxlY3QtYW55LWFycmF5LmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC1hbnktYXJyYXkvc2FtcGxlLXBvLW11bHRpc2VsZWN0LWFueS1hcnJheS5jb21wb25lbnQudHNcIj4gPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncG8tbXVsdGlzZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vcG8tbXVsdGlzZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzXG59KVxuZXhwb3J0IGNsYXNzIFBvTXVsdGlzZWxlY3RDb21wb25lbnRcbiAgZXh0ZW5kcyBQb011bHRpc2VsZWN0QmFzZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIERvQ2hlY2ssIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQENvbnRlbnRDaGlsZChQb011bHRpc2VsZWN0T3B0aW9uVGVtcGxhdGVEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pXG4gIG11bHRpc2VsZWN0T3B0aW9uVGVtcGxhdGU6IFBvTXVsdGlzZWxlY3RPcHRpb25UZW1wbGF0ZURpcmVjdGl2ZTtcblxuICBAVmlld0NoaWxkKCdkcm9wZG93bkVsZW1lbnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgZHJvcGRvd25FbGVtZW50OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdkcm9wZG93bkVsZW1lbnQnKSBkcm9wZG93bjtcbiAgQFZpZXdDaGlsZCgnaWNvbkVsZW1lbnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KSBpY29uRWxlbWVudDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnaW5wdXRFbGVtZW50JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSkgaW5wdXRFbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gIGRpc2NsYWltZXJPZmZzZXQgPSAwO1xuICBkcm9wZG93bkljb246IHN0cmluZyA9ICdwby1pY29uLWFycm93LWRvd24nO1xuICBkcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcG9zaXRpb25EaXNjbGFpbWVyRXh0cmE7XG4gIHRpbWVvdXRSZXNpemU7XG4gIHZpc2libGVFbGVtZW50ID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBpc0NhbGN1bGF0ZVZpc2libGVJdGVtczogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgY2FjaGVPcHRpb25zOiBBcnJheTxQb011bHRpc2VsZWN0T3B0aW9uIHwgYW55PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNvbnRyb2xQb3NpdGlvbjogUG9Db250cm9sUG9zaXRpb25TZXJ2aWNlLFxuICAgIHB1YmxpYyBkZWZhdWx0U2VydmljZTogUG9NdWx0aXNlbGVjdEZpbHRlclNlcnZpY2UsXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlOiBQb0xhbmd1YWdlU2VydmljZVxuICApIHtcbiAgICBzdXBlcihsYW5ndWFnZVNlcnZpY2UpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLmF1dG9Gb2N1cykge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAodGhpcy5maWx0ZXJTZXJ2aWNlICYmIChjaGFuZ2VzLmZpbHRlclNlcnZpY2UgfHwgY2hhbmdlcy5maWVsZFZhbHVlIHx8IGNoYW5nZXMuZmllbGRMYWJlbCkpIHtcbiAgICAgIHRoaXMuc2V0U2VydmljZSh0aGlzLmZpbHRlclNlcnZpY2UpO1xuICAgIH1cbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICBjb25zdCBpbnB1dFdpZHRoID0gdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAvLyBQZXJtaXRlIHF1ZSBvcyBkaXNjbGFpbWVycyBzZWphbSBjYWxjdWxhZG9zIG5hIHByaW1laXJhIHZleiBxdWUgbyBjb21wb25lbnRlIHRvcm5hLXNlIHZpc8OtdmVsLFxuICAgIC8vIGV2aXRhbmRvIGNvbSBpc3NvLCBwcm9ibGVtYXMgY29tIFRhYnMgb3UgRGl2cyBxdWUgaW5pY2llbSBlc2NvbmRpZGFzLlxuICAgIGlmICgoaW5wdXRXaWR0aCAmJiAhdGhpcy52aXNpYmxlRWxlbWVudCAmJiB0aGlzLmluaXRpYWxpemVkKSB8fCAoaW5wdXRXaWR0aCAmJiB0aGlzLmlzQ2FsY3VsYXRlVmlzaWJsZUl0ZW1zKSkge1xuICAgICAgdGhpcy5kZWJvdW5jZVJlc2l6ZSgpO1xuICAgICAgdGhpcy52aXNpYmxlRWxlbWVudCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmdldE9iamVjdHNCeVZhbHVlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZpbHRlclN1YmplY3Q/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogRnVuw6fDo28gcXVlIGF0cmlidWkgZm9jbyBhbyBjb21wb25lbnRlLlxuICAgKlxuICAgKiBQYXJhIHV0aWxpesOhLWxhIMOpIG5lY2Vzc8OhcmlvIHRlciBhIGluc3TDom5jaWEgZG8gY29tcG9uZW50ZSBubyBET00sIHBvZGVuZG8gc2VyIHV0aWxpemFkbyBvIFZpZXdDaGlsZCBkYSBzZWd1aW50ZSBmb3JtYTpcbiAgICpcbiAgICogYGBgXG4gICAqIGltcG9ydCB7IFBvTXVsdGlzZWxlY3RDb21wb25lbnQgfSBmcm9tICdAcG8tdWkvbmctY29tcG9uZW50cyc7XG4gICAqXG4gICAqIC4uLlxuICAgKlxuICAgKiBAVmlld0NoaWxkKFBvTXVsdGlzZWxlY3RDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pIG11bHRpc2VsZWN0OiBQb011bHRpc2VsZWN0Q29tcG9uZW50O1xuICAgKlxuICAgKiBmb2N1c011bHRpc2VsZWN0KCkge1xuICAgKiAgIHRoaXMubXVsdGlzZWxlY3QuZm9jdXMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIGdldElucHV0V2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucG8taW5wdXQnKS5vZmZzZXRXaWR0aCAtIDQwO1xuICB9XG5cbiAgZ2V0RGlzY2xhaW1lcnNXaWR0aCgpIHtcbiAgICBjb25zdCBkaXNjbGFpbWVycyA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdwby1kaXNjbGFpbWVyJyk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZGlzY2xhaW1lcnMpLm1hcChkaXNjbGFpbWVyID0+IGRpc2NsYWltZXJbJ29mZnNldFdpZHRoJ10pO1xuICB9XG5cbiAgY2FsY3VsYXRlVmlzaWJsZUl0ZW1zKCkge1xuICAgIGNvbnN0IGRpc2NsYWltZXJzV2lkdGggPSB0aGlzLmdldERpc2NsYWltZXJzV2lkdGgoKTtcbiAgICBjb25zdCBpbnB1dFdpZHRoID0gdGhpcy5nZXRJbnB1dFdpZHRoKCk7XG4gICAgY29uc3QgZXh0cmFEaXNjbGFpbWVyU2l6ZSA9IDM4O1xuICAgIGNvbnN0IGRpc2NsYWltZXJzVmlzaWJsZSA9IGRpc2NsYWltZXJzV2lkdGhbMF07XG5cbiAgICB0aGlzLnZpc2libGVEaXNjbGFpbWVycyA9IFtdO1xuXG4gICAgaWYgKGlucHV0V2lkdGggPiAwKSB7XG4gICAgICBsZXQgc3VtID0gMDtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdW0gKz0gZGlzY2xhaW1lcnNXaWR0aFtpXTtcbiAgICAgICAgdGhpcy52aXNpYmxlRGlzY2xhaW1lcnMucHVzaCh0aGlzLnNlbGVjdGVkT3B0aW9uc1tpXSk7XG5cbiAgICAgICAgaWYgKHN1bSA+IGlucHV0V2lkdGgpIHtcbiAgICAgICAgICBzdW0gLT0gZGlzY2xhaW1lcnNXaWR0aFtpXTtcbiAgICAgICAgICB0aGlzLmlzQ2FsY3VsYXRlVmlzaWJsZUl0ZW1zID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRpc2NsYWltZXJzVmlzaWJsZSB8fCAhdGhpcy5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChpID09PSB0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmlzQ2FsY3VsYXRlVmlzaWJsZUl0ZW1zID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1bSArIGV4dHJhRGlzY2xhaW1lclNpemUgPiBpbnB1dFdpZHRoKSB7XG4gICAgICAgICAgdGhpcy52aXNpYmxlRGlzY2xhaW1lcnMuc3BsaWNlKC0yLCAyKTtcbiAgICAgICAgICBjb25zdCBsYWJlbCA9ICcrJyArICh0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGggKyAxIC0gaSkudG9TdHJpbmcoKTtcbiAgICAgICAgICB0aGlzLnZpc2libGVEaXNjbGFpbWVycy5wdXNoKHsgW3RoaXMuZmllbGRWYWx1ZV06ICcnLCBbdGhpcy5maWVsZExhYmVsXTogbGFiZWwgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52aXNpYmxlRGlzY2xhaW1lcnMuc3BsaWNlKC0xLCAxKTtcbiAgICAgICAgICBjb25zdCBsYWJlbCA9ICcrJyArICh0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGggLSBpKS50b1N0cmluZygpO1xuICAgICAgICAgIHRoaXMudmlzaWJsZURpc2NsYWltZXJzLnB1c2goeyBbdGhpcy5maWVsZFZhbHVlXTogJycsIFt0aGlzLmZpZWxkTGFiZWxdOiBsYWJlbCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2hhbmdlSXRlbXMoY2hhbmdlZEl0ZW1zKSB7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZE9wdGlvbnMoY2hhbmdlZEl0ZW1zKTtcbiAgICB0aGlzLmNhbGxPbkNoYW5nZSh0aGlzLnNlbGVjdGVkT3B0aW9ucyk7XG5cbiAgICBpZiAodGhpcy5hdXRvSGVpZ2h0ICYmIHRoaXMuZHJvcGRvd25PcGVuKSB7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMuYWRqdXN0Q29udGFpbmVyUG9zaXRpb24oKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVWaXNpYmxlSXRlbXMoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRPcHRpb25zKSB7XG4gICAgICB0aGlzLnZpc2libGVEaXNjbGFpbWVycyA9IFtdLmNvbmNhdCh0aGlzLnNlbGVjdGVkT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWJvdW5jZVJlc2l6ZSgpO1xuXG4gICAgLy8gcXVhbmRvIGVzdGl2ZXIgZGVudHJvIGRlIG1vZGFsXG4gICAgaWYgKCF0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoKSB7XG4gICAgICB0aGlzLmlzQ2FsY3VsYXRlVmlzaWJsZUl0ZW1zID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBkZWJvdW5jZVJlc2l6ZSgpIHtcbiAgICBpZiAoIXRoaXMuYXV0b0hlaWdodCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFJlc2l6ZSk7XG4gICAgICB0aGlzLnRpbWVvdXRSZXNpemUgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVWaXNpYmxlSXRlbXMoKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkJsdXIoKSB7XG4gICAgdGhpcy5vbk1vZGVsVG91Y2hlZD8uKCk7XG4gIH1cblxuICBvbktleURvd24oZXZlbnQ/OiBhbnkpIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gUG9LZXlDb2RlRW51bS5hcnJvd1VwIHx8IGV2ZW50LmtleUNvZGUgPT09IFBvS2V5Q29kZUVudW0uYXJyb3dEb3duKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5jb250cm9sRHJvcGRvd25WaXNpYmlsaXR5KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBQb0tleUNvZGVFbnVtLnRhYikge1xuICAgICAgdGhpcy5jb250cm9sRHJvcGRvd25WaXNpYmlsaXR5KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVEcm9wZG93blZpc2liaWxpdHkoKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVySW5GaXJzdENsaWNrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb250cm9sRHJvcGRvd25WaXNpYmlsaXR5KCF0aGlzLmRyb3Bkb3duT3Blbik7XG4gIH1cblxuICBvcGVuRHJvcGRvd24odG9PcGVuKSB7XG4gICAgaWYgKHRvT3BlbiAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5jb250cm9sRHJvcGRvd25WaXNpYmlsaXR5KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnRyb2xEcm9wZG93blZpc2liaWxpdHkodG9PcGVuOiBib29sZWFuKSB7XG4gICAgdG9PcGVuID8gdGhpcy5vcGVuKCkgOiB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICBzY3JvbGxUb1NlbGVjdGVkT3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9wdGlvbnMgJiYgdGhpcy5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMub3B0aW9ucy5maW5kSW5kZXgoXG4gICAgICAgIG9wdGlvbiA9PiBvcHRpb25bdGhpcy5maWVsZFZhbHVlXSA9PT0gdGhpcy5zZWxlY3RlZE9wdGlvbnNbMF1bdGhpcy5maWVsZFZhbHVlXVxuICAgICAgKTtcbiAgICAgIHRoaXMuZHJvcGRvd24uc2Nyb2xsVG8oaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFZpc2libGVPcHRpb25zRHJvcGRvd24ob3B0aW9ucykge1xuICAgIHRoaXMudmlzaWJsZU9wdGlvbnNEcm9wZG93biA9IG9wdGlvbnM7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNoYW5nZVNlYXJjaChldmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudFt0aGlzLmZpZWxkVmFsdWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLmZpbHRlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJTdWJqZWN0Lm5leHQoZXZlbnRbdGhpcy5maWVsZFZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlYXJjaEJ5TGFiZWwoZXZlbnRbdGhpcy5maWVsZFZhbHVlXSwgdGhpcy5vcHRpb25zLCB0aGlzLmZpbHRlck1vZGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFZpc2libGVPcHRpb25zRHJvcGRvd24odGhpcy5vcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyB0aW1lb3V0IG5lY2Vzc8OhcmlvIHBhcmEgcmVwb3NpY2lvbmFyIGNvcnJldGFtZW50ZSBxdWFuZG8gZHJvcGRvd24gZXN0aXZlciBwcmEgY2ltYSBkbyBpbnB1dCBlIHJlYWxpemFyIGJ1c2NhIG5vIGlucHV0XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkanVzdENvbnRhaW5lclBvc2l0aW9uKCkpO1xuICB9XG5cbiAgY2xvc2VEaXNjbGFpbWVyKHZhbHVlKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkT3B0aW9ucy5maW5kSW5kZXgob3B0aW9uID0+IG9wdGlvblt0aGlzLmZpZWxkVmFsdWVdID09PSB2YWx1ZSk7XG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIHRoaXMudXBkYXRlVmlzaWJsZUl0ZW1zKCk7XG4gICAgdGhpcy5jYWxsT25DaGFuZ2UodGhpcy5zZWxlY3RlZE9wdGlvbnMpO1xuICB9XG5cbiAgd2FzQ2xpY2tlZE9uVG9nZ2xlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kcm9wZG93bk9wZW4gJiZcbiAgICAgICF0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICF0aGlzLmljb25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgIXRoaXMuZHJvcGRvd25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuICAgICkge1xuICAgICAgdGhpcy5jb250cm9sRHJvcGRvd25WaXNpYmlsaXR5KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUZpbHRlcih2YWx1ZTogc3RyaW5nID0gJycpOiBPYnNlcnZhYmxlPEFycmF5PFBvTXVsdGlzZWxlY3RPcHRpb24gfCBhbnk+PiB7XG4gICAgY29uc3QgcGFyYW0gPSB7IHByb3BlcnR5OiB0aGlzLmZpZWxkTGFiZWwsIHZhbHVlOiB2YWx1ZSB9O1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZ2V0RmlsdGVyZWREYXRhKHBhcmFtKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICB0aGlzLmlzU2VydmVyU2VhcmNoaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICB9KSxcbiAgICAgIHRhcCgob3B0aW9uczogQXJyYXk8UG9NdWx0aXNlbGVjdE9wdGlvbiB8IGFueT4pID0+IHtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zQnlBcHBseUZpbHRlcihvcHRpb25zKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJJbkZpcnN0Q2xpY2soKSB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdEZpbHRlcikge1xuICAgICAgdGhpcy5pc1NlcnZlclNlYXJjaGluZyA9IHRydWU7XG5cbiAgICAgIC8vIG5lY2Vzc2FyaW8gZW52aWFyIHVtIG9iamV0byBzdHJpbmcgdmF6aWEgcGFyYSByZWZhemVyIGEgYnVzY2EsIHF1YW5kbyBhbHRlcmFyIGZpbHRlclNlcnZpY2UsIGZpZWxkVmFsdWUgZSBmaWVsZExhYmVsXG4gICAgICAvLyBwb2lzIHRlbW9zIG8gZGlzdGluY3RVbnRpbENoYW5nZSBubyBwaXBlIGRvIGZpbHRlclN1YmplY3RcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldy13cmFwcGVycyAqL1xuICAgICAgdGhpcy5maWx0ZXJTdWJqZWN0Lm5leHQobmV3IFN0cmluZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zID0gWy4uLnRoaXMuY2FjaGVPcHRpb25zXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldE9wdGlvbnNCeUFwcGx5RmlsdGVyKGl0ZW1zOiBBcnJheTxQb011bHRpc2VsZWN0T3B0aW9uIHwgYW55Pikge1xuICAgIGlmICh0aGlzLmlzRmlyc3RGaWx0ZXIpIHtcbiAgICAgIHRoaXMuY2FjaGVPcHRpb25zID0gWy4uLml0ZW1zXTtcbiAgICAgIHRoaXMuaXNGaXJzdEZpbHRlciA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRWaXNpYmxlT3B0aW9uc0Ryb3Bkb3duKHRoaXMub3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFkanVzdENvbnRhaW5lclBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbFBvc2l0aW9uLmFkanVzdFBvc2l0aW9uKHBvTXVsdGlzZWxlY3RDb250YWluZXJQb3NpdGlvbkRlZmF1bHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3Bkb3duSWNvbiA9ICdwby1pY29uLWFycm93LWRvd24nO1xuICAgIHRoaXMuZHJvcGRvd25PcGVuID0gZmFsc2U7XG5cbiAgICB0aGlzLmRyb3Bkb3duLmNvbnRyb2xWaXNpYmlsaXR5KGZhbHNlKTtcbiAgICB0aGlzLnNldFZpc2libGVPcHRpb25zRHJvcGRvd24odGhpcy5vcHRpb25zKTtcblxuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5jbGlja091dExpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2NsaWNrJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLndhc0NsaWNrZWRPblRvZ2dsZShldmVudCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc2l6ZUxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdyZXNpemUnLCAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVJdGVtcygpO1xuXG4gICAgICBpc01vYmlsZSgpID8gdGhpcy5hZGp1c3RDb250YWluZXJQb3NpdGlvbigpIDogdGhpcy5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25TY3JvbGwsIHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNjcm9sbCA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLmFkanVzdENvbnRhaW5lclBvc2l0aW9uKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBvcGVuKCk6IHZvaWQge1xuICAgIHRoaXMuZHJvcGRvd25JY29uID0gJ3BvLWljb24tYXJyb3ctdXAnO1xuICAgIHRoaXMuZHJvcGRvd25PcGVuID0gdHJ1ZTtcblxuICAgIHRoaXMuZHJvcGRvd24uY29udHJvbFZpc2liaWxpdHkodHJ1ZSk7XG4gICAgdGhpcy5zZXRWaXNpYmxlT3B0aW9uc0Ryb3Bkb3duKHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5pbml0aWFsaXplTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkT3B0aW9ucygpO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5zZXRQb3NpdGlvbkRyb3Bkb3duKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUxpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGlja091dExpc3RlbmVyKSB7XG4gICAgICB0aGlzLmNsaWNrT3V0TGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNpemVMaXN0ZW5lcikge1xuICAgICAgdGhpcy5yZXNpemVMaXN0ZW5lcigpO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uU2Nyb2xsLCB0cnVlKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQb3NpdGlvbkRyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbFBvc2l0aW9uLnNldEVsZW1lbnRzKFxuICAgICAgdGhpcy5kcm9wZG93bi5jb250YWluZXIubmF0aXZlRWxlbWVudCxcbiAgICAgIHBvTXVsdGlzZWxlY3RDb250YWluZXJPZmZzZXQsXG4gICAgICB0aGlzLmlucHV0RWxlbWVudCxcbiAgICAgIFsndG9wJywgJ2JvdHRvbSddLFxuICAgICAgdHJ1ZVxuICAgICk7XG5cbiAgICB0aGlzLmFkanVzdENvbnRhaW5lclBvc2l0aW9uKCk7XG4gIH1cbn1cbiIsIjxwby1maWVsZC1jb250YWluZXJcbiAgW3AtZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbcC1sYWJlbF09XCJsYWJlbFwiXG4gIFtwLW9wdGlvbmFsXT1cIm9wdGlvbmFsXCJcbiAgW3AtcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICBbcC1zaG93LXJlcXVpcmVkXT1cInNob3dSZXF1aXJlZFwiXG4+XG4gIDxkaXZcbiAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICBjbGFzcz1cInBvLWZpZWxkLWNvbnRhaW5lci1jb250ZW50XCJcbiAgICBbY2xhc3MucG8tbXVsdGlzZWxlY3Qtc2hvd109XCJkcm9wZG93bk9wZW5cIlxuICA+XG4gICAgPGRpdlxuICAgICAgI2lucHV0RWxlbWVudFxuICAgICAgW3RhYmluZGV4XT1cImRpc2FibGVkID8gLTEgOiAwXCJcbiAgICAgIFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxcIlxuICAgICAgY2xhc3M9XCJwby1pbnB1dCBwby1pbnB1dC1pY29uLXJpZ2h0IHBvLW11bHRpc2VsZWN0LWlucHV0IHBvLWNsaWNrYWJsZVwiXG4gICAgICBbY2xhc3MucG8tbXVsdGlzZWxlY3QtaW5wdXQtYXV0b109XCJhdXRvSGVpZ2h0XCJcbiAgICAgIFtjbGFzcy5wby1tdWx0aXNlbGVjdC1pbnB1dC1zdGF0aWNdPVwiIWF1dG9IZWlnaHRcIlxuICAgICAgW2NsYXNzLnBvLW11bHRpc2VsZWN0LWlucHV0LWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIChrZXl1cC5lbnRlcik9XCJ0b2dnbGVEcm9wZG93blZpc2liaWxpdHkoKVwiXG4gICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd25WaXNpYmlsaXR5KClcIlxuICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxuICAgID5cbiAgICAgIDxzcGFuICpuZ0lmPVwicGxhY2Vob2xkZXIgJiYgIWRpc2FibGVkICYmICF2aXNpYmxlRGlzY2xhaW1lcnM/Lmxlbmd0aFwiIGNsYXNzPVwicG8tbXVsdGlzZWxlY3QtaW5wdXQtcGxhY2Vob2xkZXJcIj5cbiAgICAgICAge3sgcGxhY2Vob2xkZXIgfX1cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPHBvLWRpc2NsYWltZXJcbiAgICAgICAgKm5nRm9yPVwibGV0IGRpc2NsYWltZXIgb2YgdmlzaWJsZURpc2NsYWltZXJzXCJcbiAgICAgICAgY2xhc3M9XCJwby1tdWx0aXNlbGVjdC1pbnB1dC1kaXNjbGFpbWVyXCJcbiAgICAgICAgW3AtbGFiZWxdPVwiZGlzY2xhaW1lcltmaWVsZExhYmVsXVwiXG4gICAgICAgIFtwLXZhbHVlXT1cImRpc2NsYWltZXJbZmllbGRWYWx1ZV1cIlxuICAgICAgICBbcC1oaWRlLWNsb3NlXT1cImRpc2NsYWltZXJbZmllbGRWYWx1ZV0gPT09ICcnIHx8IGRpc2FibGVkXCJcbiAgICAgICAgW2NsYXNzLnBvLWNsaWNrYWJsZV09XCJkaXNjbGFpbWVyW2ZpZWxkVmFsdWVdID09PSAnJyAmJiAhZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwib3BlbkRyb3Bkb3duKGRpc2NsYWltZXJbZmllbGRWYWx1ZV0gPT09ICcnKVwiXG4gICAgICAgIChwLWNsb3NlLWFjdGlvbik9XCJjbG9zZURpc2NsYWltZXIoZGlzY2xhaW1lcltmaWVsZFZhbHVlXSlcIlxuICAgICAgPlxuICAgICAgPC9wby1kaXNjbGFpbWVyPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicG8tZmllbGQtaWNvbi1jb250YWluZXItcmlnaHRcIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAjaWNvbkVsZW1lbnRcbiAgICAgICAgICBjbGFzcz1cInBvLWljb24gcG8tZmllbGQtaWNvbiB7eyBkcm9wZG93bkljb24gfX0ge3sgZGlzYWJsZWQgPyAncG8taWNvbi1pbnB1dC1kaXNhYmxlZCcgOiAncG8taWNvbi1pbnB1dCcgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImRpc2FibGVkID8gJ3BvLWZpZWxkLWljb24tZGlzYWJsZWQnIDogJydcIlxuICAgICAgICA+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXBwZW5kQm94OyB0aGVuIGRyb3Bkb3duQ0RLOyBlbHNlIGRyb3Bkb3duRGVmYXVsdFwiPiA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGUgI2Ryb3Bkb3duRGVmYXVsdD5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd25MaXN0Ym94XCI+IDwvbmctY29udGFpbmVyPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSAjZHJvcGRvd25DREs+XG4gICAgPG5nLXRlbXBsYXRlIGNka0Nvbm5lY3RlZE92ZXJsYXkgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJ0cnVlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd25MaXN0Ym94XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8cG8tZmllbGQtY29udGFpbmVyLWJvdHRvbSBbcC1oZWxwXT1cImhlbHBcIiBbcC1kaXNhYmxlZF09XCJkaXNhYmxlZFwiPjwvcG8tZmllbGQtY29udGFpbmVyLWJvdHRvbT5cbjwvcG8tZmllbGQtY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3duTGlzdGJveD5cbiAgPHBvLW11bHRpc2VsZWN0LWRyb3Bkb3duXG4gICAgI2Ryb3Bkb3duRWxlbWVudFxuICAgIFtwLXNlYXJjaGluZ109XCJpc1NlcnZlclNlYXJjaGluZ1wiXG4gICAgW3AtaGlkZS1zZWFyY2hdPVwiaGlkZVNlYXJjaFwiXG4gICAgW3AtaGlkZS1zZWxlY3QtYWxsXT1cImhpZGVTZWxlY3RBbGxcIlxuICAgIFtwLWxpdGVyYWxzXT1cImxpdGVyYWxzXCJcbiAgICBbcC1vcHRpb25zXT1cIm9wdGlvbnNcIlxuICAgIFtwLXZpc2libGUtb3B0aW9uc109XCJ2aXNpYmxlT3B0aW9uc0Ryb3Bkb3duXCJcbiAgICBbcC1zZWxlY3RlZC1vcHRpb25zXT1cInNlbGVjdGVkT3B0aW9uc1wiXG4gICAgW3AtcGxhY2Vob2xkZXItc2VhcmNoXT1cInBsYWNlaG9sZGVyU2VhcmNoXCJcbiAgICBbcC1maWVsZC12YWx1ZV09XCJmaWVsZFZhbHVlXCJcbiAgICBbcC1maWVsZC1sYWJlbF09XCJmaWVsZExhYmVsXCJcbiAgICBbcC1tdWx0aXNlbGVjdC10ZW1wbGF0ZV09XCJtdWx0aXNlbGVjdE9wdGlvblRlbXBsYXRlXCJcbiAgICAocC1jaGFuZ2UpPVwiY2hhbmdlSXRlbXMoJGV2ZW50KVwiXG4gICAgKHAtY2hhbmdlLXNlYXJjaCk9XCJjaGFuZ2VTZWFyY2goJGV2ZW50KVwiXG4gICAgKHAtY2xvc2UtZHJvcGRvd24pPVwiY29udHJvbERyb3Bkb3duVmlzaWJpbGl0eShmYWxzZSlcIlxuICA+XG4gIDwvcG8tbXVsdGlzZWxlY3QtZHJvcGRvd24+XG48L25nLXRlbXBsYXRlPlxuIl19
671
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tbXVsdGlzZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jb21wb25lbnRzL3BvLWZpZWxkL3BvLW11bHRpc2VsZWN0L3BvLW11bHRpc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvY29tcG9uZW50cy9wby1maWVsZC9wby1tdWx0aXNlbGVjdC9wby1tdWx0aXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBRVosVUFBVSxFQUtWLFNBQVMsRUFDVCxVQUFVLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxFLE9BQU8sRUFBYyxZQUFZLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUMvRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLDJFQUEyRSxDQUFDOzs7Ozs7Ozs7SUNEM0gs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QTlDLDJEQUE4QyxnREFBQSwrQ0FBQSwwR0FBQTtZQUo5QyxnREFBOEI7WUFDOUIsd0NBQTBCLHlCQUFBO1lBV25CLGVBQXVDO1lBQXZDLGtHQUF1QztZQUs1QixlQUFnQjtZQUFoQix5Q0FBZ0I7WUFZOUIsZUFBNEc7WUFBNUcseUlBQTRHO1lBQzVHLHNFQUFvRDtZQU83QyxlQUFpQjtZQUFqQixvQ0FBaUIsaUJBQUEsaUJBQUE7WUFZTCxlQUFlO1lBQWYsaUNBQWUsNEJBQUE7Ozt1RkRxRC9CLHNCQUFzQjtjQU5sQyxTQUFTOzJCQUNFLGdCQUFnQixtQkFFVCx1QkFBdUIsQ0FBQyxNQUFNLGFBQy9DLFNBQVM7cU9BTVQseUJBQXlCO2tCQUR4QixZQUFZO21CQUFDLG9DQUFvQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQUdoQixlQUFlO2tCQUFsRSxTQUFTO21CQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNwQixRQUFRO2tCQUFyQyxTQUFTO21CQUFDLGlCQUFpQjtZQUNrQyxXQUFXO2tCQUF4RSxTQUFTO21CQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQUNHLFlBQVk7a0JBQTFFLFNBQVM7bUJBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50LCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBQb0xhbmd1YWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BvLWxhbmd1YWdlL3BvLWxhbmd1YWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9LZXlDb2RlRW51bSB9IGZyb20gJy4vLi4vLi4vLi4vZW51bXMvcG8ta2V5LWNvZGUuZW51bSc7XG5pbXBvcnQgeyBQb0NvbnRyb2xQb3NpdGlvblNlcnZpY2UgfSBmcm9tICcuLy4uLy4uLy4uL3NlcnZpY2VzL3BvLWNvbnRyb2wtcG9zaXRpb24vcG8tY29udHJvbC1wb3NpdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGlzTW9iaWxlIH0gZnJvbSAnLi8uLi8uLi8uLi91dGlscy91dGlsJztcblxuaW1wb3J0IHsgcG9Mb2NhbGVEZWZhdWx0IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcG8tbGFuZ3VhZ2UvcG8tbGFuZ3VhZ2UuY29uc3RhbnQnO1xuaW1wb3J0IHsgUG9NdWx0aXNlbGVjdEJhc2VDb21wb25lbnQgfSBmcm9tICcuL3BvLW11bHRpc2VsZWN0LWJhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IFBvTXVsdGlzZWxlY3RGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9wby1tdWx0aXNlbGVjdC1maWx0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQb011bHRpc2VsZWN0T3B0aW9uVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL3BvLW11bHRpc2VsZWN0LW9wdGlvbi10ZW1wbGF0ZS9wby1tdWx0aXNlbGVjdC1vcHRpb24tdGVtcGxhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IFBvTXVsdGlzZWxlY3RPcHRpb24gfSBmcm9tICcuL3BvLW11bHRpc2VsZWN0LW9wdGlvbi5pbnRlcmZhY2UnO1xuXG5jb25zdCBwb011bHRpc2VsZWN0Q29udGFpbmVyT2Zmc2V0ID0gODtcbmNvbnN0IHBvTXVsdGlzZWxlY3RDb250YWluZXJQb3NpdGlvbkRlZmF1bHQgPSAnYm90dG9tJztcbmNvbnN0IHBvTXVsdGlzZWxlY3RJbnB1dFBhZGRpbmdSaWdodCA9IDUyO1xuY29uc3QgcG9NdWx0aXNlbGVjdFNwYWNlQmV0d2VlblRhZ3MgPSA4O1xuXG5jb25zdCBsaXRlcmFsc1RhZ1JlbW92ZU90aGVycyA9IHtcbiAgcHQ6IHtcbiAgICByZW1vdmU6ICdSZW1vdmVyIHRvZG9zIG9zIGl0ZW5zIHNlbGVjaW9uYWRvcydcbiAgfSxcbiAgcnU6IHtcbiAgICByZW1vdmU6ICfQo9C00LDQu9C40YLRjCDQstGB0LUg0LLRi9Cx0YDQsNC90L3Ri9C1INGN0LvQtdC80LXQvdGC0YsnXG4gIH0sXG4gIGVzOiB7XG4gICAgcmVtb3ZlOiAnRWxpbWluYXIgdG9kb3MgbG9zIGVsZW1lbnRvcyBzZWxlY2Npb25hZG9zJ1xuICB9LFxuICBlbjoge1xuICAgIHJlbW92ZTogJ0NsZWFyIGFsbCBzZWxlY3RlZCBpdGVtcydcbiAgfVxufTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNvbnN0IHByb3ZpZGVycyA9IFtcbiAgUG9NdWx0aXNlbGVjdEZpbHRlclNlcnZpY2UsXG4gIFBvQ29udHJvbFBvc2l0aW9uU2VydmljZSxcbiAge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFBvTXVsdGlzZWxlY3RDb21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG4gIH0sXG4gIHtcbiAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFBvTXVsdGlzZWxlY3RDb21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG4gIH1cbl07XG5cbi8qKlxuICogQGRvY3NFeHRlbmRzIFBvTXVsdGlzZWxlY3RCYXNlQ29tcG9uZW50XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tbXVsdGlzZWxlY3QtYmFzaWNcIiB0aXRsZT1cIlBPIE11bHRpc2VsZWN0IEJhc2ljXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tbXVsdGlzZWxlY3QtYmFzaWMvc2FtcGxlLXBvLW11bHRpc2VsZWN0LWJhc2ljLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC1iYXNpYy9zYW1wbGUtcG8tbXVsdGlzZWxlY3QtYmFzaWMuY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tbXVsdGlzZWxlY3QtbGFic1wiIHRpdGxlPVwiUE8gTXVsdGlzZWxlY3QgTGFic1wiPlxuICogICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLW11bHRpc2VsZWN0LWxhYnMvc2FtcGxlLXBvLW11bHRpc2VsZWN0LWxhYnMuY29tcG9uZW50Lmh0bWxcIj4gPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLW11bHRpc2VsZWN0LWxhYnMvc2FtcGxlLXBvLW11bHRpc2VsZWN0LWxhYnMuY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tbXVsdGlzZWxlY3QtdmFjYXRpb25cIiB0aXRsZT1cIlBPIE11bHRpc2VsZWN0IC0gVmFjYXRpb25cIj5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC12YWNhdGlvbi9zYW1wbGUtcG8tbXVsdGlzZWxlY3QtdmFjYXRpb24uY29tcG9uZW50Lmh0bWxcIj4gPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLW11bHRpc2VsZWN0LXZhY2F0aW9uL3NhbXBsZS1wby1tdWx0aXNlbGVjdC12YWNhdGlvbi5jb21wb25lbnQudHNcIj4gPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJwby1tdWx0aXNlbGVjdC12YWNhdGlvbi1yZWFjdGl2ZS1mb3JtXCIgdGl0bGU9XCJQTyBNdWx0aXNlbGVjdCAtIFZhY2F0aW9uIFJlYWN0aXZlIEZvcm1cIj5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC12YWNhdGlvbi1yZWFjdGl2ZS1mb3JtL3NhbXBsZS1wby1tdWx0aXNlbGVjdC12YWNhdGlvbi1yZWFjdGl2ZS1mb3JtLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC12YWNhdGlvbi1yZWFjdGl2ZS1mb3JtL3NhbXBsZS1wby1tdWx0aXNlbGVjdC12YWNhdGlvbi1yZWFjdGl2ZS1mb3JtLmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogPGV4YW1wbGUgbmFtZT1cInBvLW11bHRpc2VsZWN0LXRlbXBsYXRlXCIgdGl0bGU9XCJQTyBNdWx0aXNlbGVjdCAtIFRlbXBsYXRlXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tbXVsdGlzZWxlY3QtdGVtcGxhdGUvc2FtcGxlLXBvLW11bHRpc2VsZWN0LXRlbXBsYXRlLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC10ZW1wbGF0ZS9zYW1wbGUtcG8tbXVsdGlzZWxlY3QtdGVtcGxhdGUuY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tbXVsdGlzZWxlY3QtaGVyb2VzXCIgdGl0bGU9XCJQTyBNdWx0aXNlbGVjdCAtIEhlcm9lcyAtIHVzaW5nIEFQSVwiPlxuICogICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLW11bHRpc2VsZWN0LWhlcm9lcy9zYW1wbGUtcG8tbXVsdGlzZWxlY3QtaGVyb2VzLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1tdWx0aXNlbGVjdC1oZXJvZXMvc2FtcGxlLXBvLW11bHRpc2VsZWN0LWhlcm9lcy5jb21wb25lbnQudHNcIj4gPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLW11bHRpc2VsZWN0LWhlcm9lcy9zYW1wbGUtcG8tbXVsdGlzZWxlY3QtaGVyb2VzLnNlcnZpY2UudHNcIj4gPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJwby1tdWx0aXNlbGVjdC1hbnktYXJyYXlcIiB0aXRsZT1cIlBPIE11bHRpc2VsZWN0IC0gQXJyYXkgQW55XCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tbXVsdGlzZWxlY3QtYW55LWFycmF5L3NhbXBsZS1wby1tdWx0aXNlbGVjdC1hbnktYXJyYXkuY29tcG9uZW50Lmh0bWxcIj4gPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLW11bHRpc2VsZWN0LWFueS1hcnJheS9zYW1wbGUtcG8tbXVsdGlzZWxlY3QtYW55LWFycmF5LmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwby1tdWx0aXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wby1tdWx0aXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnNcbn0pXG5leHBvcnQgY2xhc3MgUG9NdWx0aXNlbGVjdENvbXBvbmVudFxuICBleHRlbmRzIFBvTXVsdGlzZWxlY3RCYXNlQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjaywgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICBAQ29udGVudENoaWxkKFBvTXVsdGlzZWxlY3RPcHRpb25UZW1wbGF0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSlcbiAgbXVsdGlzZWxlY3RPcHRpb25UZW1wbGF0ZTogUG9NdWx0aXNlbGVjdE9wdGlvblRlbXBsYXRlRGlyZWN0aXZlO1xuXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duRWxlbWVudCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBkcm9wZG93bkVsZW1lbnQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duRWxlbWVudCcpIGRyb3Bkb3duO1xuICBAVmlld0NoaWxkKCdpY29uRWxlbWVudCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pIGljb25FbGVtZW50OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdpbnB1dEVsZW1lbnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KSBpbnB1dEVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgbGl0ZXJhbHNUYWc7XG4gIGRyb3Bkb3duSWNvbjogc3RyaW5nID0gJ3BvLWljb24tYXJyb3ctZG93bic7XG4gIGRyb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpbml0aWFsaXplZCA9IGZhbHNlO1xuICBoYXNNb3JlVGFnOiBib29sZWFuO1xuICB0aW1lb3V0UmVzaXplO1xuICB2aXNpYmxlRWxlbWVudCA9IGZhbHNlO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGVudGVyQ2xvc2VUYWcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbml0Q2FsY3VsYXRlSXRlbXMgPSB0cnVlO1xuICBwcml2YXRlIGlzQ2FsY3VsYXRlVmlzaWJsZUl0ZW1zOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBjYWNoZU9wdGlvbnM6IEFycmF5PFBvTXVsdGlzZWxlY3RPcHRpb24gfCBhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY29udHJvbFBvc2l0aW9uOiBQb0NvbnRyb2xQb3NpdGlvblNlcnZpY2UsXG4gICAgcHVibGljIGRlZmF1bHRTZXJ2aWNlOiBQb011bHRpc2VsZWN0RmlsdGVyU2VydmljZSxcbiAgICBsYW5ndWFnZVNlcnZpY2U6IFBvTGFuZ3VhZ2VTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGxhbmd1YWdlU2VydmljZSk7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZVNlcnZpY2UuZ2V0U2hvcnRMYW5ndWFnZSgpO1xuICAgIHRoaXMubGl0ZXJhbHNUYWcgPSB7XG4gICAgICAuLi5saXRlcmFsc1RhZ1JlbW92ZU90aGVyc1twb0xvY2FsZURlZmF1bHRdLFxuICAgICAgLi4ubGl0ZXJhbHNUYWdSZW1vdmVPdGhlcnNbbGFuZ3VhZ2VdXG4gICAgfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5hdXRvRm9jdXMpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyU2VydmljZSAmJiAoY2hhbmdlcy5maWx0ZXJTZXJ2aWNlIHx8IGNoYW5nZXMuZmllbGRWYWx1ZSB8fCBjaGFuZ2VzLmZpZWxkTGFiZWwpKSB7XG4gICAgICB0aGlzLnNldFNlcnZpY2UodGhpcy5maWx0ZXJTZXJ2aWNlKTtcbiAgICB9XG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgY29uc3QgaW5wdXRXaWR0aCA9IHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgLy8gUGVybWl0ZSBxdWUgYXMgdGFncyBzZWphbSBjYWxjdWxhZGFzIG5hIHByaW1laXJhIHZleiBxdWUgbyBjb21wb25lbnRlIHRvcm5hLXNlIHZpc8OtdmVsLFxuICAgIC8vIGV2aXRhbmRvIGNvbSBpc3NvLCBwcm9ibGVtYXMgY29tIFRhYnMgb3UgRGl2cyBxdWUgaW5pY2llbSBlc2NvbmRpZGFzLlxuICAgIGlmICgoaW5wdXRXaWR0aCAmJiAhdGhpcy52aXNpYmxlRWxlbWVudCAmJiB0aGlzLmluaXRpYWxpemVkKSB8fCAoaW5wdXRXaWR0aCAmJiB0aGlzLmlzQ2FsY3VsYXRlVmlzaWJsZUl0ZW1zKSkge1xuICAgICAgdGhpcy5kZWJvdW5jZVJlc2l6ZSgpO1xuICAgICAgdGhpcy52aXNpYmxlRWxlbWVudCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmdldE9iamVjdHNCeVZhbHVlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZpbHRlclN1YmplY3Q/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW7Dp8OjbyBxdWUgYXRyaWJ1aSBmb2NvIGFvIGNvbXBvbmVudGUuXG4gICAqXG4gICAqIFBhcmEgdXRpbGl6w6EtbGEgw6kgbmVjZXNzw6FyaW8gdGVyIGEgaW5zdMOibmNpYSBkbyBjb21wb25lbnRlIG5vIERPTSwgcG9kZW5kbyBzZXIgdXRpbGl6YWRvIG8gVmlld0NoaWxkIGRhIHNlZ3VpbnRlIGZvcm1hOlxuICAgKlxuICAgKiBgYGBcbiAgICogaW1wb3J0IHsgUG9NdWx0aXNlbGVjdENvbXBvbmVudCB9IGZyb20gJ0Bwby11aS9uZy1jb21wb25lbnRzJztcbiAgICpcbiAgICogLi4uXG4gICAqXG4gICAqIEBWaWV3Q2hpbGQoUG9NdWx0aXNlbGVjdENvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgbXVsdGlzZWxlY3Q6IFBvTXVsdGlzZWxlY3RDb21wb25lbnQ7XG4gICAqXG4gICAqIGZvY3VzTXVsdGlzZWxlY3QoKSB7XG4gICAqICAgdGhpcy5tdWx0aXNlbGVjdC5mb2N1cygpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0SW5wdXRXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wby1tdWx0aXNlbGVjdC1pbnB1dCcpLm9mZnNldFdpZHRoIC0gcG9NdWx0aXNlbGVjdElucHV0UGFkZGluZ1JpZ2h0O1xuICB9XG5cbiAgZ2V0VGFnc1dpZHRoKCkge1xuICAgIGNvbnN0IHRhZ3MgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgncG8tdGFnJyk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGFncykubWFwKHRhZyA9PiB0YWdbJ29mZnNldFdpZHRoJ10pO1xuICB9XG5cbiAgY2FsY3VsYXRlVmlzaWJsZUl0ZW1zKCkge1xuICAgIHRoaXMuaGFzTW9yZVRhZyA9IGZhbHNlO1xuICAgIGNvbnN0IHRhZ3NXaWR0aCA9IHRoaXMuZ2V0VGFnc1dpZHRoKCk7XG4gICAgY29uc3QgaW5wdXRXaWR0aCA9IHRoaXMuZ2V0SW5wdXRXaWR0aCgpO1xuICAgIGNvbnN0IGV4dHJhVGFnU2l6ZSA9IDYzO1xuICAgIGNvbnN0IHRhZ3NWaXNpYmxlID0gdGFnc1dpZHRoWzBdO1xuXG4gICAgdGhpcy52aXNpYmxlVGFncyA9IFtdO1xuXG4gICAgaWYgKGlucHV0V2lkdGggPiAwKSB7XG4gICAgICBsZXQgc3VtID0gMDtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdW0gKz0gdGFnc1dpZHRoW2ldICsgcG9NdWx0aXNlbGVjdFNwYWNlQmV0d2VlblRhZ3M7XG4gICAgICAgIHRoaXMudmlzaWJsZVRhZ3MucHVzaCh0aGlzLnNlbGVjdGVkT3B0aW9uc1tpXSk7XG5cbiAgICAgICAgaWYgKHN1bSA+IGlucHV0V2lkdGgpIHtcbiAgICAgICAgICBzdW0gLT0gdGFnc1dpZHRoW2ldO1xuICAgICAgICAgIHRoaXMuaXNDYWxjdWxhdGVWaXNpYmxlSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGFnc1Zpc2libGUgfHwgIXRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBpZiAoaSA9PT0gdGhpcy5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pc0NhbGN1bGF0ZVZpc2libGVJdGVtcyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFzTW9yZVRhZyA9IHRydWU7XG4gICAgICAgIGlmIChzdW0gKyBleHRyYVRhZ1NpemUgPiBpbnB1dFdpZHRoKSB7XG4gICAgICAgICAgdGhpcy52aXNpYmxlVGFncy5zcGxpY2UoLTIsIDIpO1xuICAgICAgICAgIGNvbnN0IGxhYmVsID0gJysnICsgKHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCArIDEgLSBpKS50b1N0cmluZygpO1xuICAgICAgICAgIHRoaXMudmlzaWJsZVRhZ3MucHVzaCh7IFt0aGlzLmZpZWxkVmFsdWVdOiAnJywgW3RoaXMuZmllbGRMYWJlbF06IGxhYmVsIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmlzaWJsZVRhZ3Muc3BsaWNlKC0xLCAxKTtcbiAgICAgICAgICBjb25zdCBsYWJlbCA9ICcrJyArICh0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGggLSBpKS50b1N0cmluZygpO1xuICAgICAgICAgIHRoaXMudmlzaWJsZVRhZ3MucHVzaCh7IFt0aGlzLmZpZWxkVmFsdWVdOiAnJywgW3RoaXMuZmllbGRMYWJlbF06IGxhYmVsIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pbml0Q2FsY3VsYXRlSXRlbXMpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVLZXlib2FyZE5hdmlnYXRpb25UYWcoKTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5pdENhbGN1bGF0ZUl0ZW1zID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjaGFuZ2VJdGVtcyhjaGFuZ2VkSXRlbXMpIHtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkT3B0aW9ucyhjaGFuZ2VkSXRlbXMpO1xuICAgIHRoaXMuY2FsbE9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWRPcHRpb25zKTtcblxuICAgIGlmICh0aGlzLmF1dG9IZWlnaHQgJiYgdGhpcy5kcm9wZG93bk9wZW4pIHtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5hZGp1c3RDb250YWluZXJQb3NpdGlvbigpO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlS2V5Ym9hcmROYXZpZ2F0aW9uVGFnKCk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIHVwZGF0ZVZpc2libGVJdGVtcygpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9wdGlvbnMpIHtcbiAgICAgIHRoaXMudmlzaWJsZVRhZ3MgPSBbXS5jb25jYXQodGhpcy5zZWxlY3RlZE9wdGlvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuZGVib3VuY2VSZXNpemUoKTtcblxuICAgIC8vIHF1YW5kbyBlc3RpdmVyIGRlbnRybyBkZSBtb2RhbFxuICAgIGlmICghdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCkge1xuICAgICAgdGhpcy5pc0NhbGN1bGF0ZVZpc2libGVJdGVtcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgZGVib3VuY2VSZXNpemUoKSB7XG4gICAgaWYgKCF0aGlzLmF1dG9IZWlnaHQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRSZXNpemUpO1xuICAgICAgdGhpcy50aW1lb3V0UmVzaXplID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVmlzaWJsZUl0ZW1zKCk7XG4gICAgICB9LCAyMDApO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpID09PSAnc3RyaW5nJyAmJlxuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKS5pbmNsdWRlcygnVW5zZWxlY3RlZCcpXG4gICAgKSB7XG4gICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHRoaXMubGFiZWwgPyB0aGlzLmxhYmVsIDogJycpO1xuICAgIH1cbiAgICB0aGlzLm9uTW9kZWxUb3VjaGVkPy4oKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudD86IGFueSkge1xuICAgIGlmIChcbiAgICAgIChldmVudC5rZXlDb2RlID09PSBQb0tleUNvZGVFbnVtLnRhYiAmJiB0aGlzLnZpc2libGVUYWdzLmxlbmd0aCA+IDEpIHx8XG4gICAgICAoZXZlbnQua2V5Q29kZSA9PT0gUG9LZXlDb2RlRW51bS50YWIgJiYgdGhpcy52aXNpYmxlVGFncy5sZW5ndGggPCAxKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBQb0tleUNvZGVFbnVtLmVzYykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY29udHJvbERyb3Bkb3duVmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IFBvS2V5Q29kZUVudW0uYXJyb3dEb3duICYmIHRoaXMudmlzaWJsZVRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY29udHJvbERyb3Bkb3duVmlzaWJpbGl0eSh0cnVlKTtcbiAgICAgIHRoaXMuZHJvcGRvd24/Lmxpc3Rib3g/LnNldEZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IFBvS2V5Q29kZUVudW0uZW50ZXIgJiYgIXRoaXMuZW50ZXJDbG9zZVRhZykge1xuICAgICAgaWYgKHRoaXMudmlzaWJsZVRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlRHJvcGRvd25WaXNpYmlsaXR5KCk7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy50b2dnbGVEcm9wZG93blZpc2liaWxpdHkoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBQb0tleUNvZGVFbnVtLnNwYWNlKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy50b2dnbGVEcm9wZG93blZpc2liaWxpdHkoKTtcbiAgICB9XG4gICAgdGhpcy5lbnRlckNsb3NlVGFnID0gZmFsc2U7XG4gIH1cblxuICB0b2dnbGVEcm9wZG93blZpc2liaWxpdHkoKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVySW5GaXJzdENsaWNrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb250cm9sRHJvcGRvd25WaXNpYmlsaXR5KCF0aGlzLmRyb3Bkb3duT3Blbik7XG4gIH1cblxuICBvbktleURvd25Ecm9wZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5jb250cm9sRHJvcGRvd25WaXNpYmlsaXR5KGZhbHNlKTtcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBvcGVuRHJvcGRvd24odG9PcGVuKSB7XG4gICAgaWYgKHRvT3BlbiAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5jb250cm9sRHJvcGRvd25WaXNpYmlsaXR5KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnRyb2xEcm9wZG93blZpc2liaWxpdHkodG9PcGVuOiBib29sZWFuKSB7XG4gICAgdG9PcGVuID8gdGhpcy5vcGVuKCkgOiB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICBzY3JvbGxUb1NlbGVjdGVkT3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9wdGlvbnMgJiYgdGhpcy5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMub3B0aW9ucy5maW5kSW5kZXgoXG4gICAgICAgIG9wdGlvbiA9PiBvcHRpb25bdGhpcy5maWVsZFZhbHVlXSA9PT0gdGhpcy5zZWxlY3RlZE9wdGlvbnNbMF1bdGhpcy5maWVsZFZhbHVlXVxuICAgICAgKTtcbiAgICAgIHRoaXMuZHJvcGRvd24uc2Nyb2xsVG8oaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFZpc2libGVPcHRpb25zRHJvcGRvd24ob3B0aW9ucykge1xuICAgIHRoaXMudmlzaWJsZU9wdGlvbnNEcm9wZG93biA9IG9wdGlvbnM7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNoYW5nZVNlYXJjaChldmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudFt0aGlzLmZpZWxkVmFsdWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLmZpbHRlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJTdWJqZWN0Lm5leHQoZXZlbnRbdGhpcy5maWVsZFZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlYXJjaEJ5TGFiZWwoZXZlbnRbdGhpcy5maWVsZFZhbHVlXSwgdGhpcy5vcHRpb25zLCB0aGlzLmZpbHRlck1vZGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFZpc2libGVPcHRpb25zRHJvcGRvd24odGhpcy5vcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyB0aW1lb3V0IG5lY2Vzc8OhcmlvIHBhcmEgcmVwb3NpY2lvbmFyIGNvcnJldGFtZW50ZSBxdWFuZG8gZHJvcGRvd24gZXN0aXZlciBwcmEgY2ltYSBkbyBpbnB1dCBlIHJlYWxpemFyIGJ1c2NhIG5vIGlucHV0XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkanVzdENvbnRhaW5lclBvc2l0aW9uKCkpO1xuICB9XG5cbiAgY2xvc2VUYWcodmFsdWUsIGV2ZW50KSB7XG4gICAgbGV0IGluZGV4O1xuICAgIHRoaXMuZW50ZXJDbG9zZVRhZyA9IHRydWU7XG4gICAgaWYgKCF2YWx1ZSB8fCAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5pbmNsdWRlcygnKycpKSkge1xuICAgICAgaW5kZXggPSBudWxsO1xuICAgICAgY29uc3QgaXRlbXNOb3RJblZpc2libGVUYWdzID0gdGhpcy5zZWxlY3RlZE9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiAhdGhpcy52aXNpYmxlVGFncy5pbmNsdWRlcyhvcHRpb24pKTtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHRoaXMudmlzaWJsZVRhZ3MpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkT3B0aW9ucy5pbmNsdWRlcyhvcHRpb24pKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMuc3BsaWNlKHRoaXMudmlzaWJsZVRhZ3MubGVuZ3RoIC0gMSwgaXRlbXNOb3RJblZpc2libGVUYWdzLmxlbmd0aCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlSXRlbXMoKTtcbiAgICAgICAgICB0aGlzLmNhbGxPbkNoYW5nZSh0aGlzLnNlbGVjdGVkT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXggPSB0aGlzLnNlbGVjdGVkT3B0aW9ucy5maW5kSW5kZXgob3B0aW9uID0+IG9wdGlvblt0aGlzLmZpZWxkVmFsdWVdID09PSB2YWx1ZSk7XG4gICAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlSXRlbXMoKTtcbiAgICAgIHRoaXMuY2FsbE9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWRPcHRpb25zKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZm9jdXNPbk5leHRUYWcoaW5kZXgsIGV2ZW50KTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgd2FzQ2xpY2tlZE9uVG9nZ2xlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kcm9wZG93bk9wZW4gJiZcbiAgICAgICF0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICF0aGlzLmljb25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgIXRoaXMuZHJvcGRvd25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuICAgICkge1xuICAgICAgdGhpcy5jb250cm9sRHJvcGRvd25WaXNpYmlsaXR5KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUZpbHRlcih2YWx1ZTogc3RyaW5nID0gJycpOiBPYnNlcnZhYmxlPEFycmF5PFBvTXVsdGlzZWxlY3RPcHRpb24gfCBhbnk+PiB7XG4gICAgY29uc3QgcGFyYW0gPSB7IHByb3BlcnR5OiB0aGlzLmZpZWxkTGFiZWwsIHZhbHVlOiB2YWx1ZSB9O1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZ2V0RmlsdGVyZWREYXRhKHBhcmFtKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICB0aGlzLmlzU2VydmVyU2VhcmNoaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICB9KSxcbiAgICAgIHRhcCgob3B0aW9uczogQXJyYXk8UG9NdWx0aXNlbGVjdE9wdGlvbiB8IGFueT4pID0+IHtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zQnlBcHBseUZpbHRlcihvcHRpb25zKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJJbkZpcnN0Q2xpY2soKSB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdEZpbHRlcikge1xuICAgICAgdGhpcy5pc1NlcnZlclNlYXJjaGluZyA9IHRydWU7XG5cbiAgICAgIC8vIG5lY2Vzc2FyaW8gZW52aWFyIHVtIG9iamV0byBzdHJpbmcgdmF6aWEgcGFyYSByZWZhemVyIGEgYnVzY2EsIHF1YW5kbyBhbHRlcmFyIGZpbHRlclNlcnZpY2UsIGZpZWxkVmFsdWUgZSBmaWVsZExhYmVsXG4gICAgICAvLyBwb2lzIHRlbW9zIG8gZGlzdGluY3RVbnRpbENoYW5nZSBubyBwaXBlIGRvIGZpbHRlclN1YmplY3RcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldy13cmFwcGVycyAqL1xuICAgICAgdGhpcy5maWx0ZXJTdWJqZWN0Lm5leHQobmV3IFN0cmluZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zID0gWy4uLnRoaXMuY2FjaGVPcHRpb25zXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldE9wdGlvbnNCeUFwcGx5RmlsdGVyKGl0ZW1zOiBBcnJheTxQb011bHRpc2VsZWN0T3B0aW9uIHwgYW55Pikge1xuICAgIGlmICh0aGlzLmlzRmlyc3RGaWx0ZXIpIHtcbiAgICAgIHRoaXMuY2FjaGVPcHRpb25zID0gWy4uLml0ZW1zXTtcbiAgICAgIHRoaXMuaXNGaXJzdEZpbHRlciA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRWaXNpYmxlT3B0aW9uc0Ryb3Bkb3duKHRoaXMub3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFkanVzdENvbnRhaW5lclBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbFBvc2l0aW9uLmFkanVzdFBvc2l0aW9uKHBvTXVsdGlzZWxlY3RDb250YWluZXJQb3NpdGlvbkRlZmF1bHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3Bkb3duSWNvbiA9ICdwby1pY29uLWFycm93LWRvd24nO1xuICAgIHRoaXMuZHJvcGRvd25PcGVuID0gZmFsc2U7XG5cbiAgICB0aGlzLmRyb3Bkb3duLmNvbnRyb2xWaXNpYmlsaXR5KGZhbHNlKTtcbiAgICB0aGlzLnNldFZpc2libGVPcHRpb25zRHJvcGRvd24odGhpcy5vcHRpb25zKTtcblxuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzT25OZXh0VGFnKGluZGV4Q2xvc2VkOiBudW1iZXIsIGNsaWNrT3JFbnRlcjogc3RyaW5nKSB7XG4gICAgaWYgKGNsaWNrT3JFbnRlciA9PT0gJ2VudGVyJykge1xuICAgICAgY29uc3QgdGFnUmVtb3ZlRWxlbWVudHM6IEFycmF5PGFueT4gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBvLXRhZy1yZW1vdmUnKTtcbiAgICAgIGluZGV4Q2xvc2VkID0gaW5kZXhDbG9zZWQgfHwgaW5kZXhDbG9zZWQgPT09IDAgPyBpbmRleENsb3NlZCA6IHRhZ1JlbW92ZUVsZW1lbnRzLmxlbmd0aDtcbiAgICAgIGlmICh0YWdSZW1vdmVFbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGBVbnNlbGVjdGVkIGl0ZW1zICR7dGhpcy5sYWJlbH1gKTtcbiAgICAgICAgdGhpcy5jb250cm9sRHJvcGRvd25WaXNpYmlsaXR5KHRydWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c09uUmVtb3ZlVGFnKHRhZ1JlbW92ZUVsZW1lbnRzLCBpbmRleENsb3NlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4Q2xvc2VkID0gMDtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVLZXlib2FyZE5hdmlnYXRpb25UYWcoaW5kZXhDbG9zZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c09uUmVtb3ZlVGFnKHRhZzogYW55LCBpbmRleENsb3NlZDogbnVtYmVyKSB7XG4gICAgaWYgKHRhZy5sZW5ndGggPT09IGluZGV4Q2xvc2VkKSB7XG4gICAgICB0YWdbaW5kZXhDbG9zZWQgLSAxXT8uZm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFnW2luZGV4Q2xvc2VkXT8uZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlS2V5Ym9hcmROYXZpZ2F0aW9uVGFnKGluaXRpYWxJbmRleCA9IDApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgIGNvbnN0IHRhZ1JlbW92ZUVsZW1lbnRzID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wby10YWctcmVtb3ZlJyk7XG4gICAgdGhpcy5pbml0aWFsaXplVGFnUmVtb3ZlRWxlbWVudHModGFnUmVtb3ZlRWxlbWVudHMsIGluaXRpYWxJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIHNldFRhYkluZGV4KGVsZW1lbnQsIHRhYkluZGV4KSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgdGFiSW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBcnJvd0xlZnQodGFnUmVtb3ZlRWxlbWVudHMsIGluZGV4KSB7XG4gICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgdGhpcy5zZXRUYWJJbmRleCh0YWdSZW1vdmVFbGVtZW50c1tpbmRleF0sIC0xKTtcbiAgICAgIHRhZ1JlbW92ZUVsZW1lbnRzW2luZGV4IC0gMV0uZm9jdXMoKTtcbiAgICAgIHRoaXMuc2V0VGFiSW5kZXgodGFnUmVtb3ZlRWxlbWVudHNbaW5kZXggLSAxXSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBcnJvd1JpZ2h0KHRhZ1JlbW92ZUVsZW1lbnRzLCBpbmRleCkge1xuICAgIGlmIChpbmRleCA8IHRhZ1JlbW92ZUVsZW1lbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuc2V0VGFiSW5kZXgodGFnUmVtb3ZlRWxlbWVudHNbaW5kZXhdLCAtMSk7XG4gICAgICB0YWdSZW1vdmVFbGVtZW50c1tpbmRleCArIDFdLmZvY3VzKCk7XG4gICAgICB0aGlzLnNldFRhYkluZGV4KHRhZ1JlbW92ZUVsZW1lbnRzW2luZGV4ICsgMV0sIDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgdGFnUmVtb3ZlRWxlbWVudHMsIGluZGV4KSB7XG4gICAgY29uc3QgS0VZX1NQQUNFID0gJ1NwYWNlJztcbiAgICBjb25zdCBLRVlfQVJST1dfTEVGVCA9ICdBcnJvd0xlZnQnO1xuICAgIGNvbnN0IEtFWV9BUlJPV19SSUdIVCA9ICdBcnJvd1JpZ2h0JztcblxuICAgIGlmIChldmVudC5jb2RlID09PSBLRVlfU1BBQ0UpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlfQVJST1dfTEVGVCkge1xuICAgICAgdGhpcy5oYW5kbGVBcnJvd0xlZnQodGFnUmVtb3ZlRWxlbWVudHMsIGluZGV4KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZX0FSUk9XX1JJR0hUKSB7XG4gICAgICB0aGlzLmhhbmRsZUFycm93UmlnaHQodGFnUmVtb3ZlRWxlbWVudHMsIGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUYWdSZW1vdmVFbGVtZW50cyh0YWdSZW1vdmVFbGVtZW50cywgaW5pdGlhbEluZGV4KSB7XG4gICAgdGFnUmVtb3ZlRWxlbWVudHMuZm9yRWFjaCgodGFnUmVtb3ZlRWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA9PT0gaW5pdGlhbEluZGV4KSB7XG4gICAgICAgIHRoaXMuc2V0VGFiSW5kZXgodGFnUmVtb3ZlRWxlbWVudHNbaW5pdGlhbEluZGV4XSwgMCk7XG4gICAgICB9IGVsc2UgaWYgKHRhZ1JlbW92ZUVsZW1lbnRzLmxlbmd0aCA9PT0gaW5pdGlhbEluZGV4KSB7XG4gICAgICAgIHRoaXMuc2V0VGFiSW5kZXgodGFnUmVtb3ZlRWxlbWVudHNbaW5pdGlhbEluZGV4IC0gMV0sIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRUYWJJbmRleCh0YWdSZW1vdmVFbGVtZW50LCAtMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgZnJvbUV2ZW50KHRhZ1JlbW92ZUVsZW1lbnQsICdrZXlkb3duJykuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlS2V5RG93bihldmVudCwgdGFnUmVtb3ZlRWxlbWVudHMsIGluZGV4KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5jbGlja091dExpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2NsaWNrJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLndhc0NsaWNrZWRPblRvZ2dsZShldmVudCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc2l6ZUxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdyZXNpemUnLCAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVJdGVtcygpO1xuXG4gICAgICBpc01vYmlsZSgpID8gdGhpcy5hZGp1c3RDb250YWluZXJQb3NpdGlvbigpIDogdGhpcy5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25TY3JvbGwsIHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNjcm9sbCA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLmFkanVzdENvbnRhaW5lclBvc2l0aW9uKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBvcGVuKCk6IHZvaWQge1xuICAgIHRoaXMuZHJvcGRvd25JY29uID0gJ3BvLWljb24tYXJyb3ctdXAnO1xuICAgIHRoaXMuZHJvcGRvd25PcGVuID0gdHJ1ZTtcblxuICAgIHRoaXMuZHJvcGRvd24uY29udHJvbFZpc2liaWxpdHkodHJ1ZSk7XG4gICAgdGhpcy5zZXRWaXNpYmxlT3B0aW9uc0Ryb3Bkb3duKHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5pbml0aWFsaXplTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkT3B0aW9ucygpO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5zZXRQb3NpdGlvbkRyb3Bkb3duKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUxpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGlja091dExpc3RlbmVyKSB7XG4gICAgICB0aGlzLmNsaWNrT3V0TGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNpemVMaXN0ZW5lcikge1xuICAgICAgdGhpcy5yZXNpemVMaXN0ZW5lcigpO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uU2Nyb2xsLCB0cnVlKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQb3NpdGlvbkRyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbFBvc2l0aW9uLnNldEVsZW1lbnRzKFxuICAgICAgdGhpcy5kcm9wZG93bi5jb250YWluZXIubmF0aXZlRWxlbWVudCxcbiAgICAgIHBvTXVsdGlzZWxlY3RDb250YWluZXJPZmZzZXQsXG4gICAgICB0aGlzLmlucHV0RWxlbWVudCxcbiAgICAgIFsndG9wJywgJ2JvdHRvbSddLFxuICAgICAgdHJ1ZVxuICAgICk7XG5cbiAgICB0aGlzLmFkanVzdENvbnRhaW5lclBvc2l0aW9uKCk7XG4gIH1cbn1cbiIsIjxwby1maWVsZC1jb250YWluZXJcbiAgW3AtZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbcC1sYWJlbF09XCJsYWJlbFwiXG4gIFtwLW9wdGlvbmFsXT1cIm9wdGlvbmFsXCJcbiAgW3AtcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICBbcC1zaG93LXJlcXVpcmVkXT1cInNob3dSZXF1aXJlZFwiXG4+XG4gIDxkaXZcbiAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICBjbGFzcz1cInBvLWZpZWxkLWNvbnRhaW5lci1jb250ZW50XCJcbiAgICBbY2xhc3MucG8tbXVsdGlzZWxlY3Qtc2hvd109XCJkcm9wZG93bk9wZW5cIlxuICA+XG4gICAgPGRpdlxuICAgICAgI2lucHV0RWxlbWVudFxuICAgICAgW3RhYmluZGV4XT1cImRpc2FibGVkID8gLTEgOiAwXCJcbiAgICAgIFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxcIlxuICAgICAgY2xhc3M9XCJwby1pbnB1dC1pY29uLXJpZ2h0IHBvLW11bHRpc2VsZWN0LWlucHV0XCJcbiAgICAgIFtjbGFzcy5wby1tdWx0aXNlbGVjdC1pbnB1dC1hdXRvXT1cImF1dG9IZWlnaHRcIlxuICAgICAgW2NsYXNzLnBvLW11bHRpc2VsZWN0LWlucHV0LXN0YXRpY109XCIhYXV0b0hlaWdodFwiXG4gICAgICBbY2xhc3MucG8tbXVsdGlzZWxlY3QtaW5wdXQtZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzLnBvLW11bHRpc2VsZWN0LWlucHV0LWZvbnRdPVwiIWRpc2FibGVkICYmICF2aXNpYmxlVGFncz8ubGVuZ3RoXCJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVEcm9wZG93blZpc2liaWxpdHkoKVwiXG4gICAgICAoYmx1cik9XCJvbkJsdXIoKVwiXG4gICAgPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhZGlzYWJsZWQgJiYgIXZpc2libGVUYWdzPy5sZW5ndGhcIiBjbGFzcz1cInBvLW11bHRpc2VsZWN0LWlucHV0LXBsYWNlaG9sZGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgIHt7IHBsYWNlaG9sZGVyID8gcGxhY2Vob2xkZXIgOiBsaXRlcmFscy5zZWxlY3RJdGVtIH19XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxwby10YWdcbiAgICAgICAgKm5nRm9yPVwibGV0IHRhZyBvZiB2aXNpYmxlVGFnczsgaW5kZXggYXMgaVwiXG4gICAgICAgIFtwLXZhbHVlXT1cInRhZ1tmaWVsZExhYmVsXVwiXG4gICAgICAgIFtwLWxpdGVyYWxzXT1cImkgKyAxID09PSB2aXNpYmxlVGFncy5sZW5ndGggJiYgaGFzTW9yZVRhZyA/IGxpdGVyYWxzVGFnIDogdW5kZWZpbmVkXCJcbiAgICAgICAgW3AtcmVtb3ZhYmxlXT1cInRydWVcIlxuICAgICAgICBbY2xhc3MucG8tY2xpY2thYmxlXT1cInRhZ1tmaWVsZFZhbHVlXSA9PT0gJycgJiYgIWRpc2FibGVkXCJcbiAgICAgICAgW3AtZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAocC1jbG9zZSk9XCJjbG9zZVRhZyh0YWdbZmllbGRWYWx1ZV0sICRldmVudClcIlxuICAgICAgPjwvcG8tdGFnPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicG8tZmllbGQtaWNvbi1jb250YWluZXItcmlnaHRcIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAjaWNvbkVsZW1lbnRcbiAgICAgICAgICBjbGFzcz1cInBvLWljb24gcG8tZmllbGQtaWNvbiB7eyBkcm9wZG93bkljb24gfX0ge3sgZGlzYWJsZWQgPyAncG8taWNvbi1pbnB1dC1kaXNhYmxlZCcgOiAncG8taWNvbi1pbnB1dCcgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImRpc2FibGVkID8gJ3BvLWZpZWxkLWljb24tZGlzYWJsZWQnIDogJydcIlxuICAgICAgICA+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXBwZW5kQm94OyB0aGVuIGRyb3Bkb3duQ0RLOyBlbHNlIGRyb3Bkb3duRGVmYXVsdFwiPiA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGUgI2Ryb3Bkb3duRGVmYXVsdD5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd25MaXN0Ym94XCI+IDwvbmctY29udGFpbmVyPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSAjZHJvcGRvd25DREs+XG4gICAgPG5nLXRlbXBsYXRlIGNka0Nvbm5lY3RlZE92ZXJsYXkgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJ0cnVlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd25MaXN0Ym94XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8cG8tZmllbGQtY29udGFpbmVyLWJvdHRvbSBbcC1oZWxwXT1cImhlbHBcIiBbcC1kaXNhYmxlZF09XCJkaXNhYmxlZFwiPjwvcG8tZmllbGQtY29udGFpbmVyLWJvdHRvbT5cbjwvcG8tZmllbGQtY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3duTGlzdGJveD5cbiAgPHBvLW11bHRpc2VsZWN0LWRyb3Bkb3duXG4gICAgI2Ryb3Bkb3duRWxlbWVudFxuICAgIFtwLXNlYXJjaGluZ109XCJpc1NlcnZlclNlYXJjaGluZ1wiXG4gICAgW3AtaGlkZS1zZWFyY2hdPVwiaGlkZVNlYXJjaFwiXG4gICAgW3AtaGlkZS1zZWxlY3QtYWxsXT1cImhpZGVTZWxlY3RBbGxcIlxuICAgIFtwLWxpdGVyYWxzXT1cImxpdGVyYWxzXCJcbiAgICBbcC1vcHRpb25zXT1cIm9wdGlvbnNcIlxuICAgIFtwLXZpc2libGUtb3B0aW9uc109XCJ2aXNpYmxlT3B0aW9uc0Ryb3Bkb3duXCJcbiAgICBbcC1zZWxlY3RlZC1vcHRpb25zXT1cInNlbGVjdGVkT3B0aW9uc1wiXG4gICAgW3AtcGxhY2Vob2xkZXItc2VhcmNoXT1cInBsYWNlaG9sZGVyU2VhcmNoXCJcbiAgICBbcC1maWVsZC12YWx1ZV09XCJmaWVsZFZhbHVlXCJcbiAgICBbcC1maWVsZC1sYWJlbF09XCJmaWVsZExhYmVsXCJcbiAgICBbcC1tdWx0aXNlbGVjdC10ZW1wbGF0ZV09XCJtdWx0aXNlbGVjdE9wdGlvblRlbXBsYXRlXCJcbiAgICAocC1jaGFuZ2UpPVwiY2hhbmdlSXRlbXMoJGV2ZW50KVwiXG4gICAgKHAtY2hhbmdlLXNlYXJjaCk9XCJjaGFuZ2VTZWFyY2goJGV2ZW50KVwiXG4gICAgKHAtY2xvc2UtZHJvcGRvd24pPVwiY29udHJvbERyb3Bkb3duVmlzaWJpbGl0eShmYWxzZSlcIlxuICAgIChrZXlkb3duKT1cIm9uS2V5RG93bkRyb3Bkb3duKCRldmVudCwgMClcIlxuICA+XG4gIDwvcG8tbXVsdGlzZWxlY3QtZHJvcGRvd24+XG48L25nLXRlbXBsYXRlPlxuIl19