valtech-components 4.0.944 → 4.0.945

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/esm2022/lib/components/atoms/avatar/avatar.component.mjs +3 -3
  2. package/esm2022/lib/components/atoms/box/box.component.mjs +3 -3
  3. package/esm2022/lib/components/atoms/button/button.component.mjs +15 -5
  4. package/esm2022/lib/components/atoms/container/container.component.mjs +2 -2
  5. package/esm2022/lib/components/atoms/display/display.component.mjs +3 -3
  6. package/esm2022/lib/components/atoms/divider/divider.component.mjs +3 -3
  7. package/esm2022/lib/components/atoms/href/href.component.mjs +3 -3
  8. package/esm2022/lib/components/atoms/icon/icon.component.mjs +3 -3
  9. package/esm2022/lib/components/atoms/image/image.component.mjs +3 -3
  10. package/esm2022/lib/components/atoms/progress-bar/progress-bar.component.mjs +3 -3
  11. package/esm2022/lib/components/atoms/qr-code/qr-code.component.mjs +3 -3
  12. package/esm2022/lib/components/atoms/text/text.component.mjs +3 -3
  13. package/esm2022/lib/components/atoms/title/title.component.mjs +3 -3
  14. package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +3 -3
  15. package/esm2022/lib/components/molecules/button-group/button-group.component.mjs +3 -3
  16. package/esm2022/lib/components/molecules/card/card.component.mjs +3 -3
  17. package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +3 -3
  18. package/esm2022/lib/components/molecules/code-display/code-display.component.mjs +3 -3
  19. package/esm2022/lib/components/molecules/command-display/command-display.component.mjs +3 -3
  20. package/esm2022/lib/components/molecules/comment/comment.component.mjs +3 -3
  21. package/esm2022/lib/components/molecules/content-loader/content-loader.component.mjs +3 -3
  22. package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +3 -3
  23. package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +3 -3
  24. package/esm2022/lib/components/molecules/glow-card/glow-card.component.mjs +3 -3
  25. package/esm2022/lib/components/molecules/hint/hint.component.mjs +3 -3
  26. package/esm2022/lib/components/molecules/layered-card/layered-card.component.mjs +3 -3
  27. package/esm2022/lib/components/molecules/link/link.component.mjs +3 -3
  28. package/esm2022/lib/components/molecules/links-cake/links-cake.component.mjs +3 -3
  29. package/esm2022/lib/components/molecules/notes-box/notes-box.component.mjs +3 -3
  30. package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +3 -3
  31. package/esm2022/lib/components/molecules/pill/pill.component.mjs +3 -3
  32. package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +3 -3
  33. package/esm2022/lib/components/molecules/popover-selector/popover-selector.component.mjs +3 -3
  34. package/esm2022/lib/components/molecules/progress-status/progress-status.component.mjs +3 -3
  35. package/esm2022/lib/components/molecules/prompter/prompter.component.mjs +3 -3
  36. package/esm2022/lib/components/molecules/rating/rating.component.mjs +3 -3
  37. package/esm2022/lib/components/molecules/searchbar/searchbar.component.mjs +3 -3
  38. package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +3 -3
  39. package/esm2022/lib/components/molecules/stepper/stepper.component.mjs +3 -3
  40. package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +3 -3
  41. package/esm2022/lib/components/molecules/title-block/title-block.component.mjs +3 -3
  42. package/esm2022/lib/components/organisms/about-view/about-view.component.mjs +209 -195
  43. package/esm2022/lib/components/organisms/account-view/account-view.component.mjs +315 -309
  44. package/esm2022/lib/components/organisms/api-keys-view/api-keys-view.component.mjs +105 -99
  45. package/esm2022/lib/components/organisms/article/article.component.mjs +3 -3
  46. package/esm2022/lib/components/organisms/banner/banner.component.mjs +3 -3
  47. package/esm2022/lib/components/organisms/comment-section/comment-section.component.mjs +3 -3
  48. package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +3 -3
  49. package/esm2022/lib/components/organisms/form/form.component.mjs +3 -3
  50. package/esm2022/lib/components/organisms/header/header.component.mjs +3 -3
  51. package/esm2022/lib/components/organisms/item-list/item-list.component.mjs +3 -3
  52. package/esm2022/lib/components/organisms/no-content/no-content.component.mjs +3 -3
  53. package/esm2022/lib/components/organisms/notification-preferences-view/notification-preferences-view.component.mjs +217 -204
  54. package/esm2022/lib/components/organisms/notifications-view/notifications-view.component.mjs +277 -271
  55. package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +497 -483
  56. package/esm2022/lib/components/organisms/permissions-view/permissions-view.component.mjs +269 -263
  57. package/esm2022/lib/components/organisms/preferences-view/preferences-view.component.mjs +135 -130
  58. package/esm2022/lib/components/organisms/profile-view/profile-content.component.mjs +111 -105
  59. package/esm2022/lib/components/organisms/security-view/security-view.component.mjs +241 -235
  60. package/esm2022/lib/components/organisms/settings-hub/settings-hub.component.mjs +53 -48
  61. package/esm2022/lib/components/organisms/toolbar/toolbar.component.mjs +3 -3
  62. package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +3 -3
  63. package/esm2022/lib/components/templates/simple/simple.component.mjs +3 -3
  64. package/esm2022/lib/components/types.mjs +1 -1
  65. package/esm2022/lib/version.mjs +2 -2
  66. package/fesm2022/valtech-components.mjs +2524 -2438
  67. package/fesm2022/valtech-components.mjs.map +1 -1
  68. package/lib/components/atoms/button/button.component.d.ts +6 -0
  69. package/lib/components/organisms/article/article.component.d.ts +1 -1
  70. package/lib/components/types.d.ts +12 -2
  71. package/lib/version.d.ts +1 -1
  72. package/package.json +1 -1
  73. package/src/lib/components/styles/variables.scss +5 -0
@@ -5,6 +5,7 @@ import { IonIcon } from '@ionic/angular/standalone';
5
5
  import { addIcons } from 'ionicons';
6
6
  import { alertCircleOutline, chevronDownOutline, chevronUpOutline, closeCircleOutline, notificationsOffOutline, notificationsOutline, refreshOutline, } from 'ionicons/icons';
7
7
  import { ButtonComponent } from '../../atoms/button/button.component';
8
+ import { ContainerComponent } from '../../atoms/container/container.component';
8
9
  import { DisplayComponent } from '../../atoms/display/display.component';
9
10
  import { TextComponent } from '../../atoms/text/text.component';
10
11
  import { TitleComponent } from '../../atoms/title/title.component';
@@ -441,251 +442,263 @@ export class NotificationPreferencesViewComponent {
441
442
  }
442
443
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NotificationPreferencesViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
443
444
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: NotificationPreferencesViewComponent, isStandalone: true, selector: "val-notification-preferences-view", inputs: { config: "config" }, ngImport: i0, template: `
444
- <div class="page">
445
- <header class="page-header">
446
- <val-display [props]="{ size: 'small', color: 'dark', content: pageTitle() }" />
447
- <val-title
448
- [props]="{
449
- size: 'large',
450
- color: 'dark',
451
- bold: false,
452
- content: pageDescription(),
453
- }"
454
- />
455
- </header>
456
-
457
- @if (state() === 'needs-install') {
458
- <section class="settings-section">
445
+ <val-container [props]="{ size: 'md', padding: 'none' }">
446
+ <div class="page">
447
+ <header class="page-header">
448
+ <val-display [props]="{ size: 'small', color: 'dark', content: pageTitle() }" />
459
449
  <val-title
460
450
  [props]="{
461
- size: 'medium',
451
+ size: 'large',
462
452
  color: 'dark',
463
- bold: true,
464
- content: tt('iosInstallTitle'),
453
+ bold: false,
454
+ content: pageDescription(),
465
455
  }"
466
456
  />
467
- <div class="section-body">
468
- <val-text
469
- [props]="{
470
- size: 'small',
471
- color: 'medium',
472
- bold: false,
473
- content: tt('iosInstallHint'),
474
- }"
475
- />
476
- <ol class="install-steps">
477
- <li>{{ tt('iosInstallStep1') }}</li>
478
- <li>{{ tt('iosInstallStep2') }}</li>
479
- <li>{{ tt('iosInstallStep3') }}</li>
480
- <li>{{ tt('iosInstallStep4') }}</li>
481
- </ol>
482
- </div>
483
- </section>
484
- }
457
+ </header>
485
458
 
486
- <section class="settings-section">
487
- <div class="notif-row">
488
- <div class="notif-row__icon">
489
- <ion-icon name="notifications-outline" aria-hidden="true" />
490
- </div>
491
- <div class="notif-row__body">
459
+ @if (state() === 'needs-install') {
460
+ <section class="settings-section">
492
461
  <val-title
493
462
  [props]="{
494
463
  size: 'medium',
495
464
  color: 'dark',
496
465
  bold: true,
497
- content: tt('simpleTitle'),
498
- }"
499
- />
500
- <val-text
501
- [props]="{
502
- size: 'small',
503
- color: 'medium',
504
- bold: false,
505
- content: tt('simpleDescription'),
466
+ content: tt('iosInstallTitle'),
506
467
  }"
507
468
  />
508
- @if (busyLabel(); as label) {
509
- <span class="notif-row__busy">{{ label }}</span>
510
- }
511
- </div>
512
- <div class="notif-row__control">
513
- <val-toggle-input [props]="toggleProps()" />
514
- </div>
515
- </div>
516
-
517
- @if (contextMessage(); as msg) {
518
- <div class="alert" [class]="'alert--' + alertVariant()">
519
- <ion-icon [name]="alertIcon()" aria-hidden="true" />
520
- <span>{{ msg }}</span>
521
- </div>
469
+ <div class="section-body">
470
+ <val-text
471
+ [props]="{
472
+ size: 'small',
473
+ color: 'medium',
474
+ bold: false,
475
+ content: tt('iosInstallHint'),
476
+ }"
477
+ />
478
+ <ol class="install-steps">
479
+ <li>{{ tt('iosInstallStep1') }}</li>
480
+ <li>{{ tt('iosInstallStep2') }}</li>
481
+ <li>{{ tt('iosInstallStep3') }}</li>
482
+ <li>{{ tt('iosInstallStep4') }}</li>
483
+ </ol>
484
+ </div>
485
+ </section>
522
486
  }
523
487
 
524
- @if (state() === 'error') {
525
- <div class="row-actions">
526
- <val-button [props]="retryButtonProps()" (click)="onRetry()" />
488
+ <section class="settings-section">
489
+ <div class="notif-row">
490
+ <div class="notif-row__icon">
491
+ <ion-icon name="notifications-outline" aria-hidden="true" />
492
+ </div>
493
+ <div class="notif-row__body">
494
+ <val-title
495
+ [props]="{
496
+ size: 'medium',
497
+ color: 'dark',
498
+ bold: true,
499
+ content: tt('simpleTitle'),
500
+ }"
501
+ />
502
+ <val-text
503
+ [props]="{
504
+ size: 'small',
505
+ color: 'medium',
506
+ bold: false,
507
+ content: tt('simpleDescription'),
508
+ }"
509
+ />
510
+ @if (busyLabel(); as label) {
511
+ <span class="notif-row__busy">{{ label }}</span>
512
+ }
513
+ </div>
514
+ <div class="notif-row__control">
515
+ <val-toggle-input [props]="toggleProps()" />
516
+ </div>
527
517
  </div>
528
- }
529
- </section>
530
518
 
531
- @if (resolvedConfig().showDetails && state() !== 'needs-install' && state() !== 'unsupported') {
532
- <section class="settings-section">
533
- <button class="details-toggle" type="button" (click)="toggleDetails()">
534
- <span>{{ showDetails() ? tt('detailsHide') : tt('detailsShow') }}</span>
535
- <ion-icon [name]="showDetails() ? 'chevron-up-outline' : 'chevron-down-outline'" aria-hidden="true" />
536
- </button>
537
- @if (showDetails()) {
538
- <dl class="details">
539
- <div class="details__row">
540
- <dt>{{ tt('detailsToken') }}</dt>
541
- <dd class="details__token">
542
- <span>{{ tokenPreview() ?? tt('detailsNone') }}</span>
543
- @if (currentToken()) {
544
- <button class="details__copy" type="button" (click)="copyToken()">
545
- {{ tt('detailsCopy') }}
546
- </button>
547
- }
548
- </dd>
549
- </div>
550
- <div class="details__row">
551
- <dt>{{ tt('diagnosticsPermission') }}</dt>
552
- <dd>{{ permission() }}</dd>
553
- </div>
554
- <div class="details__row">
555
- <dt>{{ tt('diagnosticsSupported') }}</dt>
556
- <dd>{{ isSupported() ? '✓' : '✗' }}</dd>
557
- </div>
558
- </dl>
519
+ @if (contextMessage(); as msg) {
520
+ <div class="alert" [class]="'alert--' + alertVariant()">
521
+ <ion-icon [name]="alertIcon()" aria-hidden="true" />
522
+ <span>{{ msg }}</span>
523
+ </div>
524
+ }
525
+
526
+ @if (state() === 'error') {
527
+ <div class="row-actions">
528
+ <val-button [props]="retryButtonProps()" (click)="onRetry()" />
529
+ </div>
559
530
  }
560
531
  </section>
561
- }
562
- </div>
563
- `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}:host-context([data-menu=\"collapsed\"]) .page{@media (min-width: 1200px){max-width:900px}}.page-header{margin-bottom:8px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.section-body{margin-top:16px;display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.notif-row{display:grid;grid-template-columns:44px 1fr auto;gap:16px;align-items:center}.notif-row__icon{width:44px;height:44px;border-radius:50%;background:var(--ion-color-light, rgba(0, 0, 0, .06));display:flex;align-items:center;justify-content:center}.notif-row__icon ion-icon{font-size:22px;color:var(--ion-color-dark, #1a1a1a)}.notif-row__body{display:flex;flex-direction:column;gap:4px;min-width:0}.notif-row__busy{font-size:12px;color:var(--ion-color-medium, #92949c);font-style:italic;margin-top:4px}.notif-row__control{flex-shrink:0}.alert{display:flex;gap:10px;align-items:flex-start;margin-top:12px;padding:12px 14px;border-radius:10px;font-size:13px;line-height:1.45;background:var(--ion-color-light, rgba(0, 0, 0, .04));color:var(--ion-color-dark, #1a1a1a)}.alert ion-icon{font-size:18px;flex-shrink:0;margin-top:1px}.alert--warning ion-icon{color:var(--ion-color-warning-shade, #c79e08)}.alert--danger ion-icon{color:var(--ion-color-danger-shade, #cf3c4f)}.alert--info ion-icon{color:var(--ion-color-medium, #6b6b6b)}.install-steps{margin:0;padding-left:20px;font-size:13px;line-height:1.6;color:var(--ion-color-dark, #1a1a1a)}.install-steps li+li{margin-top:4px}.details-toggle{display:flex;align-items:center;gap:6px;background:none;border:0;padding:0;font-size:13px;color:var(--ion-color-medium, #6b6b6b);cursor:pointer}.details-toggle ion-icon{font-size:14px}.details{margin:12px 0 0;display:flex;flex-direction:column;gap:6px}.details__row{display:grid;grid-template-columns:140px 1fr;gap:12px;font-size:12px;align-items:baseline}.details__row dt{margin:0;color:var(--ion-color-medium, #6b6b6b);text-transform:uppercase;letter-spacing:.4px;font-weight:500}.details__row dd{margin:0;color:var(--ion-color-dark, #1a1a1a);font-family:ui-monospace,SFMono-Regular,monospace;font-size:11px;word-break:break-all}.details__token{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.details__copy{flex-shrink:0;border:none;background:transparent;padding:0;color:var(--ion-color-primary, #0054e9);font-family:inherit;font-size:11px;font-weight:600;text-transform:none;letter-spacing:normal;cursor:pointer}.details__copy:hover{text-decoration:underline}\n"], dependencies: [{ kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: ToggleInputComponent, selector: "val-toggle-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
532
+
533
+ @if (resolvedConfig().showDetails && state() !== 'needs-install' && state() !== 'unsupported') {
534
+ <section class="settings-section">
535
+ <button class="details-toggle" type="button" (click)="toggleDetails()">
536
+ <span>{{ showDetails() ? tt('detailsHide') : tt('detailsShow') }}</span>
537
+ <ion-icon [name]="showDetails() ? 'chevron-up-outline' : 'chevron-down-outline'" aria-hidden="true" />
538
+ </button>
539
+ @if (showDetails()) {
540
+ <dl class="details">
541
+ <div class="details__row">
542
+ <dt>{{ tt('detailsToken') }}</dt>
543
+ <dd class="details__token">
544
+ <span>{{ tokenPreview() ?? tt('detailsNone') }}</span>
545
+ @if (currentToken()) {
546
+ <button class="details__copy" type="button" (click)="copyToken()">
547
+ {{ tt('detailsCopy') }}
548
+ </button>
549
+ }
550
+ </dd>
551
+ </div>
552
+ <div class="details__row">
553
+ <dt>{{ tt('diagnosticsPermission') }}</dt>
554
+ <dd>{{ permission() }}</dd>
555
+ </div>
556
+ <div class="details__row">
557
+ <dt>{{ tt('diagnosticsSupported') }}</dt>
558
+ <dd>{{ isSupported() ? '✓' : '✗' }}</dd>
559
+ </div>
560
+ </dl>
561
+ }
562
+ </section>
563
+ }
564
+ </div>
565
+ </val-container>
566
+ `, isInline: true, styles: [".page{padding:16px 0}.page-header{margin-bottom:8px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.section-body{margin-top:16px;display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.notif-row{display:grid;grid-template-columns:44px 1fr auto;gap:16px;align-items:center}.notif-row__icon{width:44px;height:44px;border-radius:50%;background:var(--ion-color-light, rgba(0, 0, 0, .06));display:flex;align-items:center;justify-content:center}.notif-row__icon ion-icon{font-size:22px;color:var(--ion-color-dark, #1a1a1a)}.notif-row__body{display:flex;flex-direction:column;gap:4px;min-width:0}.notif-row__busy{font-size:12px;color:var(--ion-color-medium, #92949c);font-style:italic;margin-top:4px}.notif-row__control{flex-shrink:0}.alert{display:flex;gap:10px;align-items:flex-start;margin-top:12px;padding:12px 14px;border-radius:10px;font-size:13px;line-height:1.45;background:var(--ion-color-light, rgba(0, 0, 0, .04));color:var(--ion-color-dark, #1a1a1a)}.alert ion-icon{font-size:18px;flex-shrink:0;margin-top:1px}.alert--warning ion-icon{color:var(--ion-color-warning-shade, #c79e08)}.alert--danger ion-icon{color:var(--ion-color-danger-shade, #cf3c4f)}.alert--info ion-icon{color:var(--ion-color-medium, #6b6b6b)}.install-steps{margin:0;padding-left:20px;font-size:13px;line-height:1.6;color:var(--ion-color-dark, #1a1a1a)}.install-steps li+li{margin-top:4px}.details-toggle{display:flex;align-items:center;gap:6px;background:none;border:0;padding:0;font-size:13px;color:var(--ion-color-medium, #6b6b6b);cursor:pointer}.details-toggle ion-icon{font-size:14px}.details{margin:12px 0 0;display:flex;flex-direction:column;gap:6px}.details__row{display:grid;grid-template-columns:140px 1fr;gap:12px;font-size:12px;align-items:baseline}.details__row dt{margin:0;color:var(--ion-color-medium, #6b6b6b);text-transform:uppercase;letter-spacing:.4px;font-weight:500}.details__row dd{margin:0;color:var(--ion-color-dark, #1a1a1a);font-family:ui-monospace,SFMono-Regular,monospace;font-size:11px;word-break:break-all}.details__token{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.details__copy{flex-shrink:0;border:none;background:transparent;padding:0;color:var(--ion-color-primary, #0054e9);font-family:inherit;font-size:11px;font-weight:600;text-transform:none;letter-spacing:normal;cursor:pointer}.details__copy:hover{text-decoration:underline}\n"], dependencies: [{ kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: ToggleInputComponent, selector: "val-toggle-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: ContainerComponent, selector: "val-container", inputs: ["props"] }] }); }
564
567
  }
565
568
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NotificationPreferencesViewComponent, decorators: [{
566
569
  type: Component,
567
- args: [{ selector: 'val-notification-preferences-view', standalone: true, imports: [IonIcon, ToggleInputComponent, ButtonComponent, DisplayComponent, TitleComponent, TextComponent], template: `
568
- <div class="page">
569
- <header class="page-header">
570
- <val-display [props]="{ size: 'small', color: 'dark', content: pageTitle() }" />
571
- <val-title
572
- [props]="{
573
- size: 'large',
574
- color: 'dark',
575
- bold: false,
576
- content: pageDescription(),
577
- }"
578
- />
579
- </header>
580
-
581
- @if (state() === 'needs-install') {
582
- <section class="settings-section">
570
+ args: [{ selector: 'val-notification-preferences-view', standalone: true, imports: [
571
+ IonIcon,
572
+ ToggleInputComponent,
573
+ ButtonComponent,
574
+ DisplayComponent,
575
+ TitleComponent,
576
+ TextComponent,
577
+ ContainerComponent,
578
+ ], template: `
579
+ <val-container [props]="{ size: 'md', padding: 'none' }">
580
+ <div class="page">
581
+ <header class="page-header">
582
+ <val-display [props]="{ size: 'small', color: 'dark', content: pageTitle() }" />
583
583
  <val-title
584
584
  [props]="{
585
- size: 'medium',
585
+ size: 'large',
586
586
  color: 'dark',
587
- bold: true,
588
- content: tt('iosInstallTitle'),
587
+ bold: false,
588
+ content: pageDescription(),
589
589
  }"
590
590
  />
591
- <div class="section-body">
592
- <val-text
593
- [props]="{
594
- size: 'small',
595
- color: 'medium',
596
- bold: false,
597
- content: tt('iosInstallHint'),
598
- }"
599
- />
600
- <ol class="install-steps">
601
- <li>{{ tt('iosInstallStep1') }}</li>
602
- <li>{{ tt('iosInstallStep2') }}</li>
603
- <li>{{ tt('iosInstallStep3') }}</li>
604
- <li>{{ tt('iosInstallStep4') }}</li>
605
- </ol>
606
- </div>
607
- </section>
608
- }
591
+ </header>
609
592
 
610
- <section class="settings-section">
611
- <div class="notif-row">
612
- <div class="notif-row__icon">
613
- <ion-icon name="notifications-outline" aria-hidden="true" />
614
- </div>
615
- <div class="notif-row__body">
593
+ @if (state() === 'needs-install') {
594
+ <section class="settings-section">
616
595
  <val-title
617
596
  [props]="{
618
597
  size: 'medium',
619
598
  color: 'dark',
620
599
  bold: true,
621
- content: tt('simpleTitle'),
622
- }"
623
- />
624
- <val-text
625
- [props]="{
626
- size: 'small',
627
- color: 'medium',
628
- bold: false,
629
- content: tt('simpleDescription'),
600
+ content: tt('iosInstallTitle'),
630
601
  }"
631
602
  />
632
- @if (busyLabel(); as label) {
633
- <span class="notif-row__busy">{{ label }}</span>
634
- }
635
- </div>
636
- <div class="notif-row__control">
637
- <val-toggle-input [props]="toggleProps()" />
638
- </div>
639
- </div>
640
-
641
- @if (contextMessage(); as msg) {
642
- <div class="alert" [class]="'alert--' + alertVariant()">
643
- <ion-icon [name]="alertIcon()" aria-hidden="true" />
644
- <span>{{ msg }}</span>
645
- </div>
603
+ <div class="section-body">
604
+ <val-text
605
+ [props]="{
606
+ size: 'small',
607
+ color: 'medium',
608
+ bold: false,
609
+ content: tt('iosInstallHint'),
610
+ }"
611
+ />
612
+ <ol class="install-steps">
613
+ <li>{{ tt('iosInstallStep1') }}</li>
614
+ <li>{{ tt('iosInstallStep2') }}</li>
615
+ <li>{{ tt('iosInstallStep3') }}</li>
616
+ <li>{{ tt('iosInstallStep4') }}</li>
617
+ </ol>
618
+ </div>
619
+ </section>
646
620
  }
647
621
 
648
- @if (state() === 'error') {
649
- <div class="row-actions">
650
- <val-button [props]="retryButtonProps()" (click)="onRetry()" />
622
+ <section class="settings-section">
623
+ <div class="notif-row">
624
+ <div class="notif-row__icon">
625
+ <ion-icon name="notifications-outline" aria-hidden="true" />
626
+ </div>
627
+ <div class="notif-row__body">
628
+ <val-title
629
+ [props]="{
630
+ size: 'medium',
631
+ color: 'dark',
632
+ bold: true,
633
+ content: tt('simpleTitle'),
634
+ }"
635
+ />
636
+ <val-text
637
+ [props]="{
638
+ size: 'small',
639
+ color: 'medium',
640
+ bold: false,
641
+ content: tt('simpleDescription'),
642
+ }"
643
+ />
644
+ @if (busyLabel(); as label) {
645
+ <span class="notif-row__busy">{{ label }}</span>
646
+ }
647
+ </div>
648
+ <div class="notif-row__control">
649
+ <val-toggle-input [props]="toggleProps()" />
650
+ </div>
651
651
  </div>
652
- }
653
- </section>
654
652
 
655
- @if (resolvedConfig().showDetails && state() !== 'needs-install' && state() !== 'unsupported') {
656
- <section class="settings-section">
657
- <button class="details-toggle" type="button" (click)="toggleDetails()">
658
- <span>{{ showDetails() ? tt('detailsHide') : tt('detailsShow') }}</span>
659
- <ion-icon [name]="showDetails() ? 'chevron-up-outline' : 'chevron-down-outline'" aria-hidden="true" />
660
- </button>
661
- @if (showDetails()) {
662
- <dl class="details">
663
- <div class="details__row">
664
- <dt>{{ tt('detailsToken') }}</dt>
665
- <dd class="details__token">
666
- <span>{{ tokenPreview() ?? tt('detailsNone') }}</span>
667
- @if (currentToken()) {
668
- <button class="details__copy" type="button" (click)="copyToken()">
669
- {{ tt('detailsCopy') }}
670
- </button>
671
- }
672
- </dd>
673
- </div>
674
- <div class="details__row">
675
- <dt>{{ tt('diagnosticsPermission') }}</dt>
676
- <dd>{{ permission() }}</dd>
677
- </div>
678
- <div class="details__row">
679
- <dt>{{ tt('diagnosticsSupported') }}</dt>
680
- <dd>{{ isSupported() ? '✓' : '✗' }}</dd>
681
- </div>
682
- </dl>
653
+ @if (contextMessage(); as msg) {
654
+ <div class="alert" [class]="'alert--' + alertVariant()">
655
+ <ion-icon [name]="alertIcon()" aria-hidden="true" />
656
+ <span>{{ msg }}</span>
657
+ </div>
658
+ }
659
+
660
+ @if (state() === 'error') {
661
+ <div class="row-actions">
662
+ <val-button [props]="retryButtonProps()" (click)="onRetry()" />
663
+ </div>
683
664
  }
684
665
  </section>
685
- }
686
- </div>
687
- `, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}:host-context([data-menu=\"collapsed\"]) .page{@media (min-width: 1200px){max-width:900px}}.page-header{margin-bottom:8px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.section-body{margin-top:16px;display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.notif-row{display:grid;grid-template-columns:44px 1fr auto;gap:16px;align-items:center}.notif-row__icon{width:44px;height:44px;border-radius:50%;background:var(--ion-color-light, rgba(0, 0, 0, .06));display:flex;align-items:center;justify-content:center}.notif-row__icon ion-icon{font-size:22px;color:var(--ion-color-dark, #1a1a1a)}.notif-row__body{display:flex;flex-direction:column;gap:4px;min-width:0}.notif-row__busy{font-size:12px;color:var(--ion-color-medium, #92949c);font-style:italic;margin-top:4px}.notif-row__control{flex-shrink:0}.alert{display:flex;gap:10px;align-items:flex-start;margin-top:12px;padding:12px 14px;border-radius:10px;font-size:13px;line-height:1.45;background:var(--ion-color-light, rgba(0, 0, 0, .04));color:var(--ion-color-dark, #1a1a1a)}.alert ion-icon{font-size:18px;flex-shrink:0;margin-top:1px}.alert--warning ion-icon{color:var(--ion-color-warning-shade, #c79e08)}.alert--danger ion-icon{color:var(--ion-color-danger-shade, #cf3c4f)}.alert--info ion-icon{color:var(--ion-color-medium, #6b6b6b)}.install-steps{margin:0;padding-left:20px;font-size:13px;line-height:1.6;color:var(--ion-color-dark, #1a1a1a)}.install-steps li+li{margin-top:4px}.details-toggle{display:flex;align-items:center;gap:6px;background:none;border:0;padding:0;font-size:13px;color:var(--ion-color-medium, #6b6b6b);cursor:pointer}.details-toggle ion-icon{font-size:14px}.details{margin:12px 0 0;display:flex;flex-direction:column;gap:6px}.details__row{display:grid;grid-template-columns:140px 1fr;gap:12px;font-size:12px;align-items:baseline}.details__row dt{margin:0;color:var(--ion-color-medium, #6b6b6b);text-transform:uppercase;letter-spacing:.4px;font-weight:500}.details__row dd{margin:0;color:var(--ion-color-dark, #1a1a1a);font-family:ui-monospace,SFMono-Regular,monospace;font-size:11px;word-break:break-all}.details__token{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.details__copy{flex-shrink:0;border:none;background:transparent;padding:0;color:var(--ion-color-primary, #0054e9);font-family:inherit;font-size:11px;font-weight:600;text-transform:none;letter-spacing:normal;cursor:pointer}.details__copy:hover{text-decoration:underline}\n"] }]
666
+
667
+ @if (resolvedConfig().showDetails && state() !== 'needs-install' && state() !== 'unsupported') {
668
+ <section class="settings-section">
669
+ <button class="details-toggle" type="button" (click)="toggleDetails()">
670
+ <span>{{ showDetails() ? tt('detailsHide') : tt('detailsShow') }}</span>
671
+ <ion-icon [name]="showDetails() ? 'chevron-up-outline' : 'chevron-down-outline'" aria-hidden="true" />
672
+ </button>
673
+ @if (showDetails()) {
674
+ <dl class="details">
675
+ <div class="details__row">
676
+ <dt>{{ tt('detailsToken') }}</dt>
677
+ <dd class="details__token">
678
+ <span>{{ tokenPreview() ?? tt('detailsNone') }}</span>
679
+ @if (currentToken()) {
680
+ <button class="details__copy" type="button" (click)="copyToken()">
681
+ {{ tt('detailsCopy') }}
682
+ </button>
683
+ }
684
+ </dd>
685
+ </div>
686
+ <div class="details__row">
687
+ <dt>{{ tt('diagnosticsPermission') }}</dt>
688
+ <dd>{{ permission() }}</dd>
689
+ </div>
690
+ <div class="details__row">
691
+ <dt>{{ tt('diagnosticsSupported') }}</dt>
692
+ <dd>{{ isSupported() ? '✓' : '✗' }}</dd>
693
+ </div>
694
+ </dl>
695
+ }
696
+ </section>
697
+ }
698
+ </div>
699
+ </val-container>
700
+ `, styles: [".page{padding:16px 0}.page-header{margin-bottom:8px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.section-body{margin-top:16px;display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.notif-row{display:grid;grid-template-columns:44px 1fr auto;gap:16px;align-items:center}.notif-row__icon{width:44px;height:44px;border-radius:50%;background:var(--ion-color-light, rgba(0, 0, 0, .06));display:flex;align-items:center;justify-content:center}.notif-row__icon ion-icon{font-size:22px;color:var(--ion-color-dark, #1a1a1a)}.notif-row__body{display:flex;flex-direction:column;gap:4px;min-width:0}.notif-row__busy{font-size:12px;color:var(--ion-color-medium, #92949c);font-style:italic;margin-top:4px}.notif-row__control{flex-shrink:0}.alert{display:flex;gap:10px;align-items:flex-start;margin-top:12px;padding:12px 14px;border-radius:10px;font-size:13px;line-height:1.45;background:var(--ion-color-light, rgba(0, 0, 0, .04));color:var(--ion-color-dark, #1a1a1a)}.alert ion-icon{font-size:18px;flex-shrink:0;margin-top:1px}.alert--warning ion-icon{color:var(--ion-color-warning-shade, #c79e08)}.alert--danger ion-icon{color:var(--ion-color-danger-shade, #cf3c4f)}.alert--info ion-icon{color:var(--ion-color-medium, #6b6b6b)}.install-steps{margin:0;padding-left:20px;font-size:13px;line-height:1.6;color:var(--ion-color-dark, #1a1a1a)}.install-steps li+li{margin-top:4px}.details-toggle{display:flex;align-items:center;gap:6px;background:none;border:0;padding:0;font-size:13px;color:var(--ion-color-medium, #6b6b6b);cursor:pointer}.details-toggle ion-icon{font-size:14px}.details{margin:12px 0 0;display:flex;flex-direction:column;gap:6px}.details__row{display:grid;grid-template-columns:140px 1fr;gap:12px;font-size:12px;align-items:baseline}.details__row dt{margin:0;color:var(--ion-color-medium, #6b6b6b);text-transform:uppercase;letter-spacing:.4px;font-weight:500}.details__row dd{margin:0;color:var(--ion-color-dark, #1a1a1a);font-family:ui-monospace,SFMono-Regular,monospace;font-size:11px;word-break:break-all}.details__token{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.details__copy{flex-shrink:0;border:none;background:transparent;padding:0;color:var(--ion-color-primary, #0054e9);font-family:inherit;font-size:11px;font-weight:600;text-transform:none;letter-spacing:normal;cursor:pointer}.details__copy:hover{text-decoration:underline}\n"] }]
688
701
  }], ctorParameters: () => [], propDecorators: { config: [{
689
702
  type: Input
690
703
  }] } });
691
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLXByZWZlcmVuY2VzLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMtdmlldy9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLG9CQUFvQixFQUNwQixjQUFjLEdBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUUzRixPQUFPLEVBQWtCLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5RCxPQUFPLEVBQUUs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QUFhOzs0RkF1UzlGLG9DQUFvQztrQkExU2hELFNBQVM7K0JBQ0UsbUNBQW1DLGNBQ2pDLElBQUksV0FDUCxDQUFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxZQUNoRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0hUO3dEQWdNUSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSW9uSWNvbiB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQge1xuICBhbGVydENpcmNsZU91dGxpbmUsXG4gIGNoZXZyb25Eb3duT3V0bGluZSxcbiAgY2hldnJvblVwT3V0bGluZSxcbiAgY2xvc2VDaXJjbGVPdXRsaW5lLFxuICBub3RpZmljYXRpb25zT2ZmT3V0bGluZSxcbiAgbm90aWZpY2F0aW9uc091dGxpbmUsXG4gIHJlZnJlc2hPdXRsaW5lLFxufSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5cbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRpdGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGl0bGUvdGl0bGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRvZ2dsZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL3RvZ2dsZS1pbnB1dC90b2dnbGUtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFRvZ2dsZUlucHV0TWV0YWRhdGEgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvdG9nZ2xlLWlucHV0L3R5cGVzJztcbmltcG9ydCB7IEJ1dHRvbk1ldGFkYXRhLCBDb21wb25lbnRTdGF0ZXMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uUGVybWlzc2lvblN0YXRlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5pbXBvcnQgeyBFbmFibGVQdXNoUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmlyZWJhc2UvdHlwZXMnO1xuaW1wb3J0IHsgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZpcmViYXNlL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25hdmlnYXRpb24vbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBhZ2VSZWZyZXNoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BhZ2UtcmVmcmVzaC9wYWdlLXJlZnJlc2guc2VydmljZSc7XG5pbXBvcnQgeyBQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBOb3RpZmljYXRpb25QcmVmZXJlbmNlc1ZpZXdDb25maWcgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IE5PVElGSUNBVElPTl9QUkVGRVJFTkNFU19WSUVXX0kxOE4gfSBmcm9tICcuL25vdGlmaWNhdGlvbi1wcmVmZXJlbmNlcy12aWV3LmkxOG4nO1xuXG5hZGRJY29ucyh7XG4gIGFsZXJ0Q2lyY2xlT3V0bGluZSxcbiAgY2hldnJvbkRvd25PdXRsaW5lLFxuICBjaGV2cm9uVXBPdXRsaW5lLFxuICBjbG9zZUNpcmNsZU91dGxpbmUsXG4gIG5vdGlmaWNhdGlvbnNPZmZPdXRsaW5lLFxuICBub3RpZmljYXRpb25zT3V0bGluZSxcbiAgcmVmcmVzaE91dGxpbmUsXG59KTtcblxuY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSAnU2V0dGluZ3MuTm90aWZpY2F0aW9ucyc7XG5cbi8qKlxuICogRXN0YWRvcyBkZSBsYSB2aXN0YSBkZSBwcmVmZXJlbmNpYXMgcHVzaDpcbiAqICAtIGBpZGxlYDogICAgICAgICAgdG9nZ2xlIG9mZiwgc2luIG9wZXJhY2nDs24gZW4gY3Vyc28sIHNpbiBlcnJvcmVzXG4gKiAgLSBgZW5hYmxpbmdgOiAgICAgIHNlY3VlbmNpYSBkZSBhY3RpdmFjacOzbiBlbiBjdXJzbyAodG9nZ2xlIHNwaW5uZXIpXG4gKiAgLSBgZW5hYmxlZGA6ICAgICAgIHRvZG8gT0sgKG1hc3Rlcj10cnVlICsgcGVybWlzc2lvbj1ncmFudGVkICsgdG9rZW4gcmVnaXN0cmFkbylcbiAqICAtIGBkaXNhYmxpbmdgOiAgICAgZGVzYWN0aXZhY2nDs24gZW4gY3Vyc29cbiAqICAtIGBlcnJvcmA6ICAgICAgICAgw7psdGltbyBpbnRlbnRvIGZhbGzDsyDihpIgbWVuc2FqZSArIGJvdMOzbiBcIlJlaW50ZW50YXJcIlxuICogIC0gYGJsb2NrZWRgOiAgICAgICBuYXZlZ2Fkb3IgZGVuZWfDsyBwZXJtaXNvcyDihpIgbWVuc2FqZSArIGPDs21vIGFycmVnbGFyXG4gKiAgLSBgdW5zdXBwb3J0ZWRgOiAgIG5hdmVnYWRvciBubyBzb3BvcnRhIEZDTSDihpIgbWVuc2FqZVxuICogIC0gYG5lZWRzLWluc3RhbGxgOiBpT1Mgc2luIHN0YW5kYWxvbmUg4oaSIGluc3RydWNjaW9uZXMgZGUgaW5zdGFsYWNpw7NuIFBXQVxuICovXG50eXBlIFVpU3RhdGUgPSAnaWRsZScgfCAnZW5hYmxpbmcnIHwgJ2VuYWJsZWQnIHwgJ2Rpc2FibGluZycgfCAnZXJyb3InIHwgJ2Jsb2NrZWQnIHwgJ3Vuc3VwcG9ydGVkJyB8ICduZWVkcy1pbnN0YWxsJztcblxuLyoqXG4gKiBgdmFsLW5vdGlmaWNhdGlvbi1wcmVmZXJlbmNlcy12aWV3YCDigJQgKipwcmVmZXJlbmNpYXMgZGUgbm90aWZpY2FjaW9uZXMgcHVzaCoqXG4gKiAoRkNNKSBmdWxsLWZlYXR1cmUgYXV0b2NvbnRlbmlkYSAob3JnYW5pc20pLiBQcm9tb3ZpZGEgZGVzZGUgYHNob3djYXNlYCBiYWpvIGVsXG4gKiBwcm9jZXNvIGRlIEFEUi0wMjEuXG4gKlxuICogU2VwYXJhZGEgZGUgYHZhbC1ub3RpZmljYXRpb25zLXZpZXdgIChlbCBpbmJveCAvIGZlZWQpLiBBcXXDrSBlbCB1c2VyICoqYWN0aXZhIG9cbiAqIGRlc2FjdGl2YSoqIGxhcyBub3RpZmljYWNpb25lcyBwdXNoIGVuIGVzdGUgZGlzcG9zaXRpdm8uXG4gKlxuICogVVggc2ltcGxpZmljYWRvOiBVTiBzb2xvIHRvZ2dsZSBxdWUgZWplY3V0YSB0b2RhIGxhIHNlY3VlbmNpYSAocGVkaXIgcGVybWlzbyDihpJcbiAqIFNXIHJlYWR5IOKGkiBnZXRUb2tlbiDihpIgcmVnaXN0cmFyIGVuIGJhY2tlbmQg4oaSIHNldCBtYXN0ZXIgcHJlZikgdsOtYVxuICogYE1lc3NhZ2luZ1NlcnZpY2UuZW5hYmxlKClgLiBFbCByZWdpc3RybyBkZWwgZGV2aWNlIGVuIGVsIGJhY2tlbmQgdmEgY29tb1xuICogY2FsbGJhY2sgKGxhIGxpYiBubyBkZXBlbmRlIGRlIGBBdXRoU2VydmljZWAgcGFyYSBldml0YXIgY2ljbG9zKS4gTWVuc2FqZXNcbiAqIGNvbnRleHR1YWxlcyB5IGJvdMOzbiBcIlJlaW50ZW50YXJcIiBhcGFyZWNlbiBzb2xvIGN1YW5kbyBhcGxpY2FuLlxuICpcbiAqIE5PIHJlbmRlcml6YSBpb24tY29udGVudCDigJQgdml2ZSBkZW50cm8gZGUgdmFsLXBhZ2Utd3JhcHBlci4gYEFjdGl2YXRlZFJvdXRlYCBzZVxuICogaW55ZWN0YSBgeyBvcHRpb25hbDogdHJ1ZSB9YCDihpIgZnVuY2lvbmEgc2luIHJvdXRlciAoZW1iZWJpZGEgLyBTdG9yeWJvb2spLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtbm90aWZpY2F0aW9uLXByZWZlcmVuY2VzLXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbSW9uSWNvbiwgVG9nZ2xlSW5wdXRDb21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudCwgRGlzcGxheUNvbXBvbmVudCwgVGl0bGVDb21wb25lbnQsIFRleHRDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwYWdlXCI+XG4gICAgICA8aGVhZGVyIGNsYXNzPVwicGFnZS1oZWFkZXJcIj5cbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycsIGNvbnRlbnQ6IHBhZ2VUaXRsZSgpIH1cIiAvPlxuICAgICAgICA8dmFsLXRpdGxlXG4gICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgIHNpemU6ICdsYXJnZScsXG4gICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgYm9sZDogZmFsc2UsXG4gICAgICAgICAgICBjb250ZW50OiBwYWdlRGVzY3JpcHRpb24oKSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgLz5cbiAgICAgIDwvaGVhZGVyPlxuXG4gICAgICBAaWYgKHN0YXRlKCkgPT09ICduZWVkcy1pbnN0YWxsJykge1xuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cInNldHRpbmdzLXNlY3Rpb25cIj5cbiAgICAgICAgICA8dmFsLXRpdGxlXG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICBzaXplOiAnbWVkaXVtJyxcbiAgICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgICAgICAgY29udGVudDogdHQoJ2lvc0luc3RhbGxUaXRsZScpLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1ib2R5XCI+XG4gICAgICAgICAgICA8dmFsLXRleHRcbiAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnbWVkaXVtJyxcbiAgICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0dCgnaW9zSW5zdGFsbEhpbnQnKSxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPG9sIGNsYXNzPVwiaW5zdGFsbC1zdGVwc1wiPlxuICAgICAgICAgICAgICA8bGk+e3sgdHQoJ2lvc0luc3RhbGxTdGVwMScpIH19PC9saT5cbiAgICAgICAgICAgICAgPGxpPnt7IHR0KCdpb3NJbnN0YWxsU3RlcDInKSB9fTwvbGk+XG4gICAgICAgICAgICAgIDxsaT57eyB0dCgnaW9zSW5zdGFsbFN0ZXAzJykgfX08L2xpPlxuICAgICAgICAgICAgICA8bGk+e3sgdHQoJ2lvc0luc3RhbGxTdGVwNCcpIH19PC9saT5cbiAgICAgICAgICAgIDwvb2w+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIH1cblxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZXR0aW5ncy1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJub3RpZi1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibm90aWYtcm93X19pY29uXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cIm5vdGlmaWNhdGlvbnMtb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLXJvd19fYm9keVwiPlxuICAgICAgICAgICAgPHZhbC10aXRsZVxuICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0dCgnc2ltcGxlVGl0bGUnKSxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ21lZGl1bScsXG4gICAgICAgICAgICAgICAgYm9sZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29udGVudDogdHQoJ3NpbXBsZURlc2NyaXB0aW9uJyksXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIEBpZiAoYnVzeUxhYmVsKCk7IGFzIGxhYmVsKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm90aWYtcm93X19idXN5XCI+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLXJvd19fY29udHJvbFwiPlxuICAgICAgICAgICAgPHZhbC10b2dnbGUtaW5wdXQgW3Byb3BzXT1cInRvZ2dsZVByb3BzKClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKGNvbnRleHRNZXNzYWdlKCk7IGFzIG1zZykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydFwiIFtjbGFzc109XCInYWxlcnQtLScgKyBhbGVydFZhcmlhbnQoKVwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIFtuYW1lXT1cImFsZXJ0SWNvbigpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPnt7IG1zZyB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc3RhdGUoKSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgPHZhbC1idXR0b24gW3Byb3BzXT1cInJldHJ5QnV0dG9uUHJvcHMoKVwiIChjbGljayk9XCJvblJldHJ5KClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L3NlY3Rpb24+XG5cbiAgICAgIEBpZiAocmVzb2x2ZWRDb25maWcoKS5zaG93RGV0YWlscyAmJiBzdGF0ZSgpICE9PSAnbmVlZHMtaW5zdGFsbCcgJiYgc3RhdGUoKSAhPT0gJ3Vuc3VwcG9ydGVkJykge1xuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cInNldHRpbmdzLXNlY3Rpb25cIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGV0YWlscy10b2dnbGVcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZURldGFpbHMoKVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgc2hvd0RldGFpbHMoKSA/IHR0KCdkZXRhaWxzSGlkZScpIDogdHQoJ2RldGFpbHNTaG93JykgfX08L3NwYW4+XG4gICAgICAgICAgICA8aW9uLWljb24gW25hbWVdPVwic2hvd0RldGFpbHMoKSA/ICdjaGV2cm9uLXVwLW91dGxpbmUnIDogJ2NoZXZyb24tZG93bi1vdXRsaW5lJ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgQGlmIChzaG93RGV0YWlscygpKSB7XG4gICAgICAgICAgICA8ZGwgY2xhc3M9XCJkZXRhaWxzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzX19yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZHQ+e3sgdHQoJ2RldGFpbHNUb2tlbicpIH19PC9kdD5cbiAgICAgICAgICAgICAgICA8ZGQgY2xhc3M9XCJkZXRhaWxzX190b2tlblwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdG9rZW5QcmV2aWV3KCkgPz8gdHQoJ2RldGFpbHNOb25lJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICBAaWYgKGN1cnJlbnRUb2tlbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZXRhaWxzX19jb3B5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjb3B5VG9rZW4oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHR0KCdkZXRhaWxzQ29weScpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsc19fcm93XCI+XG4gICAgICAgICAgICAgICAgPGR0Pnt7IHR0KCdkaWFnbm9zdGljc1Blcm1pc3Npb24nKSB9fTwvZHQ+XG4gICAgICAgICAgICAgICAgPGRkPnt7IHBlcm1pc3Npb24oKSB9fTwvZGQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsc19fcm93XCI+XG4gICAgICAgICAgICAgICAgPGR0Pnt7IHR0KCdkaWFnbm9zdGljc1N1cHBvcnRlZCcpIH19PC9kdD5cbiAgICAgICAgICAgICAgICA8ZGQ+e3sgaXNTdXBwb3J0ZWQoKSA/ICfinJMnIDogJ+KclycgfX08L2RkPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGw+XG4gICAgICAgICAgfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5wYWdlIHtcbiAgICAgICAgcGFkZGluZzogMTZweCAwO1xuICAgICAgICBtYXgtd2lkdGg6IDcyMHB4O1xuICAgICAgICBtYXJnaW46IDAgYXV0bztcbiAgICAgIH1cblxuICAgICAgLyogU2VndW5kbyBhbmNobywgZGVza3RvcCBjb24gZWwgcmFpbCByZXRyYcOtZG8uIFZlciBzZXR0aW5ncy1odWIgcGFyYSBsYVxuICAgICAgICAgZXhwbGljYWNpw7NuIGNvbXBsZXRhIGRlbCBtZWNhbmlzbW8uICovXG4gICAgICA6aG9zdC1jb250ZXh0KFtkYXRhLW1lbnU9J2NvbGxhcHNlZCddKSAucGFnZSB7XG4gICAgICAgIEBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHtcbiAgICAgICAgICBtYXgtd2lkdGg6IDkwMHB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAucGFnZS1oZWFkZXIge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gICAgICB9XG4gICAgICAuc2V0dGluZ3Mtc2VjdGlvbiB7XG4gICAgICAgIHBhZGRpbmc6IDE2cHggMDtcbiAgICAgIH1cbiAgICAgIC5zZXR0aW5ncy1zZWN0aW9uICsgLnNldHRpbmdzLXNlY3Rpb24ge1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tdmFsLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7XG4gICAgICB9XG4gICAgICAuc2VjdGlvbi1ib2R5IHtcbiAgICAgICAgbWFyZ2luLXRvcDogMTZweDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgfVxuICAgICAgLnJvdy1hY3Rpb25zIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMTJweDtcbiAgICAgIH1cblxuICAgICAgLm5vdGlmLXJvdyB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDRweCAxZnIgYXV0bztcbiAgICAgICAgZ2FwOiAxNnB4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgfVxuICAgICAgLm5vdGlmLXJvd19faWNvbiB7XG4gICAgICAgIHdpZHRoOiA0NHB4O1xuICAgICAgICBoZWlnaHQ6IDQ0cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuMDYpKTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG4gICAgICAubm90aWYtcm93X19pY29uIGlvbi1pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAyMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICMxYTFhMWEpO1xuICAgICAgfVxuICAgICAgLm5vdGlmLXJvd19fYm9keSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogNHB4O1xuICAgICAgICBtaW4td2lkdGg6IDA7XG4gICAgICB9XG4gICAgICAubm90aWYtcm93X19idXN5IHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgICAgICAgbWFyZ2luLXRvcDogNHB4O1xuICAgICAgfVxuICAgICAgLm5vdGlmLXJvd19fY29udHJvbCB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuXG4gICAgICAuYWxlcnQge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDEwcHg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBtYXJnaW4tdG9wOiAxMnB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE0cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1saWdodCwgcmdiYSgwLCAwLCAwLCAwLjA0KSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFyaywgIzFhMWExYSk7XG4gICAgICB9XG4gICAgICAuYWxlcnQgaW9uLWljb24ge1xuICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgICBtYXJnaW4tdG9wOiAxcHg7XG4gICAgICB9XG4gICAgICAuYWxlcnQtLXdhcm5pbmcgaW9uLWljb24ge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXdhcm5pbmctc2hhZGUsICNjNzllMDgpO1xuICAgICAgfVxuICAgICAgLmFsZXJ0LS1kYW5nZXIgaW9uLWljb24ge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhbmdlci1zaGFkZSwgI2NmM2M0Zik7XG4gICAgICB9XG4gICAgICAuYWxlcnQtLWluZm8gaW9uLWljb24ge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzZiNmI2Yik7XG4gICAgICB9XG5cbiAgICAgIC5pbnN0YWxsLXN0ZXBzIHtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYXJrLCAjMWExYTFhKTtcbiAgICAgIH1cbiAgICAgIC5pbnN0YWxsLXN0ZXBzIGxpICsgbGkge1xuICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICB9XG5cbiAgICAgIC5kZXRhaWxzLXRvZ2dsZSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogNnB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM2YjZiNmIpO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB9XG4gICAgICAuZGV0YWlscy10b2dnbGUgaW9uLWljb24ge1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICB9XG4gICAgICAuZGV0YWlscyB7XG4gICAgICAgIG1hcmdpbjogMTJweCAwIDA7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogNnB4O1xuICAgICAgfVxuICAgICAgLmRldGFpbHNfX3JvdyB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMTQwcHggMWZyO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuICAgICAgfVxuICAgICAgLmRldGFpbHNfX3JvdyBkdCB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM2YjZiNmIpO1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC40cHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICB9XG4gICAgICAuZGV0YWlsc19fcm93IGRkIHtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICMxYTFhMWEpO1xuICAgICAgICBmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgbW9ub3NwYWNlO1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgICAgIH1cbiAgICAgIC5kZXRhaWxzX190b2tlbiB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIH1cbiAgICAgIC5kZXRhaWxzX19jb3B5IHtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzAwNTRlOSk7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB9XG4gICAgICAuZGV0YWlsc19fY29weTpob3ZlciB7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblByZWZlcmVuY2VzVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBuYXYgPSBpbmplY3QoTmF2aWdhdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIHRvYXN0ID0gaW5qZWN0KFRvYXN0U2VydmljZSk7XG4gIHByaXZhdGUgYXV0aCA9IGluamVjdChBdXRoU2VydmljZSk7XG4gIHByaXZhdGUgbWVzc2FnaW5nID0gaW5qZWN0KE1lc3NhZ2luZ1NlcnZpY2UpO1xuICBwcml2YXRlIHBhZ2VSZWZyZXNoID0gaW5qZWN0KFBhZ2VSZWZyZXNoU2VydmljZSk7XG4gIHJlYWRvbmx5IHByZWZzID0gaW5qZWN0KFByZWZlcmVuY2VzU2VydmljZSk7XG4gIC8vIGBBY3RpdmF0ZWRSb3V0ZWAgb3BjaW9uYWwg4oaSIGxhIHZpc3RhIGZ1bmNpb25hIGVtYmViaWRhIC8gZW4gU3Rvcnlib29rIHNpblxuICAvLyByb3V0ZXIgKHNvbG8gbG8gdXNhIHBhcmEgbGVlciBlbCByb3V0ZSBkYXRhIGRlIGNvbmZpZyBjb21vIGZhbGxiYWNrKS5cbiAgcHJpdmF0ZSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAvKipcbiAgICogQ29uZmlnIHbDrWEgQElucHV0IChvYmplY3QtZmlyc3QpLiBTaSBubyBzZSBwYXNhLCBzZSBjYWUgYWwgcm91dGUgZGF0YVxuICAgKiBgbm90aWZpY2F0aW9uUHJlZmVyZW5jZXNDb25maWdgIChwb2JsYWRvIHBvclxuICAgKiBgcHJvdmlkZVZhbHRlY2hOb3RpZmljYXRpb25QcmVmZXJlbmNlc1JvdXRlc2ApLiBgcmVzb2x2ZWRDb25maWdgIG1lcmdlYSBjb25cbiAgICogbG9zIGRlZmF1bHRzIOKAlCBgQElucHV0YCBnYW5hIHNvYnJlIHJvdXRlIGRhdGEuXG4gICAqL1xuICBASW5wdXQoKSBjb25maWc/OiBOb3RpZmljYXRpb25QcmVmZXJlbmNlc1ZpZXdDb25maWc7XG5cbiAgcmVhZG9ubHkgcmVzb2x2ZWRDb25maWcgPSBjb21wdXRlZDxcbiAgICBSZXF1aXJlZDxPbWl0PE5vdGlmaWNhdGlvblByZWZlcmVuY2VzVmlld0NvbmZpZywgJ29uUHVzaEVuYWJsZWQnIHwgJ29uUHVzaERpc2FibGVkJz4+ICZcbiAgICAgIFBpY2s8Tm90aWZpY2F0aW9uUHJlZmVyZW5jZXNWaWV3Q29uZmlnLCAnb25QdXNoRW5hYmxlZCcgfCAnb25QdXNoRGlzYWJsZWQnPlxuICA+KCgpID0+IHtcbiAgICBjb25zdCBmcm9tUm91dGUgPSAodGhpcy5yb3V0ZT8uc25hcHNob3QuZGF0YVsnbm90aWZpY2F0aW9uUHJlZmVyZW5jZXNDb25maWcnXSA/P1xuICAgICAge30pIGFzIE5vdGlmaWNhdGlvblByZWZlcmVuY2VzVmlld0NvbmZpZztcbiAgICBjb25zdCBtZXJnZWQ6IE5vdGlmaWNhdGlvblByZWZlcmVuY2VzVmlld0NvbmZpZyA9IHsgLi4uZnJvbVJvdXRlLCAuLi4odGhpcy5jb25maWcgPz8ge30pIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dEZXRhaWxzOiBtZXJnZWQuc2hvd0RldGFpbHMgPz8gdHJ1ZSxcbiAgICAgIGkxOG5OYW1lc3BhY2U6IG1lcmdlZC5pMThuTmFtZXNwYWNlID8/IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICAgb25QdXNoRW5hYmxlZDogbWVyZ2VkLm9uUHVzaEVuYWJsZWQsXG4gICAgICBvblB1c2hEaXNhYmxlZDogbWVyZ2VkLm9uUHVzaERpc2FibGVkLFxuICAgIH07XG4gIH0pO1xuXG4gIC8qKiBOYW1lc3BhY2UgaTE4biByZXN1ZWx0byAoY2FwdHVyYWRvIHBhcmEgbGxhbWFkYXMgbm8tcmVhY3RpdmFzKS4gKi9cbiAgcHJpdmF0ZSBnZXQgbnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZygpLmkxOG5OYW1lc3BhY2U7XG4gIH1cblxuICAvKiogT3BlcmFjacOzbiBlbiBjdXJzbyAoZ29iaWVybmEgc3Bpbm5lciBkZWwgdG9nZ2xlICsgbGFiZWwgXCJBY3RpdmFuZG/igKZcIikuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1c3kgPSBzaWduYWw8bnVsbCB8ICdlbmFibGluZycgfCAnZGlzYWJsaW5nJz4obnVsbCk7XG4gIC8qKiBUcnVlIHNpIGVsIMO6bHRpbW8gaW50ZW50byBmYWxsw7Mg4oCUIGdvYmllcm5hIGVzdGFkbyBgZXJyb3JgICsgcmV0cnkgYnV0dG9uLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9sYXN0RmFpbGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgLyoqIFRydWUgbWllbnRyYXMgc2UgcmUtb2J0aWVuZSBlbCB0b2tlbiBGQ00gZW4gYmFja2dyb3VuZCAobm8gYWZlY3RhIGxhIFVJKS4gKi9cbiAgcHJpdmF0ZSBfcmVwYWlyaW5nVG9rZW4gPSBmYWxzZTtcbiAgLyoqIFRvZ2dsZSBkZWwgZXhwYW5kIGRlIGRldGFsbGVzIHTDqWNuaWNvcy4gKi9cbiAgcmVhZG9ubHkgc2hvd0RldGFpbHMgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHJlYWRvbmx5IHBlcm1pc3Npb24gPSBzaWduYWw8Tm90aWZpY2F0aW9uUGVybWlzc2lvblN0YXRlPignZGVmYXVsdCcpO1xuICByZWFkb25seSBpc1N1cHBvcnRlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRUb2tlbiA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgbmVlZHNJT1NJbnN0YWxsID0gc2lnbmFsKHRoaXMuZGV0ZWN0TmVlZHNJT1NJbnN0YWxsKCkpO1xuXG4gIC8qKiBGb3JtQ29udHJvbCBkZWwgdG9nZ2xlIChzeW5jLWVhZG8gY29uIGBpc0VuYWJsZWRgIHZpYSBlZmZlY3QpLiAqL1xuICByZWFkb25seSB0b2dnbGVDb250cm9sID0gbmV3IEZvcm1Db250cm9sPGJvb2xlYW4+KGZhbHNlLCB7XG4gICAgbm9uTnVsbGFibGU6IHRydWUsXG4gIH0pO1xuXG4gIC8qKiBIYW5kbGVyIGRlbCBsaXN0ZW5lciBgZm9jdXNgIOKAlCByZWZlcmVuY2lhIGd1YXJkYWRhIHBhcmEgcG9kZXIgcmVtb3ZlcmxvLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG9uV2luZG93Rm9jdXMgPSAoKSA9PiB0aGlzLnNjaGVkdWxlQnJvd3NlclJlZnJlc2goKTtcbiAgLyoqIFRpbWVyIGRlbCBkZWJvdW5jZSBkZWwgcmVmcmVzaCBkaXNwYXJhZG8gcG9yIGBmb2N1c2AuICovXG4gIHByaXZhdGUgZm9jdXNEZWJvdW5jZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAvKiogVmVudGFuYSBkZSBkZWJvdW5jZSAobXMpIHBhcmEgZWwgcmVmcmVzaCBkaXNwYXJhZG8gcG9yIGBmb2N1c2AuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgRk9DVVNfREVCT1VOQ0VfTVMgPSA1MDA7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEVzdGFkbyBkZXJpdmFkb1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICByZWFkb25seSBwYWdlVGl0bGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnR0KCdwYWdlVGl0bGUnKSk7XG4gIHJlYWRvbmx5IHBhZ2VEZXNjcmlwdGlvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMudHQoJ3BhZ2VEZXNjcmlwdGlvbicpKTtcblxuICAvKipcbiAgICogRXN0YWRvIGVmZWN0aXZvIGRlbCB0b2dnbGU6IFwiZWwgdXN1YXJpbyB0aWVuZSBwdXNoIGFjdGl2b1wiLlxuICAgKlxuICAgKiBTZSBkZXJpdmEgU09MTyBkZSBsYSBkZWNpc2nDs24gZGVsIHVzdWFyaW8gKGBtYXN0ZXJgKSB5IGRlbCBwZXJtaXNvIGRlbCBTT1xuICAgKiAoYHBlcm1pc3Npb25gKS4gRWwgdG9rZW4gRkNNIE5PIGZvcm1hIHBhcnRlIGRlbCBlc3RhZG8gZGUgVUk6IHZpdmUgZW5cbiAgICogbWVtb3JpYSwgc2UgcGllcmRlIGVuIGNhZGEgcmVjYXJnYS9zdXNwZW5zacOzbiBkZSBsYSBQV0EgeSBwcm9kdWNpcsOtYSBmbGlja2VyLlxuICAgKiBTaSBmYWx0YSB0b2tlbiBjb24gYG1hc3RlciAmJiBncmFudGVkYCwgZXMgdW4gZGV0YWxsZSByZXBhcmFibGUgZW5cbiAgICogYmFja2dyb3VuZCAodmVyIGByZXBhaXJUb2tlbklmTmVlZGVkYCksIG5vIHVuIGNhbWJpbyBkZWwgdG9nZ2xlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbmFibGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wcmVmcy5ub3RpZmljYXRpb25zTWFzdGVyKCkgJiYgdGhpcy5wZXJtaXNzaW9uKCkgPT09ICdncmFudGVkJyk7XG5cbiAgcmVhZG9ubHkgc3RhdGUgPSBjb21wdXRlZDxVaVN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHRoaXMubmVlZHNJT1NJbnN0YWxsKCkpIHJldHVybiAnbmVlZHMtaW5zdGFsbCc7XG4gICAgaWYgKHRoaXMucGVybWlzc2lvbigpID09PSAndW5zdXBwb3J0ZWQnIHx8ICF0aGlzLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgIC8vIGlPUyBzdGFuZGFsb25lIGHDum4gcHVlZGUgZGFyIGlzU3VwcG9ydGVkIGZhbHNlIHRlbXByYW5vIGFudGVzIGRlIGluaXQg4oCUXG4gICAgICAvLyBzb2xvIGJsb3F1ZWFtb3Mgc2kgZWwgYnJvd3NlciBleHBsw61jaXRhbWVudGUgbm8gc29wb3J0YSBBUElzLlxuICAgICAgaWYgKHRoaXMucGVybWlzc2lvbigpID09PSAndW5zdXBwb3J0ZWQnKSByZXR1cm4gJ3Vuc3VwcG9ydGVkJztcbiAgICB9XG4gICAgY29uc3QgYnVzeSA9IHRoaXMuX2J1c3koKTtcbiAgICBpZiAoYnVzeSA9PT0gJ2VuYWJsaW5nJykgcmV0dXJuICdlbmFibGluZyc7XG4gICAgaWYgKGJ1c3kgPT09ICdkaXNhYmxpbmcnKSByZXR1cm4gJ2Rpc2FibGluZyc7XG4gICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybiAnZW5hYmxlZCc7XG4gICAgaWYgKHRoaXMucGVybWlzc2lvbigpID09PSAnZGVuaWVkJykgcmV0dXJuICdibG9ja2VkJztcbiAgICBpZiAodGhpcy5fbGFzdEZhaWxlZCgpKSByZXR1cm4gJ2Vycm9yJztcbiAgICByZXR1cm4gJ2lkbGUnO1xuICB9KTtcblxuICByZWFkb25seSBidXN5TGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgcyA9IHRoaXMuc3RhdGUoKTtcbiAgICBpZiAocyA9PT0gJ2VuYWJsaW5nJykgcmV0dXJuIHRoaXMudHQoJ2VuYWJsaW5nJyk7XG4gICAgaWYgKHMgPT09ICdkaXNhYmxpbmcnKSByZXR1cm4gdGhpcy50dCgnZGlzYWJsaW5nJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGNvbnRleHRNZXNzYWdlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHN3aXRjaCAodGhpcy5zdGF0ZSgpKSB7XG4gICAgICBjYXNlICd1bnN1cHBvcnRlZCc6XG4gICAgICAgIHJldHVybiB0aGlzLnR0KCdwZXJtaXNzaW9uVW5zdXBwb3J0ZWQnKTtcbiAgICAgIGNhc2UgJ2Jsb2NrZWQnOlxuICAgICAgICByZXR1cm4gdGhpcy50dCgncGVybWlzc2lvbkRlbmllZEluZm8nKTtcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudHQoJ2Vycm9yR2VuZXJpYycpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9KTtcblxuICByZWFkb25seSBhbGVydFZhcmlhbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgcyA9IHRoaXMuc3RhdGUoKTtcbiAgICBpZiAocyA9PT0gJ2Vycm9yJyB8fCBzID09PSAnYmxvY2tlZCcpIHJldHVybiAnd2FybmluZyc7XG4gICAgaWYgKHMgPT09ICd1bnN1cHBvcnRlZCcpIHJldHVybiAnZGFuZ2VyJztcbiAgICByZXR1cm4gJ2luZm8nO1xuICB9KTtcblxuICByZWFkb25seSBhbGVydEljb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgcyA9IHRoaXMuc3RhdGUoKTtcbiAgICBpZiAocyA9PT0gJ3Vuc3VwcG9ydGVkJykgcmV0dXJuICdjbG9zZS1jaXJjbGUtb3V0bGluZSc7XG4gICAgcmV0dXJuICdhbGVydC1jaXJjbGUtb3V0bGluZSc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRvZ2dsZVByb3BzID0gY29tcHV0ZWQ8VG9nZ2xlSW5wdXRNZXRhZGF0YT4oKCkgPT4gKHtcbiAgICBjb250cm9sOiB0aGlzLnRvZ2dsZUNvbnRyb2wsXG4gICAgY29sb3I6ICdwcmltYXJ5JyxcbiAgICBkaXNhYmxlZDpcbiAgICAgIHRoaXMuX2J1c3koKSAhPT0gbnVsbCB8fFxuICAgICAgdGhpcy5zdGF0ZSgpID09PSAndW5zdXBwb3J0ZWQnIHx8XG4gICAgICB0aGlzLnN0YXRlKCkgPT09ICduZWVkcy1pbnN0YWxsJyB8fFxuICAgICAgdGhpcy5zdGF0ZSgpID09PSAnYmxvY2tlZCcsXG4gIH0pKTtcblxuICByZWFkb25seSByZXRyeUJ1dHRvblByb3BzID0gY29tcHV0ZWQ8UGFydGlhbDxCdXR0b25NZXRhZGF0YT4+KCgpID0+ICh7XG4gICAgdGV4dDogdGhpcy50dCgncmV0cnlDdGEnKSxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIGZpbGw6ICdvdXRsaW5lJyxcbiAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgdHlwZTogJ2J1dHRvbicsXG4gICAgaWNvbjogeyBuYW1lOiAncmVmcmVzaC1vdXRsaW5lJywgc2xvdDogJ3N0YXJ0JyB9LFxuICAgIHN0YXRlOiB0aGlzLl9idXN5KCkgIT09IG51bGwgPyBDb21wb25lbnRTdGF0ZXMuV09SS0lORyA6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICB9KSk7XG5cbiAgcmVhZG9ubHkgdG9rZW5QcmV2aWV3ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRUb2tlbigpO1xuICAgIGlmICghdCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGAke3Quc2xpY2UoMCwgMjIpfeKApiR7dC5zbGljZSgtNil9YDtcbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIExpZmVjeWNsZVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBucyA9IHRoaXMubnM7XG4gICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMobnMsIE5PVElGSUNBVElPTl9QUkVGRVJFTkNFU19WSUVXX0kxOE4pO1xuICAgIHRoaXMubmF2LnNldEJhY2tIZWFkZXIoJ3BhZ2VUaXRsZScsIG5zLCB7IHdpdGhNZW51OiB0cnVlIH0pO1xuXG4gICAgdm9pZCB0aGlzLnJlZnJlc2hCcm93c2VyU3RhdGUoKTtcblxuICAgIC8vIFJlLWFwbGljYXIgaGVhZGVyIGVuIGNhbWJpbyBkZSBpZGlvbWEuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgICAgICB0aGlzLm5hdi5zZXRCYWNrSGVhZGVyKCdwYWdlVGl0bGUnLCB0aGlzLm5zLCB7IHdpdGhNZW51OiB0cnVlIH0pO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICAvLyBTeW5jIEZvcm1Db250cm9sIOKGkOKGkiBlc3RhZG8gZWZlY3Rpdm8uIEN1YW5kbyBlbCBlc3RhZG8gY2FtYmlhIChjYW1iaW8gZGVcbiAgICAvLyBwZXJtaXNzaW9uIHBvciBlbCBicm93c2VyLCBvIHNuYXBzaG90IEZpcmVzdG9yZSBkZSBgbWFzdGVyYCksIGVsIHRvZ2dsZSBzZVxuICAgIC8vIHJlLWFsaW5lYSBjb24gbGEgcmVhbGlkYWQuXG4gICAgLy9cbiAgICAvLyBJTVBPUlRBTlRFOiBzZSBpZ25vcmFuIGxvcyBjYW1iaW9zIG1pZW50cmFzIGhheSB1bmEgb3BlcmFjacOzbiBlbiBjdXJzb1xuICAgIC8vIChgX2J1c3koKSAhPT0gbnVsbGApLiBEdXJhbnRlIGBvbkVuYWJsZWAvYG9uRGlzYWJsZWAgbGFzIHNlw7FhbGVzIGZ1ZW50ZSBzZVxuICAgIC8vIGFjdHVhbGl6YW4gZW4gbW9tZW50b3MgZGlzdGludG9zIHkgcHJvZHVjaXLDrWFuIGVzdGFkb3MgaW50ZXJtZWRpb3Mg4oaSXG4gICAgLy8gZmxpY2tlciB2aXNpYmxlLiBFbCB0b2dnbGUgc2UgcmUtYWxpbmVhIFVOQSBzb2xhIHZleiBlbiBlbCBgZmluYWxseWAuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBlZmYgPSB0aGlzLmlzRW5hYmxlZCgpO1xuICAgICAgICBpZiAodGhpcy5fYnVzeSgpICE9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZUNvbnRyb2wudmFsdWUgIT09IGVmZikge1xuICAgICAgICAgIHRoaXMudG9nZ2xlQ29udHJvbC5zZXRWYWx1ZShlZmYsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICAvLyBJbnRlcmNlcHRhciBjbGljayBkZWwgdXNlcjogZWwgdG9nZ2xlIHlhIGNhbWJpw7MgdmlzdWFsbWVudGUsIGVqZWN1dGFyXG4gICAgLy8gbGEgYWNjacOzbiBjb3JyZXNwb25kaWVudGUuXG4gICAgdGhpcy50b2dnbGVDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodiA9PiB7XG4gICAgICBpZiAodGhpcy5fYnVzeSgpICE9PSBudWxsKSByZXR1cm47XG4gICAgICBpZiAodiAmJiAhdGhpcy5pc0VuYWJsZWQoKSkge1xuICAgICAgICB2b2lkIHRoaXMub25FbmFibGUoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXYgJiYgdGhpcy5pc0VuYWJsZWQoKSkge1xuICAgICAgICB2b2lkIHRoaXMub25EaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEZXRlY3RhciByZWdyZXNvIGEgbGEgcGVzdGHDsWEg4oCUIGVsIHVzZXIgcHVkbyBoYWJlciBjYW1iaWFkbyBwZXJtaXNvc1xuICAgIC8vIGRlc2RlIGxhIGNvbmZpZyBkZWwgYnJvd3Nlci4gRWwgcmVmcmVzaCB2YSBjb24gZGVib3VuY2UgcGFyYSBub1xuICAgIC8vIGRpc3BhcmFyc2UgZW4gcsOhZmFnYXMgKGVuIFBXQSBtb2JpbGUgYGZvY3VzYCBzYWx0YSBjb24gY2FkYSBjYW1iaW8gZGVcbiAgICAvLyBhcHAgLyBhcGFyaWNpw7NuIGRlbCB0ZWNsYWRvKS4gRWwgbGlzdGVuZXIgc2UgcmVtdWV2ZSBlbiBuZ09uRGVzdHJveS5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMub25XaW5kb3dGb2N1cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdHJhIGVsIHB1bGwtdG8tcmVmcmVzaCBlc3TDoW5kYXIuIEF1bnF1ZSBlc3RhIHZpc3RhIG5vIG11ZXN0cmEgdW5hXG4gICAqIGxpc3RhIHJlbW90YSwgc8OtIHJlZmxlamEgZXN0YWRvIG11dGFibGUgZGVsIGJyb3dzZXIgKHBlcm1pc28sIHRva2VuLFxuICAgKiBzb3BvcnRlIEZDTSkgcXVlIHB1ZWRlIGNhbWJpYXIgZnVlcmEgZGUgbGEgYXBwIOKAlCBlbCByZWZyZXNoIHJlLWV2YWzDumEgdG9kby5cbiAgICpcbiAgICogU2UgdXNhIGBuZ09uSW5pdGAvYG5nT25EZXN0cm95YCAoTk8gYGlvblZpZXdXaWxsRW50ZXJgKSBwb3JxdWVcbiAgICogYHZhbC1wYWdlLXdyYXBwZXJgIHVzYSBgPHJvdXRlci1vdXRsZXQ+YCBwbGFubyDigJQgbG9zIGhvb2tzIGBpb25WaWV3KmAgc29sb1xuICAgKiBkaXNwYXJhbiBkZW50cm8gZGUgYDxpb24tcm91dGVyLW91dGxldD5gLlxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wYWdlUmVmcmVzaC5yZWdpc3RlcigoKSA9PiB0aGlzLnJlZnJlc2hCcm93c2VyU3RhdGUoKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VSZWZyZXNoLnVucmVnaXN0ZXIoKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMub25XaW5kb3dGb2N1cyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvY3VzRGVib3VuY2VUaW1lciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZm9jdXNEZWJvdW5jZVRpbWVyKTtcbiAgICAgIHRoaXMuZm9jdXNEZWJvdW5jZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogUmVmcmVzY2EgZWwgZXN0YWRvIGRlbCBicm93c2VyIGNvbiBkZWJvdW5jZSDigJQgZXZpdGEgcsOhZmFnYXMgZGUgYGZvY3VzYC4gKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZUJyb3dzZXJSZWZyZXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvY3VzRGVib3VuY2VUaW1lciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZm9jdXNEZWJvdW5jZVRpbWVyKTtcbiAgICB9XG4gICAgdGhpcy5mb2N1c0RlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZm9jdXNEZWJvdW5jZVRpbWVyID0gbnVsbDtcbiAgICAgIHZvaWQgdGhpcy5yZWZyZXNoQnJvd3NlclN0YXRlKCk7XG4gICAgfSwgdGhpcy5GT0NVU19ERUJPVU5DRV9NUyk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQWN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogU2VjdWVuY2lhIGNvbXBsZXRhIGRlIGFjdGl2YWNpw7NuLlxuICAgKlxuICAgKiBUb2RhIGxhIG1lY8OhbmljYSAocGVybWlzc2lvbiDihpIgU1cgcmVhZHkg4oaSIGdldFRva2VuIGNvbiByZXRyeSDihpIgd2F0Y2hkb2cgZGVcbiAgICogYXV0by1yZWxvYWQpIHZpdmUgZW4gYE1lc3NhZ2luZ1NlcnZpY2UuZW5hYmxlKClgIGRlIGxhIGxpYi4gRWwgcGFzbyBkZVxuICAgKiByZWdpc3RybyBkZWwgZGV2aWNlIGVuIGVsIGJhY2tlbmQgc2UgcGFzYSBjb21vIGNhbGxiYWNrIChgcmVnaXN0ZXJEZXZpY2VgKVxuICAgKiBwb3JxdWUgbGEgbGliIG5vIHB1ZWRlIGRlcGVuZGVyIGRlIGBBdXRoU2VydmljZWAgc2luIGNyZWFyIHVuIGNpY2xvLlxuICAgKlxuICAgKiBgZW5hYmxlKClgIG5vIGhhY2UgdGhyb3c6IHJlc3VlbHZlIGNvbiB1biBgRW5hYmxlUHVzaFJlc3VsdGAgZGVzY3JpcHRpdm8uXG4gICAqL1xuICBhc3luYyBvbkVuYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9idXN5LnNldCgnZW5hYmxpbmcnKTtcbiAgICB0aGlzLl9sYXN0RmFpbGVkLnNldChmYWxzZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0OiBFbmFibGVQdXNoUmVzdWx0ID0gYXdhaXQgdGhpcy5tZXNzYWdpbmcuZW5hYmxlKHtcbiAgICAgICAgcmVnaXN0ZXJEZXZpY2U6IHRva2VuID0+IHRoaXMuYXV0aC5yZWdpc3RlckRldmljZSh0b2tlbikudGhlbihyID0+IHIucmVnaXN0ZXJlZCksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdlbmFibGVkJykge1xuICAgICAgICAvLyBQZXJzaXN0aXIgZmxhZyBtYXN0ZXIgc2kgYcO6biBubyBlc3RhYmEgYWN0aXZvLlxuICAgICAgICBpZiAoIXRoaXMucHJlZnMubm90aWZpY2F0aW9uc01hc3RlcigpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcmVmcy5zZXROb3RpZmljYXRpb25zTWFzdGVyKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICAgICAgbWVzc2FnZTogdGhpcy50dCgnZW5hYmxlU3VjY2VzcycpLFxuICAgICAgICAgIGR1cmF0aW9uOiAyMDAwLFxuICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNvbHZlZENvbmZpZygpLm9uUHVzaEVuYWJsZWQ/LigpO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQuc3RhdHVzID09PSAndGltZW91dCcgJiYgcmVzdWx0LnJlbG9hZGVkKSB7XG4gICAgICAgIC8vIExhIGxpYiBkaXNwYXLDsyBlbCBhdXRvLXJlbG9hZCDigJQgbGEgcMOhZ2luYSBlc3TDoSBwb3IgcmVjYXJnYXJzZS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZGVuaWVkIC8gdW5zdXBwb3J0ZWQgLyBlcnJvciAvIHRpbWVvdXQgc2luIHJlbG9hZCDihpIgZmFsbG8gcmVjdXBlcmFibGUuXG4gICAgICAgIHRoaXMuX2xhc3RGYWlsZWQuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudHQoJ2Vycm9yR2VuZXJpYycpLFxuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGBlbmFibGUoKWAgbm8gaGFjZSB0aHJvdywgcGVybyBlbCBjYWxsYmFjayBkZSByZWdpc3RybyBzw60gcHVlZGUuXG4gICAgICB0aGlzLl9sYXN0RmFpbGVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudHQoJ2Vycm9yR2VuZXJpYycpLFxuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIMOabmljbyByZWZyZXNoIGZpbmFsOiByZS1hbGluZWEgZWwgdG9nZ2xlIFVOQSBzb2xhIHZleiBjb24gZWwgZXN0YWRvIHJlYWwuXG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hCcm93c2VyU3RhdGUoKTtcbiAgICAgIHRoaXMuX2J1c3kuc2V0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uRGlzYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9idXN5LnNldCgnZGlzYWJsaW5nJyk7XG4gICAgdGhpcy5fbGFzdEZhaWxlZC5zZXQoZmFsc2UpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0aC5kaXNhYmxlTm90aWZpY2F0aW9ucygpO1xuICAgICAgaWYgKHRoaXMucHJlZnMubm90aWZpY2F0aW9uc01hc3RlcigpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJlZnMuc2V0Tm90aWZpY2F0aW9uc01hc3RlcihmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnR0KCdkaXNhYmxlU3VjY2VzcycpLFxuICAgICAgICBkdXJhdGlvbjogMjAwMCxcbiAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlc29sdmVkQ29uZmlnKCkub25QdXNoRGlzYWJsZWQ/LigpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5fbGFzdEZhaWxlZC5zZXQodHJ1ZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEJyb3dzZXJTdGF0ZSgpO1xuICAgICAgdGhpcy5fYnVzeS5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlaW50ZW50YXIgbGEgc2VjdWVuY2lhIGNvbXBsZXRhIGRlIGFjdGl2YWNpw7NuLCBzaW4gaW1wb3J0YXIgZWwgZXN0YWRvIGFjdHVhbC4gKi9cbiAgYXN5bmMgb25SZXRyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9sYXN0RmFpbGVkLnNldChmYWxzZSk7XG4gICAgYXdhaXQgdGhpcy5vbkVuYWJsZSgpO1xuICB9XG5cbiAgdG9nZ2xlRGV0YWlscygpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dEZXRhaWxzLnVwZGF0ZSh2ID0+ICF2KTtcbiAgfVxuXG4gIGFzeW5jIGNvcHlUb2tlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuKCk7XG4gICAgaWYgKCF0b2tlbikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0b2tlbik7XG4gICAgICB0aGlzLnRvYXN0LnNob3coeyBtZXNzYWdlOiB0aGlzLnR0KCdkZXRhaWxzQ29waWVkJyksIGNvbG9yOiAnZGFyaycgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDbGlwYm9hcmQgQVBJIG5vIGRpc3BvbmlibGUvZGVuZWdhZGEg4oCUIGZhbGxiYWNrIHNpbGVuY2lvc28sIHNpbiB0b2FzdCBkZSBlcnJvci5cbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUHJpdmFkb3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoQnJvd3NlclN0YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaXNTdXBwb3J0ZWQuc2V0KGF3YWl0IHRoaXMubWVzc2FnaW5nLmlzU3VwcG9ydGVkKCkpO1xuICAgIHRoaXMucGVybWlzc2lvbi5zZXQodGhpcy5hdXRoLmdldE5vdGlmaWNhdGlvblBlcm1pc3Npb25TdGF0ZSgpKTtcbiAgICB0aGlzLmN1cnJlbnRUb2tlbi5zZXQodGhpcy5tZXNzYWdpbmcuY3VycmVudFRva2VuID8/IG51bGwpO1xuICAgIHZvaWQgdGhpcy5yZXBhaXJUb2tlbklmTmVlZGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwYXJhIGVsIHRva2VuIEZDTSBlbiBiYWNrZ3JvdW5kLlxuICAgKlxuICAgKiBTaSBlbCB1c3VhcmlvIHRpZW5lIHB1c2ggYWN0aXZvIChgbWFzdGVyICYmIGdyYW50ZWRgKSBwZXJvIG5vIGhheSB0b2tlbiBlblxuICAgKiBtZW1vcmlhIOKAlCBjYXNvIHTDrXBpY28gdHJhcyB1biBjb2xkIHN0YXJ0IGRlIGxhIFBXQSDigJQgcmUtb2J0ZW5lbW9zIGVsIHRva2VuXG4gICAqIHkgcmUtcmVnaXN0cmFtb3MgZWwgZGV2aWNlIHNpbiB0b2NhciBlbCB0b2dnbGUgbmkgbW9zdHJhciB1biBlcnJvclxuICAgKiBhbGFybWlzdGEuIEVsIHRva2VuIGVzIHVuIGRldGFsbGUgZGUgaW1wbGVtZW50YWNpw7NuIHJlcGFyYWJsZSwgbm8gcGFydGUgZGVsXG4gICAqIGVzdGFkbyBkZSBVSSAodmVyIGBpc0VuYWJsZWRgKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVwYWlyVG9rZW5JZk5lZWRlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fYnVzeSgpICE9PSBudWxsKSByZXR1cm47XG4gICAgaWYgKHRoaXMuX3JlcGFpcmluZ1Rva2VuKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY3VycmVudFRva2VuKCkpIHJldHVybjtcblxuICAgIHRoaXMuX3JlcGFpcmluZ1Rva2VuID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLm1lc3NhZ2luZy5nZXRUb2tlbigpO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLnNldCh0b2tlbik7XG4gICAgICAgIGF3YWl0IHRoaXMuYXV0aC5yZWdpc3RlckRldmljZSh0b2tlbik7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBSZXBhcmFjacOzbiBiZXN0LWVmZm9ydDogbm8gZGVncmFkYW1vcyBlbCB0b2dnbGUgbmkgbW9zdHJhbW9zIGVycm9yLlxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9yZXBhaXJpbmdUb2tlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBpT1MgYnJvd3NlciBzaW4gZXN0YXIgaW5zdGFsYWRvIGNvbW8gUFdBIOKAlCBwdXNoIHdlYiBubyBkaXNwb25pYmxlLlxuICAgKiBBcGxpY2EgYSBTYWZhcmkgeSBhIEVkZ2UvQ2hyb21lL0ZpcmVmb3ggZW4gaU9TICh0b2RvcyBXZWJLaXQgcG9yIG1hbmRhdG8gQXBwbGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3ROZWVkc0lPU0luc3RhbGwoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcbiAgICBjb25zdCBpc0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KHVhKTtcbiAgICBpZiAoIWlzSU9TKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgaXNTdGFuZGFsb25lID1cbiAgICAgIHdpbmRvdy5tYXRjaE1lZGlhPy4oJyhkaXNwbGF5LW1vZGU6IHN0YW5kYWxvbmUpJykubWF0Y2hlcyB8fFxuICAgICAgKG5hdmlnYXRvciBhcyB1bmtub3duIGFzIHsgc3RhbmRhbG9uZT86IGJvb2xlYW4gfSkuc3RhbmRhbG9uZSA9PT0gdHJ1ZTtcbiAgICByZXR1cm4gIWlzU3RhbmRhbG9uZTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0dChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgdGhpcy5ucyk7XG4gIH1cbn1cbiJdfQ==
704
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLXByZWZlcmVuY2VzLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMtdmlldy9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLG9CQUFvQixFQUNwQixjQUFjLEdBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUUzRixPQUFPLEVB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QUFvQiwwRkFDcEIsZUFBZSwwR0FDZixnQkFBZ0IsMkVBQ2hCLGNBQWMseUVBQ2QsYUFBYSx3RUFDYixrQkFBa0I7OzRGQWtTVCxvQ0FBb0M7a0JBNVNoRCxTQUFTOytCQUNFLG1DQUFtQyxjQUNqQyxJQUFJLFdBQ1A7d0JBQ1AsT0FBTzt3QkFDUCxvQkFBb0I7d0JBQ3BCLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGFBQWE7d0JBQ2Isa0JBQWtCO3FCQUNuQixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBIVDt3REF3TFEsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElvbkljb24gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHtcbiAgYWxlcnRDaXJjbGVPdXRsaW5lLFxuICBjaGV2cm9uRG93bk91dGxpbmUsXG4gIGNoZXZyb25VcE91dGxpbmUsXG4gIGNsb3NlQ2lyY2xlT3V0bGluZSxcbiAgbm90aWZpY2F0aW9uc09mZk91dGxpbmUsXG4gIG5vdGlmaWNhdGlvbnNPdXRsaW5lLFxuICByZWZyZXNoT3V0bGluZSxcbn0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9jb250YWluZXIvY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaXNwbGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGV4dC90ZXh0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaXRsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3RpdGxlL3RpdGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb2dnbGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy90b2dnbGUtaW5wdXQvdG9nZ2xlLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb2dnbGVJbnB1dE1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL3RvZ2dsZS1pbnB1dC90eXBlcyc7XG5pbXBvcnQgeyBCdXR0b25NZXRhZGF0YSwgQ29tcG9uZW50U3RhdGVzIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblBlcm1pc3Npb25TdGF0ZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgRW5hYmxlUHVzaFJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2ZpcmViYXNlL3R5cGVzJztcbmltcG9ydCB7IE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9maXJlYmFzZS9tZXNzYWdpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9uYXZpZ2F0aW9uL25hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQYWdlUmVmcmVzaFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYWdlLXJlZnJlc2gvcGFnZS1yZWZyZXNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXMuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90b2FzdC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgTm90aWZpY2F0aW9uUHJlZmVyZW5jZXNWaWV3Q29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBOT1RJRklDQVRJT05fUFJFRkVSRU5DRVNfVklFV19JMThOIH0gZnJvbSAnLi9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMtdmlldy5pMThuJztcblxuYWRkSWNvbnMoe1xuICBhbGVydENpcmNsZU91dGxpbmUsXG4gIGNoZXZyb25Eb3duT3V0bGluZSxcbiAgY2hldnJvblVwT3V0bGluZSxcbiAgY2xvc2VDaXJjbGVPdXRsaW5lLFxuICBub3RpZmljYXRpb25zT2ZmT3V0bGluZSxcbiAgbm90aWZpY2F0aW9uc091dGxpbmUsXG4gIHJlZnJlc2hPdXRsaW5lLFxufSk7XG5cbmNvbnN0IERFRkFVTFRfTkFNRVNQQUNFID0gJ1NldHRpbmdzLk5vdGlmaWNhdGlvbnMnO1xuXG4vKipcbiAqIEVzdGFkb3MgZGUgbGEgdmlzdGEgZGUgcHJlZmVyZW5jaWFzIHB1c2g6XG4gKiAgLSBgaWRsZWA6ICAgICAgICAgIHRvZ2dsZSBvZmYsIHNpbiBvcGVyYWNpw7NuIGVuIGN1cnNvLCBzaW4gZXJyb3Jlc1xuICogIC0gYGVuYWJsaW5nYDogICAgICBzZWN1ZW5jaWEgZGUgYWN0aXZhY2nDs24gZW4gY3Vyc28gKHRvZ2dsZSBzcGlubmVyKVxuICogIC0gYGVuYWJsZWRgOiAgICAgICB0b2RvIE9LIChtYXN0ZXI9dHJ1ZSArIHBlcm1pc3Npb249Z3JhbnRlZCArIHRva2VuIHJlZ2lzdHJhZG8pXG4gKiAgLSBgZGlzYWJsaW5nYDogICAgIGRlc2FjdGl2YWNpw7NuIGVuIGN1cnNvXG4gKiAgLSBgZXJyb3JgOiAgICAgICAgIMO6bHRpbW8gaW50ZW50byBmYWxsw7Mg4oaSIG1lbnNhamUgKyBib3TDs24gXCJSZWludGVudGFyXCJcbiAqICAtIGBibG9ja2VkYDogICAgICAgbmF2ZWdhZG9yIGRlbmVnw7MgcGVybWlzb3Mg4oaSIG1lbnNhamUgKyBjw7NtbyBhcnJlZ2xhclxuICogIC0gYHVuc3VwcG9ydGVkYDogICBuYXZlZ2Fkb3Igbm8gc29wb3J0YSBGQ00g4oaSIG1lbnNhamVcbiAqICAtIGBuZWVkcy1pbnN0YWxsYDogaU9TIHNpbiBzdGFuZGFsb25lIOKGkiBpbnN0cnVjY2lvbmVzIGRlIGluc3RhbGFjacOzbiBQV0FcbiAqL1xudHlwZSBVaVN0YXRlID0gJ2lkbGUnIHwgJ2VuYWJsaW5nJyB8ICdlbmFibGVkJyB8ICdkaXNhYmxpbmcnIHwgJ2Vycm9yJyB8ICdibG9ja2VkJyB8ICd1bnN1cHBvcnRlZCcgfCAnbmVlZHMtaW5zdGFsbCc7XG5cbi8qKlxuICogYHZhbC1ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMtdmlld2Ag4oCUICoqcHJlZmVyZW5jaWFzIGRlIG5vdGlmaWNhY2lvbmVzIHB1c2gqKlxuICogKEZDTSkgZnVsbC1mZWF0dXJlIGF1dG9jb250ZW5pZGEgKG9yZ2FuaXNtKS4gUHJvbW92aWRhIGRlc2RlIGBzaG93Y2FzZWAgYmFqbyBlbFxuICogcHJvY2VzbyBkZSBBRFItMDIxLlxuICpcbiAqIFNlcGFyYWRhIGRlIGB2YWwtbm90aWZpY2F0aW9ucy12aWV3YCAoZWwgaW5ib3ggLyBmZWVkKS4gQXF1w60gZWwgdXNlciAqKmFjdGl2YSBvXG4gKiBkZXNhY3RpdmEqKiBsYXMgbm90aWZpY2FjaW9uZXMgcHVzaCBlbiBlc3RlIGRpc3Bvc2l0aXZvLlxuICpcbiAqIFVYIHNpbXBsaWZpY2FkbzogVU4gc29sbyB0b2dnbGUgcXVlIGVqZWN1dGEgdG9kYSBsYSBzZWN1ZW5jaWEgKHBlZGlyIHBlcm1pc28g4oaSXG4gKiBTVyByZWFkeSDihpIgZ2V0VG9rZW4g4oaSIHJlZ2lzdHJhciBlbiBiYWNrZW5kIOKGkiBzZXQgbWFzdGVyIHByZWYpIHbDrWFcbiAqIGBNZXNzYWdpbmdTZXJ2aWNlLmVuYWJsZSgpYC4gRWwgcmVnaXN0cm8gZGVsIGRldmljZSBlbiBlbCBiYWNrZW5kIHZhIGNvbW9cbiAqIGNhbGxiYWNrIChsYSBsaWIgbm8gZGVwZW5kZSBkZSBgQXV0aFNlcnZpY2VgIHBhcmEgZXZpdGFyIGNpY2xvcykuIE1lbnNhamVzXG4gKiBjb250ZXh0dWFsZXMgeSBib3TDs24gXCJSZWludGVudGFyXCIgYXBhcmVjZW4gc29sbyBjdWFuZG8gYXBsaWNhbi5cbiAqXG4gKiBOTyByZW5kZXJpemEgaW9uLWNvbnRlbnQg4oCUIHZpdmUgZGVudHJvIGRlIHZhbC1wYWdlLXdyYXBwZXIuIGBBY3RpdmF0ZWRSb3V0ZWAgc2VcbiAqIGlueWVjdGEgYHsgb3B0aW9uYWw6IHRydWUgfWAg4oaSIGZ1bmNpb25hIHNpbiByb3V0ZXIgKGVtYmViaWRhIC8gU3Rvcnlib29rKS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLW5vdGlmaWNhdGlvbi1wcmVmZXJlbmNlcy12aWV3JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIElvbkljb24sXG4gICAgVG9nZ2xlSW5wdXRDb21wb25lbnQsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gICAgVGl0bGVDb21wb25lbnQsXG4gICAgVGV4dENvbXBvbmVudCxcbiAgICBDb250YWluZXJDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPHZhbC1jb250YWluZXIgW3Byb3BzXT1cInsgc2l6ZTogJ21kJywgcGFkZGluZzogJ25vbmUnIH1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYWdlXCI+XG4gICAgICAgIDxoZWFkZXIgY2xhc3M9XCJwYWdlLWhlYWRlclwiPlxuICAgICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwieyBzaXplOiAnc21hbGwnLCBjb2xvcjogJ2RhcmsnLCBjb250ZW50OiBwYWdlVGl0bGUoKSB9XCIgLz5cbiAgICAgICAgICA8dmFsLXRpdGxlXG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICBzaXplOiAnbGFyZ2UnLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgY29udGVudDogcGFnZURlc2NyaXB0aW9uKCksXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICBAaWYgKHN0YXRlKCkgPT09ICduZWVkcy1pbnN0YWxsJykge1xuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2V0dGluZ3Mtc2VjdGlvblwiPlxuICAgICAgICAgICAgPHZhbC10aXRsZVxuICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0dCgnaW9zSW5zdGFsbFRpdGxlJyksXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWJvZHlcIj5cbiAgICAgICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogJ21lZGl1bScsXG4gICAgICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHR0KCdpb3NJbnN0YWxsSGludCcpLFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8b2wgY2xhc3M9XCJpbnN0YWxsLXN0ZXBzXCI+XG4gICAgICAgICAgICAgICAgPGxpPnt7IHR0KCdpb3NJbnN0YWxsU3RlcDEnKSB9fTwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPnt7IHR0KCdpb3NJbnN0YWxsU3RlcDInKSB9fTwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPnt7IHR0KCdpb3NJbnN0YWxsU3RlcDMnKSB9fTwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPnt7IHR0KCdpb3NJbnN0YWxsU3RlcDQnKSB9fTwvbGk+XG4gICAgICAgICAgICAgIDwvb2w+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIH1cblxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cInNldHRpbmdzLXNlY3Rpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibm90aWYtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm90aWYtcm93X19pY29uXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwibm90aWZpY2F0aW9ucy1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLXJvd19fYm9keVwiPlxuICAgICAgICAgICAgICA8dmFsLXRpdGxlXG4gICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBjb250ZW50OiB0dCgnc2ltcGxlVGl0bGUnKSxcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogJ21lZGl1bScsXG4gICAgICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHR0KCdzaW1wbGVEZXNjcmlwdGlvbicpLFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICBAaWYgKGJ1c3lMYWJlbCgpOyBhcyBsYWJlbCkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm90aWYtcm93X19idXN5XCI+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLXJvd19fY29udHJvbFwiPlxuICAgICAgICAgICAgICA8dmFsLXRvZ2dsZS1pbnB1dCBbcHJvcHNdPVwidG9nZ2xlUHJvcHMoKVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAoY29udGV4dE1lc3NhZ2UoKTsgYXMgbXNnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnRcIiBbY2xhc3NdPVwiJ2FsZXJ0LS0nICsgYWxlcnRWYXJpYW50KClcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIFtuYW1lXT1cImFsZXJ0SWNvbigpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgbXNnIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChzdGF0ZSgpID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPHZhbC1idXR0b24gW3Byb3BzXT1cInJldHJ5QnV0dG9uUHJvcHMoKVwiIChjbGljayk9XCJvblJldHJ5KClcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgQGlmIChyZXNvbHZlZENvbmZpZygpLnNob3dEZXRhaWxzICYmIHN0YXRlKCkgIT09ICduZWVkcy1pbnN0YWxsJyAmJiBzdGF0ZSgpICE9PSAndW5zdXBwb3J0ZWQnKSB7XG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZXR0aW5ncy1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGV0YWlscy10b2dnbGVcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZURldGFpbHMoKVwiPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBzaG93RGV0YWlscygpID8gdHQoJ2RldGFpbHNIaWRlJykgOiB0dCgnZGV0YWlsc1Nob3cnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIFtuYW1lXT1cInNob3dEZXRhaWxzKCkgPyAnY2hldnJvbi11cC1vdXRsaW5lJyA6ICdjaGV2cm9uLWRvd24tb3V0bGluZSdcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICBAaWYgKHNob3dEZXRhaWxzKCkpIHtcbiAgICAgICAgICAgICAgPGRsIGNsYXNzPVwiZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzX19yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxkdD57eyB0dCgnZGV0YWlsc1Rva2VuJykgfX08L2R0PlxuICAgICAgICAgICAgICAgICAgPGRkIGNsYXNzPVwiZGV0YWlsc19fdG9rZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdG9rZW5QcmV2aWV3KCkgPz8gdHQoJ2RldGFpbHNOb25lJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY3VycmVudFRva2VuKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGV0YWlsc19fY29weVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY29weVRva2VuKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHR0KCdkZXRhaWxzQ29weScpIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHNfX3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgPGR0Pnt7IHR0KCdkaWFnbm9zdGljc1Blcm1pc3Npb24nKSB9fTwvZHQ+XG4gICAgICAgICAgICAgICAgICA8ZGQ+e3sgcGVybWlzc2lvbigpIH19PC9kZD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsc19fcm93XCI+XG4gICAgICAgICAgICAgICAgICA8ZHQ+e3sgdHQoJ2RpYWdub3N0aWNzU3VwcG9ydGVkJykgfX08L2R0PlxuICAgICAgICAgICAgICAgICAgPGRkPnt7IGlzU3VwcG9ydGVkKCkgPyAn4pyTJyA6ICfinJcnIH19PC9kZD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kbD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvdmFsLWNvbnRhaW5lcj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLyogQW5jaG8geSBjcmVjaW1pZW50byBjb24gZWwgcmFpbCBjb2xhcHNhZG8gbG9zIGRhIHZhbC1jb250YWluZXIgKHNpemVcbiAgICAgICAgICdtZCcpLCBubyBDU1MgbG9jYWw6IHZlciBjb250YWluZXIuY29tcG9uZW50LnNjc3MuICovXG4gICAgICAucGFnZSB7XG4gICAgICAgIHBhZGRpbmc6IDE2cHggMDtcbiAgICAgIH1cbiAgICAgIC5wYWdlLWhlYWRlciB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICAgIH1cbiAgICAgIC5zZXR0aW5ncy1zZWN0aW9uIHtcbiAgICAgICAgcGFkZGluZzogMTZweCAwO1xuICAgICAgfVxuICAgICAgLnNldHRpbmdzLXNlY3Rpb24gKyAuc2V0dGluZ3Mtc2VjdGlvbiB7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS12YWwtYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTtcbiAgICAgIH1cbiAgICAgIC5zZWN0aW9uLWJvZHkge1xuICAgICAgICBtYXJnaW4tdG9wOiAxNnB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEwcHg7XG4gICAgICB9XG4gICAgICAucm93LWFjdGlvbnMge1xuICAgICAgICBtYXJnaW4tdG9wOiAxMnB4O1xuICAgICAgfVxuXG4gICAgICAubm90aWYtcm93IHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0NHB4IDFmciBhdXRvO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB9XG4gICAgICAubm90aWYtcm93X19pY29uIHtcbiAgICAgICAgd2lkdGg6IDQ0cHg7XG4gICAgICAgIGhlaWdodDogNDRweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItbGlnaHQsIHJnYmEoMCwgMCwgMCwgMC4wNikpO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIH1cbiAgICAgIC5ub3RpZi1yb3dfX2ljb24gaW9uLWljb24ge1xuICAgICAgICBmb250LXNpemU6IDIycHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFyaywgIzFhMWExYSk7XG4gICAgICB9XG4gICAgICAubm90aWYtcm93X19ib2R5IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA0cHg7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIH1cbiAgICAgIC5ub3RpZi1yb3dfX2J1c3kge1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICB9XG4gICAgICAubm90aWYtcm93X19jb250cm9sIHtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICB9XG5cbiAgICAgIC5hbGVydCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogMTBweDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIG1hcmdpbi10b3A6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMTRweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40NTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuMDQpKTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYXJrLCAjMWExYTFhKTtcbiAgICAgIH1cbiAgICAgIC5hbGVydCBpb24taWNvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICAgIG1hcmdpbi10b3A6IDFweDtcbiAgICAgIH1cbiAgICAgIC5hbGVydC0td2FybmluZyBpb24taWNvbiB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3Itd2FybmluZy1zaGFkZSwgI2M3OWUwOCk7XG4gICAgICB9XG4gICAgICAuYWxlcnQtLWRhbmdlciBpb24taWNvbiB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFuZ2VyLXNoYWRlLCAjY2YzYzRmKTtcbiAgICAgIH1cbiAgICAgIC5hbGVydC0taW5mbyBpb24taWNvbiB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjNmI2YjZiKTtcbiAgICAgIH1cblxuICAgICAgLmluc3RhbGwtc3RlcHMge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS42O1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICMxYTFhMWEpO1xuICAgICAgfVxuICAgICAgLmluc3RhbGwtc3RlcHMgbGkgKyBsaSB7XG4gICAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICAgIH1cblxuICAgICAgLmRldGFpbHMtdG9nZ2xlIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA2cHg7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzZiNmI2Yik7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICAgIC5kZXRhaWxzLXRvZ2dsZSBpb24taWNvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIH1cbiAgICAgIC5kZXRhaWxzIHtcbiAgICAgICAgbWFyZ2luOiAxMnB4IDAgMDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA2cHg7XG4gICAgICB9XG4gICAgICAuZGV0YWlsc19fcm93IHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxNDBweCAxZnI7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gICAgICB9XG4gICAgICAuZGV0YWlsc19fcm93IGR0IHtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzZiNmI2Yik7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjRweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIH1cbiAgICAgIC5kZXRhaWxzX19yb3cgZGQge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFyaywgIzFhMWExYSk7XG4gICAgICAgIGZvbnQtZmFtaWx5OiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBtb25vc3BhY2U7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsO1xuICAgICAgfVxuICAgICAgLmRldGFpbHNfX3Rva2VuIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgfVxuICAgICAgLmRldGFpbHNfX2NvcHkge1xuICAgICAgICBmbGV4LXNocmluazogMDtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5LCAjMDA1NGU5KTtcbiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICAgIC5kZXRhaWxzX19jb3B5OmhvdmVyIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uUHJlZmVyZW5jZXNWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIG5hdiA9IGluamVjdChOYXZpZ2F0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgdG9hc3QgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBtZXNzYWdpbmcgPSBpbmplY3QoTWVzc2FnaW5nU2VydmljZSk7XG4gIHByaXZhdGUgcGFnZVJlZnJlc2ggPSBpbmplY3QoUGFnZVJlZnJlc2hTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgcHJlZnMgPSBpbmplY3QoUHJlZmVyZW5jZXNTZXJ2aWNlKTtcbiAgLy8gYEFjdGl2YXRlZFJvdXRlYCBvcGNpb25hbCDihpIgbGEgdmlzdGEgZnVuY2lvbmEgZW1iZWJpZGEgLyBlbiBTdG9yeWJvb2sgc2luXG4gIC8vIHJvdXRlciAoc29sbyBsbyB1c2EgcGFyYSBsZWVyIGVsIHJvdXRlIGRhdGEgZGUgY29uZmlnIGNvbW8gZmFsbGJhY2spLlxuICBwcml2YXRlIHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIC8qKlxuICAgKiBDb25maWcgdsOtYSBASW5wdXQgKG9iamVjdC1maXJzdCkuIFNpIG5vIHNlIHBhc2EsIHNlIGNhZSBhbCByb3V0ZSBkYXRhXG4gICAqIGBub3RpZmljYXRpb25QcmVmZXJlbmNlc0NvbmZpZ2AgKHBvYmxhZG8gcG9yXG4gICAqIGBwcm92aWRlVmFsdGVjaE5vdGlmaWNhdGlvblByZWZlcmVuY2VzUm91dGVzYCkuIGByZXNvbHZlZENvbmZpZ2AgbWVyZ2VhIGNvblxuICAgKiBsb3MgZGVmYXVsdHMg4oCUIGBASW5wdXRgIGdhbmEgc29icmUgcm91dGUgZGF0YS5cbiAgICovXG4gIEBJbnB1dCgpIGNvbmZpZz86IE5vdGlmaWNhdGlvblByZWZlcmVuY2VzVmlld0NvbmZpZztcblxuICByZWFkb25seSByZXNvbHZlZENvbmZpZyA9IGNvbXB1dGVkPFxuICAgIFJlcXVpcmVkPE9taXQ8Tm90aWZpY2F0aW9uUHJlZmVyZW5jZXNWaWV3Q29uZmlnLCAnb25QdXNoRW5hYmxlZCcgfCAnb25QdXNoRGlzYWJsZWQnPj4gJlxuICAgICAgUGljazxOb3RpZmljYXRpb25QcmVmZXJlbmNlc1ZpZXdDb25maWcsICdvblB1c2hFbmFibGVkJyB8ICdvblB1c2hEaXNhYmxlZCc+XG4gID4oKCkgPT4ge1xuICAgIGNvbnN0IGZyb21Sb3V0ZSA9ICh0aGlzLnJvdXRlPy5zbmFwc2hvdC5kYXRhWydub3RpZmljYXRpb25QcmVmZXJlbmNlc0NvbmZpZyddID8/XG4gICAgICB7fSkgYXMgTm90aWZpY2F0aW9uUHJlZmVyZW5jZXNWaWV3Q29uZmlnO1xuICAgIGNvbnN0IG1lcmdlZDogTm90aWZpY2F0aW9uUHJlZmVyZW5jZXNWaWV3Q29uZmlnID0geyAuLi5mcm9tUm91dGUsIC4uLih0aGlzLmNvbmZpZyA/PyB7fSkgfTtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd0RldGFpbHM6IG1lcmdlZC5zaG93RGV0YWlscyA/PyB0cnVlLFxuICAgICAgaTE4bk5hbWVzcGFjZTogbWVyZ2VkLmkxOG5OYW1lc3BhY2UgPz8gREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgICBvblB1c2hFbmFibGVkOiBtZXJnZWQub25QdXNoRW5hYmxlZCxcbiAgICAgIG9uUHVzaERpc2FibGVkOiBtZXJnZWQub25QdXNoRGlzYWJsZWQsXG4gICAgfTtcbiAgfSk7XG5cbiAgLyoqIE5hbWVzcGFjZSBpMThuIHJlc3VlbHRvIChjYXB0dXJhZG8gcGFyYSBsbGFtYWRhcyBuby1yZWFjdGl2YXMpLiAqL1xuICBwcml2YXRlIGdldCBucygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnKCkuaTE4bk5hbWVzcGFjZTtcbiAgfVxuXG4gIC8qKiBPcGVyYWNpw7NuIGVuIGN1cnNvIChnb2JpZXJuYSBzcGlubmVyIGRlbCB0b2dnbGUgKyBsYWJlbCBcIkFjdGl2YW5kb+KAplwiKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfYnVzeSA9IHNpZ25hbDxudWxsIHwgJ2VuYWJsaW5nJyB8ICdkaXNhYmxpbmcnPihudWxsKTtcbiAgLyoqIFRydWUgc2kgZWwgw7psdGltbyBpbnRlbnRvIGZhbGzDsyDigJQgZ29iaWVybmEgZXN0YWRvIGBlcnJvcmAgKyByZXRyeSBidXR0b24uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xhc3RGYWlsZWQgPSBzaWduYWwoZmFsc2UpO1xuICAvKiogVHJ1ZSBtaWVudHJhcyBzZSByZS1vYnRpZW5lIGVsIHRva2VuIEZDTSBlbiBiYWNrZ3JvdW5kIChubyBhZmVjdGEgbGEgVUkpLiAqL1xuICBwcml2YXRlIF9yZXBhaXJpbmdUb2tlbiA9IGZhbHNlO1xuICAvKiogVG9nZ2xlIGRlbCBleHBhbmQgZGUgZGV0YWxsZXMgdMOpY25pY29zLiAqL1xuICByZWFkb25seSBzaG93RGV0YWlscyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcmVhZG9ubHkgcGVybWlzc2lvbiA9IHNpZ25hbDxOb3RpZmljYXRpb25QZXJtaXNzaW9uU3RhdGU+KCdkZWZhdWx0Jyk7XG4gIHJlYWRvbmx5IGlzU3VwcG9ydGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgY3VycmVudFRva2VuID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBuZWVkc0lPU0luc3RhbGwgPSBzaWduYWwodGhpcy5kZXRlY3ROZWVkc0lPU0luc3RhbGwoKSk7XG5cbiAgLyoqIEZvcm1Db250cm9sIGRlbCB0b2dnbGUgKHN5bmMtZWFkbyBjb24gYGlzRW5hYmxlZGAgdmlhIGVmZmVjdCkuICovXG4gIHJlYWRvbmx5IHRvZ2dsZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2w8Ym9vbGVhbj4oZmFsc2UsIHtcbiAgICBub25OdWxsYWJsZTogdHJ1ZSxcbiAgfSk7XG5cbiAgLyoqIEhhbmRsZXIgZGVsIGxpc3RlbmVyIGBmb2N1c2Ag4oCUIHJlZmVyZW5jaWEgZ3VhcmRhZGEgcGFyYSBwb2RlciByZW1vdmVybG8uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb25XaW5kb3dGb2N1cyA9ICgpID0+IHRoaXMuc2NoZWR1bGVCcm93c2VyUmVmcmVzaCgpO1xuICAvKiogVGltZXIgZGVsIGRlYm91bmNlIGRlbCByZWZyZXNoIGRpc3BhcmFkbyBwb3IgYGZvY3VzYC4gKi9cbiAgcHJpdmF0ZSBmb2N1c0RlYm91bmNlVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBWZW50YW5hIGRlIGRlYm91bmNlIChtcykgcGFyYSBlbCByZWZyZXNoIGRpc3BhcmFkbyBwb3IgYGZvY3VzYC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBGT0NVU19ERUJPVU5DRV9NUyA9IDUwMDtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gRXN0YWRvIGRlcml2YWRvXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHJlYWRvbmx5IHBhZ2VUaXRsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMudHQoJ3BhZ2VUaXRsZScpKTtcbiAgcmVhZG9ubHkgcGFnZURlc2NyaXB0aW9uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50dCgncGFnZURlc2NyaXB0aW9uJykpO1xuXG4gIC8qKlxuICAgKiBFc3RhZG8gZWZlY3Rpdm8gZGVsIHRvZ2dsZTogXCJlbCB1c3VhcmlvIHRpZW5lIHB1c2ggYWN0aXZvXCIuXG4gICAqXG4gICAqIFNlIGRlcml2YSBTT0xPIGRlIGxhIGRlY2lzacOzbiBkZWwgdXN1YXJpbyAoYG1hc3RlcmApIHkgZGVsIHBlcm1pc28gZGVsIFNPXG4gICAqIChgcGVybWlzc2lvbmApLiBFbCB0b2tlbiBGQ00gTk8gZm9ybWEgcGFydGUgZGVsIGVzdGFkbyBkZSBVSTogdml2ZSBlblxuICAgKiBtZW1vcmlhLCBzZSBwaWVyZGUgZW4gY2FkYSByZWNhcmdhL3N1c3BlbnNpw7NuIGRlIGxhIFBXQSB5IHByb2R1Y2lyw61hIGZsaWNrZXIuXG4gICAqIFNpIGZhbHRhIHRva2VuIGNvbiBgbWFzdGVyICYmIGdyYW50ZWRgLCBlcyB1biBkZXRhbGxlIHJlcGFyYWJsZSBlblxuICAgKiBiYWNrZ3JvdW5kICh2ZXIgYHJlcGFpclRva2VuSWZOZWVkZWRgKSwgbm8gdW4gY2FtYmlvIGRlbCB0b2dnbGUuXG4gICAqL1xuICByZWFkb25seSBpc0VuYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnByZWZzLm5vdGlmaWNhdGlvbnNNYXN0ZXIoKSAmJiB0aGlzLnBlcm1pc3Npb24oKSA9PT0gJ2dyYW50ZWQnKTtcblxuICByZWFkb25seSBzdGF0ZSA9IGNvbXB1dGVkPFVpU3RhdGU+KCgpID0+IHtcbiAgICBpZiAodGhpcy5uZWVkc0lPU0luc3RhbGwoKSkgcmV0dXJuICduZWVkcy1pbnN0YWxsJztcbiAgICBpZiAodGhpcy5wZXJtaXNzaW9uKCkgPT09ICd1bnN1cHBvcnRlZCcgfHwgIXRoaXMuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgLy8gaU9TIHN0YW5kYWxvbmUgYcO6biBwdWVkZSBkYXIgaXNTdXBwb3J0ZWQgZmFsc2UgdGVtcHJhbm8gYW50ZXMgZGUgaW5pdCDigJRcbiAgICAgIC8vIHNvbG8gYmxvcXVlYW1vcyBzaSBlbCBicm93c2VyIGV4cGzDrWNpdGFtZW50ZSBubyBzb3BvcnRhIEFQSXMuXG4gICAgICBpZiAodGhpcy5wZXJtaXNzaW9uKCkgPT09ICd1bnN1cHBvcnRlZCcpIHJldHVybiAndW5zdXBwb3J0ZWQnO1xuICAgIH1cbiAgICBjb25zdCBidXN5ID0gdGhpcy5fYnVzeSgpO1xuICAgIGlmIChidXN5ID09PSAnZW5hYmxpbmcnKSByZXR1cm4gJ2VuYWJsaW5nJztcbiAgICBpZiAoYnVzeSA9PT0gJ2Rpc2FibGluZycpIHJldHVybiAnZGlzYWJsaW5nJztcbiAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuICdlbmFibGVkJztcbiAgICBpZiAodGhpcy5wZXJtaXNzaW9uKCkgPT09ICdkZW5pZWQnKSByZXR1cm4gJ2Jsb2NrZWQnO1xuICAgIGlmICh0aGlzLl9sYXN0RmFpbGVkKCkpIHJldHVybiAnZXJyb3InO1xuICAgIHJldHVybiAnaWRsZSc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGJ1c3lMYWJlbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzID0gdGhpcy5zdGF0ZSgpO1xuICAgIGlmIChzID09PSAnZW5hYmxpbmcnKSByZXR1cm4gdGhpcy50dCgnZW5hYmxpbmcnKTtcbiAgICBpZiAocyA9PT0gJ2Rpc2FibGluZycpIHJldHVybiB0aGlzLnR0KCdkaXNhYmxpbmcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgY29udGV4dE1lc3NhZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgc3dpdGNoICh0aGlzLnN0YXRlKCkpIHtcbiAgICAgIGNhc2UgJ3Vuc3VwcG9ydGVkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudHQoJ3Blcm1pc3Npb25VbnN1cHBvcnRlZCcpO1xuICAgICAgY2FzZSAnYmxvY2tlZCc6XG4gICAgICAgIHJldHVybiB0aGlzLnR0KCdwZXJtaXNzaW9uRGVuaWVkSW5mbycpO1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gdGhpcy50dCgnZXJyb3JHZW5lcmljJyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFsZXJ0VmFyaWFudCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzID0gdGhpcy5zdGF0ZSgpO1xuICAgIGlmIChzID09PSAnZXJyb3InIHx8IHMgPT09ICdibG9ja2VkJykgcmV0dXJuICd3YXJuaW5nJztcbiAgICBpZiAocyA9PT0gJ3Vuc3VwcG9ydGVkJykgcmV0dXJuICdkYW5nZXInO1xuICAgIHJldHVybiAnaW5mbyc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFsZXJ0SWNvbiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzID0gdGhpcy5zdGF0ZSgpO1xuICAgIGlmIChzID09PSAndW5zdXBwb3J0ZWQnKSByZXR1cm4gJ2Nsb3NlLWNpcmNsZS1vdXRsaW5lJztcbiAgICByZXR1cm4gJ2FsZXJ0LWNpcmNsZS1vdXRsaW5lJztcbiAgfSk7XG5cbiAgcmVhZG9ubHkgdG9nZ2xlUHJvcHMgPSBjb21wdXRlZDxUb2dnbGVJbnB1dE1ldGFkYXRhPigoKSA9PiAoe1xuICAgIGNvbnRyb2w6IHRoaXMudG9nZ2xlQ29udHJvbCxcbiAgICBjb2xvcjogJ3ByaW1hcnknLFxuICAgIGRpc2FibGVkOlxuICAgICAgdGhpcy5fYnVzeSgpICE9PSBudWxsIHx8XG4gICAgICB0aGlzLnN0YXRlKCkgPT09ICd1bnN1cHBvcnRlZCcgfHxcbiAgICAgIHRoaXMuc3RhdGUoKSA9PT0gJ25lZWRzLWluc3RhbGwnIHx8XG4gICAgICB0aGlzLnN0YXRlKCkgPT09ICdibG9ja2VkJyxcbiAgfSkpO1xuXG4gIHJlYWRvbmx5IHJldHJ5QnV0dG9uUHJvcHMgPSBjb21wdXRlZDxQYXJ0aWFsPEJ1dHRvbk1ldGFkYXRhPj4oKCkgPT4gKHtcbiAgICB0ZXh0OiB0aGlzLnR0KCdyZXRyeUN0YScpLFxuICAgIGNvbG9yOiAnZGFyaycsXG4gICAgZmlsbDogJ291dGxpbmUnLFxuICAgIHNpemU6ICdkZWZhdWx0JyxcbiAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICBpY29uOiB7IG5hbWU6ICdyZWZyZXNoLW91dGxpbmUnLCBzbG90OiAnc3RhcnQnIH0sXG4gICAgc3RhdGU6IHRoaXMuX2J1c3koKSAhPT0gbnVsbCA/IENvbXBvbmVudFN0YXRlcy5XT1JLSU5HIDogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gIH0pKTtcblxuICByZWFkb25seSB0b2tlblByZXZpZXcgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdCA9IHRoaXMuY3VycmVudFRva2VuKCk7XG4gICAgaWYgKCF0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYCR7dC5zbGljZSgwLCAyMil94oCmJHt0LnNsaWNlKC02KX1gO1xuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gTGlmZWN5Y2xlXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IG5zID0gdGhpcy5ucztcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cyhucywgTk9USUZJQ0FUSU9OX1BSRUZFUkVOQ0VTX1ZJRVdfSTE4Tik7XG4gICAgdGhpcy5uYXYuc2V0QmFja0hlYWRlcigncGFnZVRpdGxlJywgbnMsIHsgd2l0aE1lbnU6IHRydWUgfSk7XG5cbiAgICB2b2lkIHRoaXMucmVmcmVzaEJyb3dzZXJTdGF0ZSgpO1xuXG4gICAgLy8gUmUtYXBsaWNhciBoZWFkZXIgZW4gY2FtYmlvIGRlIGlkaW9tYS5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuaTE4bi5sYW5nKCk7XG4gICAgICAgIHRoaXMubmF2LnNldEJhY2tIZWFkZXIoJ3BhZ2VUaXRsZScsIHRoaXMubnMsIHsgd2l0aE1lbnU6IHRydWUgfSk7XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIC8vIFN5bmMgRm9ybUNvbnRyb2wg4oaQ4oaSIGVzdGFkbyBlZmVjdGl2by4gQ3VhbmRvIGVsIGVzdGFkbyBjYW1iaWEgKGNhbWJpbyBkZVxuICAgIC8vIHBlcm1pc3Npb24gcG9yIGVsIGJyb3dzZXIsIG8gc25hcHNob3QgRmlyZXN0b3JlIGRlIGBtYXN0ZXJgKSwgZWwgdG9nZ2xlIHNlXG4gICAgLy8gcmUtYWxpbmVhIGNvbiBsYSByZWFsaWRhZC5cbiAgICAvL1xuICAgIC8vIElNUE9SVEFOVEU6IHNlIGlnbm9yYW4gbG9zIGNhbWJpb3MgbWllbnRyYXMgaGF5IHVuYSBvcGVyYWNpw7NuIGVuIGN1cnNvXG4gICAgLy8gKGBfYnVzeSgpICE9PSBudWxsYCkuIER1cmFudGUgYG9uRW5hYmxlYC9gb25EaXNhYmxlYCBsYXMgc2XDsWFsZXMgZnVlbnRlIHNlXG4gICAgLy8gYWN0dWFsaXphbiBlbiBtb21lbnRvcyBkaXN0aW50b3MgeSBwcm9kdWNpcsOtYW4gZXN0YWRvcyBpbnRlcm1lZGlvcyDihpJcbiAgICAvLyBmbGlja2VyIHZpc2libGUuIEVsIHRvZ2dsZSBzZSByZS1hbGluZWEgVU5BIHNvbGEgdmV6IGVuIGVsIGBmaW5hbGx5YC5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVmZiA9IHRoaXMuaXNFbmFibGVkKCk7XG4gICAgICAgIGlmICh0aGlzLl9idXN5KCkgIT09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMudG9nZ2xlQ29udHJvbC52YWx1ZSAhPT0gZWZmKSB7XG4gICAgICAgICAgdGhpcy50b2dnbGVDb250cm9sLnNldFZhbHVlKGVmZiwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIC8vIEludGVyY2VwdGFyIGNsaWNrIGRlbCB1c2VyOiBlbCB0b2dnbGUgeWEgY2FtYmnDsyB2aXN1YWxtZW50ZSwgZWplY3V0YXJcbiAgICAvLyBsYSBhY2Npw7NuIGNvcnJlc3BvbmRpZW50ZS5cbiAgICB0aGlzLnRvZ2dsZUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2ID0+IHtcbiAgICAgIGlmICh0aGlzLl9idXN5KCkgIT09IG51bGwpIHJldHVybjtcbiAgICAgIGlmICh2ICYmICF0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIHZvaWQgdGhpcy5vbkVuYWJsZSgpO1xuICAgICAgfSBlbHNlIGlmICghdiAmJiB0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIHZvaWQgdGhpcy5vbkRpc2FibGUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERldGVjdGFyIHJlZ3Jlc28gYSBsYSBwZXN0YcOxYSDigJQgZWwgdXNlciBwdWRvIGhhYmVyIGNhbWJpYWRvIHBlcm1pc29zXG4gICAgLy8gZGVzZGUgbGEgY29uZmlnIGRlbCBicm93c2VyLiBFbCByZWZyZXNoIHZhIGNvbiBkZWJvdW5jZSBwYXJhIG5vXG4gICAgLy8gZGlzcGFyYXJzZSBlbiByw6FmYWdhcyAoZW4gUFdBIG1vYmlsZSBgZm9jdXNgIHNhbHRhIGNvbiBjYWRhIGNhbWJpbyBkZVxuICAgIC8vIGFwcCAvIGFwYXJpY2nDs24gZGVsIHRlY2xhZG8pLiBFbCBsaXN0ZW5lciBzZSByZW11ZXZlIGVuIG5nT25EZXN0cm95LlxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5vbldpbmRvd0ZvY3VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgZWwgcHVsbC10by1yZWZyZXNoIGVzdMOhbmRhci4gQXVucXVlIGVzdGEgdmlzdGEgbm8gbXVlc3RyYSB1bmFcbiAgICogbGlzdGEgcmVtb3RhLCBzw60gcmVmbGVqYSBlc3RhZG8gbXV0YWJsZSBkZWwgYnJvd3NlciAocGVybWlzbywgdG9rZW4sXG4gICAqIHNvcG9ydGUgRkNNKSBxdWUgcHVlZGUgY2FtYmlhciBmdWVyYSBkZSBsYSBhcHAg4oCUIGVsIHJlZnJlc2ggcmUtZXZhbMO6YSB0b2RvLlxuICAgKlxuICAgKiBTZSB1c2EgYG5nT25Jbml0YC9gbmdPbkRlc3Ryb3lgIChOTyBgaW9uVmlld1dpbGxFbnRlcmApIHBvcnF1ZVxuICAgKiBgdmFsLXBhZ2Utd3JhcHBlcmAgdXNhIGA8cm91dGVyLW91dGxldD5gIHBsYW5vIOKAlCBsb3MgaG9va3MgYGlvblZpZXcqYCBzb2xvXG4gICAqIGRpc3BhcmFuIGRlbnRybyBkZSBgPGlvbi1yb3V0ZXItb3V0bGV0PmAuXG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VSZWZyZXNoLnJlZ2lzdGVyKCgpID0+IHRoaXMucmVmcmVzaEJyb3dzZXJTdGF0ZSgpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucGFnZVJlZnJlc2gudW5yZWdpc3RlcigpO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5vbldpbmRvd0ZvY3VzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9jdXNEZWJvdW5jZVRpbWVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5mb2N1c0RlYm91bmNlVGltZXIpO1xuICAgICAgdGhpcy5mb2N1c0RlYm91bmNlVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWZyZXNjYSBlbCBlc3RhZG8gZGVsIGJyb3dzZXIgY29uIGRlYm91bmNlIOKAlCBldml0YSByw6FmYWdhcyBkZSBgZm9jdXNgLiAqL1xuICBwcml2YXRlIHNjaGVkdWxlQnJvd3NlclJlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9jdXNEZWJvdW5jZVRpbWVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5mb2N1c0RlYm91bmNlVGltZXIpO1xuICAgIH1cbiAgICB0aGlzLmZvY3VzRGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5mb2N1c0RlYm91bmNlVGltZXIgPSBudWxsO1xuICAgICAgdm9pZCB0aGlzLnJlZnJlc2hCcm93c2VyU3RhdGUoKTtcbiAgICB9LCB0aGlzLkZPQ1VTX0RFQk9VTkNFX01TKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBBY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBTZWN1ZW5jaWEgY29tcGxldGEgZGUgYWN0aXZhY2nDs24uXG4gICAqXG4gICAqIFRvZGEgbGEgbWVjw6FuaWNhIChwZXJtaXNzaW9uIOKGkiBTVyByZWFkeSDihpIgZ2V0VG9rZW4gY29uIHJldHJ5IOKGkiB3YXRjaGRvZyBkZVxuICAgKiBhdXRvLXJlbG9hZCkgdml2ZSBlbiBgTWVzc2FnaW5nU2VydmljZS5lbmFibGUoKWAgZGUgbGEgbGliLiBFbCBwYXNvIGRlXG4gICAqIHJlZ2lzdHJvIGRlbCBkZXZpY2UgZW4gZWwgYmFja2VuZCBzZSBwYXNhIGNvbW8gY2FsbGJhY2sgKGByZWdpc3RlckRldmljZWApXG4gICAqIHBvcnF1ZSBsYSBsaWIgbm8gcHVlZGUgZGVwZW5kZXIgZGUgYEF1dGhTZXJ2aWNlYCBzaW4gY3JlYXIgdW4gY2ljbG8uXG4gICAqXG4gICAqIGBlbmFibGUoKWAgbm8gaGFjZSB0aHJvdzogcmVzdWVsdmUgY29uIHVuIGBFbmFibGVQdXNoUmVzdWx0YCBkZXNjcmlwdGl2by5cbiAgICovXG4gIGFzeW5jIG9uRW5hYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2J1c3kuc2V0KCdlbmFibGluZycpO1xuICAgIHRoaXMuX2xhc3RGYWlsZWQuc2V0KGZhbHNlKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQ6IEVuYWJsZVB1c2hSZXN1bHQgPSBhd2FpdCB0aGlzLm1lc3NhZ2luZy5lbmFibGUoe1xuICAgICAgICByZWdpc3RlckRldmljZTogdG9rZW4gPT4gdGhpcy5hdXRoLnJlZ2lzdGVyRGV2aWNlKHRva2VuKS50aGVuKHIgPT4gci5yZWdpc3RlcmVkKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2VuYWJsZWQnKSB7XG4gICAgICAgIC8vIFBlcnNpc3RpciBmbGFnIG1hc3RlciBzaSBhw7puIG5vIGVzdGFiYSBhY3Rpdm8uXG4gICAgICAgIGlmICghdGhpcy5wcmVmcy5ub3RpZmljYXRpb25zTWFzdGVyKCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnByZWZzLnNldE5vdGlmaWNhdGlvbnNNYXN0ZXIodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2FzdC5zaG93KHtcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLnR0KCdlbmFibGVTdWNjZXNzJyksXG4gICAgICAgICAgZHVyYXRpb246IDIwMDAsXG4gICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc29sdmVkQ29uZmlnKCkub25QdXNoRW5hYmxlZD8uKCk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICd0aW1lb3V0JyAmJiByZXN1bHQucmVsb2FkZWQpIHtcbiAgICAgICAgLy8gTGEgbGliIGRpc3BhcsOzIGVsIGF1dG8tcmVsb2FkIOKAlCBsYSBww6FnaW5hIGVzdMOhIHBvciByZWNhcmdhcnNlLlxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBkZW5pZWQgLyB1bnN1cHBvcnRlZCAvIGVycm9yIC8gdGltZW91dCBzaW4gcmVsb2FkIOKGkiBmYWxsbyByZWN1cGVyYWJsZS5cbiAgICAgICAgdGhpcy5fbGFzdEZhaWxlZC5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICAgICAgbWVzc2FnZTogdGhpcy50dCgnZXJyb3JHZW5lcmljJyksXG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gYGVuYWJsZSgpYCBubyBoYWNlIHRocm93LCBwZXJvIGVsIGNhbGxiYWNrIGRlIHJlZ2lzdHJvIHPDrSBwdWVkZS5cbiAgICAgIHRoaXMuX2xhc3RGYWlsZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy50b2FzdC5zaG93KHtcbiAgICAgICAgbWVzc2FnZTogdGhpcy50dCgnZXJyb3JHZW5lcmljJyksXG4gICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gw5puaWNvIHJlZnJlc2ggZmluYWw6IHJlLWFsaW5lYSBlbCB0b2dnbGUgVU5BIHNvbGEgdmV6IGNvbiBlbCBlc3RhZG8gcmVhbC5cbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEJyb3dzZXJTdGF0ZSgpO1xuICAgICAgdGhpcy5fYnVzeS5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25EaXNhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2J1c3kuc2V0KCdkaXNhYmxpbmcnKTtcbiAgICB0aGlzLl9sYXN0RmFpbGVkLnNldChmYWxzZSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hdXRoLmRpc2FibGVOb3RpZmljYXRpb25zKCk7XG4gICAgICBpZiAodGhpcy5wcmVmcy5ub3RpZmljYXRpb25zTWFzdGVyKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcmVmcy5zZXROb3RpZmljYXRpb25zTWFzdGVyKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudHQoJ2Rpc2FibGVTdWNjZXNzJyksXG4gICAgICAgIGR1cmF0aW9uOiAyMDAwLFxuICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVzb2x2ZWRDb25maWcoKS5vblB1c2hEaXNhYmxlZD8uKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLl9sYXN0RmFpbGVkLnNldCh0cnVlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQnJvd3NlclN0YXRlKCk7XG4gICAgICB0aGlzLl9idXN5LnNldChudWxsKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVpbnRlbnRhciBsYSBzZWN1ZW5jaWEgY29tcGxldGEgZGUgYWN0aXZhY2nDs24sIHNpbiBpbXBvcnRhciBlbCBlc3RhZG8gYWN0dWFsLiAqL1xuICBhc3luYyBvblJldHJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2xhc3RGYWlsZWQuc2V0KGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLm9uRW5hYmxlKCk7XG4gIH1cblxuICB0b2dnbGVEZXRhaWxzKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0RldGFpbHMudXBkYXRlKHYgPT4gIXYpO1xuICB9XG5cbiAgYXN5bmMgY29weVRva2VuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW4oKTtcbiAgICBpZiAoIXRva2VuKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRva2VuKTtcbiAgICAgIHRoaXMudG9hc3Quc2hvdyh7IG1lc3NhZ2U6IHRoaXMudHQoJ2RldGFpbHNDb3BpZWQnKSwgY29sb3I6ICdkYXJrJyB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENsaXBib2FyZCBBUEkgbm8gZGlzcG9uaWJsZS9kZW5lZ2FkYSDigJQgZmFsbGJhY2sgc2lsZW5jaW9zbywgc2luIHRvYXN0IGRlIGVycm9yLlxuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQcml2YWRvc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hCcm93c2VyU3RhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc1N1cHBvcnRlZC5zZXQoYXdhaXQgdGhpcy5tZXNzYWdpbmcuaXNTdXBwb3J0ZWQoKSk7XG4gICAgdGhpcy5wZXJtaXNzaW9uLnNldCh0aGlzLmF1dGguZ2V0Tm90aWZpY2F0aW9uUGVybWlzc2lvblN0YXRlKCkpO1xuICAgIHRoaXMuY3VycmVudFRva2VuLnNldCh0aGlzLm1lc3NhZ2luZy5jdXJyZW50VG9rZW4gPz8gbnVsbCk7XG4gICAgdm9pZCB0aGlzLnJlcGFpclRva2VuSWZOZWVkZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBhcmEgZWwgdG9rZW4gRkNNIGVuIGJhY2tncm91bmQuXG4gICAqXG4gICAqIFNpIGVsIHVzdWFyaW8gdGllbmUgcHVzaCBhY3Rpdm8gKGBtYXN0ZXIgJiYgZ3JhbnRlZGApIHBlcm8gbm8gaGF5IHRva2VuIGVuXG4gICAqIG1lbW9yaWEg4oCUIGNhc28gdMOtcGljbyB0cmFzIHVuIGNvbGQgc3RhcnQgZGUgbGEgUFdBIOKAlCByZS1vYnRlbmVtb3MgZWwgdG9rZW5cbiAgICogeSByZS1yZWdpc3RyYW1vcyBlbCBkZXZpY2Ugc2luIHRvY2FyIGVsIHRvZ2dsZSBuaSBtb3N0cmFyIHVuIGVycm9yXG4gICAqIGFsYXJtaXN0YS4gRWwgdG9rZW4gZXMgdW4gZGV0YWxsZSBkZSBpbXBsZW1lbnRhY2nDs24gcmVwYXJhYmxlLCBubyBwYXJ0ZSBkZWxcbiAgICogZXN0YWRvIGRlIFVJICh2ZXIgYGlzRW5hYmxlZGApLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXBhaXJUb2tlbklmTmVlZGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9idXN5KCkgIT09IG51bGwpIHJldHVybjtcbiAgICBpZiAodGhpcy5fcmVwYWlyaW5nVG9rZW4pIHJldHVybjtcbiAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5jdXJyZW50VG9rZW4oKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fcmVwYWlyaW5nVG9rZW4gPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMubWVzc2FnaW5nLmdldFRva2VuKCk7XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uc2V0KHRva2VuKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hdXRoLnJlZ2lzdGVyRGV2aWNlKHRva2VuKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFJlcGFyYWNpw7NuIGJlc3QtZWZmb3J0OiBubyBkZWdyYWRhbW9zIGVsIHRvZ2dsZSBuaSBtb3N0cmFtb3MgZXJyb3IuXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3JlcGFpcmluZ1Rva2VuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGlPUyBicm93c2VyIHNpbiBlc3RhciBpbnN0YWxhZG8gY29tbyBQV0Eg4oCUIHB1c2ggd2ViIG5vIGRpc3BvbmlibGUuXG4gICAqIEFwbGljYSBhIFNhZmFyaSB5IGEgRWRnZS9DaHJvbWUvRmlyZWZveCBlbiBpT1MgKHRvZG9zIFdlYktpdCBwb3IgbWFuZGF0byBBcHBsZSkuXG4gICAqL1xuICBwcml2YXRlIGRldGVjdE5lZWRzSU9TSW5zdGFsbCgpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnO1xuICAgIGNvbnN0IGlzSU9TID0gL2lQYWR8aVBob25lfGlQb2QvLnRlc3QodWEpO1xuICAgIGlmICghaXNJT1MpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBpc1N0YW5kYWxvbmUgPVxuICAgICAgd2luZG93Lm1hdGNoTWVkaWE/LignKGRpc3BsYXktbW9kZTogc3RhbmRhbG9uZSknKS5tYXRjaGVzIHx8XG4gICAgICAobmF2aWdhdG9yIGFzIHVua25vd24gYXMgeyBzdGFuZGFsb25lPzogYm9vbGVhbiB9KS5zdGFuZGFsb25lID09PSB0cnVlO1xuICAgIHJldHVybiAhaXNTdGFuZGFsb25lO1xuICB9XG5cbiAgcHJvdGVjdGVkIHR0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCB0aGlzLm5zKTtcbiAgfVxufVxuIl19