@esfaenza/forms-and-validations 11.2.149-beta1 → 11.2.149-beta3

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.
@@ -2,13 +2,14 @@
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
4
  export * from './public-api';
5
- export { FormAdaptiveComponentLoc as ɵe } from './lib/forms/form-adaptive/form-adaptive.component.loc';
6
- export { FormAutocompleteComponentLoc as ɵi } from './lib/forms/form-autocomplete/form-autocomplete.component.loc';
7
- export { FormFileComponentLoc as ɵh } from './lib/forms/form-file/form-file.component.loc';
8
- export { FormMultiSelectComponent as ɵf } from './lib/forms/form-multiselect/form-multiselect.component';
9
- export { FormMultiSelectComponentLoc as ɵg } from './lib/forms/form-multiselect/form-multiselect.component.loc';
10
- export { FormSelectComponentLoc as ɵd } from './lib/forms/form-select/form-select.component.loc';
5
+ export { FormAdaptiveComponentLoc as ɵf } from './lib/forms/form-adaptive/form-adaptive.component.loc';
6
+ export { FormAutocompleteComponentLoc as ɵj } from './lib/forms/form-autocomplete/form-autocomplete.component.loc';
7
+ export { FormFileComponentLoc as ɵi } from './lib/forms/form-file/form-file.component.loc';
8
+ export { FormInputComponent as ɵd } from './lib/forms/form-input-new/form-input.component';
9
+ export { FormMultiSelectComponent as ɵg } from './lib/forms/form-multiselect/form-multiselect.component';
10
+ export { FormMultiSelectComponentLoc as ɵh } from './lib/forms/form-multiselect/form-multiselect.component.loc';
11
+ export { FormSelectComponentLoc as ɵe } from './lib/forms/form-select/form-select.component.loc';
11
12
  export { BaseValidation as ɵa } from './lib/validations/base-validation';
12
13
  export { BaseValidationLoc as ɵb } from './lib/validations/base-validation.loc';
13
14
  export { CustomRequiredDirective as ɵc } from './lib/validations/customValidators/CustomRequiredDirective';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNmYWVuemEtZm9ybXMtYW5kLXZhbGlkYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9lc2ZhZW56YS1mb3Jtcy1hbmQtdmFsaWRhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQztBQUU3QixPQUFPLEVBQUMsd0JBQXdCLElBQUksRUFBRSxFQUFDLE1BQU0sdURBQXVELENBQUM7QUFDckcsT0FBTyxFQUFDLDRCQUE0QixJQUFJLEVBQUUsRUFBQyxNQUFNLCtEQUErRCxDQUFDO0FBQ2pILE9BQU8sRUFBQyxvQkFBb0IsSUFBSSxFQUFFLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUN6RixPQUFPLEVBQUMsd0JBQXdCLElBQUksRUFBRSxFQUFDLE1BQU0seURBQXlELENBQUM7QUFDdkcsT0FBTyxFQUFDLDJCQUEyQixJQUFJLEVBQUUsRUFBQyxNQUFNLDZEQUE2RCxDQUFDO0FBQzlHLE9BQU8sRUFBQyxzQkFBc0IsSUFBSSxFQUFFLEVBQUMsTUFBTSxtREFBbUQsQ0FBQztBQUMvRixPQUFPLEVBQUMsY0FBYyxJQUFJLEVBQUUsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxpQkFBaUIsSUFBSSxFQUFFLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUMsdUJBQXVCLElBQUksRUFBRSxFQUFDLE1BQU0sNERBQTRELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG5cbmV4cG9ydCB7Rm9ybUFkYXB0aXZlQ29tcG9uZW50TG9jIGFzIMm1ZX0gZnJvbSAnLi9saWIvZm9ybXMvZm9ybS1hZGFwdGl2ZS9mb3JtLWFkYXB0aXZlLmNvbXBvbmVudC5sb2MnO1xuZXhwb3J0IHtGb3JtQXV0b2NvbXBsZXRlQ29tcG9uZW50TG9jIGFzIMm1aX0gZnJvbSAnLi9saWIvZm9ybXMvZm9ybS1hdXRvY29tcGxldGUvZm9ybS1hdXRvY29tcGxldGUuY29tcG9uZW50LmxvYyc7XG5leHBvcnQge0Zvcm1GaWxlQ29tcG9uZW50TG9jIGFzIMm1aH0gZnJvbSAnLi9saWIvZm9ybXMvZm9ybS1maWxlL2Zvcm0tZmlsZS5jb21wb25lbnQubG9jJztcbmV4cG9ydCB7Rm9ybU11bHRpU2VsZWN0Q29tcG9uZW50IGFzIMm1Zn0gZnJvbSAnLi9saWIvZm9ybXMvZm9ybS1tdWx0aXNlbGVjdC9mb3JtLW11bHRpc2VsZWN0LmNvbXBvbmVudCc7XG5leHBvcnQge0Zvcm1NdWx0aVNlbGVjdENvbXBvbmVudExvYyBhcyDJtWd9IGZyb20gJy4vbGliL2Zvcm1zL2Zvcm0tbXVsdGlzZWxlY3QvZm9ybS1tdWx0aXNlbGVjdC5jb21wb25lbnQubG9jJztcbmV4cG9ydCB7Rm9ybVNlbGVjdENvbXBvbmVudExvYyBhcyDJtWR9IGZyb20gJy4vbGliL2Zvcm1zL2Zvcm0tc2VsZWN0L2Zvcm0tc2VsZWN0LmNvbXBvbmVudC5sb2MnO1xuZXhwb3J0IHtCYXNlVmFsaWRhdGlvbiBhcyDJtWF9IGZyb20gJy4vbGliL3ZhbGlkYXRpb25zL2Jhc2UtdmFsaWRhdGlvbic7XG5leHBvcnQge0Jhc2VWYWxpZGF0aW9uTG9jIGFzIMm1Yn0gZnJvbSAnLi9saWIvdmFsaWRhdGlvbnMvYmFzZS12YWxpZGF0aW9uLmxvYyc7XG5leHBvcnQge0N1c3RvbVJlcXVpcmVkRGlyZWN0aXZlIGFzIMm1Y30gZnJvbSAnLi9saWIvdmFsaWRhdGlvbnMvY3VzdG9tVmFsaWRhdG9ycy9DdXN0b21SZXF1aXJlZERpcmVjdGl2ZSc7Il19
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNmYWVuemEtZm9ybXMtYW5kLXZhbGlkYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9lc2ZhZW56YS1mb3Jtcy1hbmQtdmFsaWRhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQztBQUU3QixPQUFPLEVBQUMsd0JBQXdCLElBQUksRUFBRSxFQUFDLE1BQU0sdURBQXVELENBQUM7QUFDckcsT0FBTyxFQUFDLDRCQUE0QixJQUFJLEVBQUUsRUFBQyxNQUFNLCtEQUErRCxDQUFDO0FBQ2pILE9BQU8sRUFBQyxvQkFBb0IsSUFBSSxFQUFFLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUN6RixPQUFPLEVBQUMsa0JBQWtCLElBQUksRUFBRSxFQUFDLE1BQU0saURBQWlELENBQUM7QUFDekYsT0FBTyxFQUFDLHdCQUF3QixJQUFJLEVBQUUsRUFBQyxNQUFNLHlEQUF5RCxDQUFDO0FBQ3ZHLE9BQU8sRUFBQywyQkFBMkIsSUFBSSxFQUFFLEVBQUMsTUFBTSw2REFBNkQsQ0FBQztBQUM5RyxPQUFPLEVBQUMsc0JBQXNCLElBQUksRUFBRSxFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDL0YsT0FBTyxFQUFDLGNBQWMsSUFBSSxFQUFFLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUMsaUJBQWlCLElBQUksRUFBRSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFDLHVCQUF1QixJQUFJLEVBQUUsRUFBQyxNQUFNLDREQUE0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuXG5leHBvcnQge0Zvcm1BZGFwdGl2ZUNvbXBvbmVudExvYyBhcyDJtWZ9IGZyb20gJy4vbGliL2Zvcm1zL2Zvcm0tYWRhcHRpdmUvZm9ybS1hZGFwdGl2ZS5jb21wb25lbnQubG9jJztcbmV4cG9ydCB7Rm9ybUF1dG9jb21wbGV0ZUNvbXBvbmVudExvYyBhcyDJtWp9IGZyb20gJy4vbGliL2Zvcm1zL2Zvcm0tYXV0b2NvbXBsZXRlL2Zvcm0tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5sb2MnO1xuZXhwb3J0IHtGb3JtRmlsZUNvbXBvbmVudExvYyBhcyDJtWl9IGZyb20gJy4vbGliL2Zvcm1zL2Zvcm0tZmlsZS9mb3JtLWZpbGUuY29tcG9uZW50LmxvYyc7XG5leHBvcnQge0Zvcm1JbnB1dENvbXBvbmVudCBhcyDJtWR9IGZyb20gJy4vbGliL2Zvcm1zL2Zvcm0taW5wdXQtbmV3L2Zvcm0taW5wdXQuY29tcG9uZW50JztcbmV4cG9ydCB7Rm9ybU11bHRpU2VsZWN0Q29tcG9uZW50IGFzIMm1Z30gZnJvbSAnLi9saWIvZm9ybXMvZm9ybS1tdWx0aXNlbGVjdC9mb3JtLW11bHRpc2VsZWN0LmNvbXBvbmVudCc7XG5leHBvcnQge0Zvcm1NdWx0aVNlbGVjdENvbXBvbmVudExvYyBhcyDJtWh9IGZyb20gJy4vbGliL2Zvcm1zL2Zvcm0tbXVsdGlzZWxlY3QvZm9ybS1tdWx0aXNlbGVjdC5jb21wb25lbnQubG9jJztcbmV4cG9ydCB7Rm9ybVNlbGVjdENvbXBvbmVudExvYyBhcyDJtWV9IGZyb20gJy4vbGliL2Zvcm1zL2Zvcm0tc2VsZWN0L2Zvcm0tc2VsZWN0LmNvbXBvbmVudC5sb2MnO1xuZXhwb3J0IHtCYXNlVmFsaWRhdGlvbiBhcyDJtWF9IGZyb20gJy4vbGliL3ZhbGlkYXRpb25zL2Jhc2UtdmFsaWRhdGlvbic7XG5leHBvcnQge0Jhc2VWYWxpZGF0aW9uTG9jIGFzIMm1Yn0gZnJvbSAnLi9saWIvdmFsaWRhdGlvbnMvYmFzZS12YWxpZGF0aW9uLmxvYyc7XG5leHBvcnQge0N1c3RvbVJlcXVpcmVkRGlyZWN0aXZlIGFzIMm1Y30gZnJvbSAnLi9saWIvdmFsaWRhdGlvbnMvY3VzdG9tVmFsaWRhdG9ycy9DdXN0b21SZXF1aXJlZERpcmVjdGl2ZSc7Il19
@@ -1,7 +1,7 @@
1
1
  // Angular
2
2
  import { NgControl, RequiredValidator } from "@angular/forms";
3
3
  import { EventEmitter, Input, Output, ViewChild, Optional, Inject, Directive, ChangeDetectorRef } from "@angular/core";
4
- // // Configurazioni
4
+ // Configurazioni
5
5
  import { AccessControlService, ComponentContext } from "@esfaenza/access-control";
6
6
  import { ACO_CUSTOMKEY, FAV_DEBUG_MODE } from '../tokens';
7
7
  import { Subject } from "rxjs";
@@ -178,19 +178,6 @@ export class BaseFormControl {
178
178
  this.LabelColWidth = parseInt(ratio[0]);
179
179
  this.InputColWidth = parseInt(ratio[1]);
180
180
  }
181
- /**
182
- * Query sull'elemento 'baseInput' che funziona in ambiente statico
183
- *
184
- * @param {NgModel} comp Elemento HTML marcato con "#baseInput"
185
- */
186
- set baseInput(comp) { this.registerBaseInput(comp); }
187
- /**
188
- * Query sull'elemento 'baseInput' che funziona in ambiente dinamico
189
- *
190
- * @param {NgModel} comp Elemento HTML marcato con "#baseInput"
191
- */
192
- set baseInput_static(comp) { this.registerBaseInput(comp); }
193
- ;
194
181
  /**
195
182
  * Effettua il Bind/Parse delle varie **Source** unendo le informazioni specificate in **Display**
196
183
  *
@@ -275,7 +262,7 @@ export class BaseFormControl {
275
262
  ngOnInit() {
276
263
  // A volte nell'ngOnInit non ci passa quindi lo metto sia qui sia nell'afterviewinit, penso che valga per i componenti di terze parti
277
264
  // che si collegano per i cazzi loro al form ecc, quindi la parte sopra non serve... BOH
278
- this.checkRequiredValidator();
265
+ this.doCheckRequiredValidator();
279
266
  //Il nome non c'è se metto standalone : true (CHE NON é DA METTERE)
280
267
  //Dato che anche il controllo esterno viene considerato come componente del form, non posso basarmi solo sul nome ma devo aggiungere un tag. In questo caso "_internal"
281
268
  // ATTENZIONE: QUALSIASI SIA IL MOTIVO, SE STO COSO VIENE SPOSTATO DALL ngOnInit NON FUNZIONA PIU NULLA
@@ -293,6 +280,7 @@ export class BaseFormControl {
293
280
  let origFunc = this.Form.onSubmit;
294
281
  var formOutsideRef = this.Form;
295
282
  this.Form.onSubmit = (ev) => {
283
+ this.submitted = true;
296
284
  this.cdr.markForCheck();
297
285
  return origFunc.apply(formOutsideRef);
298
286
  };
@@ -323,17 +311,17 @@ export class BaseFormControl {
323
311
  this.destroyed$.complete();
324
312
  }
325
313
  /** Elabora i validatori iniettati e capisce se il valore è obbligatorio o meno */
326
- checkRequiredValidator() {
327
- // controllo se è settato un required per decidere in maniera condizionale se utilizzare il validatore required nel componente interno
314
+ doCheckRequiredValidator() {
315
+ // Controllo se è settato un required per decidere in maniera condizionale se utilizzare il validatore required nel componente interno
328
316
  // Lo faccio qui e non in un eventuale ngOnInit o costruttore perché ngOnInit non sempre viene chiamato e da costruttore il validatore non ha ancora il valore giusto
329
- if (this._validators && this._validators.some(elem => elem instanceof RequiredValidator && elem.required))
317
+ if (this._validators && this.Validation && this._validators.some(elem => elem instanceof RequiredValidator && elem.required))
330
318
  this.Required = true;
331
319
  }
332
320
  /** @ignore */
333
321
  ngAfterViewInit() {
334
322
  if (!this.ngControl)
335
323
  return;
336
- this.checkRequiredValidator();
324
+ this.doCheckRequiredValidator();
337
325
  }
338
326
  /** Helper che collega la funzione di reset del controllo form al controllo di validazione sottostante */
339
327
  bindResetFunction() {
@@ -361,7 +349,7 @@ export class BaseFormControl {
361
349
  if (this.Model)
362
350
  this.onNotNullValueSet();
363
351
  // markForCheck non va bene in quanto arrivano possibilmente 2 update su un solo ciclo di stack
364
- // setTime*ut che wrappa tutto non va bene sennò spamma delle change detection a suon di interval che rallentano tantissimo l'app
352
+ // setTimeout che wrappa tutto non va bene sennò spamma delle change detection a suon di interval che rallentano tantissimo l'app
365
353
  this.cdr.detectChanges();
366
354
  }
367
355
  /** @ignore */
@@ -372,17 +360,15 @@ export class BaseFormControl {
372
360
  registerOnTouched(fn) {
373
361
  this.onTouched = fn;
374
362
  }
375
- /**
376
- * Registra internamente il componente di validazione, ne imposta i validatori e collega il Form, se presente
377
- *
378
- * @param {NgModel} comp Elemento HTML marcato con "#validationControl"
379
- */
380
- registerBaseInput(comp) {
381
- if (comp) {
363
+ set baseInput(comp) { this.doRegisterBaseInput(comp); }
364
+ set baseInput_static(comp) { this.doRegisterBaseInput(comp); }
365
+ ;
366
+ doRegisterBaseInput(baseInput) {
367
+ if (baseInput) {
382
368
  // È arrivato un nuovo validationContorl (succede solo nel form-select quando cambia la source da 0 elementi / null ad N elementi, quindi al massimo una volta)
383
369
  if (this.validationControl && this.Form)
384
370
  this.Form.removeControl(this.validationControl);
385
- this.validationControl = comp;
371
+ this.validationControl = baseInput;
386
372
  //Questa serve per passare avanti i validatori
387
373
  if (this.UseUserValidators)
388
374
  this.validationControl.control.setValidators(this._validators);
@@ -393,10 +379,11 @@ export class BaseFormControl {
393
379
  }
394
380
  if (this.ngControl)
395
381
  this.bindResetFunction();
396
- //I val-roba questo lo fanno automaticamente dentro... gli altri no (es. semplice input checkbox)
397
- this.updateValidityForNativeInput();
382
+ // I val-roba questo lo fanno automaticamente dentro... gli altri no (es. semplice input checkbox)
383
+ this.doUpdateValidityForNativeInput();
398
384
  }
399
385
  }
386
+ //#endregion
400
387
  registerForm(ngForm) {
401
388
  this.Form = ngForm;
402
389
  this.Form.addControl(this.validationControl);
@@ -407,9 +394,8 @@ export class BaseFormControl {
407
394
  *
408
395
  * @param {boolean} forcedValue Forza l'aggiornamento anche se non è un input nativo (input nativo = checkbox, ad esempio)
409
396
  */
410
- updateValidityForNativeInput(forcedValue = false) {
411
- if (forcedValue || this.nativeInput)
412
- this.validationControl.control.updateValueAndValidity();
397
+ doUpdateValidityForNativeInput(forcedValue = false) {
398
+ this.validationControl.control.updateValueAndValidity();
413
399
  }
414
400
  /**
415
401
  * @ignore
@@ -464,12 +450,13 @@ export class BaseFormControl {
464
450
  */
465
451
  set submitted(val) {
466
452
  this._submitted = val;
467
- if (!this.baseInput)
453
+ if (!this.validationControl)
468
454
  return;
469
455
  if (val) {
470
- this.baseInput.control.markAsTouched();
456
+ this.validationControl.control.markAsTouched();
457
+ this.validationControl.control.markAsDirty();
471
458
  }
472
- if (this.baseInput.control.status === "INVALID" && val) { /*this.showTooltipWithMessage();*/ }
459
+ if (this.validationControl.control.status === "INVALID" && val) { /*this.showTooltipWithMessage();*/ }
473
460
  else { /*this.tooltip.hide();*/ }
474
461
  }
475
462
  /**
@@ -479,22 +466,22 @@ export class BaseFormControl {
479
466
  this._forceInvalid = val;
480
467
  if (val)
481
468
  setTimeout(() => {
482
- this.baseInput.control.setErrors({ forcedtoinvalid: true });
483
- this.baseInput.control.markAsTouched();
484
- this.baseInput.control.markAsDirty();
469
+ this.validationControl.control.setErrors({ forcedtoinvalid: true });
470
+ this.validationControl.control.markAsTouched();
471
+ this.validationControl.control.markAsDirty();
485
472
  this.cdr.detectChanges();
486
473
  });
487
474
  else
488
475
  setTimeout(() => {
489
- this.baseInput.control.setErrors({ forcedtoinvalid: null });
490
- this.baseInput.control.updateValueAndValidity();
476
+ this.validationControl.control.setErrors({ forcedtoinvalid: null });
477
+ this.validationControl.control.updateValueAndValidity();
491
478
  });
492
479
  }
493
480
  /**
494
481
  * @ignore
495
482
  */
496
483
  setDisabledState(isDisabled) {
497
- isDisabled ? this.baseInput.control.disable() : this.baseInput.control.enable();
484
+ isDisabled ? this.validationControl.control.disable() : this.validationControl.control.enable();
498
485
  this.Readonly = isDisabled;
499
486
  }
500
487
  /**
@@ -557,12 +544,12 @@ BaseFormControl.propDecorators = {
557
544
  Readonly: [{ type: Input }],
558
545
  LabelInputRatio: [{ type: Input }],
559
546
  htmlInput: [{ type: ViewChild, args: ['htmlInput', { static: false },] }],
560
- baseInput: [{ type: ViewChild, args: ["baseInput", { static: false },] }],
561
- baseInput_static: [{ type: ViewChild, args: ["baseInput", { static: true },] }],
562
547
  inputChange: [{ type: Output }],
563
548
  inputFocus: [{ type: Output }],
564
549
  inputFinalized: [{ type: Output }],
550
+ baseInput: [{ type: ViewChild, args: ["baseInput", { static: false },] }],
551
+ baseInput_static: [{ type: ViewChild, args: ["baseInput", { static: true },] }],
565
552
  submitted: [{ type: Input, args: ["submitted",] }],
566
553
  forceInvalid: [{ type: Input }]
567
554
  };
568
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9iYXNlLWZvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUF3QixTQUFTLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUVuSSxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLGtFQUFrRTtBQUVsRSxNQUFNLE9BQWdCLGVBQWU7SUE2TWpDLDJCQUEyQjtJQUMzQixZQUFzQixHQUFzQixFQUFTLFNBQW9CLEVBQVksV0FBdUIsRUFBc0IsRUFBd0IsRUFBcUIsVUFBNEIsRUFBNkMsYUFBcUIsRUFBOEMsY0FBdUIsRUFBVSxjQUF1QixLQUFLO1FBQWxXLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQXNCLE9BQUUsR0FBRixFQUFFLENBQXNCO1FBQXFCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQTZDLGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQThDLG1CQUFjLEdBQWQsY0FBYyxDQUFTO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBN014WDs7Ozs7V0FLRztRQUNLLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFFbEM7OztXQUdHO1FBQ08sc0JBQWlCLEdBQVcsSUFBSSxDQUFDO1FBRTNDLG9EQUFvRDtRQUM3QyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBV2pDLHlFQUF5RTtRQUMvRCxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFFNUMsY0FBYztRQUNKLG9CQUFlLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUU1QyxjQUFjO1FBQ0osY0FBUyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVoQyxtQ0FBbUM7UUFDM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUVuQzs7OztXQUlHO1FBQ0ssd0JBQW1CLEdBQVksSUFBSSxDQUFDO1FBUzVDLGtHQUFrRztRQUN6RixvQkFBZSxHQUErQyxTQUFTLENBQUM7UUFFakYscUdBQXFHO1FBQzVGLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFFcEMsNktBQTZLO1FBQ3BLLHVCQUFrQixHQUFZLElBQUksQ0FBQztRQUU1Qyw4REFBOEQ7UUFDckQsZUFBVSxHQUFZLElBQUksQ0FBQztRQUVwQzs7O1dBR0c7UUFDTSxXQUFNLEdBQVksS0FBSyxDQUFDO1FBRWpDLDZDQUE2QztRQUNwQyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUVsQyxtRUFBbUU7UUFDMUQsbUJBQWMsR0FBVyxFQUFFLENBQUM7UUFFckMsMkhBQTJIO1FBQ2xILDRCQUF1QixHQUFXLEVBQUUsQ0FBQztRQUU5QyxrREFBa0Q7UUFDekMsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFdEMscUVBQXFFO1FBQzVELFVBQUssR0FBVyxFQUFFLENBQUM7UUFFNUIsNEJBQTRCO1FBQ25CLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBRW5DLDJCQUEyQjtRQUNsQixrQkFBYSxHQUFXLENBQUMsQ0FBQztRQUVuQyx5RkFBeUY7UUFDaEYsU0FBSSxHQUFZLEtBQUssQ0FBQztRQUUvQixnREFBZ0Q7UUFDdkMsU0FBSSxHQUFXLElBQUksQ0FBQztRQUs3QixvRkFBb0Y7UUFDM0UsWUFBTyxHQUFXLElBQUksQ0FBQztRQUVoQzs7OztXQUlHO1FBQ00sa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFdkMsc01BQXNNO1FBQzdMLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRXRDLHFIQUFxSDtRQUM1RyxxQkFBZ0IsR0FBWSxJQUFJLENBQUM7UUFLMUMsZ0dBQWdHO1FBQ3ZGLGtCQUFhLEdBQWlDLE1BQU0sQ0FBQztRQUU5RCxxSUFBcUk7UUFDNUgsb0JBQWUsR0FBVyxHQUFHLENBQUM7UUFFdkM7Ozs7O1dBS0c7UUFDTSxZQUFPLEdBQVcsZUFBZSxDQUFDO1FBRTNDLGlJQUFpSTtRQUMxSCxnQkFBVyxHQUEwQyxFQUFFLENBQUM7UUFFL0QsNkNBQTZDO1FBQ25DLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBb0QxQyx3RUFBd0U7UUFDOUQsZ0JBQVcsR0FBOEIsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUVuRix5R0FBeUc7UUFDL0YsZUFBVSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRWxFLG9FQUFvRTtRQUMxRCxtQkFBYyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBRTVFLGtFQUFrRTtRQUMxRCx1QkFBa0IsR0FBMkQsRUFBRSxDQUFBO1FBRXZGLG9EQUFvRDtRQUM1QyxtQkFBYyxHQUF1QyxFQUFFLENBQUM7UUF5TGhFLGVBQVUsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQTBMaEQ7O1dBRUc7UUFDTyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQWpYckMsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0dBQW9HLENBQUMsQ0FBQztZQUV4SCxPQUFPO1NBQ1Y7UUFFRCx3S0FBd0s7UUFDeEssSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFO1lBQ3ZHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9GLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUE7U0FDN0M7UUFFRCxTQUFTLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUUvQixtR0FBbUc7UUFDbkcsa0dBQWtHO1FBRWxHLDhIQUE4SDtRQUM5SCw4RkFBOEY7UUFDOUYsSUFBVSxTQUFVLENBQUMsT0FBTztZQUN4QixJQUFJLENBQUMsSUFBSSxHQUFpQixTQUFVLENBQUMsT0FBTyxDQUFDO1FBRWpELGdKQUFnSjtRQUNoSixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDaEIsZ0hBQWdIO1lBQ2hILGdFQUFnRTtZQUNoRSxpSkFBaUo7WUFDakosSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDekIsSUFBSSxDQUFDLENBQUMsZ0JBQWdCO3dCQUNsQixDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLENBQUM7YUFDTjtZQUNELElBQUcsSUFBSSxDQUFDLFdBQVc7Z0JBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQ25EO0lBQ0wsQ0FBQztJQTFHRDs7OztPQUlHO0lBQ0gsSUFBSSxRQUFRLEtBQWMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUVsRDs7OztPQUlHO0lBQ0gsSUFBYSxRQUFRLENBQUMsS0FBYztRQUNoQyxJQUFJLElBQUksQ0FBQyxtQkFBbUI7WUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFhLGVBQWUsQ0FBQyxLQUFhO1FBQ3RDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQVVEOzs7O09BSUc7SUFDSCxJQUErQyxTQUFTLENBQUMsSUFBYSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFekc7Ozs7T0FJRztJQUNILElBQThDLGdCQUFnQixDQUFDLElBQWEsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUEsQ0FBQztJQTREaEg7Ozs7T0FJRztJQUNPLG9CQUFvQjs7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQ1osT0FBTztRQUVYLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFDaEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFFN0Isc0VBQXNFO1FBQ3RFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBRXRCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sSUFBSSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUV0QyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxJQUFJLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBRWxDLDJEQUEyRDtZQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEIseURBQXlEO2dCQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RCxDQUFDLENBQUMsQ0FBQztZQUVILDBFQUEwRTtZQUMxRSxJQUFJLElBQUksQ0FBQyxLQUFLO2dCQUNWLElBQUksQ0FBQyxjQUFjLFNBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsMENBQUUsV0FBVyxDQUFDO1NBQ3pGO0lBQ0wsQ0FBQztJQUVELDZEQUE2RDtJQUNyRCwwQkFBMEI7UUFDOUIsaUZBQWlGO1FBQ2pGLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDcEUsSUFBSSxZQUFZLEVBQUU7WUFDZCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNyQiw2R0FBNkc7Z0JBQzdHLCtFQUErRTtnQkFDL0UsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hGLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQseURBQXlEO0lBQ2pELHNCQUFzQjtRQUMxQiwrREFBK0Q7UUFDL0QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0MsSUFBSSxPQUFPO1lBQ1AsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssbUJBQW1CLENBQUMsQ0FBTTtRQUM5QiwyRUFBMkU7UUFDM0UsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUV4QiwyRUFBMkU7UUFDM0Usc0NBQXNDO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDcEc7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsbUJBQW1CO1FBQ2YsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELGNBQWM7SUFDZCxRQUFRO1FBQ0oscUlBQXFJO1FBQ3JJLHdGQUF3RjtRQUN4RixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QixtRUFBbUU7UUFDbkUsdUtBQXVLO1FBQ3ZLLHVHQUF1RztRQUN2RyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSTtZQUNuQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUV0RSx1R0FBdUc7UUFDdkcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2FBQ2hDO1lBRUQsb0hBQW9IO1lBQ3BILGdJQUFnSTtZQUNoSSwwR0FBMEc7WUFDMUcsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDbEMsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsRUFBVyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN4QixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDMUMsQ0FBQyxDQUFDO1NBQ0w7UUFFRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUMzQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JFLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxXQUFXLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtvQkFDakQsK0VBQStFO29CQUMvRSxtQ0FBbUM7b0JBQ25DLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUMzRCxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzdDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzVELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2lCQUMzQjtZQUNMLENBQUMsQ0FBQyxDQUFBO1NBQ0w7SUFDTCxDQUFDO0lBSUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNyRixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUdwRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixzQkFBc0I7UUFDbEIsc0lBQXNJO1FBQ3RJLHFLQUFxSztRQUNySyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksaUJBQWlCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNyRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsY0FBYztJQUNkLGVBQWU7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFDZixPQUFPO1FBRVgsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELHlHQUF5RztJQUNqRyxpQkFBaUI7UUFDckIsc0hBQXNIO1FBQ3RILE1BQU0sUUFBUSxHQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBUSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNsRyxJQUFJLDBCQUEwQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQ3hELElBQUksa0NBQWtDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztRQUV4RSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ2hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUMzQyxrQ0FBa0MsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQyxDQUFDLENBQUM7UUFFRixpR0FBaUc7UUFDM0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFRLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFBO0lBQy9ELENBQUM7SUFFRCxjQUFjO0lBQ2QsVUFBVSxDQUFDLEdBQVE7UUFDZixJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUVqQix1SEFBdUg7UUFDdkgsSUFBSSxJQUFJLENBQUMsU0FBUztZQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFcEQsSUFBSSxJQUFJLENBQUMsS0FBSztZQUNWLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRTdCLCtGQUErRjtRQUMvRixpSUFBaUk7UUFDakksSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsY0FBYztJQUNkLGdCQUFnQixDQUFDLEVBQU87UUFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGNBQWM7SUFDZCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsSUFBYTtRQUMzQixJQUFJLElBQUksRUFBRTtZQUNOLGdLQUFnSztZQUNoSyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsSUFBSTtnQkFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFFcEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUU5Qiw4Q0FBOEM7WUFDOUMsSUFBRyxJQUFJLENBQUMsaUJBQWlCO2dCQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFbkUseUpBQXlKO1lBQ3pKLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7Z0JBQzVDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7YUFDaEM7WUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUNkLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRTdCLGlHQUFpRztZQUNqRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztTQUN2QztJQUNMLENBQUM7SUFFTSxZQUFZLENBQUMsTUFBYztRQUM5QixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsNEJBQTRCLENBQUMsY0FBdUIsS0FBSztRQUNyRCxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVztZQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLGNBQW1CLElBQUksRUFBRSxlQUF3QixLQUFLLEVBQUUseUJBQWtDLEtBQUssRUFBRSxXQUFvQixLQUFLOztRQUM5SCxJQUFJLE1BQU0sR0FBRyxXQUFXLElBQUksSUFBSSxJQUFJLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFDLElBQUksQ0FBQyxLQUFLLG1DQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBRXZGLElBQUcsQ0FBQyxzQkFBc0I7WUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7UUFFakMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLFlBQVk7WUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE9BQU8sQ0FBQyxLQUFVO1FBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUzs7UUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksYUFBQyxJQUFJLENBQUMsU0FBUywwQ0FBRSxJQUFJLDBDQUFFLFFBQVEsR0FBRyxDQUFDO1FBQzNELElBQUksQ0FBQyxHQUFHLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksR0FBRyxDQUFDLE9BQWU7UUFDdEIsSUFBSSxJQUFJLENBQUMsY0FBYztZQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixHQUFHLE9BQU8sQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFrQkQ7Ozs7T0FJRztJQUNILElBQXdCLFNBQVMsQ0FBQyxHQUFZO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1FBRXRCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUNmLE9BQU87UUFFWCxJQUFJLEdBQUcsRUFBRTtZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQUU7UUFFcEQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEdBQUcsRUFBRSxFQUFFLGtDQUFrQyxFQUFFO2FBQ3pGLEVBQUUsd0JBQXdCLEVBQUU7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYSxZQUFZLENBQUMsR0FBWTtRQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztRQUV6QixJQUFJLEdBQUc7WUFDSCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7O1lBRUgsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFFLFVBQW1CO1FBQ2pDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFPRDs7T0FFRztJQUNILG9CQUFvQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDbEIsT0FBTztRQUNYLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxzQkFBc0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdEMsQ0FBQzs7O1lBdm9CSixTQUFTOzs7WUFYb0UsaUJBQWlCO1lBRGhFLFNBQVM7WUEyTjhELEtBQUs7WUF2TmxHLG9CQUFvQix1QkF1TnNGLFFBQVE7WUF2TjVGLGdCQUFnQix1QkF1TmtILFFBQVE7eUNBQXlDLFFBQVEsWUFBSSxNQUFNLFNBQUMsYUFBYTswQ0FBa0MsUUFBUSxZQUFJLE1BQU0sU0FBQyxjQUFjOzs7OzJCQS9KaFQsS0FBSzttQ0FJTCxLQUFLOzhCQUdMLEtBQUs7eUJBR0wsS0FBSztpQ0FHTCxLQUFLO3lCQUdMLEtBQUs7cUJBTUwsS0FBSzswQkFHTCxLQUFLOzZCQUdMLEtBQUs7c0NBR0wsS0FBSzswQkFHTCxLQUFLO29CQUdMLEtBQUs7NEJBR0wsS0FBSzs0QkFHTCxLQUFLO21CQUdMLEtBQUs7bUJBR0wsS0FBSztxQkFHTCxLQUFLO3NCQUdMLEtBQUs7NEJBT0wsS0FBSzswQkFHTCxLQUFLOytCQUdMLEtBQUs7a0NBR0wsS0FBSzs0QkFHTCxLQUFLOzhCQUdMLEtBQUs7c0JBUUwsS0FBSzt1QkFvQkwsS0FBSzs4QkFVTCxLQUFLO3dCQVNMLFNBQVMsU0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO3dCQVV4QyxTQUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTsrQkFPeEMsU0FBUyxTQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7MEJBR3ZDLE1BQU07eUJBR04sTUFBTTs2QkFHTixNQUFNO3dCQW1ZTixLQUFLLFNBQUMsV0FBVzsyQkFlakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCwgTmdGb3JtLCBOZ01vZGVsLCBSZXF1aXJlZFZhbGlkYXRvciB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCwgT3B0aW9uYWwsIEluamVjdCwgRGlyZWN0aXZlLCBDaGFuZ2VEZXRlY3RvclJlZiwgRWxlbWVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyAvLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBBY2Nlc3NDb250cm9sU2VydmljZSwgQ29tcG9uZW50Q29udGV4dCB9IGZyb20gXCJAZXNmYWVuemEvYWNjZXNzLWNvbnRyb2xcIjtcclxuaW1wb3J0IHsgQUNPX0NVU1RPTUtFWSwgRkFWX0RFQlVHX01PREUgfSBmcm9tICcuLi90b2tlbnMnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDaGFuZ2VFdmVudCB9IGZyb20gXCIuLi9tb2RlbHMvQ2hhbmdlRXZlbnRcIjtcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vKiogQ29tcG9uZW50ZSBiYXNlIGRhIGN1aSB0dXR0aSBpIGNvbXBvbmVudGkgRm9ybSBpbXBsZW1lbnRhbm8gKi9cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRm9ybUNvbnRyb2wgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgICAvKipcclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0OTg4XHJcbiAgICAgKiBUTDpEUjsgSWwgcHJpbW8gdmFsb3JlIHBhc3NhdG8gYWwgd3JpdGVWYWx1ZSDDqCBudWxsbyBwZXJjaMOpIHF1YW5kbyBpIGNhZ25hY2NpIGZhbm5vIG5ldyBGb3JtQ29udHJvbCgpXHJcbiAgICAgKiBzY3Jpdm9ubyB1biB3cml0ZVZhbHVlIG51bGxvLi4uIHF1aW5kaSBhbCBwcmltbyBiaW5kaW5nIHNhbHRvIGwnaW5pemlhbGl6emF6aW9uZSBzZSBobyBsYSBjb3BwaWEgbnVsbC1maXJzdEJpbmRcclxuICAgICAqIHBvaSBtZXR0ZW5kbyBmaXJzdEJpbmQgYSBmYWxzZSBkaSBsw6wgaW4gcG9pIGZ1bnppb25vIGNvbWUgZGV2by4gVmlzdGEgbGEgY2FzaXN0aWNhIGV2aXRvIGVzc2VuemlhbG1lbnRlIG1ldMOgIGRldGVjdENoYW5nZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIGRpIHV0aWxpenphcmUgaSB2YWxpZGF0b3JpIGNoZSBsJ3V0ZW50ZSBwaWF6emEgc3VsIGNvbXBvbmVudGUuIFxyXG4gICAgICogRGEgbm9uIHVzYXJlIG5lbCBjYXNvIGRpIGZvcm0tYWRhcHRpdmUgZGF0byBjaGUgaSB2YWxpZGF0b3JpIHZlbmdvbm8gdmFsdXRhdGkgaW4gYmFzZSBhbCB0aXBvIGVjY1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgVXNlVXNlclZhbGlkYXRvcnM6Ym9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSBpbCBjYW1wbyDDqCBvYmJsaWdhdG9yaW8gaSBvcHppb25hbGUgKi9cclxuICAgIHB1YmxpYyBSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBNb2RlbGxvIHJhcHByZXNlbnRhdG8gZGEgcXVlc3RvIGNhbXBvICovXHJcbiAgICBwdWJsaWMgTW9kZWw6IGFueTtcclxuXHJcbiAgICAvKiogVmFsb3JlIGRlbCBNb2RlbGxvICovXHJcbiAgICBwdWJsaWMgRXZhbHVhdGVkTW9kZWw6IHN0cmluZztcclxuXHJcbiAgICAvKiogTm9tZSBnZW5lcmF0byBwZXIgaWwgY29udHJvbGxvIGludGVybm8uIERpIGRlZmF1bHQgw6ggaWwgbm9tZSBkZWwgY29udHJvbGxvIGVzdGVybm8gY29uIGwnYWdnaXVudGEgZGkgXCJfaW50ZXJuYWxcIi4gU2VydmUgcGVyIGV2aXRhcmUgY3Jvc3MtYmluZCAqL1xyXG4gICAgcHVibGljIEdlbmVyYXRlZE5hbWU6IHN0cmluZztcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIGlsIEZvcm0gY2hlIGNvbnRpZW5lIHF1ZXN0byBjYW1wbyDDqCBnacOgIHN0YXRvIHJlZ2lzdHJhdG8gKi9cclxuICAgIHByb3RlY3RlZCBmb3JtSGFzQmVlbkJvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByb3RlY3RlZCBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByb3RlY3RlZCBvblRvdWNoZWQgPSAoKSA9PiB7IH07XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgVmVkaSBnZXR0ZXIgZSBzZXR0ZXIgKi9cclxuICAgIHByaXZhdGUgX3JlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWFsb3JhIGNpIGZvc3NlIHVuIGNvbnRlc3RvIGNvbGxlZ2F0byBxdWVzdGEgdmFyaWFiaWxlIGlkZW50aWZpY2Egc2UgU29ubyBsJ093bmVyIG8gbWVuby5cclxuICAgICAqIFxyXG4gICAgICogU2Ugbm9uIGxvIHNvbm8sIGlsIGNhbXBvIHJpc3VsdGVyw6AgaW4gc29sYSBsZXR0dXJhIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEFwcENvbnRleHRPd25lcnNoaXA6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBTdWJqZWN0IGEgY3VpIGwnb2dnZXR0byBpbnRlcm5vIHNpIGNvbGxlZ2EgcGVyIGVmZmV0dHVhcmUgaWwgZm9jdXMgZGVsbCdlbGVtZW50byBpbnB1dCBzb3R0b3N0YW50ZSAqL1xyXG4gICAgQElucHV0KCkgRm9jdXNTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+O1xyXG4gICAgLyoqXHJcbiAgICAqIEBFWFBFUklNRU5UQUxcclxuICAgICovXHJcbiAgICBASW5wdXQoKSBTZXRWYWxpZGF0aW9uU3ViamVjdDogU3ViamVjdDx7IGZpZWxkTmFtZTogc3RyaW5nLCBlcnJvcjogc3RyaW5nIH0+O1xyXG5cclxuICAgIC8qKiBNb2RhbGl0w6AgaW4gY3VpIHZpZW5lIG1vc3RyYXRvIGlsIGNhbXBvLCAxLTEgcmlzcGV0dG8gYWxsZSBkZWZpbml6aW9uaSBkaSBBbmd1bGFyIE1hdGVyaWFsICAqL1xyXG4gICAgQElucHV0KCkgRmllbGRBcHBlYXJlbmNlOiBcImxlZ2FjeVwiIHwgXCJzdGFuZGFyZFwiIHwgXCJmaWxsXCIgfCBcIm91dGxpbmVcIiA9IFwib3V0bGluZVwiO1xyXG5cclxuICAgIC8qKiBVdGlsaXp6YSBvIG1lbm8gaWwgTGF5b3V0IGRpIHVuIGZvcm0gKExhYmVsIGNvbiBpbnB1dCBkaSBmaWFuY28pLCBzZSBmYWxzZSBtb3N0cmEgc29sbyBsJ2lucHV0ICovXHJcbiAgICBASW5wdXQoKSBGb3JtTGF5b3V0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogRGVmaW5pc2NlIHNlIHJpY2hpYW1hcmUgbCdFdmVudEVtaXR0ZXIgKippbnB1dENoYW5nZSoqIGluIG1hbmllcmEgY2xhc3NpY2EgKHRydWUpIG8gc29sbyBwZXIgbGEgY2hhbmdlIGNvbnNpZGVyYXRlIGRlZmluaXRpdmUgY29tZSB0YXN0byBpbnZpbyAvIGJsdXIgLyBlY2MuLi4gKGZhbHNlKSAqL1xyXG4gICAgQElucHV0KCkgRW1pdFBlbmRpbmdDaGFuZ2VzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogQXR0aXZhIG8gZGlzYXR0aXZhIGxhIHZhbGlkYXppb25lIHBlciBxdWVzdG8gY29tcG9uZW50ZSAqL1xyXG4gICAgQElucHV0KCkgVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogUGVybWV0dGUgZGkgc2NyaXZlcmUgbyBtZW5vIG5lbCBjYW1wbyBkaSBJbnB1dC4gU2kgZGlmZmVyZW56aWEgZGFsIFJlYWRvbmx5IGluIHF1YW50byBmaXNpY2FtZW50ZSBsJ0lucHV0IMOoIHNjcml2aWJpbGUgZSB2ZW5nb25vIG1hbnRlbnV0aSBpIHRlbWkgZGVsbGEgdmFsaWRhemlvbmVcclxuICAgICAqIG1hIGludGVyYWdpcmUgZGlyZXR0YW1lbnRlIGNvbiBsYSBjYXNlbGxhIGRpIElucHV0IHBlciBsJ3V0ZW50ZSBub24gw6ggcG9zc2liaWxlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZyb3plbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBQbGFjZWhvbGRlciBwZXIgcXVhbmRvIGwnaW5wdXQgw6ggdnVvdG8gKi9cclxuICAgIEBJbnB1dCgpIFBsYWNlaG9sZGVyOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKiBDbGFzc2UgZXh0cmEgcGVyIGlsIGZvcm0tZ3JvdXAgaW4gY3VpIHZpZW5lIHdyYXBwYXRvIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIEZvcm1Hcm91cENsYXNzOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKiBNZXNzYWdnaW8gZGEgbW9zdHJhcmUgcXVhbmRvIGxhIHZhbGlkYXppb25lIGZhbGxpc2NlIHBlciBxdWVzdG8gY29tcG9uZW50ZS4gRGkgZGVmYXVsdCB2aWVuZSBwcm9wb3N0YSBkYWxsYSBsaWJyZXJpYSAqL1xyXG4gICAgQElucHV0KCkgRmFpbGVkVmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIElucHV0IGNoZSBmb3J6YSBsJ2ludmFsaWRpdMOgIGRlbCBjb21wb25lbnRlICovXHJcbiAgICBASW5wdXQoKSBGb3JjZWRFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBNb3N0cmEgdW4gdGVzdG8gYSBzaW5pc3RyYSBkZWxsJ2lucHV0IChGb3JtTGF5b3V0IHBlcm1ldHRlbmRvKSAqL1xyXG4gICAgQElucHV0KCkgTGFiZWw6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIGNvbC1tZC1YIHBlciBsYSBsYWJlbCAqL1xyXG4gICAgQElucHV0KCkgTGFiZWxDb2xXaWR0aDogbnVtYmVyID0gNDtcclxuXHJcbiAgICAvKiogY29sLW1kLVggcGVyIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIElucHV0Q29sV2lkdGg6IG51bWJlciA9IDg7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSDDqCBsJ3VsdGltbyBjb21wb25lbnRlIGRpIHVuIGZvcm0gKHNlcnZlIHBlciByaW11b3ZlcmUgaWwgbWFyZ2luZSBmaW5hbGUpICovXHJcbiAgICBASW5wdXQoKSBMYXN0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEFzc29jaWEgaWwgY29tcG9uZW50ZSBGb3JtIGEgcXVlc3RvIGlucHV0ICovXHJcbiAgICBASW5wdXQoKSBGb3JtOiBOZ0Zvcm0gPSBudWxsO1xyXG5cclxuICAgIC8qKiBTb3JnZW50ZSBkYSBjdWkgc2NlZ2xpZXJlIHZhbG9yaSBwZXIgaSBjb21wb25lbnRpIEZvcm0gY2hlIGxvIGNvbnNlbnRvbm8gKi9cclxuICAgIEBJbnB1dCgpIFNvdXJjZTogYW55W107XHJcblxyXG4gICAgLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbCdJZCBkZWdsaSBvZ2dldHRpIGJpbmRhdGkgbmVsbGEgKipTb3VyY2UqKiAqL1xyXG4gICAgQElucHV0KCkgSWRGaWVsZDogc3RyaW5nID0gJ2lkJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBpbCAqKlBsYWNlaG9sZGVyKiogZGV2J2Vzc2VyZSB1c2F0byBjb21lIHVuYSBmbG9hdGluZyBsYWJlbCBkaSBtYXRlcmlhbCBvIHNvbG8gY29tZSB1biBwbGFjZWhvbGRlciBzdGFuZGFyZCBcclxuICAgICAqIFxyXG4gICAgICogSWdub3JhdGEgbGF0byBhdXRvY29tcGxldGUsIGF1dG9jb21wbGV0ZS1tdWx0aSBlIHNlbGVjdCBpbiBxdWFudG8gaGFubm8gZ2VzdGlvbmkgcGFydGljb2xhcmkgZGkgcGxhY2Vob2xkZXIgZWNjLi4uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZsb2F0aW5nTGFiZWw6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBJbmRpY2EgY2hlIGxhIHBhcnRlIGlucHV0IGRlbCBjb250cm9sbG8gZGV2J2Vzc2VyZSB1bmEgbGFiZWwgcmVhZG9ubHkgZSBsYSBwYXJ0ZSBsYWJlbCBkaSB0aXRvbG8gZGV2J2Vzc2VyZSBpbiBib2xkLiBQZXIgdXRpbGl6emFyZSB1biBzb2xvIGNvbXBvbmVudGUgc2lhIHBlciBsYSBtb2RpZmljYSBjaGUgcGVyIGlsIGRldHRhZ2xpbyAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGxhIGNvbmRpemlvbmUgcGVyIGN1aSB1biBlbGVtZW50byBpbiBNb2RhbGl0w6AgRGlzcGxheSBwdcOyIGVzc2VyZSB2aXNpYmlsZSBpbiBiYXNlIGEgdWx0ZXJpb3JpIGNvbnRyb2xsaSAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheUNvbmRpdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIFRlbXBsYXRlIHBlciB2aXN1YWxpenphcmUgbGEgbW9kYWxpdMOgICoqRGlzcGxheU1vZGUqKiBjb21lIHZ1b2xlIGlsIHByb2dyYW1tYXRvcmUgZnJvY2lvIGRpIHR1cm5vICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5TW9kZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKiBMYXlvdXQgZGVsIEZvcm0gcXVhbmRvIMOoIGluIG1vZGFsaXTDoCBEaXNwbGF5LiBEaSBkZWZhdWx0IG1hbnRpZW5lIGxhIGZvcm1hdHRhemlvbmUgYSBmb3JtICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5TGF5b3V0OiAnZm9ybScgfCAnaW5saW5lJyB8ICdoaWRkZW4nID0gJ2Zvcm0nO1xyXG5cclxuICAgIC8qKiBTZXBhcmF0b3JlIGRhIG1ldHRlcmUgaW4gYXV0b21hdGljbyBmcmEgdW4gZWxlbWVudG8gRm9ybSBlIGwnYWx0cm8gcXVhbmRvIHNvbm8gaW4gKipEaXNwbGF5TW9kZSoqIGNvbiAqKkRpc3BsYXlMYXlvdXQqKiBpbmxpbmUgKi9cclxuICAgIEBJbnB1dCgpIElubGluZVNlcGFyYXRvcjogc3RyaW5nID0gJyAnO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEVzcHJlc3Npb25lIHNpbWlsLUFuZ3VsYXIgcGVyIGNhbWJpYXJlIGlsIHRlc3RvIGRlaSBjb21wb25lbnRpIGNoZSBzY2VsZ29ubyBpbCBwcm9wcmlvIG1vZGVsbG8gZGEgdW5hICoqU291cmNlKipcclxuICAgICAqIFxyXG4gICAgICogSWwgZnVuemlvbmFtZW50byDDqCBpZGVudGljbyBhbCBiaW5kZXIgZGkgYW5ndWxhciwgc29sbyBjb24gdW5hIGdyYWZmYSBpbnZlY2UgY2hlIDIuXHJcbiAgICAgKiDDiCBpbm9sdHJlIHBvc3NpYmlsZSBhZ2dpdW5nZXJlIHBlenppIGRpIGRlc2NyaXppb25lIGluIG1hbmllcmEgY29uZGl6aW9uYWxlIGNvbiBsYSBzaW50YXNzaSAqKjpwcm9wPyhQcm9wIHZhbGUge3Byb3B9KSoqXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIERpc3BsYXk6IHN0cmluZyA9ICd7ZGVzY3JpcHRpb259JztcclxuXHJcbiAgICAvKiogUmlzdWx0YXRvIGRlbGwndW5pb25lIGZyYSBsZSBpbmZvcm1hemlvbmkgZGVnbGkgb2dnZXR0aSBpbiAqKlNvdXJjZSoqIGUgbGUgaW1wb3N0YXppb25pIHNwZWNpZmljYXRlIG5lbGwnSW5wdXQgKipEaXNwbGF5KiogKi9cclxuICAgIHB1YmxpYyBCb3VuZFNvdXJjZTogeyBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2Ugw6ggaWwgcHJpbW8gQmluZCBkZWxsYSBTb3VyY2UgKi9cclxuICAgIHByb3RlY3RlZCBTb3VyY2VGaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqX3JlYWRvbmx5KipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIHNvbGEgbGV0dHVyYSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgZ2V0IFJlYWRvbmx5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcmVhZG9ubHk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcG9zdGEgaWwgdmFsb3JlIGRlbGxhIHZhcmlhYmlsZSAqKl9yZWFkb25seSoqIGdlc3RlbmRvIGFuY2hlIGlsIENvbnRlc3RvIGFwcGxpY2F0aXZvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgVmFsb3JlIGRhIGltcG9zdGFyZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBzZXQgUmVhZG9ubHkodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5BcHBDb250ZXh0T3duZXJzaGlwKVxyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVybWV0dGUgZGkgc2V0dGFyZSBpbiB1bmEgdm9sdGEgc29sbyBnbGkgaW5wdXQgTGFiZWxDb2xXaWR0aCBlIElucHV0Q29sV2lkdGgsIGJhc3RhIHNjcml2ZXJsbyBjb24gbGEgc2ludGFzc2kgXCJYIFlcIlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgSW5wdXQgbmVsIGZvcm1hdG8gXCJYIFlcIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBzZXQgTGFiZWxJbnB1dFJhdGlvKGlucHV0OiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgcmF0aW8gPSBpbnB1dC5zcGxpdCgvXFxzLyk7XHJcbiAgICAgICAgdGhpcy5MYWJlbENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMF0pO1xyXG4gICAgICAgIHRoaXMuSW5wdXRDb2xXaWR0aCA9IHBhcnNlSW50KHJhdGlvWzFdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVsZW1lbnRvIEhUTUwgcmFwcHJlc2VudGFudGUgbCdJbnB1dFxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdodG1sSW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgaHRtbElucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIC8qKiB2YWwtcXVhbGNvc2EgY2hlIGZhIGVmZmV0dGl2YW1lbnRlIGRhIGlucHV0LCBvIGV2ZW50dWFsbWVudGUgaWwgc2luZ29sbyBpbnB1dCBpbiBjYXNpIHBhcnRpY29sYXJpIChlcyBjaGVja2JveCkgKi9cclxuICAgIHByb3RlY3RlZCB2YWxpZGF0aW9uQ29udHJvbDogTmdNb2RlbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1ZXJ5IHN1bGwnZWxlbWVudG8gJ2Jhc2VJbnB1dCcgY2hlIGZ1bnppb25hIGluIGFtYmllbnRlIHN0YXRpY29cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtOZ01vZGVsfSBjb21wIEVsZW1lbnRvIEhUTUwgbWFyY2F0byBjb24gXCIjYmFzZUlucHV0XCJcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZChcImJhc2VJbnB1dFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IGJhc2VJbnB1dChjb21wOiBOZ01vZGVsKSB7IHRoaXMucmVnaXN0ZXJCYXNlSW5wdXQoY29tcCk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFF1ZXJ5IHN1bGwnZWxlbWVudG8gJ2Jhc2VJbnB1dCcgY2hlIGZ1bnppb25hIGluIGFtYmllbnRlIGRpbmFtaWNvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TmdNb2RlbH0gY29tcCBFbGVtZW50byBIVE1MIG1hcmNhdG8gY29uIFwiI2Jhc2VJbnB1dFwiXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoXCJiYXNlSW5wdXRcIiwgeyBzdGF0aWM6IHRydWUgfSkgc2V0IGJhc2VJbnB1dF9zdGF0aWMoY29tcDogTmdNb2RlbCkgeyB0aGlzLnJlZ2lzdGVyQmFzZUlucHV0KGNvbXApOyB9O1xyXG5cclxuICAgIC8qKiBFdmVudG8gY2hpYW1hdG8gYWxsYSBtb2RpZmljYSBkZWwgdmFsb3JlIGNvbGxlZ2F0byBhIHF1ZXN0byBjYW1wbyAqL1xyXG4gICAgQE91dHB1dCgpIGlucHV0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8Q2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFuZ2VFdmVudD4oKTtcclxuXHJcbiAgICAvKiogRXZlbnRvIGNoaWFtYXRvIGFsIGZvY3VzIGRlbCBjYW1wbyBkaSB0ZXN0by9jb21iby9xdWVsY2hlw6gsIHJpZW1pdHRhIGwnZXZlbnRvIG9yaWdpbmFsZSBKYXZhc2NyaXB0ICovXHJcbiAgICBAT3V0cHV0KCkgaW5wdXRGb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICAvKiogRXZlbnRvIGNoaWFtYXRvIGFsIGZpbmFsaXplIGRlbCBjYW1wbyBkaSB0ZXN0by9jb21iby9xdWVsY2hlw6ggKi9cclxuICAgIEBPdXRwdXQoKSBpbnB1dEZpbmFsaXplZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgICAvKiogQ2FjaGUgZGVsbGUgY29uZGl6aW9uaSBzY3JpdHRlIHRpcG8gOnByb3A/KFJvYmEgY29uIHtwcm9wfSkgKi9cclxuICAgIHByaXZhdGUgQmluZENoZWNraW5nR3JvdXBzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIHdoZW5leGlzdHM6IHN0cmluZyB9W10gPSBbXVxyXG5cclxuICAgIC8qKiBDYWNoZSBkZWxsZSBwcm9wcmlldMOgIHNjcml0dGUgdGlwbyAtLT4ge3Byb3B9ICovXHJcbiAgICBwcml2YXRlIEJpbmRQcm9wZXJ0aWVzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgQ29zdHJ1dHRvcmUgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCBwcm90ZWN0ZWQgX3ZhbGlkYXRvcnM6IEFycmF5PGFueT4sIEBPcHRpb25hbCgpIHByaXZhdGUgYWM6IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBAT3B0aW9uYWwoKSBwdWJsaWMgQXBwQ29udGV4dDogQ29tcG9uZW50Q29udGV4dCwgQE9wdGlvbmFsKCkgQEluamVjdChBQ09fQ1VTVE9NS0VZKSBwcml2YXRlIEFDT19DVVNUT01LRVk6IHN0cmluZywgQE9wdGlvbmFsKCkgQEluamVjdChGQVZfREVCVUdfTU9ERSkgcHJpdmF0ZSBGQVZfREVCVUdfTU9ERTogYm9vbGVhbiwgcHJpdmF0ZSBuYXRpdmVJbnB1dDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFuZGxlTnVsbE5nQ29udHJvbCgpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm5nQ29udHJvbCBudWxsbyBwZXIgcXVhbGNoZSBtb3Rpdm8hIElsIDkwJSBkZWxsZSBmdW56aW9uYWxpdMOgIGRpIHF1ZXN0byBpbnB1dCBzYXJhbm5vIGRpc2FiaWxpdGF0ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vU2UgbWkgYXJyaXZhIGwnaW5qZWN0YWJsZSBkZWwgY29udGVzdG8gcG9zc28gY2FwaXJlIHNlIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBpbiByZWFkb25seSBvIG5vLCBzb2xvIHNlIGhvIGdpw6AgaW5pemlhbGl6emF0byBpIGNvbnRyb2xsZXIgY3VzdG9tIGRlbGwnYWNjZXNzIGNvbnRyb2xcclxuICAgICAgICBpZiAodGhpcy5BcHBDb250ZXh0ICYmIHRoaXMuQXBwQ29udGV4dC5uYW1lICYmIHRoaXMuQUNPX0NVU1RPTUtFWSAmJiB0aGlzLmFjICYmIHRoaXMuYWMuSW5pdGlhbGl6ZWRDdXN0b20pIHtcclxuICAgICAgICAgICAgdGhpcy5BcHBDb250ZXh0T3duZXJzaGlwID0gIXRoaXMuYWMuaGFzKHRoaXMuQUNPX0NVU1RPTUtFWSArIFwiOlwiICsgdGhpcy5BcHBDb250ZXh0Lm5hbWUsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9ICF0aGlzLkFwcENvbnRleHRPd25lcnNoaXBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuXHJcbiAgICAgICAgLy9TZSBobyBnacOgIHVuIHBhcmVudCBpbXBvc3RhdG8gdnVvbCBkaXJlIGNoZSBzb3R0byBhbCB0YWcgPGZvcm0+IGhvIGRpcmV0dGFtZW50ZSB1biB0YWcgPGZvcm0tKj4uLlxyXG4gICAgICAgIC8vLi4gcXVpbmRpIHBvc3NvIGltcG9zdGFyZSBkaXJldHRhbWVudGUgaWwgcmlmZXJpbWVudG8gZGVsIEZvcm0gZGEgdXNhcmUgaW4gSFRNTCBwZXIgaWwgc3VibWl0dGVkXHJcblxyXG4gICAgICAgIC8vU2Ugbm9uIGMnw6ggdnVvbCBkaXJlIGNoZSBkZW50cm8gYWwgdGFnIDxmb3JtPiBjJ8OoIHVubyBzcGxlbmRpZG8gPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiAuLi4uXCI+Li5cclxuICAgICAgICAvLy4uIGlsIHF1YWxlIGEgc3VhIHZvbHRhIGNvbnRpZW5lIGlsIGNvbnRyb2xsbyA8Zm9ybS0qPiBxdWluZGkgYXZyw7IgaWwgZm9ybSBuZWxsJ2lucHV0IFwiRm9ybVwiXHJcbiAgICAgICAgaWYgKCg8YW55Pm5nQ29udHJvbCkuX3BhcmVudClcclxuICAgICAgICAgICAgdGhpcy5Gb3JtID0gPE5nRm9ybT4oPGFueT5uZ0NvbnRyb2wpLl9wYXJlbnQ7XHJcblxyXG4gICAgICAgIC8vUXVlc3RhIHNlcnZlIHBlciBpbXBvc3RhcmUgbWUgc3Rlc3NvIGNvbWUgc2kgZGV2ZSwgaWwgdmFsaWRhdG9yZSBpbnZlY2UgbG8gcGFzc28gYWwgdmFsaWRhdGlvbi1pbnB1dCBxdWFuZG8gdmllbmUgc2V0dGF0byBpbCB2YWxpZGF0aW9uQ29udHJvbFxyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xyXG4gICAgICAgICAgICAvL1BlciB0dXR0aSBpIHZhbGlkYXRvcmk6IHJpZ2VuZXJvIGxhIGZ1bnppb25lIGRpIHZhbGlkYXppb25lLiBQZXIgcXVhbGNoZSBtb3Rpdm8gYSB2b2x0ZSBobyB2YWxpZGF0b3JpIHNlbnphLi4uXHJcbiAgICAgICAgICAgIC8vLi4uIHF1ZXN0byDDqCB1biB3b3JrYXJvdW5kIHBlciBlc3NlcmUgc2ljdXJvIGRpIGF2ZXJsYSBzZW1wcmUuXHJcbiAgICAgICAgICAgIC8vU29sbyBpIHZhbGlkYXRvcmkgY29uIHBhcmFtZXRyaSBoYW5ubyBiaXNvZ25vIGRlbGxhIF9jcmVhdGVWYWxpZGF0b3IgKGVzLiBcIm1heGxlbmd0aFwiIGNoZSBoYSAxIHBhcmFtZXRybyksIHF1aW5kaSBubyB2YWxpZGF0b3JpIHRpcG8gXCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0b3JzLmZvckVhY2godiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYuX2NyZWF0ZVZhbGlkYXRvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgdi5fY3JlYXRlVmFsaWRhdG9yKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aGlzLl92YWxpZGF0b3JzKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpO1xyXG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFZmZldHR1YSBpbCBCaW5kL1BhcnNlIGRlbGxlIHZhcmllICoqU291cmNlKiogdW5lbmRvIGxlIGluZm9ybWF6aW9uaSBzcGVjaWZpY2F0ZSBpbiAqKkRpc3BsYXkqKlxyXG4gICAgICogXHJcbiAgICAgKiBFdmVudHVhbG1lbnRlIHJpZWZmZXR0dWEgdW4gYmluZCBhbCBtb2RlbGxvIGluIGJhc2UgYWwgdmFsb3JlIGRlbGxhIHZhcmlhYmlsZSAqKlJlYmluZE1vZGVsQWZ0ZXJTb3VyY2UqKlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgdHJ5QmluZFNvdXJjZURpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlNvdXJjZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5Tb3VyY2UubGVuZ3RoID09IDAgJiYgIXRoaXMuU291cmNlRmlyc3RCaW5kKVxyXG4gICAgICAgICAgICB0aGlzLkJvdW5kU291cmNlID0gW107XHJcblxyXG4gICAgICAgIHRoaXMuU291cmNlRmlyc3RCaW5kID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIENhY2hlIGxvY2FsZSBwZXIgZXZpdGFyZSBkaSByaWZhcmUgZGVpIHJlZ2V4Lm1hdGNoIG9nbmkgc2FudGEgdm9sdGFcclxuICAgICAgICBpZiAodGhpcy5Tb3VyY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLkJvdW5kU291cmNlID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5CaW5kQ2hlY2tpbmdHcm91cHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRlQmluZENoZWNraW5nR3JvdXBzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5CaW5kUHJvcGVydGllcy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVCaW5kUHJvcGVydGllcygpO1xyXG5cclxuICAgICAgICAgICAgLy8gQmxvY2NvIHBlciBnZW5lcmFyZSBsYSBkZXNjcml6aW9uZSBmaW5hbGUgZGkgdW4gZWxlbWVudG9cclxuICAgICAgICAgICAgdGhpcy5Tb3VyY2UuZm9yRWFjaChzID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEFnZ2l1bmdvIGFsbGEgQm91bmRTb3VyY2UgaW4gZm9ybWF0byBzdGFuZGFyZCBLZXlWYWx1ZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZS5wdXNoKHRoaXMudHJhbnNmb3JtU291cmNlSXRlbShzKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gUG9zdCB0cnliaW5kIHNlIGMnw6ggdW4gbW9kZWxsbyBhc3NvY2lhdG8gcmljYWxjb2xvIGwnKipFdmFsdWF0ZWRNb2RlbCoqXHJcbiAgICAgICAgICAgIGlmICh0aGlzLk1vZGVsKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5FdmFsdWF0ZWRNb2RlbCA9IHRoaXMuQm91bmRTb3VyY2UuZmluZCh0ID0+IHQuaWQgPT0gdGhpcy5Nb2RlbCk/LmRlc2NyaXB0aW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogVmFsdXRhIGlsIGNvbnRlbnV0byBkZWxsYSB2YXJpYWJpbGUgQmluZENoZWNraW5nR3JvdXBzICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlQmluZENoZWNraW5nR3JvdXBzKCkge1xyXG4gICAgICAgIC8vIEJsb2NjbyBwZXIgdGlyYXJlIGZ1b3JpIGxlIGNvbmRpemlvbmkgc2NyaXR0ZSB0aXBvIC0tPiA6cHJvcD8oUm9iYSBjb24ge3Byb3B9KVxyXG4gICAgICAgIHZhciBpZmZlZE1hdGNoZXMgPSB0aGlzLkRpc3BsYXkubWF0Y2goLzooW2Etel0rKVxcP1xcKChbXlxcKFxcKV0rKVxcKS9nKTtcclxuICAgICAgICBpZiAoaWZmZWRNYXRjaGVzKSB7XHJcbiAgICAgICAgICAgIGlmZmVkTWF0Y2hlcy5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gU3Rlc3NhIHJlZ2V4IGRpIHNvcHJhIG1hIGlsIHRhZyBcImlcIiBzZXJ2ZSBwZXIgdGlyYXJlIGZ1b3JpIGkgc2luZ29saSBjYXB0dXJpbmcgZ3JvdXAgZSBwZXIgcXVhbGNoZSBtb3Rpdm8gXHJcbiAgICAgICAgICAgICAgICAvLyBuZXcgUmVnRXhwKGJhc2VSZWdleCwgXCJnXCIpIG5vbiBmdW56aW9uYSBxdWluZGkgbm9uIGhvIHBvdHV0byByYXppb25hbGl6emFybG9cclxuICAgICAgICAgICAgICAgIGxldCBncm91cHMgPSBtLm1hdGNoKC86KFthLXpdKylcXD9cXCgoW15cXChcXCldKylcXCkvaSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkJpbmRDaGVja2luZ0dyb3Vwcy5wdXNoKHsgZ2xvYmFsOiBtLCBwcm9wOiBncm91cHNbMV0sIHdoZW5leGlzdHM6IGdyb3Vwc1syXSB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBWYWx1dGEgaWwgY29udGVudXRvIGRlbGxhIHZhcmlhYmlsZSBCaW5kUHJvcGVydGllcyAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZUJpbmRQcm9wZXJ0aWVzKCkge1xyXG4gICAgICAgIC8vIEJsb2NjbyBwZXIgdGlyYXJlIGZ1b3JpIGxlIHByb3ByaWV0w6Agc2NyaXR0ZSB0aXBvIC0tPiB7cHJvcH1cclxuICAgICAgICB2YXIgbWF0Y2hlcyA9IHRoaXMuRGlzcGxheS5tYXRjaCgve1thLXpdK30vZ2kpO1xyXG4gICAgICAgIGlmIChtYXRjaGVzKVxyXG4gICAgICAgICAgICBtYXRjaGVzLmZvckVhY2gobSA9PiB7IHRoaXMuQmluZFByb3BlcnRpZXMucHVzaCh7IGdsb2JhbDogbSwgcHJvcDogbS5zdWJzdHJpbmcoMSwgbS5sZW5ndGggLSAxKSB9KTsgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFzZm9ybWEgdW4gb2dnZXR0byBkZWxsYSBTb3VyY2UgYWxsYSBzdWEgdmVyc2lvbmUgXCJudW92YVwiIGJhc2FuZG9zaSBzdWxsZSBpbmZvcm1hemlvbmkgc3UgZ3J1cHBpIGUgcHJvcHJpZXTDoFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIGRhIHRyYXNmb3JtYXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHt7aWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZ319IE9nZ2V0dG8gZmluYWxlIHRyYXNmb3JtYXRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhbnNmb3JtU291cmNlSXRlbShzOiBhbnkpOiB7aWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZ30ge1xyXG4gICAgICAgIC8vIFBhcnRvIHNlbXByZSBkYWxsYSB2YXJpYWJpbGUgZGkgRGlzcGxheSwgcG9pIHNvc3RpdHVpc2NvIHBlenpvIHBlciBwZXp6b1xyXG4gICAgICAgIGxldCBkZXNjID0gdGhpcy5EaXNwbGF5O1xyXG5cclxuICAgICAgICAvLyBUYWdsaW8gbyBtYW50ZW5nbyBsZSBjb25kaXppb25pIGluIGJhc2UgYWxsYSBwcm9wcmlldMOgIHN1IGN1aSBmYXJlIGNoZWNrXHJcbiAgICAgICAgLy8gRG9wb2RpY2jDqSBzY3Jpdm8gdHV0dGUgbGUgcHJvcHJpZXTDoFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5CaW5kQ2hlY2tpbmdHcm91cHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSB0aGlzLkJpbmRDaGVja2luZ0dyb3Vwc1tpXTtcclxuICAgICAgICAgICAgZGVzYyA9IGRlc2MucmVwbGFjZSh0Lmdsb2JhbCwgKHNbdC5wcm9wXSAhPSBudWxsICYmIHNbdC5wcm9wXSAhPSB1bmRlZmluZWQpID8gdC53aGVuZXhpc3RzIDogXCJcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuQmluZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSB0aGlzLkJpbmRQcm9wZXJ0aWVzW2ldO1xyXG4gICAgICAgICAgICBkZXNjID0gZGVzYy5yZXBsYWNlKHQuZ2xvYmFsLCBzW3QucHJvcF0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgaWQ6IHNbdGhpcy5JZEZpZWxkXSwgZGVzY3JpcHRpb246IGRlc2MgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBpbCBjb21vcG5lbnRlIGluIHF1ZXN0aW9uZSDDqCBpbiBncmFkbyBkaSBnZXN0aXJlIG5nQ29udHJvbCBudWxsaS4gXHJcbiAgICAgKiBEaSBkZWZhdWx0IMOoICoqZmFsc2UqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgZ2VzdGlzY28gbmdDb250cm9sIG51bGxpLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBoYW5kbGVOdWxsTmdDb250cm9sKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgLy8gQSB2b2x0ZSBuZWxsJ25nT25Jbml0IG5vbiBjaSBwYXNzYSBxdWluZGkgbG8gbWV0dG8gc2lhIHF1aSBzaWEgbmVsbCdhZnRlcnZpZXdpbml0LCBwZW5zbyBjaGUgdmFsZ2EgcGVyIGkgY29tcG9uZW50aSBkaSB0ZXJ6ZSBwYXJ0aVxyXG4gICAgICAgIC8vIGNoZSBzaSBjb2xsZWdhbm8gcGVyIGkgY2F6emkgbG9ybyBhbCBmb3JtIGVjYywgcXVpbmRpIGxhIHBhcnRlIHNvcHJhIG5vbiBzZXJ2ZS4uLiBCT0hcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRWYWxpZGF0b3IoKTtcclxuXHJcbiAgICAgICAgLy9JbCBub21lIG5vbiBjJ8OoIHNlIG1ldHRvIHN0YW5kYWxvbmUgOiB0cnVlIChDSEUgTk9OIMOpIERBIE1FVFRFUkUpXHJcbiAgICAgICAgLy9EYXRvIGNoZSBhbmNoZSBpbCBjb250cm9sbG8gZXN0ZXJubyB2aWVuZSBjb25zaWRlcmF0byBjb21lIGNvbXBvbmVudGUgZGVsIGZvcm0sIG5vbiBwb3NzbyBiYXNhcm1pIHNvbG8gc3VsIG5vbWUgbWEgZGV2byBhZ2dpdW5nZXJlIHVuIHRhZy4gSW4gcXVlc3RvIGNhc28gXCJfaW50ZXJuYWxcIlxyXG4gICAgICAgIC8vIEFUVEVOWklPTkU6IFFVQUxTSUFTSSBTSUEgSUwgTU9USVZPLCBTRSBTVE8gQ09TTyBWSUVORSBTUE9TVEFUTyBEQUxMIG5nT25Jbml0IE5PTiBGVU5aSU9OQSBQSVUgTlVMTEFcclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wubmFtZSlcclxuICAgICAgICAgICAgdGhpcy5HZW5lcmF0ZWROYW1lID0gdGhpcy5uZ0NvbnRyb2wubmFtZS50b1N0cmluZygpICsgXCJfaW50ZXJuYWxcIjtcclxuXHJcbiAgICAgICAgLy8gQVRURU5aSU9ORTogUVVBTFNJQVNJIFNJQSBJTCBNT1RJVk8sIFNFIFNUTyBDT1NPIFZJRU5FIFNQT1NUQVRPIERBTEwgbmdPbkluaXQgTk9OIEZVTlpJT05BIFBJVSBOVUxMQVxyXG4gICAgICAgIGlmICh0aGlzLkZvcm0pIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm1IYXNCZWVuQm91bmQgJiYgdGhpcy52YWxpZGF0aW9uQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1IYXNCZWVuQm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBRdWFuZG8gdW4gZm9ybSB2aWVuZSBzdWJtaXR0YXRvIGxhIHZhcmlhYmlsZSBGb3JtLnN1Ym1pdHRlZCB2aWVuZSBhc3NlZ25hdGEgYWxsJ2lucHV0IFtzdWJtaXR0ZWRdIGRlbCB2YWwtY29udHJvbFxyXG4gICAgICAgICAgICAvLyBFc3NlbmRvIGNoZSBwZXLDsiBsYSBDRCDDqCBPblB1c2ggcGVyIGRpcmUgYWQgQW5ndWxhciBjaGUgbCdJbnB1dCDDqCBjYW1iaWF0byBlIHBlcm1ldHRlcmUgaSBzaWRlZmZlY3RzIGRpIGFzc2VnbmFyZSBbc3VibWl0dGVkXVxyXG4gICAgICAgICAgICAvLyBkZXZvIGF0dGFjY2FybWkgYWwgc3VibWl0IGF0dHVhbGUgZGVsIGZvcm0gZSBwcmltYSBkaSBlc2VndWlybG8gZGV2byBtYXJjYXJlIGlsIGNvbXBvbmVudGUgcGVyIGlsIGNoZWNrXHJcbiAgICAgICAgICAgIGxldCBvcmlnRnVuYyA9IHRoaXMuRm9ybS5vblN1Ym1pdDtcclxuICAgICAgICAgICAgdmFyIGZvcm1PdXRzaWRlUmVmID0gdGhpcy5Gb3JtO1xyXG4gICAgICAgICAgICB0aGlzLkZvcm0ub25TdWJtaXQgPSAoZXYpOiBib29sZWFuID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdGdW5jLmFwcGx5KGZvcm1PdXRzaWRlUmVmKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlNldFZhbGlkYXRpb25TdWJqZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0VmFsaWRhdGlvblN1YmplY3QucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSkuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHYuZmllbGROYW1lICsgXCJfaW50ZXJuYWxcIiA9PSB0aGlzLkdlbmVyYXRlZE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBCaXNvZ25hIGZhcmxvIHN1IGVudHJhbWJpIGkgQ29udHJvbCBwZXIgcG9ydGFyZSBpbCBcIi52YWxpZFwiIG5lbCBwdW50byBnaXVzdG9cclxuICAgICAgICAgICAgICAgICAgICAvLyBlIHBlciBhdmVyZSBnbGkgc3RpbGkgc3VsbCdpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gdGhpcy5Gb3JtLmdldENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoeyBmb3JjZWR0b2ludmFsaWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zZXRFcnJvcnMoeyBmb3JjZWR0b2ludmFsaWQ6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3llZCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2Ugc29ubyBpbiBtb2RhbGl0w6AgZGV0YXRjaGVkIGRldm8gcmltdW92ZXJlIG1hbnVhbG1lbnRlIHF1ZXN0byBjb250cm9sbG8gcXVhbmRvIGVudHJvIG5lbGxhIGRpc3Bvc2UsIGFsdHJpbWVudGkgc2UgcG9pIG5lIGFuZGFzc2kgYSByaWFnZ2l1bmdlcmVcclxuICAgICAqIHVuIGFsdHJvIGNvbiBsbyBzdGVzc28gXCJuYW1lXCIgbWEgbWFnYXJpIHJlc2V0dGF0bywgQW5ndWxhciBsbyByZS1pZHJhdGVyZWJiZSBjb24gaSB2YWxvcmkgcHJlY2VkZW50aSBub25vc3RhbnRlIGlsIG1vZGVsbG8gZm9zc2UgdnVvdG9cclxuICAgICAqL1xyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybSAmJiB0aGlzLnZhbGlkYXRpb25Db250cm9sICYmICEhdGhpcy5Gb3JtLmdldENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCkpXHJcbiAgICAgICAgICAgIHRoaXMuRm9ybS5yZW1vdmVDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpO1xyXG5cclxuXHJcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcclxuICAgICAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRWxhYm9yYSBpIHZhbGlkYXRvcmkgaW5pZXR0YXRpIGUgY2FwaXNjZSBzZSBpbCB2YWxvcmUgw6ggb2JibGlnYXRvcmlvIG8gbWVubyAqL1xyXG4gICAgY2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpIHtcclxuICAgICAgICAvLyBjb250cm9sbG8gc2Ugw6ggc2V0dGF0byB1biByZXF1aXJlZCBwZXIgZGVjaWRlcmUgaW4gbWFuaWVyYSBjb25kaXppb25hbGUgc2UgdXRpbGl6emFyZSBpbCB2YWxpZGF0b3JlIHJlcXVpcmVkIG5lbCBjb21wb25lbnRlIGludGVybm9cclxuICAgICAgICAvLyBMbyBmYWNjaW8gcXVpIGUgbm9uIGluIHVuIGV2ZW50dWFsZSBuZ09uSW5pdCBvIGNvc3RydXR0b3JlIHBlcmNow6kgbmdPbkluaXQgbm9uIHNlbXByZSB2aWVuZSBjaGlhbWF0byBlIGRhIGNvc3RydXR0b3JlIGlsIHZhbGlkYXRvcmUgbm9uIGhhIGFuY29yYSBpbCB2YWxvcmUgZ2l1c3RvXHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRvcnMgJiYgdGhpcy5fdmFsaWRhdG9ycy5zb21lKGVsZW0gPT4gZWxlbSBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yICYmIGVsZW0ucmVxdWlyZWQpKVxyXG4gICAgICAgICAgICB0aGlzLlJlcXVpcmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkVmFsaWRhdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhlbHBlciBjaGUgY29sbGVnYSBsYSBmdW56aW9uZSBkaSByZXNldCBkZWwgY29udHJvbGxvIGZvcm0gYWwgY29udHJvbGxvIGRpIHZhbGlkYXppb25lIHNvdHRvc3RhbnRlICovXHJcbiAgICBwcml2YXRlIGJpbmRSZXNldEZ1bmN0aW9uKCkge1xyXG4gICAgICAgIC8vZmFjY2lvIGluIG1vZG8gY2hlIHNlIGNoaWFtbyBpbCByZXNldCBkZWwgY29udHJvbGxvIChvIGRlbGxhIGZvcm0pIGRhbGwnZXN0ZXJubyBzaSByZXNldHRpIGFuY2hlIGlsIGNvbnRyb2xsbyBuYXRpdm9cclxuICAgICAgICBjb25zdCBvcmlnRnVuYyA9ICg8YW55PnRoaXMubmdDb250cm9sLmNvbnRyb2wpLl9fb3JpZ2luYWxfcmVzZXRfXyB8fCB0aGlzLm5nQ29udHJvbC5jb250cm9sLnJlc2V0O1xyXG4gICAgICAgIHZhciBuZ0NvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZSA9IHRoaXMubmdDb250cm9sLmNvbnRyb2w7XHJcbiAgICAgICAgdmFyIHZhbGlkYXRpb25Db250cm9sX291dHNpZGVSZWZlcmVuY2UgPSB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2w7XHJcblxyXG4gICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wucmVzZXQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIG9yaWdGdW5jLmFwcGx5KG5nQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlKTtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbkNvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZS5yZXNldCgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vUGVyIGNvbnNlbnRpcmUgcmljaGlhbWkgbXVsdGlwbGkgZGkgcXVlc3RhIGZ1bnppb25lIHByZW5kZW5kbyBzZW1wcmUgbGEgZml1bnppb25lIGRpIHJlc2V0IGJhc2VcclxuICAgICAgICAoPGFueT50aGlzLm5nQ29udHJvbC5jb250cm9sKS5fX29yaWdpbmFsX3Jlc2V0X18gPSBvcmlnRnVuY1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsICYmIHRoaXMuZmlyc3RCaW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3RCaW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuTW9kZWwgPSBvYmo7XHJcblxyXG4gICAgICAgIC8vUGVyIHN2ZWdsaWFyZSBBbmd1bGFyLiBJbCB2YWxvcmUgY2hlIGVudHJhIHBvdHJlYmJlIGVzc2VyZSB2YWxpZG8vbm9uIHZhbGlkbyBlIHF1ZXN0byBsbyBiaW5kYSBhIHR1dHRvLCBmb3JtIGNvbXByZXNvXHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuTW9kZWwpXHJcbiAgICAgICAgICAgIHRoaXMub25Ob3ROdWxsVmFsdWVTZXQoKTtcclxuXHJcbiAgICAgICAgLy8gbWFya0ZvckNoZWNrIG5vbiB2YSBiZW5lIGluIHF1YW50byBhcnJpdmFubyBwb3NzaWJpbG1lbnRlIDIgdXBkYXRlIHN1IHVuIHNvbG8gY2ljbG8gZGkgc3RhY2tcclxuICAgICAgICAvLyBzZXRUaW1lKnV0IGNoZSB3cmFwcGEgdHV0dG8gbm9uIHZhIGJlbmUgc2VubsOyIHNwYW1tYSBkZWxsZSBjaGFuZ2UgZGV0ZWN0aW9uIGEgc3VvbiBkaSBpbnRlcnZhbCBjaGUgcmFsbGVudGFubyB0YW50aXNzaW1vIGwnYXBwXHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdHJhIGludGVybmFtZW50ZSBpbCBjb21wb25lbnRlIGRpIHZhbGlkYXppb25lLCBuZSBpbXBvc3RhIGkgdmFsaWRhdG9yaSBlIGNvbGxlZ2EgaWwgRm9ybSwgc2UgcHJlc2VudGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtOZ01vZGVsfSBjb21wIEVsZW1lbnRvIEhUTUwgbWFyY2F0byBjb24gXCIjdmFsaWRhdGlvbkNvbnRyb2xcIlxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckJhc2VJbnB1dChjb21wOiBOZ01vZGVsKSB7XHJcbiAgICAgICAgaWYgKGNvbXApIHtcclxuICAgICAgICAgICAgLy8gw4ggYXJyaXZhdG8gdW4gbnVvdm8gdmFsaWRhdGlvbkNvbnRvcmwgKHN1Y2NlZGUgc29sbyBuZWwgZm9ybS1zZWxlY3QgcXVhbmRvIGNhbWJpYSBsYSBzb3VyY2UgZGEgMCBlbGVtZW50aSAvIG51bGwgYWQgTiBlbGVtZW50aSwgcXVpbmRpIGFsIG1hc3NpbW8gdW5hIHZvbHRhKSBcclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wgJiYgdGhpcy5Gb3JtKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLnJlbW92ZUNvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sID0gY29tcDtcclxuXHJcbiAgICAgICAgICAgIC8vUXVlc3RhIHNlcnZlIHBlciBwYXNzYXJlIGF2YW50aSBpIHZhbGlkYXRvcmlcclxuICAgICAgICAgICAgaWYodGhpcy5Vc2VVc2VyVmFsaWRhdG9ycylcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpO1xyXG5cclxuICAgICAgICAgICAgLy9TZSBzb25vIHN0YWNjYXRvIGRhbCBGb3JtICh2dW9sIGRpcmUgY2hlIHNvbm8gYWQgZXNlbXBpbyBkZW50cm8gdW4gbmctdGVtcGxhdGUpIGFnZ2l1bmdvIGlsIGNvbnRyb2xsbyBhbCBGb3JtIHBhc3NhdG8gY29tZSBpbnB1dCAoY29udGV4dCBkZWwgdGVtcGxhdGUpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkZvcm0gJiYgIXRoaXMuZm9ybUhhc0JlZW5Cb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUhhc0JlZW5Cb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZFJlc2V0RnVuY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIC8vSSB2YWwtcm9iYSBxdWVzdG8gbG8gZmFubm8gYXV0b21hdGljYW1lbnRlIGRlbnRyby4uLiBnbGkgYWx0cmkgbm8gKGVzLiBzZW1wbGljZSBpbnB1dCBjaGVja2JveClcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGl0eUZvck5hdGl2ZUlucHV0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RlckZvcm0obmdGb3JtOiBOZ0Zvcm0pIHtcclxuICAgICAgICB0aGlzLkZvcm0gPSBuZ0Zvcm07XHJcbiAgICAgICAgdGhpcy5Gb3JtLmFkZENvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbClcclxuICAgICAgICB0aGlzLmZvcm1IYXNCZWVuQm91bmQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdnaW9ybmEgaWwgdmFsb3JlIGUgbGEgdmFsaWRpdMOgIGRlbGwnaW5wdXQgc290dG9zdGFudGUuIE5vbiB2aWVuZSBjaGlhbWF0byBwZXIgaW5wdXQgbmF0aXZpIGNvbWUgbGUgY2hlY2tib3hcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZWRWYWx1ZSBGb3J6YSBsJ2FnZ2lvcm5hbWVudG8gYW5jaGUgc2Ugbm9uIMOoIHVuIGlucHV0IG5hdGl2byAoaW5wdXQgbmF0aXZvID0gY2hlY2tib3gsIGFkIGVzZW1waW8pXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZhbGlkaXR5Rm9yTmF0aXZlSW5wdXQoZm9yY2VkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChmb3JjZWRWYWx1ZSB8fCB0aGlzLm5hdGl2ZUlucHV0KVxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogQ2xhc3NpY28gXCJzcGFyYSBmdW9yaVwiLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZWQoZm9yY2VkVmFsdWU6IGFueSA9IG51bGwsIG1hcmtGb3JDaGVjazogYm9vbGVhbiA9IGZhbHNlLCBtb2RlbEV2YWx1YXRpb25IYW5kbGVkOiBib29sZWFuID0gZmFsc2UsIGludGVybmFsOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgdG9FbWl0ID0gZm9yY2VkVmFsdWUgPT0gbnVsbCB8fCBmb3JjZWRWYWx1ZSA9PSBcIlwiID8gdGhpcy5Nb2RlbCA/PyBcIlwiIDogZm9yY2VkVmFsdWU7XHJcblxyXG4gICAgICAgIGlmKCFtb2RlbEV2YWx1YXRpb25IYW5kbGVkKVxyXG4gICAgICAgICAgICB0aGlzLkV2YWx1YXRlZE1vZGVsID0gdG9FbWl0O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRvRW1pdCk7XHJcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KG5ldyBDaGFuZ2VFdmVudChpbnRlcm5hbCwgdG9FbWl0KSk7XHJcbiAgICAgICAgaWYgKG1hcmtGb3JDaGVjaylcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBDbGFzc2ljbyBcInNwYXJhIGZ1b3JpXCIgc3VsIGZvY3VzLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGZvY3VzZWQoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRGb2N1cy5lbWl0KGV2ZW50KTtcclxuICAgICAgICB0aGlzLmxvZyhcIkNvbnRyb2wgRm9jdXNlZCAtIFwiICsgdGhpcy5HZW5lcmF0ZWROYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIENsYXNzaWNvIFwic3BhcmEgZnVvcmlcIiBzdWxsYSBmaW5hbGl6emF6aW9uZSBkZWwgdmFsb3JlIGRlbGwnaW5wdXQgKGJsdXIgLyB0YXN0byBpbnZpbywgZWNjLi4uKS4gTWFudGVuZ28gbG8gc3Rlc3NvIG5vbWUgZGVsbCdldmVudG8gZGVpIDx2YWwtKj4gKGlucHV0Q2hhbmdlKSBwZXIgcmV0cm9jb21wYXRpYmlsaXTDoC5cclxuICAgICAqIFxyXG4gICAgICogTm9uIHBvc3NvIHRlbmVybG8gcHJvdGVjdGVkIGFsdHJpbWVudGkgcG9zc28gZXNlZ3VpcmxvIHNvbG8gZGFsIC50cyBlIG5vbiBkYWxsJyAuaHRtbFxyXG4gICAgICovXHJcbiAgICBmaW5hbGl6ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEZpbmFsaXplZC5lbWl0KHRoaXMubmdDb250cm9sPy5uYW1lPy50b1N0cmluZygpKTtcclxuICAgICAgICB0aGlzLmxvZyhcIkNvbnRyb2wgVmFsdWUgRmluYWxpemVkIC0gXCIgKyB0aGlzLkdlbmVyYXRlZE5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhbXBhIHVuIGxvZyBhIGNvbnNvbGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIHN0YW1wYXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2cobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRkFWX0RFQlVHX01PREUpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQGZvcm1zLWFuZC12YWxpZGF0aW9uczogXCIgKyBtZXNzYWdlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBhYnN0cmFjdCBvbk5vdE51bGxWYWx1ZVNldCgpOiB2b2lkO1xyXG5cclxuICAgIC8vICoqKioqKioqKioqKioqKioqXHJcbiAgICAvLyAqKiBWQUxJREFUSU9OUyAqKlxyXG4gICAgLy8gKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhcmlhYmlsZSBwZXIgdGVuZXJlIGluIG1lbW9yaWEgbG8gc3RhdG8gZGkgc3VibWl0IGRpIHF1ZXN0byBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBfc3VibWl0dGVkOiBib29sZWFuO1xyXG4gICAgLyoqXHJcbiAgICAgKiBWYXJpYWJpbGUgcGVyIHRlbmVyZSBpbiBtZW1vcmlhIGlsIGZhdHRvIGNoZSBpbCBjb21wb25lbnRlIMOoIGZvcnphdG8gYSBpbnZhbGlkbyBvIG5vXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBfZm9yY2VJbnZhbGlkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBvc3RhIGlsIGNvbXBvbmVudGUgY29tZSBcInN1Ym1pdHRlZFwiIHNjYXRlbmFuZG9uZSBsZSB2YWxpZGF6aW9uaSBlZCBldmVudHVhbG1lbnRlIGxhIHZpc3VhbGl6emF6aW9uZSBkZWwgdG9vbHRpcCBkaSBlcnJvcmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWwgKip0cnVlKiogc2Ugc2kgdnVvbGUgaW1wb3N0YXJlIHF1ZXN0byBjb250cm9sbG8gY29tZSBzdWJtaXR0ZWQsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dChcInN1Ym1pdHRlZFwiKSBzZXQgc3VibWl0dGVkKHZhbDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX3N1Ym1pdHRlZCA9IHZhbDtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmJhc2VJbnB1dClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodmFsKSB7IHRoaXMuYmFzZUlucHV0LmNvbnRyb2wubWFya0FzVG91Y2hlZCgpOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmJhc2VJbnB1dC5jb250cm9sLnN0YXR1cyA9PT0gXCJJTlZBTElEXCIgJiYgdmFsKSB7IC8qdGhpcy5zaG93VG9vbHRpcFdpdGhNZXNzYWdlKCk7Ki8gfVxyXG4gICAgICAgIGVsc2UgeyAvKnRoaXMudG9vbHRpcC5oaWRlKCk7Ki8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wb3N0YSBpbCBjb21wb25lbnRlIGNvbWUgXCJpbnZhbGlkXCIgYSBwcmVzY2luZGVyZSBkYWkgdmFsaWRhdG9yaVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBzZXQgZm9yY2VJbnZhbGlkKHZhbDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2ZvcmNlSW52YWxpZCA9IHZhbDtcclxuXHJcbiAgICAgICAgaWYgKHZhbClcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbnB1dC5jb250cm9sLnNldEVycm9ycyh7IGZvcmNlZHRvaW52YWxpZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUlucHV0LmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlSW5wdXQuY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlSW5wdXQuY29udHJvbC5zZXRFcnJvcnMoeyBmb3JjZWR0b2ludmFsaWQ6IG51bGwgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbnB1dC5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpc0Rpc2FibGVkID8gdGhpcy5iYXNlSW5wdXQuY29udHJvbC5kaXNhYmxlKCkgOiB0aGlzLmJhc2VJbnB1dC5jb250cm9sLmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuUmVhZG9ubHkgPSBpc0Rpc2FibGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTdWJzY3JpcHRpb24gYWxsZSByaWNoaWVzdGUgZGkgZm9jdXNcclxuICAgICovXHJcbiAgICBvYnNlcnZhYmxlOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RyYSBpbCBTdWJqZWN0IHBlciByaWNldmVyZSBsZSByaWNoaWVzdGUgZGkgRm9jdXMgZGFsbCdlc3Rlcm5vXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyRm9jdXNSZXF1ZXN0KCk6IGFueSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLkZvY3VzU3ViamVjdClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMub2JzZXJ2YWJsZSA9IHRoaXMuRm9jdXNTdWJqZWN0LnN1YnNjcmliZSh0ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5odG1sSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVyZWdpc3RyYSBpbCBTdWJqZWN0IGRlbGxlIHJpY2hpZXN0ZSBkaSBmb2N1c1xyXG4gICAgICovXHJcbiAgICBkZXJlZ2lzdGVyRm9jdXNSZXF1ZXN0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9ic2VydmFibGUpXHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZS51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG59Il19
555
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9iYXNlLWZvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUF3QixTQUFTLEVBQW1CLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUVuSSxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLGtFQUFrRTtBQUVsRSxNQUFNLE9BQWdCLGVBQWU7SUE0TGpDLDJCQUEyQjtJQUMzQixZQUFzQixHQUFzQixFQUFTLFNBQW9CLEVBQVksV0FBdUIsRUFBc0IsRUFBd0IsRUFBcUIsVUFBNEIsRUFBNkMsYUFBcUIsRUFBOEMsY0FBdUIsRUFBVSxjQUF1QixLQUFLO1FBQWxXLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQXNCLE9BQUUsR0FBRixFQUFFLENBQXNCO1FBQXFCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQTZDLGtCQUFh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LEtBQUs7OEJBVUwsS0FBSzt3QkFTTCxTQUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTswQkFHeEMsTUFBTTt5QkFHTixNQUFNOzZCQUdOLE1BQU07d0JBK1FOLFNBQVMsU0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOytCQUN4QyxTQUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTt3QkFtSHZDLEtBQUssU0FBQyxXQUFXOzJCQWtCakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCwgTmdGb3JtLCBOZ01vZGVsLCBSZXF1aXJlZFZhbGlkYXRvciB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCwgT3B0aW9uYWwsIEluamVjdCwgRGlyZWN0aXZlLCBDaGFuZ2VEZXRlY3RvclJlZiwgRWxlbWVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBBY2Nlc3NDb250cm9sU2VydmljZSwgQ29tcG9uZW50Q29udGV4dCB9IGZyb20gXCJAZXNmYWVuemEvYWNjZXNzLWNvbnRyb2xcIjtcclxuaW1wb3J0IHsgQUNPX0NVU1RPTUtFWSwgRkFWX0RFQlVHX01PREUgfSBmcm9tICcuLi90b2tlbnMnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDaGFuZ2VFdmVudCB9IGZyb20gXCIuLi9tb2RlbHMvQ2hhbmdlRXZlbnRcIjtcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vKiogQ29tcG9uZW50ZSBiYXNlIGRhIGN1aSB0dXR0aSBpIGNvbXBvbmVudGkgRm9ybSBpbXBsZW1lbnRhbm8gKi9cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRm9ybUNvbnRyb2wgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgICAvKipcclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0OTg4XHJcbiAgICAgKiBUTDpEUjsgSWwgcHJpbW8gdmFsb3JlIHBhc3NhdG8gYWwgd3JpdGVWYWx1ZSDDqCBudWxsbyBwZXJjaMOpIHF1YW5kbyBpIGNhZ25hY2NpIGZhbm5vIG5ldyBGb3JtQ29udHJvbCgpXHJcbiAgICAgKiBzY3Jpdm9ubyB1biB3cml0ZVZhbHVlIG51bGxvLi4uIHF1aW5kaSBhbCBwcmltbyBiaW5kaW5nIHNhbHRvIGwnaW5pemlhbGl6emF6aW9uZSBzZSBobyBsYSBjb3BwaWEgbnVsbC1maXJzdEJpbmRcclxuICAgICAqIHBvaSBtZXR0ZW5kbyBmaXJzdEJpbmQgYSBmYWxzZSBkaSBsw6wgaW4gcG9pIGZ1bnppb25vIGNvbWUgZGV2by4gVmlzdGEgbGEgY2FzaXN0aWNhIGV2aXRvIGVzc2VuemlhbG1lbnRlIG1ldMOgIGRldGVjdENoYW5nZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIGRpIHV0aWxpenphcmUgaSB2YWxpZGF0b3JpIGNoZSBsJ3V0ZW50ZSBwaWF6emEgc3VsIGNvbXBvbmVudGUuIFxyXG4gICAgICogRGEgbm9uIHVzYXJlIG5lbCBjYXNvIGRpIGZvcm0tYWRhcHRpdmUgZGF0byBjaGUgaSB2YWxpZGF0b3JpIHZlbmdvbm8gdmFsdXRhdGkgaW4gYmFzZSBhbCB0aXBvIGVjY1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgVXNlVXNlclZhbGlkYXRvcnM6Ym9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSBpbCBjYW1wbyDDqCBvYmJsaWdhdG9yaW8gaSBvcHppb25hbGUgKi9cclxuICAgIHB1YmxpYyBSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBNb2RlbGxvIHJhcHByZXNlbnRhdG8gZGEgcXVlc3RvIGNhbXBvICovXHJcbiAgICBwdWJsaWMgTW9kZWw6IGFueTtcclxuXHJcbiAgICAvKiogVmFsb3JlIGRlbCBNb2RlbGxvICovXHJcbiAgICBwdWJsaWMgRXZhbHVhdGVkTW9kZWw6IHN0cmluZztcclxuXHJcbiAgICAvKiogTm9tZSBnZW5lcmF0byBwZXIgaWwgY29udHJvbGxvIGludGVybm8uIERpIGRlZmF1bHQgw6ggaWwgbm9tZSBkZWwgY29udHJvbGxvIGVzdGVybm8gY29uIGwnYWdnaXVudGEgZGkgXCJfaW50ZXJuYWxcIi4gU2VydmUgcGVyIGV2aXRhcmUgY3Jvc3MtYmluZCAqL1xyXG4gICAgcHVibGljIEdlbmVyYXRlZE5hbWU6IHN0cmluZztcclxuXHJcbiAgICAvKiogSW5kaWNhIHNlIGlsIEZvcm0gY2hlIGNvbnRpZW5lIHF1ZXN0byBjYW1wbyDDqCBnacOgIHN0YXRvIHJlZ2lzdHJhdG8gKi9cclxuICAgIHByb3RlY3RlZCBmb3JtSGFzQmVlbkJvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByb3RlY3RlZCBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByb3RlY3RlZCBvblRvdWNoZWQgPSAoKSA9PiB7IH07XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgVmVkaSBnZXR0ZXIgZSBzZXR0ZXIgKi9cclxuICAgIHByaXZhdGUgX3JlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWFsb3JhIGNpIGZvc3NlIHVuIGNvbnRlc3RvIGNvbGxlZ2F0byBxdWVzdGEgdmFyaWFiaWxlIGlkZW50aWZpY2Egc2UgU29ubyBsJ093bmVyIG8gbWVuby5cclxuICAgICAqIFxyXG4gICAgICogU2Ugbm9uIGxvIHNvbm8sIGlsIGNhbXBvIHJpc3VsdGVyw6AgaW4gc29sYSBsZXR0dXJhIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEFwcENvbnRleHRPd25lcnNoaXA6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBTdWJqZWN0IGEgY3VpIGwnb2dnZXR0byBpbnRlcm5vIHNpIGNvbGxlZ2EgcGVyIGVmZmV0dHVhcmUgaWwgZm9jdXMgZGVsbCdlbGVtZW50byBpbnB1dCBzb3R0b3N0YW50ZSAqL1xyXG4gICAgQElucHV0KCkgRm9jdXNTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+O1xyXG4gICAgLyoqXHJcbiAgICAqIEBFWFBFUklNRU5UQUxcclxuICAgICovXHJcbiAgICBASW5wdXQoKSBTZXRWYWxpZGF0aW9uU3ViamVjdDogU3ViamVjdDx7IGZpZWxkTmFtZTogc3RyaW5nLCBlcnJvcjogc3RyaW5nIH0+O1xyXG5cclxuICAgIC8qKiBNb2RhbGl0w6AgaW4gY3VpIHZpZW5lIG1vc3RyYXRvIGlsIGNhbXBvLCAxLTEgcmlzcGV0dG8gYWxsZSBkZWZpbml6aW9uaSBkaSBBbmd1bGFyIE1hdGVyaWFsICAqL1xyXG4gICAgQElucHV0KCkgRmllbGRBcHBlYXJlbmNlOiBcImxlZ2FjeVwiIHwgXCJzdGFuZGFyZFwiIHwgXCJmaWxsXCIgfCBcIm91dGxpbmVcIiA9IFwib3V0bGluZVwiO1xyXG5cclxuICAgIC8qKiBVdGlsaXp6YSBvIG1lbm8gaWwgTGF5b3V0IGRpIHVuIGZvcm0gKExhYmVsIGNvbiBpbnB1dCBkaSBmaWFuY28pLCBzZSBmYWxzZSBtb3N0cmEgc29sbyBsJ2lucHV0ICovXHJcbiAgICBASW5wdXQoKSBGb3JtTGF5b3V0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogRGVmaW5pc2NlIHNlIHJpY2hpYW1hcmUgbCdFdmVudEVtaXR0ZXIgKippbnB1dENoYW5nZSoqIGluIG1hbmllcmEgY2xhc3NpY2EgKHRydWUpIG8gc29sbyBwZXIgbGEgY2hhbmdlIGNvbnNpZGVyYXRlIGRlZmluaXRpdmUgY29tZSB0YXN0byBpbnZpbyAvIGJsdXIgLyBlY2MuLi4gKGZhbHNlKSAqL1xyXG4gICAgQElucHV0KCkgRW1pdFBlbmRpbmdDaGFuZ2VzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogQXR0aXZhIG8gZGlzYXR0aXZhIGxhIHZhbGlkYXppb25lIHBlciBxdWVzdG8gY29tcG9uZW50ZSAqL1xyXG4gICAgQElucHV0KCkgVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogUGVybWV0dGUgZGkgc2NyaXZlcmUgbyBtZW5vIG5lbCBjYW1wbyBkaSBJbnB1dC4gU2kgZGlmZmVyZW56aWEgZGFsIFJlYWRvbmx5IGluIHF1YW50byBmaXNpY2FtZW50ZSBsJ0lucHV0IMOoIHNjcml2aWJpbGUgZSB2ZW5nb25vIG1hbnRlbnV0aSBpIHRlbWkgZGVsbGEgdmFsaWRhemlvbmVcclxuICAgICAqIG1hIGludGVyYWdpcmUgZGlyZXR0YW1lbnRlIGNvbiBsYSBjYXNlbGxhIGRpIElucHV0IHBlciBsJ3V0ZW50ZSBub24gw6ggcG9zc2liaWxlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZyb3plbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBQbGFjZWhvbGRlciBwZXIgcXVhbmRvIGwnaW5wdXQgw6ggdnVvdG8gKi9cclxuICAgIEBJbnB1dCgpIFBsYWNlaG9sZGVyOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKiBDbGFzc2UgZXh0cmEgcGVyIGlsIGZvcm0tZ3JvdXAgaW4gY3VpIHZpZW5lIHdyYXBwYXRvIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIEZvcm1Hcm91cENsYXNzOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKiBNZXNzYWdnaW8gZGEgbW9zdHJhcmUgcXVhbmRvIGxhIHZhbGlkYXppb25lIGZhbGxpc2NlIHBlciBxdWVzdG8gY29tcG9uZW50ZS4gRGkgZGVmYXVsdCB2aWVuZSBwcm9wb3N0YSBkYWxsYSBsaWJyZXJpYSAqL1xyXG4gICAgQElucHV0KCkgRmFpbGVkVmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIElucHV0IGNoZSBmb3J6YSBsJ2ludmFsaWRpdMOgIGRlbCBjb21wb25lbnRlICovXHJcbiAgICBASW5wdXQoKSBGb3JjZWRFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBNb3N0cmEgdW4gdGVzdG8gYSBzaW5pc3RyYSBkZWxsJ2lucHV0IChGb3JtTGF5b3V0IHBlcm1ldHRlbmRvKSAqL1xyXG4gICAgQElucHV0KCkgTGFiZWw6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqIGNvbC1tZC1YIHBlciBsYSBsYWJlbCAqL1xyXG4gICAgQElucHV0KCkgTGFiZWxDb2xXaWR0aDogbnVtYmVyID0gNDtcclxuXHJcbiAgICAvKiogY29sLW1kLVggcGVyIGwnaW5wdXQgKi9cclxuICAgIEBJbnB1dCgpIElucHV0Q29sV2lkdGg6IG51bWJlciA9IDg7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSDDqCBsJ3VsdGltbyBjb21wb25lbnRlIGRpIHVuIGZvcm0gKHNlcnZlIHBlciByaW11b3ZlcmUgaWwgbWFyZ2luZSBmaW5hbGUpICovXHJcbiAgICBASW5wdXQoKSBMYXN0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEFzc29jaWEgaWwgY29tcG9uZW50ZSBGb3JtIGEgcXVlc3RvIGlucHV0ICovXHJcbiAgICBASW5wdXQoKSBGb3JtOiBOZ0Zvcm0gPSBudWxsO1xyXG5cclxuICAgIC8qKiBTb3JnZW50ZSBkYSBjdWkgc2NlZ2xpZXJlIHZhbG9yaSBwZXIgaSBjb21wb25lbnRpIEZvcm0gY2hlIGxvIGNvbnNlbnRvbm8gKi9cclxuICAgIEBJbnB1dCgpIFNvdXJjZTogYW55W107XHJcblxyXG4gICAgLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbCdJZCBkZWdsaSBvZ2dldHRpIGJpbmRhdGkgbmVsbGEgKipTb3VyY2UqKiAqL1xyXG4gICAgQElucHV0KCkgSWRGaWVsZDogc3RyaW5nID0gJ2lkJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBpbCAqKlBsYWNlaG9sZGVyKiogZGV2J2Vzc2VyZSB1c2F0byBjb21lIHVuYSBmbG9hdGluZyBsYWJlbCBkaSBtYXRlcmlhbCBvIHNvbG8gY29tZSB1biBwbGFjZWhvbGRlciBzdGFuZGFyZCBcclxuICAgICAqIFxyXG4gICAgICogSWdub3JhdGEgbGF0byBhdXRvY29tcGxldGUsIGF1dG9jb21wbGV0ZS1tdWx0aSBlIHNlbGVjdCBpbiBxdWFudG8gaGFubm8gZ2VzdGlvbmkgcGFydGljb2xhcmkgZGkgcGxhY2Vob2xkZXIgZWNjLi4uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEZsb2F0aW5nTGFiZWw6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKiBJbmRpY2EgY2hlIGxhIHBhcnRlIGlucHV0IGRlbCBjb250cm9sbG8gZGV2J2Vzc2VyZSB1bmEgbGFiZWwgcmVhZG9ubHkgZSBsYSBwYXJ0ZSBsYWJlbCBkaSB0aXRvbG8gZGV2J2Vzc2VyZSBpbiBib2xkLiBQZXIgdXRpbGl6emFyZSB1biBzb2xvIGNvbXBvbmVudGUgc2lhIHBlciBsYSBtb2RpZmljYSBjaGUgcGVyIGlsIGRldHRhZ2xpbyAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGxhIGNvbmRpemlvbmUgcGVyIGN1aSB1biBlbGVtZW50byBpbiBNb2RhbGl0w6AgRGlzcGxheSBwdcOyIGVzc2VyZSB2aXNpYmlsZSBpbiBiYXNlIGEgdWx0ZXJpb3JpIGNvbnRyb2xsaSAqL1xyXG4gICAgQElucHV0KCkgRGlzcGxheUNvbmRpdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIFRlbXBsYXRlIHBlciB2aXN1YWxpenphcmUgbGEgbW9kYWxpdMOgICoqRGlzcGxheU1vZGUqKiBjb21lIHZ1b2xlIGlsIHByb2dyYW1tYXRvcmUgZnJvY2lvIGRpIHR1cm5vICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5TW9kZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKiBMYXlvdXQgZGVsIEZvcm0gcXVhbmRvIMOoIGluIG1vZGFsaXTDoCBEaXNwbGF5LiBEaSBkZWZhdWx0IG1hbnRpZW5lIGxhIGZvcm1hdHRhemlvbmUgYSBmb3JtICovXHJcbiAgICBASW5wdXQoKSBEaXNwbGF5TGF5b3V0OiAnZm9ybScgfCAnaW5saW5lJyB8ICdoaWRkZW4nID0gJ2Zvcm0nO1xyXG5cclxuICAgIC8qKiBTZXBhcmF0b3JlIGRhIG1ldHRlcmUgaW4gYXV0b21hdGljbyBmcmEgdW4gZWxlbWVudG8gRm9ybSBlIGwnYWx0cm8gcXVhbmRvIHNvbm8gaW4gKipEaXNwbGF5TW9kZSoqIGNvbiAqKkRpc3BsYXlMYXlvdXQqKiBpbmxpbmUgKi9cclxuICAgIEBJbnB1dCgpIElubGluZVNlcGFyYXRvcjogc3RyaW5nID0gJyAnO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEVzcHJlc3Npb25lIHNpbWlsLUFuZ3VsYXIgcGVyIGNhbWJpYXJlIGlsIHRlc3RvIGRlaSBjb21wb25lbnRpIGNoZSBzY2VsZ29ubyBpbCBwcm9wcmlvIG1vZGVsbG8gZGEgdW5hICoqU291cmNlKipcclxuICAgICAqIFxyXG4gICAgICogSWwgZnVuemlvbmFtZW50byDDqCBpZGVudGljbyBhbCBiaW5kZXIgZGkgYW5ndWxhciwgc29sbyBjb24gdW5hIGdyYWZmYSBpbnZlY2UgY2hlIDIuXHJcbiAgICAgKiDDiCBpbm9sdHJlIHBvc3NpYmlsZSBhZ2dpdW5nZXJlIHBlenppIGRpIGRlc2NyaXppb25lIGluIG1hbmllcmEgY29uZGl6aW9uYWxlIGNvbiBsYSBzaW50YXNzaSAqKjpwcm9wPyhQcm9wIHZhbGUge3Byb3B9KSoqXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIERpc3BsYXk6IHN0cmluZyA9ICd7ZGVzY3JpcHRpb259JztcclxuXHJcbiAgICAvKiogUmlzdWx0YXRvIGRlbGwndW5pb25lIGZyYSBsZSBpbmZvcm1hemlvbmkgZGVnbGkgb2dnZXR0aSBpbiAqKlNvdXJjZSoqIGUgbGUgaW1wb3N0YXppb25pIHNwZWNpZmljYXRlIG5lbGwnSW5wdXQgKipEaXNwbGF5KiogKi9cclxuICAgIHB1YmxpYyBCb3VuZFNvdXJjZTogeyBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2Ugw6ggaWwgcHJpbW8gQmluZCBkZWxsYSBTb3VyY2UgKi9cclxuICAgIHByb3RlY3RlZCBTb3VyY2VGaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCB2YWxvcmUgZGVsbGEgdmFyaWFiaWxlICoqX3JlYWRvbmx5KipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIHNvbGEgbGV0dHVyYSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgZ2V0IFJlYWRvbmx5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcmVhZG9ubHk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcG9zdGEgaWwgdmFsb3JlIGRlbGxhIHZhcmlhYmlsZSAqKl9yZWFkb25seSoqIGdlc3RlbmRvIGFuY2hlIGlsIENvbnRlc3RvIGFwcGxpY2F0aXZvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgVmFsb3JlIGRhIGltcG9zdGFyZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBzZXQgUmVhZG9ubHkodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5BcHBDb250ZXh0T3duZXJzaGlwKVxyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVybWV0dGUgZGkgc2V0dGFyZSBpbiB1bmEgdm9sdGEgc29sbyBnbGkgaW5wdXQgTGFiZWxDb2xXaWR0aCBlIElucHV0Q29sV2lkdGgsIGJhc3RhIHNjcml2ZXJsbyBjb24gbGEgc2ludGFzc2kgXCJYIFlcIlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgSW5wdXQgbmVsIGZvcm1hdG8gXCJYIFlcIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBzZXQgTGFiZWxJbnB1dFJhdGlvKGlucHV0OiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgcmF0aW8gPSBpbnB1dC5zcGxpdCgvXFxzLyk7XHJcbiAgICAgICAgdGhpcy5MYWJlbENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMF0pO1xyXG4gICAgICAgIHRoaXMuSW5wdXRDb2xXaWR0aCA9IHBhcnNlSW50KHJhdGlvWzFdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVsZW1lbnRvIEhUTUwgcmFwcHJlc2VudGFudGUgbCdJbnB1dFxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdodG1sSW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgaHRtbElucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIC8qKiBFdmVudG8gY2hpYW1hdG8gYWxsYSBtb2RpZmljYSBkZWwgdmFsb3JlIGNvbGxlZ2F0byBhIHF1ZXN0byBjYW1wbyAqL1xyXG4gICAgQE91dHB1dCgpIGlucHV0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8Q2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFuZ2VFdmVudD4oKTtcclxuXHJcbiAgICAvKiogRXZlbnRvIGNoaWFtYXRvIGFsIGZvY3VzIGRlbCBjYW1wbyBkaSB0ZXN0by9jb21iby9xdWVsY2hlw6gsIHJpZW1pdHRhIGwnZXZlbnRvIG9yaWdpbmFsZSBKYXZhc2NyaXB0ICovXHJcbiAgICBAT3V0cHV0KCkgaW5wdXRGb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICAvKiogRXZlbnRvIGNoaWFtYXRvIGFsIGZpbmFsaXplIGRlbCBjYW1wbyBkaSB0ZXN0by9jb21iby9xdWVsY2hlw6ggKi9cclxuICAgIEBPdXRwdXQoKSBpbnB1dEZpbmFsaXplZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgICAvKiogQ2FjaGUgZGVsbGUgY29uZGl6aW9uaSBzY3JpdHRlIHRpcG8gOnByb3A/KFJvYmEgY29uIHtwcm9wfSkgKi9cclxuICAgIHByaXZhdGUgQmluZENoZWNraW5nR3JvdXBzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIHdoZW5leGlzdHM6IHN0cmluZyB9W10gPSBbXVxyXG5cclxuICAgIC8qKiBDYWNoZSBkZWxsZSBwcm9wcmlldMOgIHNjcml0dGUgdGlwbyAtLT4ge3Byb3B9ICovXHJcbiAgICBwcml2YXRlIEJpbmRQcm9wZXJ0aWVzOiB7IGdsb2JhbDogc3RyaW5nLCBwcm9wOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgQ29zdHJ1dHRvcmUgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCBwcm90ZWN0ZWQgX3ZhbGlkYXRvcnM6IEFycmF5PGFueT4sIEBPcHRpb25hbCgpIHByaXZhdGUgYWM6IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBAT3B0aW9uYWwoKSBwdWJsaWMgQXBwQ29udGV4dDogQ29tcG9uZW50Q29udGV4dCwgQE9wdGlvbmFsKCkgQEluamVjdChBQ09fQ1VTVE9NS0VZKSBwcml2YXRlIEFDT19DVVNUT01LRVk6IHN0cmluZywgQE9wdGlvbmFsKCkgQEluamVjdChGQVZfREVCVUdfTU9ERSkgcHJpdmF0ZSBGQVZfREVCVUdfTU9ERTogYm9vbGVhbiwgcHJpdmF0ZSBuYXRpdmVJbnB1dDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFuZGxlTnVsbE5nQ29udHJvbCgpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm5nQ29udHJvbCBudWxsbyBwZXIgcXVhbGNoZSBtb3Rpdm8hIElsIDkwJSBkZWxsZSBmdW56aW9uYWxpdMOgIGRpIHF1ZXN0byBpbnB1dCBzYXJhbm5vIGRpc2FiaWxpdGF0ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vU2UgbWkgYXJyaXZhIGwnaW5qZWN0YWJsZSBkZWwgY29udGVzdG8gcG9zc28gY2FwaXJlIHNlIHF1ZXN0byBjYW1wbyBkZXZlIGVzc2VyZSBpbiByZWFkb25seSBvIG5vLCBzb2xvIHNlIGhvIGdpw6AgaW5pemlhbGl6emF0byBpIGNvbnRyb2xsZXIgY3VzdG9tIGRlbGwnYWNjZXNzIGNvbnRyb2xcclxuICAgICAgICBpZiAodGhpcy5BcHBDb250ZXh0ICYmIHRoaXMuQXBwQ29udGV4dC5uYW1lICYmIHRoaXMuQUNPX0NVU1RPTUtFWSAmJiB0aGlzLmFjICYmIHRoaXMuYWMuSW5pdGlhbGl6ZWRDdXN0b20pIHtcclxuICAgICAgICAgICAgdGhpcy5BcHBDb250ZXh0T3duZXJzaGlwID0gIXRoaXMuYWMuaGFzKHRoaXMuQUNPX0NVU1RPTUtFWSArIFwiOlwiICsgdGhpcy5BcHBDb250ZXh0Lm5hbWUsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9ICF0aGlzLkFwcENvbnRleHRPd25lcnNoaXBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuXHJcbiAgICAgICAgLy9TZSBobyBnacOgIHVuIHBhcmVudCBpbXBvc3RhdG8gdnVvbCBkaXJlIGNoZSBzb3R0byBhbCB0YWcgPGZvcm0+IGhvIGRpcmV0dGFtZW50ZSB1biB0YWcgPGZvcm0tKj4uLlxyXG4gICAgICAgIC8vLi4gcXVpbmRpIHBvc3NvIGltcG9zdGFyZSBkaXJldHRhbWVudGUgaWwgcmlmZXJpbWVudG8gZGVsIEZvcm0gZGEgdXNhcmUgaW4gSFRNTCBwZXIgaWwgc3VibWl0dGVkXHJcblxyXG4gICAgICAgIC8vU2Ugbm9uIGMnw6ggdnVvbCBkaXJlIGNoZSBkZW50cm8gYWwgdGFnIDxmb3JtPiBjJ8OoIHVubyBzcGxlbmRpZG8gPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiAuLi4uXCI+Li5cclxuICAgICAgICAvLy4uIGlsIHF1YWxlIGEgc3VhIHZvbHRhIGNvbnRpZW5lIGlsIGNvbnRyb2xsbyA8Zm9ybS0qPiBxdWluZGkgYXZyw7IgaWwgZm9ybSBuZWxsJ2lucHV0IFwiRm9ybVwiXHJcbiAgICAgICAgaWYgKCg8YW55Pm5nQ29udHJvbCkuX3BhcmVudClcclxuICAgICAgICAgICAgdGhpcy5Gb3JtID0gPE5nRm9ybT4oPGFueT5uZ0NvbnRyb2wpLl9wYXJlbnQ7XHJcblxyXG4gICAgICAgIC8vUXVlc3RhIHNlcnZlIHBlciBpbXBvc3RhcmUgbWUgc3Rlc3NvIGNvbWUgc2kgZGV2ZSwgaWwgdmFsaWRhdG9yZSBpbnZlY2UgbG8gcGFzc28gYWwgdmFsaWRhdGlvbi1pbnB1dCBxdWFuZG8gdmllbmUgc2V0dGF0byBpbCB2YWxpZGF0aW9uQ29udHJvbFxyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xyXG4gICAgICAgICAgICAvL1BlciB0dXR0aSBpIHZhbGlkYXRvcmk6IHJpZ2VuZXJvIGxhIGZ1bnppb25lIGRpIHZhbGlkYXppb25lLiBQZXIgcXVhbGNoZSBtb3Rpdm8gYSB2b2x0ZSBobyB2YWxpZGF0b3JpIHNlbnphLi4uXHJcbiAgICAgICAgICAgIC8vLi4uIHF1ZXN0byDDqCB1biB3b3JrYXJvdW5kIHBlciBlc3NlcmUgc2ljdXJvIGRpIGF2ZXJsYSBzZW1wcmUuXHJcbiAgICAgICAgICAgIC8vU29sbyBpIHZhbGlkYXRvcmkgY29uIHBhcmFtZXRyaSBoYW5ubyBiaXNvZ25vIGRlbGxhIF9jcmVhdGVWYWxpZGF0b3IgKGVzLiBcIm1heGxlbmd0aFwiIGNoZSBoYSAxIHBhcmFtZXRybyksIHF1aW5kaSBubyB2YWxpZGF0b3JpIHRpcG8gXCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0b3JzLmZvckVhY2godiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYuX2NyZWF0ZVZhbGlkYXRvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgdi5fY3JlYXRlVmFsaWRhdG9yKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aGlzLl92YWxpZGF0b3JzKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpO1xyXG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFZmZldHR1YSBpbCBCaW5kL1BhcnNlIGRlbGxlIHZhcmllICoqU291cmNlKiogdW5lbmRvIGxlIGluZm9ybWF6aW9uaSBzcGVjaWZpY2F0ZSBpbiAqKkRpc3BsYXkqKlxyXG4gICAgICogXHJcbiAgICAgKiBFdmVudHVhbG1lbnRlIHJpZWZmZXR0dWEgdW4gYmluZCBhbCBtb2RlbGxvIGluIGJhc2UgYWwgdmFsb3JlIGRlbGxhIHZhcmlhYmlsZSAqKlJlYmluZE1vZGVsQWZ0ZXJTb3VyY2UqKlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgdHJ5QmluZFNvdXJjZURpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlNvdXJjZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5Tb3VyY2UubGVuZ3RoID09IDAgJiYgIXRoaXMuU291cmNlRmlyc3RCaW5kKVxyXG4gICAgICAgICAgICB0aGlzLkJvdW5kU291cmNlID0gW107XHJcblxyXG4gICAgICAgIHRoaXMuU291cmNlRmlyc3RCaW5kID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIENhY2hlIGxvY2FsZSBwZXIgZXZpdGFyZSBkaSByaWZhcmUgZGVpIHJlZ2V4Lm1hdGNoIG9nbmkgc2FudGEgdm9sdGFcclxuICAgICAgICBpZiAodGhpcy5Tb3VyY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLkJvdW5kU291cmNlID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5CaW5kQ2hlY2tpbmdHcm91cHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRlQmluZENoZWNraW5nR3JvdXBzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5CaW5kUHJvcGVydGllcy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVCaW5kUHJvcGVydGllcygpO1xyXG5cclxuICAgICAgICAgICAgLy8gQmxvY2NvIHBlciBnZW5lcmFyZSBsYSBkZXNjcml6aW9uZSBmaW5hbGUgZGkgdW4gZWxlbWVudG9cclxuICAgICAgICAgICAgdGhpcy5Tb3VyY2UuZm9yRWFjaChzID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEFnZ2l1bmdvIGFsbGEgQm91bmRTb3VyY2UgaW4gZm9ybWF0byBzdGFuZGFyZCBLZXlWYWx1ZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Cb3VuZFNvdXJjZS5wdXNoKHRoaXMudHJhbnNmb3JtU291cmNlSXRlbShzKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gUG9zdCB0cnliaW5kIHNlIGMnw6ggdW4gbW9kZWxsbyBhc3NvY2lhdG8gcmljYWxjb2xvIGwnKipFdmFsdWF0ZWRNb2RlbCoqXHJcbiAgICAgICAgICAgIGlmICh0aGlzLk1vZGVsKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5FdmFsdWF0ZWRNb2RlbCA9IHRoaXMuQm91bmRTb3VyY2UuZmluZCh0ID0+IHQuaWQgPT0gdGhpcy5Nb2RlbCk/LmRlc2NyaXB0aW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogVmFsdXRhIGlsIGNvbnRlbnV0byBkZWxsYSB2YXJpYWJpbGUgQmluZENoZWNraW5nR3JvdXBzICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlQmluZENoZWNraW5nR3JvdXBzKCkge1xyXG4gICAgICAgIC8vIEJsb2NjbyBwZXIgdGlyYXJlIGZ1b3JpIGxlIGNvbmRpemlvbmkgc2NyaXR0ZSB0aXBvIC0tPiA6cHJvcD8oUm9iYSBjb24ge3Byb3B9KVxyXG4gICAgICAgIHZhciBpZmZlZE1hdGNoZXMgPSB0aGlzLkRpc3BsYXkubWF0Y2goLzooW2Etel0rKVxcP1xcKChbXlxcKFxcKV0rKVxcKS9nKTtcclxuICAgICAgICBpZiAoaWZmZWRNYXRjaGVzKSB7XHJcbiAgICAgICAgICAgIGlmZmVkTWF0Y2hlcy5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gU3Rlc3NhIHJlZ2V4IGRpIHNvcHJhIG1hIGlsIHRhZyBcImlcIiBzZXJ2ZSBwZXIgdGlyYXJlIGZ1b3JpIGkgc2luZ29saSBjYXB0dXJpbmcgZ3JvdXAgZSBwZXIgcXVhbGNoZSBtb3Rpdm8gXHJcbiAgICAgICAgICAgICAgICAvLyBuZXcgUmVnRXhwKGJhc2VSZWdleCwgXCJnXCIpIG5vbiBmdW56aW9uYSBxdWluZGkgbm9uIGhvIHBvdHV0byByYXppb25hbGl6emFybG9cclxuICAgICAgICAgICAgICAgIGxldCBncm91cHMgPSBtLm1hdGNoKC86KFthLXpdKylcXD9cXCgoW15cXChcXCldKylcXCkvaSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkJpbmRDaGVja2luZ0dyb3Vwcy5wdXNoKHsgZ2xvYmFsOiBtLCBwcm9wOiBncm91cHNbMV0sIHdoZW5leGlzdHM6IGdyb3Vwc1syXSB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBWYWx1dGEgaWwgY29udGVudXRvIGRlbGxhIHZhcmlhYmlsZSBCaW5kUHJvcGVydGllcyAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZUJpbmRQcm9wZXJ0aWVzKCkge1xyXG4gICAgICAgIC8vIEJsb2NjbyBwZXIgdGlyYXJlIGZ1b3JpIGxlIHByb3ByaWV0w6Agc2NyaXR0ZSB0aXBvIC0tPiB7cHJvcH1cclxuICAgICAgICB2YXIgbWF0Y2hlcyA9IHRoaXMuRGlzcGxheS5tYXRjaCgve1thLXpdK30vZ2kpO1xyXG4gICAgICAgIGlmIChtYXRjaGVzKVxyXG4gICAgICAgICAgICBtYXRjaGVzLmZvckVhY2gobSA9PiB7IHRoaXMuQmluZFByb3BlcnRpZXMucHVzaCh7IGdsb2JhbDogbSwgcHJvcDogbS5zdWJzdHJpbmcoMSwgbS5sZW5ndGggLSAxKSB9KTsgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFzZm9ybWEgdW4gb2dnZXR0byBkZWxsYSBTb3VyY2UgYWxsYSBzdWEgdmVyc2lvbmUgXCJudW92YVwiIGJhc2FuZG9zaSBzdWxsZSBpbmZvcm1hemlvbmkgc3UgZ3J1cHBpIGUgcHJvcHJpZXTDoFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIGRhIHRyYXNmb3JtYXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHt7aWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZ319IE9nZ2V0dG8gZmluYWxlIHRyYXNmb3JtYXRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhbnNmb3JtU291cmNlSXRlbShzOiBhbnkpOiB7aWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZ30ge1xyXG4gICAgICAgIC8vIFBhcnRvIHNlbXByZSBkYWxsYSB2YXJpYWJpbGUgZGkgRGlzcGxheSwgcG9pIHNvc3RpdHVpc2NvIHBlenpvIHBlciBwZXp6b1xyXG4gICAgICAgIGxldCBkZXNjID0gdGhpcy5EaXNwbGF5O1xyXG5cclxuICAgICAgICAvLyBUYWdsaW8gbyBtYW50ZW5nbyBsZSBjb25kaXppb25pIGluIGJhc2UgYWxsYSBwcm9wcmlldMOgIHN1IGN1aSBmYXJlIGNoZWNrXHJcbiAgICAgICAgLy8gRG9wb2RpY2jDqSBzY3Jpdm8gdHV0dGUgbGUgcHJvcHJpZXTDoFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5CaW5kQ2hlY2tpbmdHcm91cHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSB0aGlzLkJpbmRDaGVja2luZ0dyb3Vwc1tpXTtcclxuICAgICAgICAgICAgZGVzYyA9IGRlc2MucmVwbGFjZSh0Lmdsb2JhbCwgKHNbdC5wcm9wXSAhPSBudWxsICYmIHNbdC5wcm9wXSAhPSB1bmRlZmluZWQpID8gdC53aGVuZXhpc3RzIDogXCJcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuQmluZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSB0aGlzLkJpbmRQcm9wZXJ0aWVzW2ldO1xyXG4gICAgICAgICAgICBkZXNjID0gZGVzYy5yZXBsYWNlKHQuZ2xvYmFsLCBzW3QucHJvcF0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgaWQ6IHNbdGhpcy5JZEZpZWxkXSwgZGVzY3JpcHRpb246IGRlc2MgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBpbCBjb21vcG5lbnRlIGluIHF1ZXN0aW9uZSDDqCBpbiBncmFkbyBkaSBnZXN0aXJlIG5nQ29udHJvbCBudWxsaS4gXHJcbiAgICAgKiBEaSBkZWZhdWx0IMOoICoqZmFsc2UqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgZ2VzdGlzY28gbmdDb250cm9sIG51bGxpLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBoYW5kbGVOdWxsTmdDb250cm9sKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgLy8gQSB2b2x0ZSBuZWxsJ25nT25Jbml0IG5vbiBjaSBwYXNzYSBxdWluZGkgbG8gbWV0dG8gc2lhIHF1aSBzaWEgbmVsbCdhZnRlcnZpZXdpbml0LCBwZW5zbyBjaGUgdmFsZ2EgcGVyIGkgY29tcG9uZW50aSBkaSB0ZXJ6ZSBwYXJ0aVxyXG4gICAgICAgIC8vIGNoZSBzaSBjb2xsZWdhbm8gcGVyIGkgY2F6emkgbG9ybyBhbCBmb3JtIGVjYywgcXVpbmRpIGxhIHBhcnRlIHNvcHJhIG5vbiBzZXJ2ZS4uLiBCT0hcclxuICAgICAgICB0aGlzLmRvQ2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpO1xyXG5cclxuICAgICAgICAvL0lsIG5vbWUgbm9uIGMnw6ggc2UgbWV0dG8gc3RhbmRhbG9uZSA6IHRydWUgKENIRSBOT04gw6kgREEgTUVUVEVSRSlcclxuICAgICAgICAvL0RhdG8gY2hlIGFuY2hlIGlsIGNvbnRyb2xsbyBlc3Rlcm5vIHZpZW5lIGNvbnNpZGVyYXRvIGNvbWUgY29tcG9uZW50ZSBkZWwgZm9ybSwgbm9uIHBvc3NvIGJhc2FybWkgc29sbyBzdWwgbm9tZSBtYSBkZXZvIGFnZ2l1bmdlcmUgdW4gdGFnLiBJbiBxdWVzdG8gY2FzbyBcIl9pbnRlcm5hbFwiXHJcbiAgICAgICAgLy8gQVRURU5aSU9ORTogUVVBTFNJQVNJIFNJQSBJTCBNT1RJVk8sIFNFIFNUTyBDT1NPIFZJRU5FIFNQT1NUQVRPIERBTEwgbmdPbkluaXQgTk9OIEZVTlpJT05BIFBJVSBOVUxMQVxyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbC5uYW1lKVxyXG4gICAgICAgICAgICB0aGlzLkdlbmVyYXRlZE5hbWUgPSB0aGlzLm5nQ29udHJvbC5uYW1lLnRvU3RyaW5nKCkgKyBcIl9pbnRlcm5hbFwiO1xyXG5cclxuICAgICAgICAvLyBBVFRFTlpJT05FOiBRVUFMU0lBU0kgU0lBIElMIE1PVElWTywgU0UgU1RPIENPU08gVklFTkUgU1BPU1RBVE8gREFMTCBuZ09uSW5pdCBOT04gRlVOWklPTkEgUElVIE5VTExBXHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZm9ybUhhc0JlZW5Cb3VuZCAmJiB0aGlzLnZhbGlkYXRpb25Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0uYWRkQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUhhc0JlZW5Cb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFF1YW5kbyB1biBmb3JtIHZpZW5lIHN1Ym1pdHRhdG8gbGEgdmFyaWFiaWxlIEZvcm0uc3VibWl0dGVkIHZpZW5lIGFzc2VnbmF0YSBhbGwnaW5wdXQgW3N1Ym1pdHRlZF0gZGVsIHZhbC1jb250cm9sXHJcbiAgICAgICAgICAgIC8vIEVzc2VuZG8gY2hlIHBlcsOyIGxhIENEIMOoIE9uUHVzaCBwZXIgZGlyZSBhZCBBbmd1bGFyIGNoZSBsJ0lucHV0IMOoIGNhbWJpYXRvIGUgcGVybWV0dGVyZSBpIHNpZGVmZmVjdHMgZGkgYXNzZWduYXJlIFtzdWJtaXR0ZWRdXHJcbiAgICAgICAgICAgIC8vIGRldm8gYXR0YWNjYXJtaSBhbCBzdWJtaXQgYXR0dWFsZSBkZWwgZm9ybSBlIHByaW1hIGRpIGVzZWd1aXJsbyBkZXZvIG1hcmNhcmUgaWwgY29tcG9uZW50ZSBwZXIgaWwgY2hlY2tcclxuICAgICAgICAgICAgbGV0IG9yaWdGdW5jID0gdGhpcy5Gb3JtLm9uU3VibWl0O1xyXG4gICAgICAgICAgICB2YXIgZm9ybU91dHNpZGVSZWYgPSB0aGlzLkZvcm07XHJcbiAgICAgICAgICAgIHRoaXMuRm9ybS5vblN1Ym1pdCA9IChldik6IGJvb2xlYW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ0Z1bmMuYXBwbHkoZm9ybU91dHNpZGVSZWYpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU2V0VmFsaWRhdGlvblN1YmplY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5TZXRWYWxpZGF0aW9uU3ViamVjdC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUodiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodi5maWVsZE5hbWUgKyBcIl9pbnRlcm5hbFwiID09IHRoaXMuR2VuZXJhdGVkTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEJpc29nbmEgZmFybG8gc3UgZW50cmFtYmkgaSBDb250cm9sIHBlciBwb3J0YXJlIGlsIFwiLnZhbGlkXCIgbmVsIHB1bnRvIGdpdXN0b1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGUgcGVyIGF2ZXJlIGdsaSBzdGlsaSBzdWxsJ2lucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSB0aGlzLkZvcm0uZ2V0Q29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNldEVycm9ycyh7IGZvcmNlZHRvaW52YWxpZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnNldEVycm9ycyh7IGZvcmNlZHRvaW52YWxpZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGVzdHJveWVkJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZSBzb25vIGluIG1vZGFsaXTDoCBkZXRhdGNoZWQgZGV2byByaW11b3ZlcmUgbWFudWFsbWVudGUgcXVlc3RvIGNvbnRyb2xsbyBxdWFuZG8gZW50cm8gbmVsbGEgZGlzcG9zZSwgYWx0cmltZW50aSBzZSBwb2kgbmUgYW5kYXNzaSBhIHJpYWdnaXVuZ2VyZVxyXG4gICAgICogdW4gYWx0cm8gY29uIGxvIHN0ZXNzbyBcIm5hbWVcIiBtYSBtYWdhcmkgcmVzZXR0YXRvLCBBbmd1bGFyIGxvIHJlLWlkcmF0ZXJlYmJlIGNvbiBpIHZhbG9yaSBwcmVjZWRlbnRpIG5vbm9zdGFudGUgaWwgbW9kZWxsbyBmb3NzZSB2dW90b1xyXG4gICAgICovXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtICYmIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wgJiYgISF0aGlzLkZvcm0uZ2V0Q29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKSlcclxuICAgICAgICAgICAgdGhpcy5Gb3JtLnJlbW92ZUNvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEVsYWJvcmEgaSB2YWxpZGF0b3JpIGluaWV0dGF0aSBlIGNhcGlzY2Ugc2UgaWwgdmFsb3JlIMOoIG9iYmxpZ2F0b3JpbyBvIG1lbm8gKi9cclxuICAgIGRvQ2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpIHtcclxuICAgICAgICAgICAgLy8gQ29udHJvbGxvIHNlIMOoIHNldHRhdG8gdW4gcmVxdWlyZWQgcGVyIGRlY2lkZXJlIGluIG1hbmllcmEgY29uZGl6aW9uYWxlIHNlIHV0aWxpenphcmUgaWwgdmFsaWRhdG9yZSByZXF1aXJlZCBuZWwgY29tcG9uZW50ZSBpbnRlcm5vXHJcbiAgICAgICAgICAgIC8vIExvIGZhY2NpbyBxdWkgZSBub24gaW4gdW4gZXZlbnR1YWxlIG5nT25Jbml0IG8gY29zdHJ1dHRvcmUgcGVyY2jDqSBuZ09uSW5pdCBub24gc2VtcHJlIHZpZW5lIGNoaWFtYXRvIGUgZGEgY29zdHJ1dHRvcmUgaWwgdmFsaWRhdG9yZSBub24gaGEgYW5jb3JhIGlsIHZhbG9yZSBnaXVzdG9cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRvcnMgJiYgdGhpcy5WYWxpZGF0aW9uICYmIHRoaXMuX3ZhbGlkYXRvcnMuc29tZShlbGVtID0+IGVsZW0gaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvciAmJiBlbGVtLnJlcXVpcmVkKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmRvQ2hlY2tSZXF1aXJlZFZhbGlkYXRvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBIZWxwZXIgY2hlIGNvbGxlZ2EgbGEgZnVuemlvbmUgZGkgcmVzZXQgZGVsIGNvbnRyb2xsbyBmb3JtIGFsIGNvbnRyb2xsbyBkaSB2YWxpZGF6aW9uZSBzb3R0b3N0YW50ZSAqL1xyXG4gICAgcHJpdmF0ZSBiaW5kUmVzZXRGdW5jdGlvbigpIHtcclxuICAgICAgICAvL2ZhY2NpbyBpbiBtb2RvIGNoZSBzZSBjaGlhbW8gaWwgcmVzZXQgZGVsIGNvbnRyb2xsbyAobyBkZWxsYSBmb3JtKSBkYWxsJ2VzdGVybm8gc2kgcmVzZXR0aSBhbmNoZSBpbCBjb250cm9sbG8gbmF0aXZvXHJcbiAgICAgICAgY29uc3Qgb3JpZ0Z1bmMgPSAoPGFueT50aGlzLm5nQ29udHJvbC5jb250cm9sKS5fX29yaWdpbmFsX3Jlc2V0X18gfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5yZXNldDtcclxuICAgICAgICB2YXIgbmdDb250cm9sX291dHNpZGVSZWZlcmVuY2UgPSB0aGlzLm5nQ29udHJvbC5jb250cm9sO1xyXG4gICAgICAgIHZhciB2YWxpZGF0aW9uQ29udHJvbF9vdXRzaWRlUmVmZXJlbmNlID0gdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sO1xyXG5cclxuICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnJlc2V0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBvcmlnRnVuYy5hcHBseShuZ0NvbnRyb2xfb3V0c2lkZVJlZmVyZW5jZSk7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25Db250cm9sX291dHNpZGVSZWZlcmVuY2UucmVzZXQoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL1BlciBjb25zZW50aXJlIHJpY2hpYW1pIG11bHRpcGxpIGRpIHF1ZXN0YSBmdW56aW9uZSBwcmVuZGVuZG8gc2VtcHJlIGxhIGZpdW56aW9uZSBkaSByZXNldCBiYXNlXHJcbiAgICAgICAgKDxhbnk+dGhpcy5uZ0NvbnRyb2wuY29udHJvbCkuX19vcmlnaW5hbF9yZXNldF9fID0gb3JpZ0Z1bmNcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChvYmogPT0gbnVsbCAmJiB0aGlzLmZpcnN0QmluZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcnN0QmluZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLk1vZGVsID0gb2JqO1xyXG5cclxuICAgICAgICAvL1BlciBzdmVnbGlhcmUgQW5ndWxhci4gSWwgdmFsb3JlIGNoZSBlbnRyYSBwb3RyZWJiZSBlc3NlcmUgdmFsaWRvL25vbiB2YWxpZG8gZSBxdWVzdG8gbG8gYmluZGEgYSB0dXR0bywgZm9ybSBjb21wcmVzb1xyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbClcclxuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLk1vZGVsKVxyXG4gICAgICAgICAgICB0aGlzLm9uTm90TnVsbFZhbHVlU2V0KCk7XHJcblxyXG4gICAgICAgIC8vIG1hcmtGb3JDaGVjayBub24gdmEgYmVuZSBpbiBxdWFudG8gYXJyaXZhbm8gcG9zc2liaWxtZW50ZSAyIHVwZGF0ZSBzdSB1biBzb2xvIGNpY2xvIGRpIHN0YWNrXHJcbiAgICAgICAgLy8gc2V0VGltZW91dCBjaGUgd3JhcHBhIHR1dHRvIG5vbiB2YSBiZW5lIHNlbm7DsiBzcGFtbWEgZGVsbGUgY2hhbmdlIGRldGVjdGlvbiBhIHN1b24gZGkgaW50ZXJ2YWwgY2hlIHJhbGxlbnRhbm8gdGFudGlzc2ltbyBsJ2FwcFxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFJlZ2lzdHJhemlvbmUgSW5wdXQgSFRNTFxyXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRpb25Db250cm9sOiBOZ01vZGVsO1xyXG4gICAgQFZpZXdDaGlsZChcImJhc2VJbnB1dFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IGJhc2VJbnB1dChjb21wOiBOZ01vZGVsKSB7IHRoaXMuZG9SZWdpc3RlckJhc2VJbnB1dChjb21wKTsgfVxyXG4gICAgQFZpZXdDaGlsZChcImJhc2VJbnB1dFwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBzZXQgYmFzZUlucHV0X3N0YXRpYyhjb21wOiBOZ01vZGVsKSB7IHRoaXMuZG9SZWdpc3RlckJhc2VJbnB1dChjb21wKTsgfTtcclxuXHJcbiAgICBkb1JlZ2lzdGVyQmFzZUlucHV0KGJhc2VJbnB1dDogTmdNb2RlbCkge1xyXG4gICAgICAgIGlmIChiYXNlSW5wdXQpIHtcclxuICAgICAgICAgICAgLy8gw4ggYXJyaXZhdG8gdW4gbnVvdm8gdmFsaWRhdGlvbkNvbnRvcmwgKHN1Y2NlZGUgc29sbyBuZWwgZm9ybS1zZWxlY3QgcXVhbmRvIGNhbWJpYSBsYSBzb3VyY2UgZGEgMCBlbGVtZW50aSAvIG51bGwgYWQgTiBlbGVtZW50aSwgcXVpbmRpIGFsIG1hc3NpbW8gdW5hIHZvbHRhKSBcclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wgJiYgdGhpcy5Gb3JtKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtLnJlbW92ZUNvbnRyb2wodGhpcy52YWxpZGF0aW9uQ29udHJvbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sID0gYmFzZUlucHV0O1xyXG5cclxuICAgICAgICAgICAgLy9RdWVzdGEgc2VydmUgcGVyIHBhc3NhcmUgYXZhbnRpIGkgdmFsaWRhdG9yaVxyXG4gICAgICAgICAgICBpZih0aGlzLlVzZVVzZXJWYWxpZGF0b3JzKVxyXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sLnNldFZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7XHJcblxyXG4gICAgICAgICAgICAvL1NlIHNvbm8gc3RhY2NhdG8gZGFsIEZvcm0gKHZ1b2wgZGlyZSBjaGUgc29ubyBhZCBlc2VtcGlvIGRlbnRybyB1biBuZy10ZW1wbGF0ZSkgYWdnaXVuZ28gaWwgY29udHJvbGxvIGFsIEZvcm0gcGFzc2F0byBjb21lIGlucHV0IChjb250ZXh0IGRlbCB0ZW1wbGF0ZSlcclxuICAgICAgICAgICAgaWYgKHRoaXMuRm9ybSAmJiAhdGhpcy5mb3JtSGFzQmVlbkJvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkZvcm0uYWRkQ29udHJvbCh0aGlzLnZhbGlkYXRpb25Db250cm9sKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtSGFzQmVlbkJvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kUmVzZXRGdW5jdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgLy8gSSB2YWwtcm9iYSBxdWVzdG8gbG8gZmFubm8gYXV0b21hdGljYW1lbnRlIGRlbnRyby4uLiBnbGkgYWx0cmkgbm8gKGVzLiBzZW1wbGljZSBpbnB1dCBjaGVja2JveClcclxuICAgICAgICAgICAgdGhpcy5kb1VwZGF0ZVZhbGlkaXR5Rm9yTmF0aXZlSW5wdXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJGb3JtKG5nRm9ybTogTmdGb3JtKSB7XHJcbiAgICAgICAgdGhpcy5Gb3JtID0gbmdGb3JtO1xyXG4gICAgICAgIHRoaXMuRm9ybS5hZGRDb250cm9sKHRoaXMudmFsaWRhdGlvbkNvbnRyb2wpXHJcbiAgICAgICAgdGhpcy5mb3JtSGFzQmVlbkJvdW5kID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFnZ2lvcm5hIGlsIHZhbG9yZSBlIGxhIHZhbGlkaXTDoCBkZWxsJ2lucHV0IHNvdHRvc3RhbnRlLiBOb24gdmllbmUgY2hpYW1hdG8gcGVyIGlucHV0IG5hdGl2aSBjb21lIGxlIGNoZWNrYm94XHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VkVmFsdWUgRm9yemEgbCdhZ2dpb3JuYW1lbnRvIGFuY2hlIHNlIG5vbiDDqCB1biBpbnB1dCBuYXRpdm8gKGlucHV0IG5hdGl2byA9IGNoZWNrYm94LCBhZCBlc2VtcGlvKVxyXG4gICAgICovXHJcbiAgICBkb1VwZGF0ZVZhbGlkaXR5Rm9yTmF0aXZlSW5wdXQoZm9yY2VkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBDbGFzc2ljbyBcInNwYXJhIGZ1b3JpXCIuIE1hbnRlbmdvIGxvIHN0ZXNzbyBub21lIGRlbGwnZXZlbnRvIGRlaSA8dmFsLSo+IChpbnB1dENoYW5nZSkgcGVyIHJldHJvY29tcGF0aWJpbGl0w6AuXHJcbiAgICAgKiBcclxuICAgICAqIE5vbiBwb3NzbyB0ZW5lcmxvIHByb3RlY3RlZCBhbHRyaW1lbnRpIHBvc3NvIGVzZWd1aXJsbyBzb2xvIGRhbCAudHMgZSBub24gZGFsbCcgLmh0bWxcclxuICAgICAqL1xyXG4gICAgY2hhbmdlZChmb3JjZWRWYWx1ZTogYW55ID0gbnVsbCwgbWFya0ZvckNoZWNrOiBib29sZWFuID0gZmFsc2UsIG1vZGVsRXZhbHVhdGlvbkhhbmRsZWQ6IGJvb2xlYW4gPSBmYWxzZSwgaW50ZXJuYWw6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGxldCB0b0VtaXQgPSBmb3JjZWRWYWx1ZSA9PSBudWxsIHx8IGZvcmNlZFZhbHVlID09IFwiXCIgPyB0aGlzLk1vZGVsID8/IFwiXCIgOiBmb3JjZWRWYWx1ZTtcclxuXHJcbiAgICAgICAgaWYoIW1vZGVsRXZhbHVhdGlvbkhhbmRsZWQpXHJcbiAgICAgICAgICAgIHRoaXMuRXZhbHVhdGVkTW9kZWwgPSB0b0VtaXQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodG9FbWl0KTtcclxuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlLmVtaXQobmV3IENoYW5nZUV2ZW50KGludGVybmFsLCB0b0VtaXQpKTtcclxuICAgICAgICBpZiAobWFya0ZvckNoZWNrKVxyXG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIENsYXNzaWNvIFwic3BhcmEgZnVvcmlcIiBzdWwgZm9jdXMuIE1hbnRlbmdvIGxvIHN0ZXNzbyBub21lIGRlbGwnZXZlbnRvIGRlaSA8dmFsLSo+IChpbnB1dENoYW5nZSkgcGVyIHJldHJvY29tcGF0aWJpbGl0w6AuXHJcbiAgICAgKiBcclxuICAgICAqIE5vbiBwb3NzbyB0ZW5lcmxvIHByb3RlY3RlZCBhbHRyaW1lbnRpIHBvc3NvIGVzZWd1aXJsbyBzb2xvIGRhbCAudHMgZSBub24gZGFsbCcgLmh0bWxcclxuICAgICAqL1xyXG4gICAgZm9jdXNlZChldmVudDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEZvY3VzLmVtaXQoZXZlbnQpO1xyXG4gICAgICAgIHRoaXMubG9nKFwiQ29udHJvbCBGb2N1c2VkIC0gXCIgKyB0aGlzLkdlbmVyYXRlZE5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogQ2xhc3NpY28gXCJzcGFyYSBmdW9yaVwiIHN1bGxhIGZpbmFsaXp6YXppb25lIGRlbCB2YWxvcmUgZGVsbCdpbnB1dCAoYmx1ciAvIHRhc3RvIGludmlvLCBlY2MuLi4pLiBNYW50ZW5nbyBsbyBzdGVzc28gbm9tZSBkZWxsJ2V2ZW50byBkZWkgPHZhbC0qPiAoaW5wdXRDaGFuZ2UpIHBlciByZXRyb2NvbXBhdGliaWxpdMOgLlxyXG4gICAgICogXHJcbiAgICAgKiBOb24gcG9zc28gdGVuZXJsbyBwcm90ZWN0ZWQgYWx0cmltZW50aSBwb3NzbyBlc2VndWlybG8gc29sbyBkYWwgLnRzIGUgbm9uIGRhbGwnIC5odG1sXHJcbiAgICAgKi9cclxuICAgIGZpbmFsaXplZCgpIHtcclxuICAgICAgICB0aGlzLmlucHV0RmluYWxpemVkLmVtaXQodGhpcy5uZ0NvbnRyb2w/Lm5hbWU/LnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIHRoaXMubG9nKFwiQ29udHJvbCBWYWx1ZSBGaW5hbGl6ZWQgLSBcIiArIHRoaXMuR2VuZXJhdGVkTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFtcGEgdW4gbG9nIGEgY29uc29sZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBNZXNzYWdnaW8gZGEgc3RhbXBhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvZyhtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5GQVZfREVCVUdfTU9ERSlcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJAZm9ybXMtYW5kLXZhbGlkYXRpb25zOiBcIiArIG1lc3NhZ2UpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIGFic3RyYWN0IG9uTm90TnVsbFZhbHVlU2V0KCk6IHZvaWQ7XHJcblxyXG4gICAgLy8gKioqKioqKioqKioqKioqKipcclxuICAgIC8vICoqIFZBTElEQVRJT05TICoqXHJcbiAgICAvLyAqKioqKioqKioqKioqKioqKlxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFyaWFiaWxlIHBlciB0ZW5lcmUgaW4gbWVtb3JpYSBsbyBzdGF0byBkaSBzdWJtaXQgZGkgcXVlc3RvIGNvbXBvbmVudGVcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIF9zdWJtaXR0ZWQ6IGJvb2xlYW47XHJcbiAgICAvKipcclxuICAgICAqIFZhcmlhYmlsZSBwZXIgdGVuZXJlIGluIG1lbW9yaWEgaWwgZmF0dG8gY2hlIGlsIGNvbXBvbmVudGUgw6ggZm9yemF0byBhIGludmFsaWRvIG8gbm9cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIF9mb3JjZUludmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcG9zdGEgaWwgY29tcG9uZW50ZSBjb21lIFwic3VibWl0dGVkXCIgc2NhdGVuYW5kb25lIGxlIHZhbGlkYXppb25pIGVkIGV2ZW50dWFsbWVudGUgbGEgdmlzdWFsaXp6YXppb25lIGRlbCB0b29sdGlwIGRpIGVycm9yZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbCAqKnRydWUqKiBzZSBzaSB2dW9sZSBpbXBvc3RhcmUgcXVlc3RvIGNvbnRyb2xsbyBjb21lIHN1Ym1pdHRlZCwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgQElucHV0KFwic3VibWl0dGVkXCIpIHNldCBzdWJtaXR0ZWQodmFsOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fc3VibWl0dGVkID0gdmFsO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGlvbkNvbnRyb2wpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHZhbCkgeyBcclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sLnN0YXR1cyA9PT0gXCJJTlZBTElEXCIgJiYgdmFsKSB7IC8qdGhpcy5zaG93VG9vbHRpcFdpdGhNZXNzYWdlKCk7Ki8gfVxyXG4gICAgICAgIGVsc2UgeyAvKnRoaXMudG9vbHRpcC5oaWRlKCk7Ki8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wb3N0YSBpbCBjb21wb25lbnRlIGNvbWUgXCJpbnZhbGlkXCIgYSBwcmVzY2luZGVyZSBkYWkgdmFsaWRhdG9yaVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBzZXQgZm9yY2VJbnZhbGlkKHZhbDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2ZvcmNlSW52YWxpZCA9IHZhbDtcclxuXHJcbiAgICAgICAgaWYgKHZhbClcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wuc2V0RXJyb3JzKHsgZm9yY2VkdG9pbnZhbGlkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udHJvbC5jb250cm9sLnNldEVycm9ycyh7IGZvcmNlZHRvaW52YWxpZDogbnVsbCB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaXNEaXNhYmxlZCA/IHRoaXMudmFsaWRhdGlvbkNvbnRyb2wuY29udHJvbC5kaXNhYmxlKCkgOiB0aGlzLnZhbGlkYXRpb25Db250cm9sLmNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICAgICAgdGhpcy5SZWFkb25seSA9IGlzRGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFN1YnNjcmlwdGlvbiBhbGxlIHJpY2hpZXN0ZSBkaSBmb2N1c1xyXG4gICAgKi9cclxuICAgIG9ic2VydmFibGU6IGFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdHJhIGlsIFN1YmplY3QgcGVyIHJpY2V2ZXJlIGxlIHJpY2hpZXN0ZSBkaSBGb2N1cyBkYWxsJ2VzdGVybm9cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJGb2N1c1JlcXVlc3QoKTogYW55IHtcclxuICAgICAgICBpZiAoIXRoaXMuRm9jdXNTdWJqZWN0KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgdGhpcy5vYnNlcnZhYmxlID0gdGhpcy5Gb2N1c1N1YmplY3Quc3Vic2NyaWJlKHQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXJlZ2lzdHJhIGlsIFN1YmplY3QgZGVsbGUgcmljaGllc3RlIGRpIGZvY3VzXHJcbiAgICAgKi9cclxuICAgIGRlcmVnaXN0ZXJGb2N1c1JlcXVlc3QoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2YWJsZSlcclxuICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbn0iXX0=
@@ -1,6 +1,6 @@
1
1
  // Angular
2
2
  import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Inject, Input, Optional, Output, Self } from "@angular/core";
3
- import { NG_VALIDATORS, NgControl } from "@angular/forms";
3
+ import { NG_VALIDATORS, NgControl, RequiredValidator } from "@angular/forms";
4
4
  // Applicazione
5
5
  import { BaseFormControl } from "../base-form-control";
6
6
  // Configurazioni
@@ -8,7 +8,7 @@ import { AccessControlService, ComponentContext } from '@esfaenza/access-control
8
8
  import { ACO_CUSTOMKEY, FAV_DEBUG_MODE } from '../../tokens';
9
9
  import { ChangeDetectorRef } from "@angular/core";
10
10
  /** Semplice componente di Input testuale, con eventuale prefisso/suffisso */
11
- export class FormInputComponent extends BaseFormControl {
11
+ export class FormInputComponentOLD extends BaseFormControl {
12
12
  /** @ignore Costruttore */
13
13
  constructor(cdr, ngControl, _validators, ac, AppContext, ACO_CUSTOMKEY, FAV_DEBUG_MODE) {
14
14
  super(cdr, ngControl, _validators, ac, AppContext, ACO_CUSTOMKEY, FAV_DEBUG_MODE);
@@ -41,15 +41,32 @@ export class FormInputComponent extends BaseFormControl {
41
41
  this.ShowPassword = !this.ShowPassword;
42
42
  event.preventDefault();
43
43
  }
44
+ /**
45
+ * @ignore
46
+ */
47
+ ngOnInit() {
48
+ super.ngOnInit();
49
+ this.registerFocusRequest();
50
+ // Controllo se è settato un required per decidere in maniera condizionale se utilizzare il validatore required nel componente interno
51
+ if (this._validators && this.Validation && this._validators.some(elem => elem instanceof RequiredValidator))
52
+ this.Required = true;
53
+ }
54
+ /**
55
+ * @ignore
56
+ */
57
+ ngOnDestroy() {
58
+ super.ngOnDestroy();
59
+ this.deregisterFocusRequest();
60
+ }
44
61
  }
45
- FormInputComponent.decorators = [
62
+ FormInputComponentOLD.decorators = [
46
63
  { type: Component, args: [{
47
- selector: "form-input",
48
- template: "<!-- Uguale in tutti i componenti --------------------------------------------------------------------------->\r\n<ng-container *ngIf=\"!FormLayout && (!DisplayMode || (DisplayLayout != 'hidden' && DisplayCondition))\">\r\n <ng-container *ngIf=\"DisplayMode && !DisplayModeTemplate\">\r\n <ng-container *ngIf=\"DisplayLayout == 'form'\">{{ EvaluatedModel }}</ng-container>\r\n <div *ngIf=\"DisplayLayout == 'inline'\" class=\"app-inline\">{{ EvaluatedModel }}</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"DisplayMode && DisplayModeTemplate\"><ng-container *ngTemplateOutlet=\"DisplayModeTemplate, context: { $implicit: EvaluatedModel }\"></ng-container></ng-container>\r\n <div [hidden]=\"DisplayMode\"><ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container></div>\r\n</ng-container>\r\n\r\n<div *ngIf=\"FormLayout && (!DisplayMode || (DisplayLayout != 'hidden' && DisplayCondition))\" class=\"{{FormGroupClass + (Last ? ' app-margin-bottom-0 app-margin-right-0 ' : '') + (DisplayLayout == 'inline' && DisplayMode ? (' app-inline-block ' + (!Last ? 'app-margin-right-10' : '')) : ' form-group row')}}\">\r\n <label class=\"col-md-{{(DisplayMode && DisplayLayout == 'inline' ? 'none app-bold app-margin-bottom-0' : LabelColWidth) + (DisplayMode ? ' app-bold' : ' m-t-5') }}\">{{Label}}{{Required && !DisplayMode ? '*' : ''}}{{Label ? \":\" : \"\"}}</label>\r\n <span *ngIf=\"DisplayMode && DisplayLayout == 'inline' && InlineSeparator != ''\">{{InlineSeparator}}</span>\r\n <div class=\"col-md-{{DisplayMode && DisplayLayout == 'inline' ? 'none app-inline-block' : InputColWidth}}\">\r\n <ng-container *ngIf=\"DisplayMode && !DisplayModeTemplate\">{{ EvaluatedModel }}</ng-container>\r\n <ng-container *ngIf=\"DisplayMode && DisplayModeTemplate\"><ng-container *ngTemplateOutlet=\"DisplayModeTemplate, context: { $implicit: EvaluatedModel }\"></ng-container></ng-container>\r\n <div [hidden]=\"DisplayMode\"><ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container></div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n<!----------------------------------------------------------------------------------------------------------->\r\n\r\n<ng-template #controlTemplate>\r\n <mat-form-field floatLabel=\"never\" appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-no-border-top mat-height-fixed\">\r\n <mat-label [class.app-margin-left-25]=\"HasPrefix\" *ngIf=\"Placeholder && FloatingLabel\">{{Placeholder}}</mat-label>\r\n <!--Prefisso-->\r\n <ng-container *ngIf=\"HasPrefix\">\r\n <button type=\"button\"\r\n class=\"mat-button mat-icon-button mat-button-base mat-icon-button-override mat-icon-button-override-prefix\"\r\n matPrefix (click)=\"onPrefixAction.emit(); $event.stopPropagation(); $event.preventDefault();\">\r\n <ng-container *ngTemplateOutlet=\"prefix\"></ng-container>\r\n </button>\r\n </ng-container>\r\n <!--Input-->\r\n <input matInput\r\n #baseInput=\"ngModel\"\r\n #htmlInput\r\n [type]=\"Password ? 'password' : 'text'\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n autocomplete=\"off\"\r\n name=\"base-input\"\r\n class=\"form-control\"\r\n id=\"{{GeneratedName}}\"\r\n [class.app-margin-left-25]=\"HasPrefix\"\r\n [class.mat-input-with-suffix]=\"HasSuffix || Password\"\r\n [(ngModel)]=\"Model\"\r\n [class.checking-field]=\"!Validation\"\r\n [readonly]=\"Frozen\"\r\n [disabled]=\"Readonly\"\r\n [placeholder]=\"FloatingLabel ? undefined : Placeholder\"\r\n (focus)=\"focused($event);\"\r\n (ngModelChange)=\"changed()\"\r\n (keyup)=\"($event.keyCode == 13 || $event.keyCode == 27) && finalized();\"\r\n (blur)=\"finalized();\"\r\n >\r\n <ng-container *ngIf=\"HasSuffix || Password\">\r\n <ng-container *ngIf=\"!Password\">\r\n <button type=\"button\"\r\n class=\"mat-button mat-icon-button mat-button-base mat-icon-button-override mat-icon-button-override-suffix\"\r\n matSuffix (click)=\"onSuffixAction.emit(); $event.stopPropagation(); $event.preventDefault();\">\r\n <ng-container *ngTemplateOutlet=\"suffix\"></ng-container>\r\n </button>\r\n </ng-container>\r\n <!--Password-->\r\n <span class=\"form-input-suffix\" *ngIf=\"Password\">\r\n <ng-container *ngIf=\"Password\" matSuffix>\r\n <a *ngIf=\"ShowPassword\" class=\"fa fa-eye-slash app-fs-16 app-pointer\" (click)=\"onShowHidePassword($event)\"></a>\r\n <a *ngIf=\"!ShowPassword\" class=\"fa fa-eye app-fs-16 app-pointer\" (click)=\"onShowHidePassword($event)\"></a>\r\n </ng-container>\r\n </span>\r\n </ng-container>\r\n </mat-form-field>\r\n</ng-template>",
64
+ selector: "form-input-old",
65
+ template: "Uguale in tutti i componenti -------------------------------------------------------------------------\r\n<ng-container *ngIf=\"!FormLayout && (!DisplayMode || (DisplayLayout != 'hidden' && DisplayCondition))\">\r\n <ng-container *ngIf=\"DisplayMode && !DisplayModeTemplate\">\r\n <ng-container *ngIf=\"DisplayLayout == 'form'\">{{ EvaluatedModel }}</ng-container>\r\n <div *ngIf=\"DisplayLayout == 'inline'\" class=\"app-inline\">{{ EvaluatedModel }}</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"DisplayMode && DisplayModeTemplate\"><ng-container *ngTemplateOutlet=\"DisplayModeTemplate, context: { $implicit: EvaluatedModel }\"></ng-container></ng-container>\r\n <div [hidden]=\"DisplayMode\"><ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container></div>\r\n</ng-container>\r\n\r\n<div *ngIf=\"FormLayout && (!DisplayMode || (DisplayLayout != 'hidden' && DisplayCondition))\" class=\"{{FormGroupClass + (Last ? ' app-margin-bottom-0 app-margin-right-0 ' : '') + (DisplayLayout == 'inline' && DisplayMode ? (' app-inline-block ' + (!Last ? 'app-margin-right-10' : '')) : ' form-group row')}}\">\r\n <label class=\"col-md-{{(DisplayMode && DisplayLayout == 'inline' ? 'none app-bold app-margin-bottom-0' : LabelColWidth) + (DisplayMode ? ' app-bold' : ' m-t-5') }}\">{{Label}}{{Required && !DisplayMode ? '*' : ''}}{{Label ? \":\" : \"\"}}</label>\r\n <span *ngIf=\"DisplayMode && DisplayLayout == 'inline' && InlineSeparator != ''\">{{InlineSeparator}}</span>\r\n <div class=\"col-md-{{DisplayMode && DisplayLayout == 'inline' ? 'none app-inline-block' : InputColWidth}}\">\r\n <ng-container *ngIf=\"DisplayMode && !DisplayModeTemplate\">{{ EvaluatedModel }}</ng-container>\r\n <ng-container *ngIf=\"DisplayMode && DisplayModeTemplate\"><ng-container *ngTemplateOutlet=\"DisplayModeTemplate, context: { $implicit: EvaluatedModel }\"></ng-container></ng-container>\r\n <div [hidden]=\"DisplayMode\"><ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container></div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n<!----------------------------------------------------------------------------------------------------------->\r\n\r\n<ng-template #controlTemplate>\r\n <mat-form-field floatLabel=\"never\" appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-no-border-top mat-height-fixed\">\r\n <mat-label [class.app-margin-left-25]=\"HasPrefix\" *ngIf=\"Placeholder && FloatingLabel\">{{Placeholder}}</mat-label>\r\n <!--Prefisso-->\r\n <ng-container *ngIf=\"HasPrefix\">\r\n <button type=\"button\"\r\n class=\"mat-button mat-icon-button mat-button-base mat-icon-button-override mat-icon-button-override-prefix\"\r\n matPrefix (click)=\"onPrefixAction.emit(); $event.stopPropagation(); $event.preventDefault();\">\r\n <ng-container *ngTemplateOutlet=\"prefix\"></ng-container>\r\n </button>\r\n </ng-container>\r\n <!--Input-->\r\n <input matInput\r\n #baseInput=\"ngModel\"\r\n #htmlInput\r\n [type]=\"Password ? 'password' : 'text'\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n autocomplete=\"off\"\r\n name=\"base-input\"\r\n class=\"form-control\"\r\n id=\"{{GeneratedName}}\"\r\n [class.app-margin-left-25]=\"HasPrefix\"\r\n [class.mat-input-with-suffix]=\"HasSuffix || Password\"\r\n [(ngModel)]=\"Model\"\r\n [class.checking-field]=\"!Validation\"\r\n [readonly]=\"Frozen\"\r\n [disabled]=\"Readonly\"\r\n [placeholder]=\"FloatingLabel ? undefined : Placeholder\"\r\n (focus)=\"focused($event);\"\r\n (ngModelChange)=\"changed()\"\r\n (keyup)=\"($event.keyCode == 13 || $event.keyCode == 27) && finalized();\"\r\n (blur)=\"finalized();\"\r\n >\r\n <ng-container *ngIf=\"HasSuffix || Password\">\r\n <ng-container *ngIf=\"!Password\">\r\n <button type=\"button\"\r\n class=\"mat-button mat-icon-button mat-button-base mat-icon-button-override mat-icon-button-override-suffix\"\r\n matSuffix (click)=\"onSuffixAction.emit(); $event.stopPropagation(); $event.preventDefault();\">\r\n <ng-container *ngTemplateOutlet=\"suffix\"></ng-container>\r\n </button>\r\n </ng-container>\r\n <!--Password-->\r\n <span class=\"form-input-suffix\" *ngIf=\"Password\">\r\n <ng-container *ngIf=\"Password\" matSuffix>\r\n <a *ngIf=\"ShowPassword\" class=\"fa fa-eye-slash app-fs-16 app-pointer\" (click)=\"onShowHidePassword($event)\"></a>\r\n <a *ngIf=\"!ShowPassword\" class=\"fa fa-eye app-fs-16 app-pointer\" (click)=\"onShowHidePassword($event)\"></a>\r\n </ng-container>\r\n </span>\r\n </ng-container>\r\n </mat-form-field>\r\n</ng-template>",
49
66
  changeDetection: ChangeDetectionStrategy.OnPush
50
67
  },] }
51
68
  ];
52
- FormInputComponent.ctorParameters = () => [
69
+ FormInputComponentOLD.ctorParameters = () => [
53
70
  { type: ChangeDetectorRef },
54
71
  { type: NgControl, decorators: [{ type: Optional }, { type: Self }] },
55
72
  { type: Array, decorators: [{ type: Optional }, { type: Inject, args: [NG_VALIDATORS,] }] },
@@ -58,11 +75,11 @@ FormInputComponent.ctorParameters = () => [
58
75
  { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ACO_CUSTOMKEY,] }] },
59
76
  { type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [FAV_DEBUG_MODE,] }] }
60
77
  ];
61
- FormInputComponent.propDecorators = {
78
+ FormInputComponentOLD.propDecorators = {
62
79
  Password: [{ type: Input }],
63
80
  onSuffixAction: [{ type: Output }],
64
81
  onPrefixAction: [{ type: Output }],
65
82
  suffix: [{ type: ContentChild, args: ["suffix", { static: false },] }],
66
83
  prefix: [{ type: ContentChild, args: ["prefix", { static: false },] }]
67
84
  };
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9mb3JtLWlucHV0L2Zvcm0taW5wdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM3SixPQUFPLEVBQXdCLGFBQWEsRUFBRSxTQUFTLEVBQVcsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RixlQUFlO0FBQ2YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXZELGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRixPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEQsNkVBQTZFO0FBTTdFLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxlQUFlO0lBdUJuRCwyQkFBMkI7SUFDM0IsWUFBWSxHQUFzQixFQUFzQixTQUFvQixFQUFxQyxXQUF1QixFQUFjLEVBQXdCLEVBQWMsVUFBNEIsRUFBcUMsYUFBcUIsRUFBc0MsY0FBd0I7UUFDNVUsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBdkJ0RixvREFBb0Q7UUFDcEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQyx1RUFBdUU7UUFDN0QsbUJBQWMsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV4RSx1RUFBdUU7UUFDN0QsbUJBQWMsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQVF4RSx1R0FBdUc7UUFDaEcsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUVsQyx1R0FBdUc7UUFDaEcsY0FBUyxHQUFZLEtBQUssQ0FBQztRQXNCM0IsaUJBQVksR0FBWSxLQUFLLENBQUM7SUFqQnJDLENBQUM7SUFFRCxjQUFjO0lBQ2QsVUFBVSxDQUFDLEdBQVE7UUFDZixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFFBQVEsT0FBTSxFQUFFLENBQUM7UUFDNUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsY0FBYztJQUNkLGtCQUFrQjtRQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQsY0FBYztJQUNkLGlCQUFpQixLQUFXLENBQUM7SUFHdEIsa0JBQWtCLENBQUMsS0FBVTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN2QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7O1lBckRKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsZ2xLQUF3QztnQkFDeEMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07YUFDbEQ7OztZQVBRLGlCQUFpQjtZQVJvQixTQUFTLHVCQXdDZCxRQUFRLFlBQUksSUFBSTtZQUF5RSxLQUFLLHVCQUFwRCxRQUFRLFlBQUksTUFBTSxTQUFDLGFBQWE7WUFsQzFHLG9CQUFvQix1QkFrQ2tILFFBQVE7WUFsQ3hILGdCQUFnQix1QkFrQ3NJLFFBQVE7eUNBQWtDLFFBQVEsWUFBSSxNQUFNLFNBQUMsYUFBYTswQ0FBMEIsUUFBUSxZQUFJLE1BQU0sU0FBQyxjQUFjOzs7dUJBckJyVCxLQUFLOzZCQUdMLE1BQU07NkJBR04sTUFBTTtxQkFHTixZQUFZLFNBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtxQkFHeEMsWUFBWSxTQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPcHRpb25hbCwgT3V0cHV0LCBTZWxmLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMSURBVE9SUywgTmdDb250cm9sLCBOZ01vZGVsIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vLyBBcHBsaWNhemlvbmVcclxuaW1wb3J0IHsgQmFzZUZvcm1Db250cm9sIH0gZnJvbSBcIi4uL2Jhc2UtZm9ybS1jb250cm9sXCI7XHJcblxyXG4vLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBBY2Nlc3NDb250cm9sU2VydmljZSwgQ29tcG9uZW50Q29udGV4dCB9IGZyb20gJ0Blc2ZhZW56YS9hY2Nlc3MtY29udHJvbCc7XHJcbmltcG9ydCB7IEFDT19DVVNUT01LRVksIEZBVl9ERUJVR19NT0RFIH0gZnJvbSAnLi4vLi4vdG9rZW5zJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLyoqIFNlbXBsaWNlIGNvbXBvbmVudGUgZGkgSW5wdXQgdGVzdHVhbGUsIGNvbiBldmVudHVhbGUgcHJlZmlzc28vc3VmZmlzc28gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJmb3JtLWlucHV0XCIsXHJcbiAgICB0ZW1wbGF0ZVVybDogXCJmb3JtLWlucHV0LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUlucHV0Q29tcG9uZW50IGV4dGVuZHMgQmFzZUZvcm1Db250cm9sIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2UgbCdpbnB1dCByZWxhdGl2byDDqCBkaSB0aXBvIFBhc3N3b3JkICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgUGFzc3dvcmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogRGVsZWdhdG8gcGVyIGwnZXNlY3V6aW9uZSBkaSB1bidvcGVyYXppb25lIGFsIGNsaWNrIGRlbCBzdWZmaXNzbyAqL1xyXG4gICAgQE91dHB1dCgpIG9uU3VmZml4QWN0aW9uOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgLyoqIERlbGVnYXRvIHBlciBsJ2VzZWN1emlvbmUgZGkgdW4nb3BlcmF6aW9uZSBhbCBjbGljayBkZWwgcHJlZmlzc28gKi9cclxuICAgIEBPdXRwdXQoKSBvblByZWZpeEFjdGlvbjogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKiBFbGVtZW50byBjaGUgY29udGllbmUgbGEgcHJvaWV6aW9uZSBkZWxsJ0hUTUwgZGVsIHN1ZmZpc3NvICovXHJcbiAgICBAQ29udGVudENoaWxkKFwic3VmZml4XCIsIHsgc3RhdGljOiBmYWxzZSB9KSBzdWZmaXg7XHJcblxyXG4gICAgLyoqIEVsZW1lbnRvIGNoZSBjb250aWVuZSBsYSBwcm9pZXppb25lIGRlbGwnSFRNTCBkZWwgcHJlZmlzc28gKi9cclxuICAgIEBDb250ZW50Q2hpbGQoXCJwcmVmaXhcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHByZWZpeDtcclxuXHJcbiAgICAvKiogSW5kaWNhIGxhIHByZXNlbnphIG8gbWVubyBkaSB1biBzdWZmaXNzbywgc2kgYmFzYSBzdWxsYSBcInRydXRoaW5lc3NcIiBkZWxsYSBwcm9pZXppb25lICoqc3VmZml4KiogKi9cclxuICAgIHB1YmxpYyBIYXNTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGxhIHByZXNlbnphIG8gbWVubyBkaSB1biBwcmVmaXNzbywgc2kgYmFzYSBzdWxsYSBcInRydXRoaW5lc3NcIiBkZWxsYSBwcm9pZXppb25lICoqcHJlZml4KiogKi9cclxuICAgIHB1YmxpYyBIYXNQcmVmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSBDb3N0cnV0dG9yZSAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIEBPcHRpb25hbCgpIEBTZWxmKCkgbmdDb250cm9sOiBOZ0NvbnRyb2wsIEBPcHRpb25hbCgpIEBJbmplY3QoTkdfVkFMSURBVE9SUykgX3ZhbGlkYXRvcnM6IEFycmF5PGFueT4sIEBPcHRpb25hbCgpIGFjOiBBY2Nlc3NDb250cm9sU2VydmljZSwgQE9wdGlvbmFsKCkgQXBwQ29udGV4dDogQ29tcG9uZW50Q29udGV4dCwgQE9wdGlvbmFsKCkgQEluamVjdChBQ09fQ1VTVE9NS0VZKSBBQ09fQ1VTVE9NS0VZOiBzdHJpbmcsIEBPcHRpb25hbCgpIEBJbmplY3QoRkFWX0RFQlVHX01PREUpIEZBVl9ERUJVR19NT0RFIDogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKGNkciwgbmdDb250cm9sLCBfdmFsaWRhdG9ycywgYWMsIEFwcENvbnRleHQsIEFDT19DVVNUT01LRVksIEZBVl9ERUJVR19NT0RFKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuRXZhbHVhdGVkTW9kZWwgPSBvYmo/LnRvU3RyaW5nKCkgfHwgXCJcIjtcclxuICAgICAgICBzdXBlci53cml0ZVZhbHVlKG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgICAgICB0aGlzLkhhc1N1ZmZpeCA9ICEhdGhpcy5zdWZmaXg7XHJcbiAgICAgICAgdGhpcy5IYXNQcmVmaXggPSAhIXRoaXMucHJlZml4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBvbk5vdE51bGxWYWx1ZVNldCgpOiB2b2lkIHsgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgU2hvd1Bhc3N3b3JkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgb25TaG93SGlkZVBhc3N3b3JkKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLlBhc3N3b3JkID0gIXRoaXMuUGFzc3dvcmQ7IFxyXG4gICAgICAgIHRoaXMuU2hvd1Bhc3N3b3JkID0gIXRoaXMuU2hvd1Bhc3N3b3JkO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbn0iXX0=
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9mb3JtLWlucHV0L2Zvcm0taW5wdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM3SixPQUFPLEVBQXdCLGFBQWEsRUFBRSxTQUFTLEVBQVcsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RyxlQUFlO0FBQ2YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXZELGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRixPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEQsNkVBQTZFO0FBTTdFLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxlQUFlO0lBdUJ0RCwyQkFBMkI7SUFDM0IsWUFBWSxHQUFzQixFQUFzQixTQUFvQixFQUFxQyxXQUF1QixFQUFjLEVBQXdCLEVBQWMsVUFBNEIsRUFBcUMsYUFBcUIsRUFBc0MsY0FBd0I7UUFDNVUsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBdkJ0RixvREFBb0Q7UUFDcEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQyx1RUFBdUU7UUFDN0QsbUJBQWMsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV4RSx1RUFBdUU7UUFDN0QsbUJBQWMsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQVF4RSx1R0FBdUc7UUFDaEcsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUVsQyx1R0FBdUc7UUFDaEcsY0FBUyxHQUFZLEtBQUssQ0FBQztRQXNCM0IsaUJBQVksR0FBWSxLQUFLLENBQUM7SUFqQnJDLENBQUM7SUFFRCxjQUFjO0lBQ2QsVUFBVSxDQUFDLEdBQVE7UUFDZixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFFBQVEsT0FBTSxFQUFFLENBQUM7UUFDNUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsY0FBYztJQUNkLGtCQUFrQjtRQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQsY0FBYztJQUNkLGlCQUFpQixLQUFXLENBQUM7SUFHdEIsa0JBQWtCLENBQUMsS0FBVTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN2QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztNQUVFO0lBQ0YsUUFBUTtRQUNKLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUU1QixzSUFBc0k7UUFDdEksSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksaUJBQWlCLENBQUM7WUFDdkcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNQLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNsQyxDQUFDOzs7WUF6RUosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLHdrS0FBd0M7Z0JBQ3hDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2xEOzs7WUFQUSxpQkFBaUI7WUFSb0IsU0FBUyx1QkF3Q2QsUUFBUSxZQUFJLElBQUk7WUFBeUUsS0FBSyx1QkFBcEQsUUFBUSxZQUFJLE1BQU0sU0FBQyxhQUFhO1lBbEMxRyxvQkFBb0IsdUJBa0NrSCxRQUFRO1lBbEN4SCxnQkFBZ0IsdUJBa0NzSSxRQUFRO3lDQUFrQyxRQUFRLFlBQUksTUFBTSxTQUFDLGFBQWE7MENBQTBCLFFBQVEsWUFBSSxNQUFNLFNBQUMsY0FBYzs7O3VCQXJCclQsS0FBSzs2QkFHTCxNQUFNOzZCQUdOLE1BQU07cUJBR04sWUFBWSxTQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7cUJBR3hDLFlBQVksU0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT3B0aW9uYWwsIE91dHB1dCwgU2VsZiwgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTElEQVRPUlMsIE5nQ29udHJvbCwgTmdNb2RlbCwgUmVxdWlyZWRWYWxpZGF0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbi8vIEFwcGxpY2F6aW9uZVxyXG5pbXBvcnQgeyBCYXNlRm9ybUNvbnRyb2wgfSBmcm9tIFwiLi4vYmFzZS1mb3JtLWNvbnRyb2xcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLCBDb21wb25lbnRDb250ZXh0IH0gZnJvbSAnQGVzZmFlbnphL2FjY2Vzcy1jb250cm9sJztcclxuaW1wb3J0IHsgQUNPX0NVU1RPTUtFWSwgRkFWX0RFQlVHX01PREUgfSBmcm9tICcuLi8uLi90b2tlbnMnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vKiogU2VtcGxpY2UgY29tcG9uZW50ZSBkaSBJbnB1dCB0ZXN0dWFsZSwgY29uIGV2ZW50dWFsZSBwcmVmaXNzby9zdWZmaXNzbyAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiBcImZvcm0taW5wdXQtb2xkXCIsXHJcbiAgICB0ZW1wbGF0ZVVybDogXCJmb3JtLWlucHV0LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUlucHV0Q29tcG9uZW50T0xEIGV4dGVuZHMgQmFzZUZvcm1Db250cm9sIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2UgbCdpbnB1dCByZWxhdGl2byDDqCBkaSB0aXBvIFBhc3N3b3JkICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgUGFzc3dvcmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogRGVsZWdhdG8gcGVyIGwnZXNlY3V6aW9uZSBkaSB1bidvcGVyYXppb25lIGFsIGNsaWNrIGRlbCBzdWZmaXNzbyAqL1xyXG4gICAgQE91dHB1dCgpIG9uU3VmZml4QWN0aW9uOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgLyoqIERlbGVnYXRvIHBlciBsJ2VzZWN1emlvbmUgZGkgdW4nb3BlcmF6aW9uZSBhbCBjbGljayBkZWwgcHJlZmlzc28gKi9cclxuICAgIEBPdXRwdXQoKSBvblByZWZpeEFjdGlvbjogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKiBFbGVtZW50byBjaGUgY29udGllbmUgbGEgcHJvaWV6aW9uZSBkZWxsJ0hUTUwgZGVsIHN1ZmZpc3NvICovXHJcbiAgICBAQ29udGVudENoaWxkKFwic3VmZml4XCIsIHsgc3RhdGljOiBmYWxzZSB9KSBzdWZmaXg7XHJcblxyXG4gICAgLyoqIEVsZW1lbnRvIGNoZSBjb250aWVuZSBsYSBwcm9pZXppb25lIGRlbGwnSFRNTCBkZWwgcHJlZmlzc28gKi9cclxuICAgIEBDb250ZW50Q2hpbGQoXCJwcmVmaXhcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHByZWZpeDtcclxuXHJcbiAgICAvKiogSW5kaWNhIGxhIHByZXNlbnphIG8gbWVubyBkaSB1biBzdWZmaXNzbywgc2kgYmFzYSBzdWxsYSBcInRydXRoaW5lc3NcIiBkZWxsYSBwcm9pZXppb25lICoqc3VmZml4KiogKi9cclxuICAgIHB1YmxpYyBIYXNTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGxhIHByZXNlbnphIG8gbWVubyBkaSB1biBwcmVmaXNzbywgc2kgYmFzYSBzdWxsYSBcInRydXRoaW5lc3NcIiBkZWxsYSBwcm9pZXppb25lICoqcHJlZml4KiogKi9cclxuICAgIHB1YmxpYyBIYXNQcmVmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSBDb3N0cnV0dG9yZSAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIEBPcHRpb25hbCgpIEBTZWxmKCkgbmdDb250cm9sOiBOZ0NvbnRyb2wsIEBPcHRpb25hbCgpIEBJbmplY3QoTkdfVkFMSURBVE9SUykgX3ZhbGlkYXRvcnM6IEFycmF5PGFueT4sIEBPcHRpb25hbCgpIGFjOiBBY2Nlc3NDb250cm9sU2VydmljZSwgQE9wdGlvbmFsKCkgQXBwQ29udGV4dDogQ29tcG9uZW50Q29udGV4dCwgQE9wdGlvbmFsKCkgQEluamVjdChBQ09fQ1VTVE9NS0VZKSBBQ09fQ1VTVE9NS0VZOiBzdHJpbmcsIEBPcHRpb25hbCgpIEBJbmplY3QoRkFWX0RFQlVHX01PREUpIEZBVl9ERUJVR19NT0RFIDogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKGNkciwgbmdDb250cm9sLCBfdmFsaWRhdG9ycywgYWMsIEFwcENvbnRleHQsIEFDT19DVVNUT01LRVksIEZBVl9ERUJVR19NT0RFKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuRXZhbHVhdGVkTW9kZWwgPSBvYmo/LnRvU3RyaW5nKCkgfHwgXCJcIjtcclxuICAgICAgICBzdXBlci53cml0ZVZhbHVlKG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgICAgICB0aGlzLkhhc1N1ZmZpeCA9ICEhdGhpcy5zdWZmaXg7XHJcbiAgICAgICAgdGhpcy5IYXNQcmVmaXggPSAhIXRoaXMucHJlZml4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBvbk5vdE51bGxWYWx1ZVNldCgpOiB2b2lkIHsgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgU2hvd1Bhc3N3b3JkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgb25TaG93SGlkZVBhc3N3b3JkKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLlBhc3N3b3JkID0gIXRoaXMuUGFzc3dvcmQ7IFxyXG4gICAgICAgIHRoaXMuU2hvd1Bhc3N3b3JkID0gIXRoaXMuU2hvd1Bhc3N3b3JkO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEBpZ25vcmUgXHJcbiAgICAqL1xyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9jdXNSZXF1ZXN0KCk7XHJcblxyXG4gICAgICAgIC8vIENvbnRyb2xsbyBzZSDDqCBzZXR0YXRvIHVuIHJlcXVpcmVkIHBlciBkZWNpZGVyZSBpbiBtYW5pZXJhIGNvbmRpemlvbmFsZSBzZSB1dGlsaXp6YXJlIGlsIHZhbGlkYXRvcmUgcmVxdWlyZWQgbmVsIGNvbXBvbmVudGUgaW50ZXJub1xyXG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzICYmIHRoaXMuVmFsaWRhdGlvbiAmJiB0aGlzLl92YWxpZGF0b3JzLnNvbWUoZWxlbSA9PiBlbGVtIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3IpKVxyXG4gICAgICAgICAgICB0aGlzLlJlcXVpcmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5kZXJlZ2lzdGVyRm9jdXNSZXF1ZXN0KCk7XHJcbiAgICB9XHJcbn0iXX0=