@sinequa/assistant 3.9.5 → 3.9.6-rc2

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 (69) hide show
  1. package/chat/chat-message/chat-message.component.d.ts +17 -25
  2. package/chat/chat-message/i18n/de.json +11 -0
  3. package/chat/chat-reference/chat-reference.component.d.ts +18 -8
  4. package/chat/chat-reference/i18n/de.json +4 -0
  5. package/chat/chat-settings-v3/i18n/de.json +14 -0
  6. package/chat/chat.component.d.ts +2 -1
  7. package/chat/debug-message/debug-message-details/debug-message-details.component.d.ts +2 -3
  8. package/chat/debug-message/i18n/de.json +3 -0
  9. package/chat/dialogs/i18n/de.json +19 -0
  10. package/chat/directives/copy-to-clipboard.directive.d.ts +8 -0
  11. package/chat/documents-upload/document-list/document-list.component.d.ts +4 -9
  12. package/chat/documents-upload/document-overview/document-overview.component.d.ts +3 -17
  13. package/chat/documents-upload/document-upload/document-upload.component.d.ts +3 -8
  14. package/chat/documents-upload/documents-upload.service.d.ts +7 -16
  15. package/chat/documents-upload/i18n/de.json +24 -0
  16. package/chat/i18n/de.json +42 -0
  17. package/chat/markdown-it-plugins/code-block.plugin.d.ts +2 -0
  18. package/chat/markdown-it-plugins/image-reference.plugin.d.ts +3 -0
  19. package/chat/markdown-it-plugins/link.plugin.d.ts +5 -0
  20. package/chat/markdown-it-plugins/page-reference.plugin.d.ts +3 -0
  21. package/chat/markdown-it-plugins/reference.plugin.d.ts +7 -0
  22. package/chat/public-api.d.ts +2 -1
  23. package/chat/references/i18n/de.json +6 -0
  24. package/chat/references/references.component.d.ts +43 -0
  25. package/chat/saved-chats/i18n/de.json +5 -0
  26. package/chat/services/app.service.d.ts +2 -1
  27. package/chat/services/custom-elements.service.d.ts +13 -0
  28. package/chat/smart-renderer/smart-renderer.d.ts +23 -0
  29. package/chat/token-progress-bar/i18n/de.json +4 -0
  30. package/chat/tooltip/tooltip.directive.d.ts +2 -2
  31. package/chat/types.d.ts +8 -42
  32. package/esm2022/chat/chat-message/chat-message.component.mjs +33 -135
  33. package/esm2022/chat/chat-reference/chat-reference.component.mjs +60 -26
  34. package/esm2022/chat/chat-settings-v3/chat-settings-v3.component.mjs +1 -1
  35. package/esm2022/chat/chat.component.mjs +48 -12
  36. package/esm2022/chat/chat.service.mjs +3 -2
  37. package/esm2022/chat/debug-message/debug-message-details/debug-message-details.component.mjs +2 -2
  38. package/esm2022/chat/debug-message/debug-message.service.mjs +4 -7
  39. package/esm2022/chat/directives/copy-to-clipboard.directive.mjs +68 -0
  40. package/esm2022/chat/documents-upload/document-list/document-list.component.mjs +21 -22
  41. package/esm2022/chat/documents-upload/document-overview/document-overview.component.mjs +8 -31
  42. package/esm2022/chat/documents-upload/document-upload/document-upload.component.mjs +12 -14
  43. package/esm2022/chat/documents-upload/documents-upload.service.mjs +25 -44
  44. package/esm2022/chat/markdown-it-plugins/code-block.plugin.mjs +14 -0
  45. package/esm2022/chat/markdown-it-plugins/image-reference.plugin.mjs +58 -0
  46. package/esm2022/chat/markdown-it-plugins/link.plugin.mjs +15 -0
  47. package/esm2022/chat/markdown-it-plugins/page-reference.plugin.mjs +60 -0
  48. package/esm2022/chat/markdown-it-plugins/reference.plugin.mjs +68 -0
  49. package/esm2022/chat/public-api.mjs +3 -2
  50. package/esm2022/chat/references/references.component.mjs +290 -0
  51. package/esm2022/chat/saved-chats/saved-chats.component.mjs +4 -3
  52. package/esm2022/chat/saved-chats/saved-chats.service.mjs +9 -12
  53. package/esm2022/chat/services/app.service.mjs +8 -2
  54. package/esm2022/chat/services/assistant-configuration.service.mjs +9 -18
  55. package/esm2022/chat/services/assistant-metadata.service.mjs +3 -3
  56. package/esm2022/chat/services/assistant-tokens-tracking.service.mjs +3 -6
  57. package/esm2022/chat/services/custom-elements.service.mjs +43 -0
  58. package/esm2022/chat/smart-renderer/smart-renderer.mjs +103 -0
  59. package/esm2022/chat/tooltip/tooltip.directive.mjs +9 -9
  60. package/esm2022/chat/types.mjs +2 -5
  61. package/fesm2022/sinequa-assistant-chat.mjs +908 -497
  62. package/fesm2022/sinequa-assistant-chat.mjs.map +1 -1
  63. package/package.json +4 -6
  64. package/chat/prompt.component.d.ts +0 -25
  65. package/chat/unified-plugins/embedded-image-reference.plugin.d.ts +0 -3
  66. package/chat/unified-plugins/embedded-page-reference.plugin.d.ts +0 -3
  67. package/esm2022/chat/prompt.component.mjs +0 -88
  68. package/esm2022/chat/unified-plugins/embedded-image-reference.plugin.mjs +0 -56
  69. package/esm2022/chat/unified-plugins/embedded-page-reference.plugin.mjs +0 -57
@@ -1,13 +1,13 @@
1
1
  import { CommonModule } from "@angular/common";
2
2
  import { Component, inject, Input, ViewChild, } from "@angular/core";
3
3
  import { NgxFlowModule } from "@flowjs/ngx-flow";
4
- import { BehaviorSubject, catchError, EMPTY, filter, finalize, interval, Subscription, switchMap, takeWhile, tap, startWith, of, } from "rxjs";
4
+ import { BehaviorSubject, catchError, EMPTY, finalize, interval, Subscription, switchMap, takeWhile, tap, startWith, of, take, } from "rxjs";
5
5
  import { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';
6
6
  import { isAuthenticated } from "@sinequa/atomic";
7
- import { InstanceManagerService } from "../../instance-manager.service";
8
7
  import { DocumentsUploadService } from "../documents-upload.service";
9
8
  import { FormatIconComponent } from '../../format-icon/format-icon.component';
10
9
  import { NotificationsService } from "../../services/notification.service";
10
+ import { AppService } from "../../services/app.service";
11
11
  import * as i0 from "@angular/core";
12
12
  import * as i1 from "@angular/common";
13
13
  import * as i2 from "@flowjs/ngx-flow";
@@ -34,13 +34,13 @@ export class DocumentUploadComponent {
34
34
  this.uploading$ = new BehaviorSubject(false);
35
35
  this.uploadingInfos$ = new BehaviorSubject(undefined);
36
36
  this._subscription = new Subscription();
37
- this.instanceManagerService = inject(InstanceManagerService);
38
37
  this.documentsUploadService = inject(DocumentsUploadService);
39
38
  this.notificationsService = inject(NotificationsService);
39
+ this.appService = inject(AppService);
40
40
  this.transloco = inject(TranslocoService);
41
41
  }
42
42
  ngOnInit() {
43
- this._subscription.add(of(isAuthenticated()).pipe(tap((_) => this.instantiateChatService()), switchMap((_) => this.chatService.assistantConfig$), filter((config) => !!config), tap((_) => this.documentsUploadService.init(this.chatService)), catchError((error) => {
43
+ this._subscription.add(of(isAuthenticated()).pipe(switchMap((_) => this.appService.init()), tap((_) => this.documentsUploadService.init()), catchError((error) => {
44
44
  console.error(error);
45
45
  this.notificationsService.error(error);
46
46
  return EMPTY;
@@ -63,9 +63,6 @@ export class DocumentUploadComponent {
63
63
  ngOnDestroy() {
64
64
  this._subscription.unsubscribe();
65
65
  }
66
- instantiateChatService() {
67
- this.chatService = this.instanceManagerService.getInstance(this.instanceId);
68
- }
69
66
  /**
70
67
  * Handles the submission of files.
71
68
  *
@@ -215,11 +212,14 @@ export class DocumentUploadComponent {
215
212
  this.indexing$.next(true);
216
213
  // Combine immediate API call with interval-based polling
217
214
  this._subscription.add(interval(this.pollingInterval).pipe(startWith(0), // Trigger the API call immediately
218
- switchMap(() => this.documentsUploadService.getIndexingStatus(token)), tap((res) => this.indexingInfos$.next(res)), takeWhile((response) => !response.isCompleted, true), catchError((err) => {
215
+ switchMap(() => this.documentsUploadService.getIndexingStatus(token)), tap((res) => this.indexingInfos$.next(res)), takeWhile((response) => !response.isCompleted, true), // Use takeWhileInclusive() pattern to ensure that the last value where isCompleted === true is also included.
216
+ catchError((err) => {
219
217
  console.error(err);
220
218
  this.notificationsService.error(this.transloco.translate('chatDocumentsUpload.errorIndexingStatus'));
221
219
  return EMPTY;
222
220
  }), finalize(() => {
221
+ // Refresh the list of uploaded documents at the end of indexing
222
+ this.documentsUploadService.getDocumentsList().pipe(take(1)).subscribe();
223
223
  // Clear the indexing flags
224
224
  this.indexing$.next(false);
225
225
  this.indexingInfos$.next(undefined);
@@ -240,17 +240,15 @@ export class DocumentUploadComponent {
240
240
  return completed / total;
241
241
  }
242
242
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
243
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DocumentUploadComponent, isStandalone: true, selector: "sq-document-upload", inputs: { instanceId: "instanceId", pollingInterval: "pollingInterval" }, providers: [DocumentsUploadService, provideTranslocoScope('chat-documents-upload')], viewQueries: [{ propertyName: "flow", first: true, predicate: ["flow"], descendants: true, static: true }], ngImport: i0, template: "<ng-container #flow=\"flow\" [flowConfig]=\"flowConfig\"></ng-container>\n<div class=\"file-upload-container\">\n <input\n type=\"file\"\n flowButton\n [flow]=\"flow.flowJs\"\n multiple\n hidden\n #fileInput>\n <div\n flowDrop\n [flow]=\"flow.flowJs\"\n (dragenter)=\"onDragenter()\"\n (dragleave)=\"onDragleave($event)\"\n (drop)=\"onDrop()\"\n (click)=\"fileInput.click()\"\n class=\"dropzone\"\n [ngClass]=\"{'dropzone--active': (dragging$ | async)}\"\n [hidden]=\"(uploading$ | async) || (indexing$ | async)\">\n <ng-container *ngIf=\"!(dragging$ | async); else draggingContent\">\n <i class=\"fas fa-cloud-upload-alt\"></i>\n <span>{{ 'chatDocumentsUpload.dragAndDrop' | transloco }}</span>\n <span class=\"text-orange\">{{ 'chatDocumentsUpload.clickToBrowse' | transloco }}</span>\n </ng-container>\n <ng-template #draggingContent>\n <span>{{ 'chatDocumentsUpload.dropFiles' | transloco }}</span>\n </ng-template>\n </div>\n\n <div *ngIf=\"(uploading$ | async) || (indexing$ | async)\" class=\"dropzone dropzone--active\">\n <ng-container *ngIf=\"(uploading$ | async); else indexingState\">\n <i class=\"fas fa-spinner fa-pulse\"></i>\n <span>\n {{ 'chatDocumentsUpload.uploadingFiles' | transloco: { count: (flow.transfers$ | async)!.transfers.length } }}\n </span>\n <span *ngIf=\"(uploadingInfos$ | async) as uploadingInfos\">{{ uploadingInfos.progress | number:'1.0-0' }}%</span>\n </ng-container>\n <ng-template #indexingState>\n <i class=\"fas fa-spinner fa-pulse\"></i>\n <ng-container *ngIf=\"indexingInfos$ | async as indexingInfo\">\n <span>\n {{ 'chatDocumentsUpload.indexingFiles' | transloco: { count: indexingInfo.docs.length } }}\n </span>\n <span>{{ getIndexingProgress(indexingInfo) * 100 | number:'1.0-0' }}%</span>\n </ng-container>\n </ng-template>\n </div>\n\n <ul *ngIf=\"errorAlerts.length > 0\" class=\"error-list mt-3\">\n <li *ngFor=\"let error of errorAlerts\">\n {{ error }}\n </li>\n </ul>\n\n <div *ngIf=\"((flow.transfers$ | async)?.transfers?.length > 0) && !(uploading$ | async)\" class=\"file-list mt-3\">\n <ul>\n <li *ngFor=\"let transfer of (flow.transfers$ | async)!.transfers; trackBy: trackTransfer\">\n <sq-format-icon [extension]=\"transfer.flowFile.getExtension()\" class=\"me-1\"></sq-format-icon>\n <span [title]=\"transfer.name\">{{ transfer.name }}</span>\n <i class=\"fas fa-trash ms-1\" (click)=\"flow.cancelFile(transfer)\" [title]=\"'chatDocumentsUpload.cancel' | transloco\"></i>\n </li>\n </ul>\n </div>\n\n <div class=\"d-flex mt-2\">\n <button\n type=\"button\"\n class=\"btn btn-light cancel-btn me-2\"\n (click)=\"flow.cancel()\"\n [disabled]=\"!((flow.transfers$ | async)?.transfers?.length > 0) || (uploading$ | async) || (indexing$ | async)\">\n {{ 'chatDocumentsUpload.cancel' | transloco }}\n </button>\n <button\n type=\"button\"\n class=\"upload-btn\"\n (click)=\"upload()\"\n [disabled]=\"!((flow.transfers$ | async)?.transfers?.length > 0) || (uploading$ | async) || (indexing$ | async)\">\n {{ 'chatDocumentsUpload.upload' | transloco }}\n </button>\n </div>\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-uploaded-doc-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}@keyframes dash-move{0%{background-position:0 0}to{background-position:100% 0}}.file-upload-container{width:100%;position:relative;padding:20px;background-color:var(--ast-primary-bg, #f2f8fe)}.file-upload-container .dropzone{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100px;border:2px dashed var(--ast-primary-color, #005DA7);border-color:var(--ast-secondary-color, #FF732E) var(--ast-primary-color, #005DA7) var(--ast-primary-color, #005DA7) var(--ast-secondary-color, #FF732E);border-radius:5px;padding:10px;cursor:pointer;background-color:var(--ast-primary-bg, #f2f8fe);transition:background-color .3s ease;color:var(--ast-primary-color, #005DA7)}.file-upload-container .dropzone--active{background-color:var(--ast-secondary-bg, #FFF8F1);color:var(--ast-secondary-color, #FF732E);border-color:var(--ast-secondary-color, #FF732E)}.file-upload-container .dropzone i{font-size:x-large}.file-upload-container .dropzone span{margin:0;font-size:small}.file-upload-container .dropzone span.text-orange{color:var(--ast-secondary-color, #FF732E)}.file-upload-container .file-list h6{color:#a9a9a9}.file-upload-container .file-list ul{list-style-type:none;padding:0}.file-upload-container .file-list ul li{display:flex;align-items:center;padding:10px;background-color:var(--ast-primary-bg, #f2f8fe);margin-bottom:5px;border-radius:5px;font-size:small}.file-upload-container .file-list ul li span{flex-grow:1;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.file-upload-container .file-list ul li i{cursor:pointer}.file-upload-container .file-list ul li i:hover{color:var(--ast-primary-color, #005DA7)}.file-upload-container .error-list{display:flex;flex-direction:column;list-style:disc;background:var(--ast-error-color, rgba(249, 58, 55, .7));color:#fff;border-radius:5px}.file-upload-container .error-list li{padding:3px}.file-upload-container .upload-btn{background:linear-gradient(to right,#1d4ed8,#ec4899,#f97316);color:#fff;border:none;padding:8px 16px;border-radius:5px;cursor:pointer;width:100%}.file-upload-container .upload-btn:hover{background:linear-gradient(to right,#1d4ed8cc,#ec4899cc,#f97316cc)}.file-upload-container .upload-btn[disabled]{opacity:.3;cursor:not-allowed}.file-upload-container .cancel-btn{cursor:pointer;pointer-events:unset;width:100%}.file-upload-container .cancel-btn[disabled]{opacity:.3;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: NgxFlowModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[flowButton]", inputs: ["flowDirectoryOnly", "flowAttributes", "flow"] }, { kind: "directive", type: i2.DropDirective, selector: "[flowDrop]", inputs: ["flow"], exportAs: ["flowDrop"] }, { kind: "directive", type: i2.FlowDirective, selector: "[flowConfig]", inputs: ["flowConfig"], exportAs: ["flow"] }, { kind: "component", type: FormatIconComponent, selector: "sq-format-icon", inputs: ["extension"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] }); }
243
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DocumentUploadComponent, isStandalone: true, selector: "sq-document-upload", inputs: { pollingInterval: "pollingInterval" }, providers: [provideTranslocoScope('chat-documents-upload')], viewQueries: [{ propertyName: "flow", first: true, predicate: ["flow"], descendants: true, static: true }], ngImport: i0, template: "<ng-container #flow=\"flow\" [flowConfig]=\"flowConfig\"></ng-container>\n<div class=\"file-upload-container\">\n <input\n type=\"file\"\n flowButton\n [flow]=\"flow.flowJs\"\n multiple\n hidden\n #fileInput>\n <div\n flowDrop\n [flow]=\"flow.flowJs\"\n (dragenter)=\"onDragenter()\"\n (dragleave)=\"onDragleave($event)\"\n (drop)=\"onDrop()\"\n (click)=\"fileInput.click()\"\n class=\"dropzone\"\n [ngClass]=\"{'dropzone--active': (dragging$ | async)}\"\n [hidden]=\"(uploading$ | async) || (indexing$ | async)\">\n <ng-container *ngIf=\"!(dragging$ | async); else draggingContent\">\n <i class=\"fas fa-cloud-upload-alt\"></i>\n <span>{{ 'chatDocumentsUpload.dragAndDrop' | transloco }}</span>\n <span class=\"text-orange\">{{ 'chatDocumentsUpload.clickToBrowse' | transloco }}</span>\n </ng-container>\n <ng-template #draggingContent>\n <span>{{ 'chatDocumentsUpload.dropFiles' | transloco }}</span>\n </ng-template>\n </div>\n\n <div *ngIf=\"(uploading$ | async) || (indexing$ | async)\" class=\"dropzone dropzone--active\">\n <ng-container *ngIf=\"(uploading$ | async); else indexingState\">\n <i class=\"fas fa-spinner fa-pulse\"></i>\n <span>\n {{ 'chatDocumentsUpload.uploadingFiles' | transloco: { count: (flow.transfers$ | async)!.transfers.length } }}\n </span>\n <span *ngIf=\"(uploadingInfos$ | async) as uploadingInfos\">{{ uploadingInfos.progress | number:'1.0-0' }}%</span>\n </ng-container>\n <ng-template #indexingState>\n <i class=\"fas fa-spinner fa-pulse\"></i>\n <ng-container *ngIf=\"indexingInfos$ | async as indexingInfo\">\n <span>\n {{ 'chatDocumentsUpload.indexingFiles' | transloco: { count: indexingInfo.docs.length } }}\n </span>\n <span>{{ getIndexingProgress(indexingInfo) * 100 | number:'1.0-0' }}%</span>\n </ng-container>\n </ng-template>\n </div>\n\n <ul *ngIf=\"errorAlerts.length > 0\" class=\"error-list mt-3\">\n <li *ngFor=\"let error of errorAlerts\">\n {{ error }}\n </li>\n </ul>\n\n <div *ngIf=\"((flow.transfers$ | async)?.transfers?.length > 0) && !(uploading$ | async)\" class=\"file-list mt-3\">\n <ul>\n <li *ngFor=\"let transfer of (flow.transfers$ | async)!.transfers; trackBy: trackTransfer\">\n <sq-format-icon [extension]=\"transfer.flowFile.getExtension()\" class=\"me-1\"></sq-format-icon>\n <span class=\"me-1\" [title]=\"transfer.name\">{{ transfer.name }}</span>\n <button\n type=\"button\"\n (click)=\"flow.cancelFile(transfer)\"\n [title]=\"'chatDocumentsUpload.cancel' | transloco\"\n class=\"bg-transparent border-0 p-0 m-0 cursor-pointer text-inherit leading-none inline-flex items-center justify-center\"\n >\n <i class=\"fas fa-trash\"></i>\n </button>\n </li>\n </ul>\n </div>\n\n <div class=\"d-flex mt-2\">\n <button\n type=\"button\"\n class=\"btn btn-light cancel-btn me-2\"\n (click)=\"flow.cancel()\"\n [disabled]=\"!((flow.transfers$ | async)?.transfers?.length > 0) || (uploading$ | async) || (indexing$ | async)\">\n {{ 'chatDocumentsUpload.cancel' | transloco }}\n </button>\n <button\n type=\"button\"\n class=\"upload-btn\"\n (click)=\"upload()\"\n [disabled]=\"!((flow.transfers$ | async)?.transfers?.length > 0) || (uploading$ | async) || (indexing$ | async)\">\n {{ 'chatDocumentsUpload.upload' | transloco }}\n </button>\n </div>\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-uploaded-doc-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}@keyframes dash-move{0%{background-position:0 0}to{background-position:100% 0}}.file-upload-container{width:100%;position:relative;padding:20px;background-color:var(--ast-primary-bg, #f2f8fe)}.file-upload-container .dropzone{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100px;border:2px dashed var(--ast-primary-color, #005DA7);border-color:var(--ast-secondary-color, #FF732E) var(--ast-primary-color, #005DA7) var(--ast-primary-color, #005DA7) var(--ast-secondary-color, #FF732E);border-radius:5px;padding:10px;cursor:pointer;background-color:var(--ast-primary-bg, #f2f8fe);transition:background-color .3s ease;color:var(--ast-primary-color, #005DA7)}.file-upload-container .dropzone--active{background-color:var(--ast-secondary-bg, #FFF8F1);color:var(--ast-secondary-color, #FF732E);border-color:var(--ast-secondary-color, #FF732E)}.file-upload-container .dropzone i{font-size:x-large}.file-upload-container .dropzone span{margin:0;font-size:small}.file-upload-container .dropzone span.text-orange{color:var(--ast-secondary-color, #FF732E)}.file-upload-container .file-list h6{color:#a9a9a9}.file-upload-container .file-list ul{list-style-type:none;padding:0}.file-upload-container .file-list ul li{display:flex;align-items:center;padding:10px;background-color:var(--ast-primary-bg, #f2f8fe);margin-bottom:5px;border-radius:5px;font-size:small}.file-upload-container .file-list ul li span{flex-grow:1;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.file-upload-container .file-list ul li i{cursor:pointer}.file-upload-container .file-list ul li i:hover{color:var(--ast-primary-color, #005DA7)}.file-upload-container .error-list{display:flex;flex-direction:column;list-style:disc;background:var(--ast-error-color, rgba(249, 58, 55, .7));color:#fff;border-radius:5px}.file-upload-container .error-list li{padding:3px}.file-upload-container .upload-btn{background:linear-gradient(to right,#1d4ed8,#ec4899,#f97316);color:#fff;border:none;padding:8px 16px;border-radius:5px;cursor:pointer;width:100%}.file-upload-container .upload-btn:hover{background:linear-gradient(to right,#1d4ed8cc,#ec4899cc,#f97316cc)}.file-upload-container .upload-btn[disabled]{opacity:.3;cursor:not-allowed}.file-upload-container .cancel-btn{cursor:pointer;pointer-events:unset;width:100%}.file-upload-container .cancel-btn[disabled]{opacity:.3;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: NgxFlowModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[flowButton]", inputs: ["flowDirectoryOnly", "flowAttributes", "flow"] }, { kind: "directive", type: i2.DropDirective, selector: "[flowDrop]", inputs: ["flow"], exportAs: ["flowDrop"] }, { kind: "directive", type: i2.FlowDirective, selector: "[flowConfig]", inputs: ["flowConfig"], exportAs: ["flow"] }, { kind: "component", type: FormatIconComponent, selector: "sq-format-icon", inputs: ["extension"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] }); }
244
244
  }
245
245
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentUploadComponent, decorators: [{
246
246
  type: Component,
247
- args: [{ selector: "sq-document-upload", standalone: true, providers: [DocumentsUploadService, provideTranslocoScope('chat-documents-upload')], imports: [CommonModule, NgxFlowModule, FormatIconComponent, TranslocoPipe], template: "<ng-container #flow=\"flow\" [flowConfig]=\"flowConfig\"></ng-container>\n<div class=\"file-upload-container\">\n <input\n type=\"file\"\n flowButton\n [flow]=\"flow.flowJs\"\n multiple\n hidden\n #fileInput>\n <div\n flowDrop\n [flow]=\"flow.flowJs\"\n (dragenter)=\"onDragenter()\"\n (dragleave)=\"onDragleave($event)\"\n (drop)=\"onDrop()\"\n (click)=\"fileInput.click()\"\n class=\"dropzone\"\n [ngClass]=\"{'dropzone--active': (dragging$ | async)}\"\n [hidden]=\"(uploading$ | async) || (indexing$ | async)\">\n <ng-container *ngIf=\"!(dragging$ | async); else draggingContent\">\n <i class=\"fas fa-cloud-upload-alt\"></i>\n <span>{{ 'chatDocumentsUpload.dragAndDrop' | transloco }}</span>\n <span class=\"text-orange\">{{ 'chatDocumentsUpload.clickToBrowse' | transloco }}</span>\n </ng-container>\n <ng-template #draggingContent>\n <span>{{ 'chatDocumentsUpload.dropFiles' | transloco }}</span>\n </ng-template>\n </div>\n\n <div *ngIf=\"(uploading$ | async) || (indexing$ | async)\" class=\"dropzone dropzone--active\">\n <ng-container *ngIf=\"(uploading$ | async); else indexingState\">\n <i class=\"fas fa-spinner fa-pulse\"></i>\n <span>\n {{ 'chatDocumentsUpload.uploadingFiles' | transloco: { count: (flow.transfers$ | async)!.transfers.length } }}\n </span>\n <span *ngIf=\"(uploadingInfos$ | async) as uploadingInfos\">{{ uploadingInfos.progress | number:'1.0-0' }}%</span>\n </ng-container>\n <ng-template #indexingState>\n <i class=\"fas fa-spinner fa-pulse\"></i>\n <ng-container *ngIf=\"indexingInfos$ | async as indexingInfo\">\n <span>\n {{ 'chatDocumentsUpload.indexingFiles' | transloco: { count: indexingInfo.docs.length } }}\n </span>\n <span>{{ getIndexingProgress(indexingInfo) * 100 | number:'1.0-0' }}%</span>\n </ng-container>\n </ng-template>\n </div>\n\n <ul *ngIf=\"errorAlerts.length > 0\" class=\"error-list mt-3\">\n <li *ngFor=\"let error of errorAlerts\">\n {{ error }}\n </li>\n </ul>\n\n <div *ngIf=\"((flow.transfers$ | async)?.transfers?.length > 0) && !(uploading$ | async)\" class=\"file-list mt-3\">\n <ul>\n <li *ngFor=\"let transfer of (flow.transfers$ | async)!.transfers; trackBy: trackTransfer\">\n <sq-format-icon [extension]=\"transfer.flowFile.getExtension()\" class=\"me-1\"></sq-format-icon>\n <span [title]=\"transfer.name\">{{ transfer.name }}</span>\n <i class=\"fas fa-trash ms-1\" (click)=\"flow.cancelFile(transfer)\" [title]=\"'chatDocumentsUpload.cancel' | transloco\"></i>\n </li>\n </ul>\n </div>\n\n <div class=\"d-flex mt-2\">\n <button\n type=\"button\"\n class=\"btn btn-light cancel-btn me-2\"\n (click)=\"flow.cancel()\"\n [disabled]=\"!((flow.transfers$ | async)?.transfers?.length > 0) || (uploading$ | async) || (indexing$ | async)\">\n {{ 'chatDocumentsUpload.cancel' | transloco }}\n </button>\n <button\n type=\"button\"\n class=\"upload-btn\"\n (click)=\"upload()\"\n [disabled]=\"!((flow.transfers$ | async)?.transfers?.length > 0) || (uploading$ | async) || (indexing$ | async)\">\n {{ 'chatDocumentsUpload.upload' | transloco }}\n </button>\n </div>\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-uploaded-doc-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}@keyframes dash-move{0%{background-position:0 0}to{background-position:100% 0}}.file-upload-container{width:100%;position:relative;padding:20px;background-color:var(--ast-primary-bg, #f2f8fe)}.file-upload-container .dropzone{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100px;border:2px dashed var(--ast-primary-color, #005DA7);border-color:var(--ast-secondary-color, #FF732E) var(--ast-primary-color, #005DA7) var(--ast-primary-color, #005DA7) var(--ast-secondary-color, #FF732E);border-radius:5px;padding:10px;cursor:pointer;background-color:var(--ast-primary-bg, #f2f8fe);transition:background-color .3s ease;color:var(--ast-primary-color, #005DA7)}.file-upload-container .dropzone--active{background-color:var(--ast-secondary-bg, #FFF8F1);color:var(--ast-secondary-color, #FF732E);border-color:var(--ast-secondary-color, #FF732E)}.file-upload-container .dropzone i{font-size:x-large}.file-upload-container .dropzone span{margin:0;font-size:small}.file-upload-container .dropzone span.text-orange{color:var(--ast-secondary-color, #FF732E)}.file-upload-container .file-list h6{color:#a9a9a9}.file-upload-container .file-list ul{list-style-type:none;padding:0}.file-upload-container .file-list ul li{display:flex;align-items:center;padding:10px;background-color:var(--ast-primary-bg, #f2f8fe);margin-bottom:5px;border-radius:5px;font-size:small}.file-upload-container .file-list ul li span{flex-grow:1;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.file-upload-container .file-list ul li i{cursor:pointer}.file-upload-container .file-list ul li i:hover{color:var(--ast-primary-color, #005DA7)}.file-upload-container .error-list{display:flex;flex-direction:column;list-style:disc;background:var(--ast-error-color, rgba(249, 58, 55, .7));color:#fff;border-radius:5px}.file-upload-container .error-list li{padding:3px}.file-upload-container .upload-btn{background:linear-gradient(to right,#1d4ed8,#ec4899,#f97316);color:#fff;border:none;padding:8px 16px;border-radius:5px;cursor:pointer;width:100%}.file-upload-container .upload-btn:hover{background:linear-gradient(to right,#1d4ed8cc,#ec4899cc,#f97316cc)}.file-upload-container .upload-btn[disabled]{opacity:.3;cursor:not-allowed}.file-upload-container .cancel-btn{cursor:pointer;pointer-events:unset;width:100%}.file-upload-container .cancel-btn[disabled]{opacity:.3;cursor:not-allowed}\n"] }]
248
- }], propDecorators: { instanceId: [{
249
- type: Input
250
- }], pollingInterval: [{
247
+ args: [{ selector: "sq-document-upload", standalone: true, providers: [provideTranslocoScope('chat-documents-upload')], imports: [CommonModule, NgxFlowModule, FormatIconComponent, TranslocoPipe], template: "<ng-container #flow=\"flow\" [flowConfig]=\"flowConfig\"></ng-container>\n<div class=\"file-upload-container\">\n <input\n type=\"file\"\n flowButton\n [flow]=\"flow.flowJs\"\n multiple\n hidden\n #fileInput>\n <div\n flowDrop\n [flow]=\"flow.flowJs\"\n (dragenter)=\"onDragenter()\"\n (dragleave)=\"onDragleave($event)\"\n (drop)=\"onDrop()\"\n (click)=\"fileInput.click()\"\n class=\"dropzone\"\n [ngClass]=\"{'dropzone--active': (dragging$ | async)}\"\n [hidden]=\"(uploading$ | async) || (indexing$ | async)\">\n <ng-container *ngIf=\"!(dragging$ | async); else draggingContent\">\n <i class=\"fas fa-cloud-upload-alt\"></i>\n <span>{{ 'chatDocumentsUpload.dragAndDrop' | transloco }}</span>\n <span class=\"text-orange\">{{ 'chatDocumentsUpload.clickToBrowse' | transloco }}</span>\n </ng-container>\n <ng-template #draggingContent>\n <span>{{ 'chatDocumentsUpload.dropFiles' | transloco }}</span>\n </ng-template>\n </div>\n\n <div *ngIf=\"(uploading$ | async) || (indexing$ | async)\" class=\"dropzone dropzone--active\">\n <ng-container *ngIf=\"(uploading$ | async); else indexingState\">\n <i class=\"fas fa-spinner fa-pulse\"></i>\n <span>\n {{ 'chatDocumentsUpload.uploadingFiles' | transloco: { count: (flow.transfers$ | async)!.transfers.length } }}\n </span>\n <span *ngIf=\"(uploadingInfos$ | async) as uploadingInfos\">{{ uploadingInfos.progress | number:'1.0-0' }}%</span>\n </ng-container>\n <ng-template #indexingState>\n <i class=\"fas fa-spinner fa-pulse\"></i>\n <ng-container *ngIf=\"indexingInfos$ | async as indexingInfo\">\n <span>\n {{ 'chatDocumentsUpload.indexingFiles' | transloco: { count: indexingInfo.docs.length } }}\n </span>\n <span>{{ getIndexingProgress(indexingInfo) * 100 | number:'1.0-0' }}%</span>\n </ng-container>\n </ng-template>\n </div>\n\n <ul *ngIf=\"errorAlerts.length > 0\" class=\"error-list mt-3\">\n <li *ngFor=\"let error of errorAlerts\">\n {{ error }}\n </li>\n </ul>\n\n <div *ngIf=\"((flow.transfers$ | async)?.transfers?.length > 0) && !(uploading$ | async)\" class=\"file-list mt-3\">\n <ul>\n <li *ngFor=\"let transfer of (flow.transfers$ | async)!.transfers; trackBy: trackTransfer\">\n <sq-format-icon [extension]=\"transfer.flowFile.getExtension()\" class=\"me-1\"></sq-format-icon>\n <span class=\"me-1\" [title]=\"transfer.name\">{{ transfer.name }}</span>\n <button\n type=\"button\"\n (click)=\"flow.cancelFile(transfer)\"\n [title]=\"'chatDocumentsUpload.cancel' | transloco\"\n class=\"bg-transparent border-0 p-0 m-0 cursor-pointer text-inherit leading-none inline-flex items-center justify-center\"\n >\n <i class=\"fas fa-trash\"></i>\n </button>\n </li>\n </ul>\n </div>\n\n <div class=\"d-flex mt-2\">\n <button\n type=\"button\"\n class=\"btn btn-light cancel-btn me-2\"\n (click)=\"flow.cancel()\"\n [disabled]=\"!((flow.transfers$ | async)?.transfers?.length > 0) || (uploading$ | async) || (indexing$ | async)\">\n {{ 'chatDocumentsUpload.cancel' | transloco }}\n </button>\n <button\n type=\"button\"\n class=\"upload-btn\"\n (click)=\"upload()\"\n [disabled]=\"!((flow.transfers$ | async)?.transfers?.length > 0) || (uploading$ | async) || (indexing$ | async)\">\n {{ 'chatDocumentsUpload.upload' | transloco }}\n </button>\n </div>\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-uploaded-doc-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}@keyframes dash-move{0%{background-position:0 0}to{background-position:100% 0}}.file-upload-container{width:100%;position:relative;padding:20px;background-color:var(--ast-primary-bg, #f2f8fe)}.file-upload-container .dropzone{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100px;border:2px dashed var(--ast-primary-color, #005DA7);border-color:var(--ast-secondary-color, #FF732E) var(--ast-primary-color, #005DA7) var(--ast-primary-color, #005DA7) var(--ast-secondary-color, #FF732E);border-radius:5px;padding:10px;cursor:pointer;background-color:var(--ast-primary-bg, #f2f8fe);transition:background-color .3s ease;color:var(--ast-primary-color, #005DA7)}.file-upload-container .dropzone--active{background-color:var(--ast-secondary-bg, #FFF8F1);color:var(--ast-secondary-color, #FF732E);border-color:var(--ast-secondary-color, #FF732E)}.file-upload-container .dropzone i{font-size:x-large}.file-upload-container .dropzone span{margin:0;font-size:small}.file-upload-container .dropzone span.text-orange{color:var(--ast-secondary-color, #FF732E)}.file-upload-container .file-list h6{color:#a9a9a9}.file-upload-container .file-list ul{list-style-type:none;padding:0}.file-upload-container .file-list ul li{display:flex;align-items:center;padding:10px;background-color:var(--ast-primary-bg, #f2f8fe);margin-bottom:5px;border-radius:5px;font-size:small}.file-upload-container .file-list ul li span{flex-grow:1;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.file-upload-container .file-list ul li i{cursor:pointer}.file-upload-container .file-list ul li i:hover{color:var(--ast-primary-color, #005DA7)}.file-upload-container .error-list{display:flex;flex-direction:column;list-style:disc;background:var(--ast-error-color, rgba(249, 58, 55, .7));color:#fff;border-radius:5px}.file-upload-container .error-list li{padding:3px}.file-upload-container .upload-btn{background:linear-gradient(to right,#1d4ed8,#ec4899,#f97316);color:#fff;border:none;padding:8px 16px;border-radius:5px;cursor:pointer;width:100%}.file-upload-container .upload-btn:hover{background:linear-gradient(to right,#1d4ed8cc,#ec4899cc,#f97316cc)}.file-upload-container .upload-btn[disabled]{opacity:.3;cursor:not-allowed}.file-upload-container .cancel-btn{cursor:pointer;pointer-events:unset;width:100%}.file-upload-container .cancel-btn[disabled]{opacity:.3;cursor:not-allowed}\n"] }]
248
+ }], propDecorators: { pollingInterval: [{
251
249
  type: Input
252
250
  }], flow: [{
253
251
  type: ViewChild,
254
252
  args: ["flow", { static: true }]
255
253
  }] } });
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtdXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2RvY3VtZW50cy11cGxvYWQvZG9jdW1lbnQtdXBsb2FkL2RvY3VtZW50LXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9kb2N1bWVudHMtdXBsb2FkL2RvY3VtZW50LXVwbG9hZC9kb2N1bWVudC11cGxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBMkIsTUFBTSxrQkFBa0IsQ0FBQztBQUUxRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDUixRQUFRLEVBQ1IsWUFBWSxFQUNaLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNILFNBQVMsRUFDVCxFQUFFLEdBQ0gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWxELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRzlFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFN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SUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTmd4Rmxvd01vZHVsZSwgRmxvd0RpcmVjdGl2ZSwgVHJhbnNmZXIgfSBmcm9tIFwiQGZsb3dqcy9uZ3gtZmxvd1wiO1xuaW1wb3J0IHsgRmxvd0ZpbGUgfSBmcm9tIFwiZmxvd2pzXCI7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNhdGNoRXJyb3IsXG4gIEVNUFRZLFxuICBmaWx0ZXIsXG4gIGZpbmFsaXplLFxuICBpbnRlcnZhbCxcbiAgU3Vic2NyaXB0aW9uLFxuICBzd2l0Y2hNYXAsXG4gIHRha2VXaGlsZSxcbiAgdGFwLFxuICBzdGFydFdpdGgsXG4gIG9mLFxufSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcHJvdmlkZVRyYW5zbG9jb1Njb3BlLCBUcmFuc2xvY29QaXBlLCBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQGpzdmVyc2UvdHJhbnNsb2NvJztcblxuaW1wb3J0IHsgaXNBdXRoZW50aWNhdGVkIH0gZnJvbSBcIkBzaW5lcXVhL2F0b21pY1wiO1xuXG5pbXBvcnQgeyBJbnN0YW5jZU1hbmFnZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2luc3RhbmNlLW1hbmFnZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY2hhdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudHNVcGxvYWRTZXJ2aWNlIH0gZnJvbSBcIi4uL2RvY3VtZW50cy11cGxvYWQuc2VydmljZVwiO1xuaW1wb3J0IHsgRm9ybWF0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Zvcm1hdC1pY29uL2Zvcm1hdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGF0Q29uZmlnIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJbmRleGluZ0luZm9zLCBVcGxvYWRFdmVudCwgVXBsb2FkaW5nSW5mb3MgfSBmcm9tIFwiLi4vZG9jdW1lbnRzLXVwbG9hZC5tb2RlbFwiO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcInNxLWRvY3VtZW50LXVwbG9hZFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2RvY3VtZW50LXVwbG9hZC5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vZG9jdW1lbnQtdXBsb2FkLmNvbXBvbmVudC5zY3NzXCJdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBwcm92aWRlcnM6IFtEb2N1bWVudHNVcGxvYWRTZXJ2aWNlLCBwcm92aWRlVHJhbnNsb2NvU2NvcGUoJ2NoYXQtZG9jdW1lbnRzLXVwbG9hZCcpXSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTmd4Rmxvd01vZHVsZSwgRm9ybWF0SWNvbkNvbXBvbmVudCwgVHJhbnNsb2NvUGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgRG9jdW1lbnRVcGxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBEZWZpbmUgdGhlIGtleSBiYXNlZCBvbiBpdCwgdGhlIGFwcHJvcHJpYXRlIGNoYXRTZXJ2aWNlIGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSBpbnN0YW5jZU1hbmFnZXJTZXJ2aWNlICovXG4gIEBJbnB1dCgpIGluc3RhbmNlSWQ6IHN0cmluZztcbiAgLyoqIFBvbGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHRvIHVwZGF0ZSB0aGUgaW5kZXhpbmcgc3RhdHVzIG9mIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgKi9cbiAgQElucHV0KCkgcG9sbGluZ0ludGVydmFsIDogbnVtYmVyID0gMTAwMDtcbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBmbG93IGRpcmVjdGl2ZVxuICBAVmlld0NoaWxkKFwiZmxvd1wiLCB7IHN0YXRpYzogdHJ1ZSB9KSBmbG93ITogRmxvd0RpcmVjdGl2ZTtcblxuICBwdWJsaWMgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlO1xuICByZWFkb25seSBmbG93Q29uZmlnOiBmbG93anMuRmxvd09wdGlvbnMgPSB7XG4gICAgLy8gRGlzYWJsZXMgY2h1bmsgdGVzdGluZyBiZWZvcmUgdXBsb2FkaW5nIGFjdHVhbCBmaWxlIGRhdGEuIFRodXMsIGF2b2lkcyB1bm5lY2Vzc2FyeSByZXF1ZXN0cyBhbmQgc3BlZWRzIHVwIHVwbG9hZHNcbiAgICB0ZXN0Q2h1bmtzOiBmYWxzZSxcbiAgICAvLyBBbGxvd3MgbXVsdGlwbGUgZmlsZSB1cGxvYWRzIHNpbXVsdGFuZW91c2x5XG4gICAgc2luZ2xlRmlsZTogZmFsc2UsXG4gICAgLy8gQWxsb3dzIHRoZSBzYW1lIGZpbGUgdG8gYmUgdXBsb2FkZWQgbXVsdGlwbGUgdGltZXNcbiAgICBhbGxvd0R1cGxpY2F0ZVVwbG9hZHM6IHRydWUsXG4gICAgcXVlcnk6ICgpID0+IHtcbiAgICAgIHJldHVybiB7fTsgLy8gRW1wdHkgb2JqZWN0IHRvIHByZXZlbnQgcXVlcnkgcGFyYW1ldGVyc1xuICAgIH0sXG4gICAgcHJlcHJvY2VzczogKGNodW5rKSA9PiBjaHVuay5hYm9ydCgpIC8vIFByZXZlbnRzIHRoZSBkZWZhdWx0IGZsb3cgdXBsb2FkIG9mIGNodW5rc1xuICB9O1xuICBwdWJsaWMgZXJyb3JBbGVydHM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBkcmFnZ2luZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGluZGV4aW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgaW5kZXhpbmdJbmZvcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEluZGV4aW5nSW5mb3MgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyB1cGxvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyB1cGxvYWRpbmdJbmZvcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVwbG9hZGluZ0luZm9zIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwdWJsaWMgaW5zdGFuY2VNYW5hZ2VyU2VydmljZSA9IGluamVjdChJbnN0YW5jZU1hbmFnZXJTZXJ2aWNlKTtcbiAgcHVibGljIGRvY3VtZW50c1VwbG9hZFNlcnZpY2UgPSBpbmplY3QoRG9jdW1lbnRzVXBsb2FkU2VydmljZSk7XG4gIHB1YmxpYyBub3RpZmljYXRpb25zU2VydmljZSA9IGluamVjdChOb3RpZmljYXRpb25zU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsb2NvID0gaW5qZWN0KFRyYW5zbG9jb1NlcnZpY2UpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBvZihpc0F1dGhlbnRpY2F0ZWQoKSkucGlwZShcbiAgICAgICAgICB0YXAoKF8pID0+IHRoaXMuaW5zdGFudGlhdGVDaGF0U2VydmljZSgpKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKF8pID0+IHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50Q29uZmlnJCksXG4gICAgICAgICAgZmlsdGVyKChjb25maWc6IENoYXRDb25maWcgfCB1bmRlZmluZWQpID0+ICEhY29uZmlnKSxcbiAgICAgICAgICB0YXAoKF8pID0+IHRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS5pbml0KHRoaXMuY2hhdFNlcnZpY2UpKSxcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5mbG93LmV2ZW50cyQuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCBldnQgPSBldmVudCBhcyBhbnk7XG4gICAgICAgIC8vIEtlcHQgaXQganVzdCBmb3IgcmVmZXJlbmNlIHRvIHNob3cgaG93IHRvIGFjY2VzcyBkYXRhIG9mIGRpZmZlcmVudCBldmVudHNcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiZmlsZXNBZGRlZFwiKSB7XG4gICAgICAgICAgY29uc3QgYWRkZWRGaWxlcyA9IGV2dC5ldmVudFswXSBhcyBGbG93RmlsZVtdO1xuICAgICAgICAgIHRoaXMuX29uRmlsZXNBZGRlZChhZGRlZEZpbGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJmaWxlc1N1Ym1pdHRlZFwiKSB7XG4gICAgICAgICAgdGhpcy5fb25GaWxlc1N1Ym1pdHRlZCgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBPdmVycmlkZSB0aGUgdXBsb2FkIG1ldGhvZCBvZiB0aGUgZmxvdyBkaXJlY3RpdmVcbiAgICB0aGlzLmZsb3cudXBsb2FkID0gdGhpcy5zdGFydFVwbG9hZC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBpbnN0YW50aWF0ZUNoYXRTZXJ2aWNlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLmluc3RhbmNlTWFuYWdlclNlcnZpY2UuZ2V0SW5zdGFuY2UodGhpcy5pbnN0YW5jZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBzdWJtaXNzaW9uIG9mIGZpbGVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIGNoZWNrcyBvbiB0aGUgc3VibWl0dGVkIGZpbGVzOlxuICAgKlxuICAgKiAxLiBDaGVja3MgaWYgdGhlIG51bWJlciBvZiBmaWxlcyBzdWJtaXR0ZWQgZXhjZWVkcyB0aGUgcmVtYWluaW5nRmlsZUNvdW50IGRlZmluZWQgaW4gdGhlIGNvbnN0cmFpbnRzLlxuICAgKiAgICAtIElmIHRoZSBudW1iZXIgb2YgZmlsZXMgZXhjZWVkcyB0aGUgYWxsb3dlZCBjb3VudCwgYWxsIGZpbGVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGZsb3cuXG4gICAqICAgIC0gQW4gZXJyb3IgbWVzc2FnZSBpcyBhZGRlZCB0byB0aGUgZXJyb3IgYWxlcnRzLlxuICAgKlxuICAgKiAyLiBDaGVja3MgaWYgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGZpbGVzIHN1Ym1pdHRlZCBleGNlZWRzIHRoZSByZW1haW5pbmdGaWxlU2l6ZSBkZWZpbmVkIGluIHRoZSBjb25zdHJhaW50cy5cbiAgICogICAgLSBJZiB0aGUgdG90YWwgc2l6ZSBleGNlZWRzIHRoZSBhbGxvd2VkIHNpemUsIGFsbCBmaWxlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBmbG93LlxuICAgKiAgICAtIEFuIGVycm9yIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGVycm9yIGFsZXJ0cy5cbiAgICpcbiAgICogMy4gQ2hlY2tzIGlmIHRoZSBmaWxlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgc3VibWl0dGVkIGlzIG5vdCBhbGxvd2VkLlxuICAgKiAgICAtIElmIHRoZSBmaWxlIGV4dGVuc2lvbiBpcyBub3QgYWxsb3dlZCwgdGhlIGZpbGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBmbG93LlxuICAgKiAgICAtIEFuIGVycm9yIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGVycm9yIGFsZXJ0cy5cbiAgICovXG4gIHByaXZhdGUgX29uRmlsZXNTdWJtaXR0ZWQoKSB7XG4gICAgLy8gR2V0IGFsbCBmaWxlcyBmcm9tIHRoZSBmbG93XG4gICAgY29uc3QgZmlsZXMgPSBbLi4udGhpcy5mbG93LmZsb3dKcy5maWxlc107XG4gICAgLy8gQ2xlYXIgdGhlIGVycm9yIGFsZXJ0c1xuICAgIHRoaXMuZXJyb3JBbGVydHMgPSBbXTtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIG51bWJlciBvZiBmaWxlcyBzdWJtaXR0ZWQgZXhjZWVkcyB0aGUgcmVtYWluaW5nRmlsZUNvdW50IGRlZmluZWQgaW4gdGhlIGNvbnN0cmFpbnRzLlxuICAgICAqIElmIHRoZSBudW1iZXIgb2YgZmlsZXMgZXhjZWVkcyB0aGUgYWxsb3dlZCBjb3VudCwgYWxsIGZpbGVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGZsb3dcbiAgICAgKiBBbiBlcnJvciBtZXNzYWdlIGlzIGFkZGVkIHRvIHRoZSBlcnJvciBhbGVydHMuXG4gICAgICovXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IHRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS51cGxvYWRDb25maWckLnZhbHVlIS5jb25zdHJhaW50cy5yZW1haW5pbmdGaWxlQ291bnQpIHtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICB0aGlzLmZsb3cuZmxvd0pzLnJlbW92ZUZpbGUoZmlsZSk7XG4gICAgICB9XG4gICAgICBlcnJvcnMucHVzaCh0aGlzLnRyYW5zbG9jby50cmFuc2xhdGUoJ2NoYXREb2N1bWVudHNVcGxvYWQuZmlsZXNOdW1iZXJMaW1pdEV4Y2VlZGVkJywgeyBtYXg6IHRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS51cGxvYWRDb25maWckLnZhbHVlIS5jb25zdHJhaW50cy5yZW1haW5pbmdGaWxlQ291bnQgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZmlsZXMgc3VibWl0dGVkIGV4Y2VlZHMgdGhlIHJlbWFpbmluZ0ZpbGVTaXplIGRlZmluZWQgaW4gdGhlIGNvbnN0cmFpbnRzLlxuICAgICAqIElmIHRoZSB0b3RhbCBzaXplIGV4Y2VlZHMgdGhlIGFsbG93ZWQgc2l6ZSwgYWxsIGZpbGVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGZsb3dcbiAgICAgKiBBbiBlcnJvciBtZXNzYWdlIGlzIGFkZGVkIHRvIHRoZSBlcnJvciBhbGVydHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGZpbGVzIHRoYXQgY2FuIGJlIHVwbG9hZGVkIGlzIHRlbXBvcmFyeSBzZXQgdG8gdGhlIG1heGltdW0gb2YgMTI4IE1CIGFuZCB0aGUgcmVtYWluaW5nRmlsZVNpemVNQiBkZWZpbmVkIGluIHRoZSBjb25zdHJhaW50cy5cbiAgICAgKiBXYWl0aW5nIGZvciB0aGUgcGx1Z2luIHRvIGhhbmRsZSB0aGlzIGtlc3RyZWwgaXNzdWVcbiAgICAgKi9cbiAgICBlbHNlIGlmICh0aGlzLmRvY3VtZW50c1VwbG9hZFNlcnZpY2UuY29udmVydEJ5dGVzVG9NQih0aGlzLmZsb3cuZmxvd0pzLmdldFNpemUoKSkgPiBNYXRoLm1pbigxMjgsIHRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS51cGxvYWRDb25maWckLnZhbHVlIS5jb25zdHJhaW50cy5yZW1haW5pbmdGaWxlU2l6ZU1CKSkge1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIHRoaXMuZmxvdy5mbG93SnMucmVtb3ZlRmlsZShmaWxlKTtcbiAgICAgIH1cbiAgICAgIGVycm9ycy5wdXNoKHRoaXMudHJhbnNsb2NvLnRyYW5zbGF0ZSgnY2hhdERvY3VtZW50c1VwbG9hZC5maWxlc1NpemVMaW1pdEV4Y2VlZGVkJywgeyBtYXg6IE1hdGgubWluKDEyOCwgdGhpcy5kb2N1bWVudHNVcGxvYWRTZXJ2aWNlLnVwbG9hZENvbmZpZyQudmFsdWUhLmNvbnN0cmFpbnRzLnJlbWFpbmluZ0ZpbGVTaXplTUIpIH0pKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZmlsZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIHN1Ym1pdHRlZCBpcyBub3QgYWxsb3dlZC5cbiAgICAgKiBJZiB0aGUgZmlsZSBleHRlbnNpb24gaXMgbm90IGFsbG93ZWQsIHRoZSBmaWxlIGlzIHJlbW92ZWQgZnJvbSB0aGUgZmxvd1xuICAgICAqIEFuIGVycm9yIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGVycm9yIGFsZXJ0cy5cbiAgICAgKi9cbiAgICBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBpZiAoIXRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS51cGxvYWRDb25maWckLnZhbHVlIS5jb25zdHJhaW50cy5zdXBwb3J0ZWRGaWxlRXh0ZW5zaW9ucy5pbmNsdWRlcyhgJHtmaWxlLmdldEV4dGVuc2lvbigpfWApKSB7XG4gICAgICAgICAgdGhpcy5mbG93LmZsb3dKcy5yZW1vdmVGaWxlKGZpbGUpO1xuICAgICAgICAgIGVycm9ycy5wdXNoKHRoaXMudHJhbnNsb2NvLnRyYW5zbGF0ZSgnY2hhdERvY3VtZW50c1VwbG9hZC5maWxlRXh0ZW5zaW9uVW5zdXBwb3J0ZWQnLCB7IGV4dGVuc2lvbjogZmlsZS5nZXRFeHRlbnNpb24oKSB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgdW5pcXVlIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBlcnJvciBhbGVydHNcbiAgICB0aGlzLmVycm9yQWxlcnRzID0gWy4uLm5ldyBTZXQoZXJyb3JzKV07XG4gIH1cblxuICBwcml2YXRlIF9vbkZpbGVzQWRkZWQoZmlsZXM6IEZsb3dGaWxlW10pIHt9XG5cbiAgb25EcmFnZW50ZXIoKSB7XG4gICAgdGhpcy5kcmFnZ2luZyQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIG9uRHJhZ2xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBpZiAoXG4gICAgICAhZXZlbnQucmVsYXRlZFRhcmdldCB8fFxuICAgICAgIShldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiLmRyb3B6b25lXCIpXG4gICAgKSB7XG4gICAgICB0aGlzLmRyYWdnaW5nJC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBvbkRyb3AoKSB7XG4gICAgdGhpcy5kcmFnZ2luZyQubmV4dChmYWxzZSk7XG4gIH1cblxuICB0cmFja1RyYW5zZmVyKHRyYW5zZmVyOiBUcmFuc2Zlcikge1xuICAgIHJldHVybiB0cmFuc2Zlci5pZDtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEluaXRpYXRlcyB0aGUgdXBsb2FkIHByb2Nlc3MgYnkgaW52b2tpbmcgdGhlIGB1cGxvYWRgIG1ldGhvZFxuICAgKiBvZiB0aGUgYGZsb3dgIGluc3RhbmNlLlxuICAgKiBUaGUgYHVwbG9hZGAgbWV0aG9kIGlzIG92ZXJyaWRkZW4gaW4gdGhlIGBuZ09uSW5pdGAgbWV0aG9kIHRvIG1hdGNoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIGFzc2lzdGFudCBBUEkuXG4gICAqL1xuICB1cGxvYWQoKSB7XG4gICAgdGhpcy5mbG93LnVwbG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlcyB0aGUgZmlsZSB1cGxvYWQgcHJvY2VzcyBieSBwcmVwYXJpbmcgdGhlIGZvcm0gZGF0YSxcbiAgICogc2V0dGluZyB0aGUgdXBsb2FkaW5nIGZsYWcsIGFuZCBtYWtpbmcgYW4gQVBJIGNhbGwgdG8gdXBsb2FkIHRoZSBmaWxlcy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBDb2xsZWN0cyBhbGwgZmlsZXMgZnJvbSB0aGUgYGZsb3dKc2AgaW5zdGFuY2UgYW5kIGFwcGVuZHMgdGhlbSB0byBhIGBGb3JtRGF0YWAgb2JqZWN0LlxuICAgKiAtIFN1YnNjcmliZXMgdG8gdGhlIHVwbG9hZCBwcm9jZXNzIHRvIGhhbmRsZSBwcm9ncmVzcyB1cGRhdGVzLCBjb21wbGV0aW9uLCBhbmQgZXJyb3JzLlxuICAgKiAtIFRyaWdnZXJzIHRyYWNraW5nIHRoZSBpbmRleGluZyBwcm9jZXNzIHVwb24gc3VjY2Vzc2Z1bCB1cGxvYWQgY29tcGxldGlvbi5cbiAgICogLSBDbGVhbnMgdXAgdGhlIGBmbG93YCBpbnN0YW5jZSBhZnRlciB0aGUgdXBsb2FkIHByb2Nlc3MgaXMgZmluYWxpemVkLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFydFVwbG9hZCgpIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgLy8gQWRkIGFsbCBmaWxlcyB3aXRoIHRoZWlyIG9yaWdpbmFsIG5hbWVzXG4gICAgdGhpcy5mbG93LmZsb3dKcy5maWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoZmlsZS5uYW1lLCBmaWxlLmZpbGUpO1xuICAgIH0pO1xuXG4gICAgLy8gQ2xlYXIgdGhlIGVycm9yIGFsZXJ0c1xuICAgIHRoaXMuZXJyb3JBbGVydHMgPSBbXTtcbiAgICAvLyBTZXQgdGhlIHVwbG9hZGluZyBmbGFnIHRvIHRydWVcbiAgICB0aGlzLnVwbG9hZGluZyQubmV4dCh0cnVlKTtcblxuICAgIC8vIE1ha2UgdGhlIEFQSSBjYWxsIHRvIHVwbG9hZCB0aGUgZmlsZXNcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5kb2N1bWVudHNVcGxvYWRTZXJ2aWNlLnVwbG9hZERvY3VtZW50cyhmb3JtRGF0YSkucGlwZShcbiAgICAgICAgdGFwKChldmVudDogVXBsb2FkRXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3VwbG9hZFByb2dyZXNzJykge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRpbmdJbmZvcyQubmV4dChldmVudCBhcyBVcGxvYWRpbmdJbmZvcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChldmVudC50eXBlID09PSAncmVzcG9uc2UnKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrSW5kZXhpbmdQcm9jZXNzKGV2ZW50LmJvZHkuc3RhdHVzVG9rZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMudXBsb2FkaW5nJC5uZXh0KGZhbHNlKTsgLy8gU2V0IHRoZSB1cGxvYWRpbmcgZmxhZyB0byBmYWxzZSBPTkxZIGluIGNhc2Ugb2YgYW4gZXJyb3IuIE90aGVyd2lzZSwga2VlcCBpdCB0cnVlIHVudGlsIHRoZSBzdGFydCBvZiBpbmRleGluZyBwcm9jZXNzIGluIG9yZGVyIHRvIHByZXZlbnQgZmxpY2tlcmluZyBvZiB0aGUgVUlcbiAgICAgICAgICB0aGlzLnVwbG9hZGluZ0luZm9zJC5uZXh0KHVuZGVmaW5lZCk7IC8vIENsZWFyIHRoZSB1cGxvYWRpbmcgaW5mb3NcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcih0aGlzLnRyYW5zbG9jby50cmFuc2xhdGUoJ2NoYXREb2N1bWVudHNVcGxvYWQuZXJyb3JVcGxvYWRpbmdGaWxlcycpKTtcbiAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgIH0pLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgLy8gQ2xlYXIgdGhlIGZsb3cgaW5zdGFuY2UgYWZ0ZXIgdGhlIHVwbG9hZCBpcyBjb21wbGV0ZSBvciBhbiBlcnJvciBvY2N1cnNcbiAgICAgICAgICB0aGlzLmZsb3cuY2FuY2VsKCk7XG4gICAgICAgIH0pXG4gICAgICApLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja3MgdGhlIGluZGV4aW5nIHByb2Nlc3MgZm9yIGEgc2luZ2xlIGRvY3VtZW50cyB1cGxvYWQgc2Vzc2lvbiBieSBwb2xsaW5nIHRoZSBBUEkgZm9yIGl0cyBzdGF0dXMuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIEEgdW5pcXVlIHRva2VuIHJlcHJlc2VudGluZyB0aGUgc2luZ2xlIGRvY3VtZW50cyB1cGxvYWQgc2Vzc2lvbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBDbGVhcnMgdGhlIHVwbG9hZGluZyBmbGFncyBhbmQgc2V0cyB0aGUgaW5kZXhpbmcgZmxhZyB0byB0cnVlIGJlZm9yZSBzdGFydGluZyB0aGUgcHJvY2Vzcy5cbiAgICogLSBQb2xscyB0aGUgQVBJIGV2ZXJ5IChwb2xsaW5nSW50ZXJ2YWw6IGRlZmF1bHQgPSAxIHNlY29uZCkgdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgaW5kZXhpbmcgc3RhdHVzLlxuICAgKiAtIFVwZGF0ZXMgdGhlIGBpbmRleGluZ0luZm9zYCBwcm9wZXJ0eSB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzLlxuICAgKiAtIFN0b3BzIHBvbGxpbmcgd2hlbiB0aGUgaW5kZXhpbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQgb3IgYW4gZXJyb3Igb2NjdXJzLlxuICAgKiAtIENsZWFucyB1cCBieSByZXNldHRpbmcgdGhlIGluZGV4aW5nIGZsYWdzIGFuZCBjbGVhcmluZyB0aGUgYGluZGV4aW5nSW5mb3NgIHByb3BlcnR5IHdoZW4gdGhlIHByb2Nlc3MgaXMgZmluYWxpemVkLlxuICAgKi9cbiAgdHJhY2tJbmRleGluZ1Byb2Nlc3ModG9rZW46IHN0cmluZykge1xuICAgIC8vIENsZWFyIHRoZSB1cGxvYWRpbmcgZmxhZ3NcbiAgICB0aGlzLnVwbG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy51cGxvYWRpbmdJbmZvcyQubmV4dCh1bmRlZmluZWQpO1xuICAgIC8vIFNldCB0aGUgaW5kZXhpbmcgZmxhZyB0byB0cnVlXG4gICAgdGhpcy5pbmRleGluZyQubmV4dCh0cnVlKTtcblxuICAgIC8vIENvbWJpbmUgaW1tZWRpYXRlIEFQSSBjYWxsIHdpdGggaW50ZXJ2YWwtYmFzZWQgcG9sbGluZ1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBpbnRlcnZhbCh0aGlzLnBvbGxpbmdJbnRlcnZhbCkucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKDApLCAvLyBUcmlnZ2VyIHRoZSBBUEkgY2FsbCBpbW1lZGlhdGVseVxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5kb2N1bWVudHNVcGxvYWRTZXJ2aWNlLmdldEluZGV4aW5nU3RhdHVzKHRva2VuKSksXG4gICAgICAgIHRhcCgocmVzOiBJbmRleGluZ0luZm9zKSA9PiB0aGlzLmluZGV4aW5nSW5mb3MkLm5leHQocmVzKSksXG4gICAgICAgIHRha2VXaGlsZSgocmVzcG9uc2U6IEluZGV4aW5nSW5mb3MpID0+ICFyZXNwb25zZS5pc0NvbXBsZXRlZCwgdHJ1ZSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKHRoaXMudHJhbnNsb2NvLnRyYW5zbGF0ZSgnY2hhdERvY3VtZW50c1VwbG9hZC5lcnJvckluZGV4aW5nU3RhdHVzJykpO1xuICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAvLyBDbGVhciB0aGUgaW5kZXhpbmcgZmxhZ3NcbiAgICAgICAgICB0aGlzLmluZGV4aW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmluZGV4aW5nSW5mb3MkLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgfSlcbiAgICAgICkuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGluZGV4aW5nIHByb2dyZXNzIGFzIGEgcGVyY2VudGFnZSBvZiBjb21wbGV0ZWQgZG9jdW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gaW5mb3MgLSBUaGUgaW5kZXhpbmcgaW5mb3JtYXRpb24gY29udGFpbmluZyB0aGUgbGlzdCBvZiBkb2N1bWVudHMgYW5kIHRoZWlyIHN0YXR1c2VzLlxuICAgKiBAcmV0dXJucyBUaGUgcHJvZ3Jlc3MgYXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLCB3aGVyZSAwIGluZGljYXRlcyBubyBwcm9ncmVzcyBhbmQgMSBpbmRpY2F0ZXMgYWxsIGRvY3VtZW50cyBhcmUgcHJvY2Vzc2VkIChwcm9jZXNzZWQgbWVhbnMgZWl0aGVyIGluZGV4ZWQgb3IgZXJyb3JlZCkuXG4gICAqICAgICAgICAgIFJldHVybnMgMCBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZCBvciB0aGVyZSBhcmUgbm8gZG9jdW1lbnRzLlxuICAgKi9cbiAgZ2V0SW5kZXhpbmdQcm9ncmVzcyhpbmZvczogSW5kZXhpbmdJbmZvcyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gICAgaWYgKCFpbmZvcyB8fCAhaW5mb3MuZG9jcykgcmV0dXJuIDA7XG4gICAgY29uc3QgY29tcGxldGVkID0gaW5mb3MuZG9jcy5maWx0ZXIoZG9jID0+IGRvYy5zdGF0dXMgPT09IFwiSW5kZXhlZFwiIHx8IGRvYy5zdGF0dXMgPT09IFwiRXJyb3JcIikubGVuZ3RoO1xuICAgIGNvbnN0IHRvdGFsID0gaW5mb3MuZG9jcy5sZW5ndGg7XG4gICAgcmV0dXJuIGNvbXBsZXRlZC90b3RhbDtcbiAgfVxuXG59XG4iLCI8bmctY29udGFpbmVyICNmbG93PVwiZmxvd1wiIFtmbG93Q29uZmlnXT1cImZsb3dDb25maWdcIj48L25nLWNvbnRhaW5lcj5cbjxkaXYgY2xhc3M9XCJmaWxlLXVwbG9hZC1jb250YWluZXJcIj5cbiAgPGlucHV0XG4gICAgdHlwZT1cImZpbGVcIlxuICAgIGZsb3dCdXR0b25cbiAgICBbZmxvd109XCJmbG93LmZsb3dKc1wiXG4gICAgbXVsdGlwbGVcbiAgICBoaWRkZW5cbiAgICAjZmlsZUlucHV0PlxuICA8ZGl2XG4gICAgZmxvd0Ryb3BcbiAgICBbZmxvd109XCJmbG93LmZsb3dKc1wiXG4gICAgKGRyYWdlbnRlcik9XCJvbkRyYWdlbnRlcigpXCJcbiAgICAoZHJhZ2xlYXZlKT1cIm9uRHJhZ2xlYXZlKCRldmVudClcIlxuICAgIChkcm9wKT1cIm9uRHJvcCgpXCJcbiAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIlxuICAgIGNsYXNzPVwiZHJvcHpvbmVcIlxuICAgIFtuZ0NsYXNzXT1cInsnZHJvcHpvbmUtLWFjdGl2ZSc6IChkcmFnZ2luZyQgfCBhc3luYyl9XCJcbiAgICBbaGlkZGVuXT1cIih1cGxvYWRpbmckIHwgYXN5bmMpIHx8IChpbmRleGluZyQgfCBhc3luYylcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGRyYWdnaW5nJCB8IGFzeW5jKTsgZWxzZSBkcmFnZ2luZ0NvbnRlbnRcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2xvdWQtdXBsb2FkLWFsdFwiPjwvaT5cbiAgICAgICAgPHNwYW4+e3sgJ2NoYXREb2N1bWVudHNVcGxvYWQuZHJhZ0FuZERyb3AnIHwgdHJhbnNsb2NvIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtb3JhbmdlXCI+e3sgJ2NoYXREb2N1bWVudHNVcGxvYWQuY2xpY2tUb0Jyb3dzZScgfCB0cmFuc2xvY28gfX08L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZHJhZ2dpbmdDb250ZW50PlxuICAgICAgICA8c3Bhbj57eyAnY2hhdERvY3VtZW50c1VwbG9hZC5kcm9wRmlsZXMnIHwgdHJhbnNsb2NvIH19PC9zcGFuPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cIih1cGxvYWRpbmckIHwgYXN5bmMpIHx8IChpbmRleGluZyQgfCBhc3luYylcIiBjbGFzcz1cImRyb3B6b25lIGRyb3B6b25lLS1hY3RpdmVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHVwbG9hZGluZyQgfCBhc3luYyk7IGVsc2UgaW5kZXhpbmdTdGF0ZVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3Bpbm5lciBmYS1wdWxzZVwiPjwvaT5cbiAgICAgIDxzcGFuPlxuICAgICAgICB7eyAnY2hhdERvY3VtZW50c1VwbG9hZC51cGxvYWRpbmdGaWxlcycgfCB0cmFuc2xvY286IHsgY291bnQ6IChmbG93LnRyYW5zZmVycyQgfCBhc3luYykhLnRyYW5zZmVycy5sZW5ndGggfSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCIodXBsb2FkaW5nSW5mb3MkIHwgYXN5bmMpIGFzIHVwbG9hZGluZ0luZm9zXCI+e3sgdXBsb2FkaW5nSW5mb3MucHJvZ3Jlc3MgfCBudW1iZXI6JzEuMC0wJyB9fSU8L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNpbmRleGluZ1N0YXRlPlxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3Bpbm5lciBmYS1wdWxzZVwiPjwvaT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbmRleGluZ0luZm9zJCB8IGFzeW5jIGFzIGluZGV4aW5nSW5mb1wiPlxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICB7eyAnY2hhdERvY3VtZW50c1VwbG9hZC5pbmRleGluZ0ZpbGVzJyB8IHRyYW5zbG9jbzogeyBjb3VudDogaW5kZXhpbmdJbmZvLmRvY3MubGVuZ3RoIH0gfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBnZXRJbmRleGluZ1Byb2dyZXNzKGluZGV4aW5nSW5mbykgKiAxMDAgfCBudW1iZXI6JzEuMC0wJyB9fSU8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cblxuICA8dWwgKm5nSWY9XCJlcnJvckFsZXJ0cy5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvci1saXN0IG10LTNcIj5cbiAgICA8bGkgKm5nRm9yPVwibGV0IGVycm9yIG9mIGVycm9yQWxlcnRzXCI+XG4gICAgICB7eyBlcnJvciB9fVxuICAgIDwvbGk+XG4gIDwvdWw+XG5cbiAgPGRpdiAqbmdJZj1cIigoZmxvdy50cmFuc2ZlcnMkIHwgYXN5bmMpPy50cmFuc2ZlcnM/Lmxlbmd0aCA+IDApICYmICEodXBsb2FkaW5nJCB8IGFzeW5jKVwiIGNsYXNzPVwiZmlsZS1saXN0IG10LTNcIj5cbiAgICA8dWw+XG4gICAgICA8bGkgKm5nRm9yPVwibGV0IHRyYW5zZmVyIG9mIChmbG93LnRyYW5zZmVycyQgfCBhc3luYykhLnRyYW5zZmVyczsgdHJhY2tCeTogdHJhY2tUcmFuc2ZlclwiPlxuICAgICAgICA8c3EtZm9ybWF0LWljb24gW2V4dGVuc2lvbl09XCJ0cmFuc2Zlci5mbG93RmlsZS5nZXRFeHRlbnNpb24oKVwiIGNsYXNzPVwibWUtMVwiPjwvc3EtZm9ybWF0LWljb24+XG4gICAgICAgIDxzcGFuIFt0aXRsZV09XCJ0cmFuc2Zlci5uYW1lXCI+e3sgdHJhbnNmZXIubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2ggbXMtMVwiIChjbGljayk9XCJmbG93LmNhbmNlbEZpbGUodHJhbnNmZXIpXCIgW3RpdGxlXT1cIidjaGF0RG9jdW1lbnRzVXBsb2FkLmNhbmNlbCcgfCB0cmFuc2xvY29cIj48L2k+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggbXQtMlwiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGNhbmNlbC1idG4gbWUtMlwiXG4gICAgICAoY2xpY2spPVwiZmxvdy5jYW5jZWwoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiISgoZmxvdy50cmFuc2ZlcnMkIHwgYXN5bmMpPy50cmFuc2ZlcnM/Lmxlbmd0aCA+IDApIHx8ICh1cGxvYWRpbmckIHwgYXN5bmMpIHx8IChpbmRleGluZyQgfCBhc3luYylcIj5cbiAgICAgIHt7ICdjaGF0RG9jdW1lbnRzVXBsb2FkLmNhbmNlbCcgfCB0cmFuc2xvY28gfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwidXBsb2FkLWJ0blwiXG4gICAgICAoY2xpY2spPVwidXBsb2FkKClcIlxuICAgICAgW2Rpc2FibGVkXT1cIiEoKGZsb3cudHJhbnNmZXJzJCB8IGFzeW5jKT8udHJhbnNmZXJzPy5sZW5ndGggPiAwKSB8fCAodXBsb2FkaW5nJCB8IGFzeW5jKSB8fCAoaW5kZXhpbmckIHwgYXN5bmMpXCI+XG4gICAgICB7eyAnY2hhdERvY3VtZW50c1VwbG9hZC51cGxvYWQnIHwgdHJhbnNsb2NvIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtdXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2RvY3VtZW50cy11cGxvYWQvZG9jdW1lbnQtdXBsb2FkL2RvY3VtZW50LXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9kb2N1bWVudHMtdXBsb2FkL2RvY3VtZW50LXVwbG9hZC9kb2N1bWVudC11cGxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBMkIsTUFBTSxrQkFBa0IsQ0FBQztBQUUxRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixLQUFLLEVBQ0wsUUFBUSxFQUNSLFFBQVEsRUFDUixZQUFZLEVBQ1osU0FBUyxFQUNULFNBQVMsRUFDVCxHQUFHLEVBQ0gsU0FBUyxFQUNULEVBQUUsRUFDRixJQUFJLEdBQ0wsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWxELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0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LENBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxtQkFBbUIsQ0FBQyxLQUFnQztRQUNsRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3RHLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2hDLE9BQU8sU0FBUyxHQUFDLEtBQUssQ0FBQztJQUN6QixDQUFDOytHQW5SVSx1QkFBdUI7bUdBQXZCLHVCQUF1QixpSEFIdkIsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLHNJQ3hDN0QsMi9HQXdGQSxzdUhEL0NZLFlBQVksMGNBQUUsYUFBYSx5WUFBRSxtQkFBbUIsNkVBQUUsYUFBYTs7NEZBRTlELHVCQUF1QjtrQkFSbkMsU0FBUzsrQkFDRSxvQkFBb0IsY0FHbEIsSUFBSSxhQUNMLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxXQUNsRCxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxDQUFDOzhCQUlqRSxlQUFlO3NCQUF2QixLQUFLO2dCQUUrQixJQUFJO3NCQUF4QyxTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBOZ3hGbG93TW9kdWxlLCBGbG93RGlyZWN0aXZlLCBUcmFuc2ZlciB9IGZyb20gXCJAZmxvd2pzL25neC1mbG93XCI7XG5pbXBvcnQgeyBGbG93RmlsZSB9IGZyb20gXCJmbG93anNcIjtcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY2F0Y2hFcnJvcixcbiAgRU1QVFksXG4gIGZpbmFsaXplLFxuICBpbnRlcnZhbCxcbiAgU3Vic2NyaXB0aW9uLFxuICBzd2l0Y2hNYXAsXG4gIHRha2VXaGlsZSxcbiAgdGFwLFxuICBzdGFydFdpdGgsXG4gIG9mLFxuICB0YWtlLFxufSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcHJvdmlkZVRyYW5zbG9jb1Njb3BlLCBUcmFuc2xvY29QaXBlLCBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQGpzdmVyc2UvdHJhbnNsb2NvJztcblxuaW1wb3J0IHsgaXNBdXRoZW50aWNhdGVkIH0gZnJvbSBcIkBzaW5lcXVhL2F0b21pY1wiO1xuXG5pbXBvcnQgeyBEb2N1bWVudHNVcGxvYWRTZXJ2aWNlIH0gZnJvbSBcIi4uL2RvY3VtZW50cy11cGxvYWQuc2VydmljZVwiO1xuaW1wb3J0IHsgRm9ybWF0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Zvcm1hdC1pY29uL2Zvcm1hdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJbmRleGluZ0luZm9zLCBVcGxvYWRFdmVudCwgVXBsb2FkaW5nSW5mb3MgfSBmcm9tIFwiLi4vZG9jdW1lbnRzLXVwbG9hZC5tb2RlbFwiO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IEFwcFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYXBwLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcInNxLWRvY3VtZW50LXVwbG9hZFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2RvY3VtZW50LXVwbG9hZC5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vZG9jdW1lbnQtdXBsb2FkLmNvbXBvbmVudC5zY3NzXCJdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBwcm92aWRlcnM6IFtwcm92aWRlVHJhbnNsb2NvU2NvcGUoJ2NoYXQtZG9jdW1lbnRzLXVwbG9hZCcpXSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTmd4Rmxvd01vZHVsZSwgRm9ybWF0SWNvbkNvbXBvbmVudCwgVHJhbnNsb2NvUGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgRG9jdW1lbnRVcGxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBQb2xsaW5nIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyB0byB1cGRhdGUgdGhlIGluZGV4aW5nIHN0YXR1cyBvZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzICovXG4gIEBJbnB1dCgpIHBvbGxpbmdJbnRlcnZhbCA6IG51bWJlciA9IDEwMDA7XG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgZmxvdyBkaXJlY3RpdmVcbiAgQFZpZXdDaGlsZChcImZsb3dcIiwgeyBzdGF0aWM6IHRydWUgfSkgZmxvdyE6IEZsb3dEaXJlY3RpdmU7XG5cbiAgcmVhZG9ubHkgZmxvd0NvbmZpZzogZmxvd2pzLkZsb3dPcHRpb25zID0ge1xuICAgIC8vIERpc2FibGVzIGNodW5rIHRlc3RpbmcgYmVmb3JlIHVwbG9hZGluZyBhY3R1YWwgZmlsZSBkYXRhLiBUaHVzLCBhdm9pZHMgdW5uZWNlc3NhcnkgcmVxdWVzdHMgYW5kIHNwZWVkcyB1cCB1cGxvYWRzXG4gICAgdGVzdENodW5rczogZmFsc2UsXG4gICAgLy8gQWxsb3dzIG11bHRpcGxlIGZpbGUgdXBsb2FkcyBzaW11bHRhbmVvdXNseVxuICAgIHNpbmdsZUZpbGU6IGZhbHNlLFxuICAgIC8vIEFsbG93cyB0aGUgc2FtZSBmaWxlIHRvIGJlIHVwbG9hZGVkIG11bHRpcGxlIHRpbWVzXG4gICAgYWxsb3dEdXBsaWNhdGVVcGxvYWRzOiB0cnVlLFxuICAgIHF1ZXJ5OiAoKSA9PiB7XG4gICAgICByZXR1cm4ge307IC8vIEVtcHR5IG9iamVjdCB0byBwcmV2ZW50IHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICB9LFxuICAgIHByZXByb2Nlc3M6IChjaHVuaykgPT4gY2h1bmsuYWJvcnQoKSAvLyBQcmV2ZW50cyB0aGUgZGVmYXVsdCBmbG93IHVwbG9hZCBvZiBjaHVua3NcbiAgfTtcbiAgcHVibGljIGVycm9yQWxlcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgZHJhZ2dpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBpbmRleGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGluZGV4aW5nSW5mb3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJbmRleGluZ0luZm9zIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwdWJsaWMgdXBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgdXBsb2FkaW5nSW5mb3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVcGxvYWRpbmdJbmZvcyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHVibGljIGRvY3VtZW50c1VwbG9hZFNlcnZpY2UgPSBpbmplY3QoRG9jdW1lbnRzVXBsb2FkU2VydmljZSk7XG4gIHB1YmxpYyBub3RpZmljYXRpb25zU2VydmljZSA9IGluamVjdChOb3RpZmljYXRpb25zU2VydmljZSk7XG4gIHB1YmxpYyBhcHBTZXJ2aWNlID0gaW5qZWN0KEFwcFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbG9jbyA9IGluamVjdChUcmFuc2xvY29TZXJ2aWNlKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgb2YoaXNBdXRoZW50aWNhdGVkKCkpLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChfKSA9PiB0aGlzLmFwcFNlcnZpY2UuaW5pdCgpKSxcbiAgICAgICAgICB0YXAoKF8pID0+IHRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS5pbml0KCkpLFxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmZsb3cuZXZlbnRzJC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGV2dCA9IGV2ZW50IGFzIGFueTtcbiAgICAgICAgLy8gS2VwdCBpdCBqdXN0IGZvciByZWZlcmVuY2UgdG8gc2hvdyBob3cgdG8gYWNjZXNzIGRhdGEgb2YgZGlmZmVyZW50IGV2ZW50c1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJmaWxlc0FkZGVkXCIpIHtcbiAgICAgICAgICBjb25zdCBhZGRlZEZpbGVzID0gZXZ0LmV2ZW50WzBdIGFzIEZsb3dGaWxlW107XG4gICAgICAgICAgdGhpcy5fb25GaWxlc0FkZGVkKGFkZGVkRmlsZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBcImZpbGVzU3VibWl0dGVkXCIpIHtcbiAgICAgICAgICB0aGlzLl9vbkZpbGVzU3VibWl0dGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIE92ZXJyaWRlIHRoZSB1cGxvYWQgbWV0aG9kIG9mIHRoZSBmbG93IGRpcmVjdGl2ZVxuICAgIHRoaXMuZmxvdy51cGxvYWQgPSB0aGlzLnN0YXJ0VXBsb2FkLmJpbmQodGhpcyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBzdWJtaXNzaW9uIG9mIGZpbGVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIGNoZWNrcyBvbiB0aGUgc3VibWl0dGVkIGZpbGVzOlxuICAgKlxuICAgKiAxLiBDaGVja3MgaWYgdGhlIG51bWJlciBvZiBmaWxlcyBzdWJtaXR0ZWQgZXhjZWVkcyB0aGUgcmVtYWluaW5nRmlsZUNvdW50IGRlZmluZWQgaW4gdGhlIGNvbnN0cmFpbnRzLlxuICAgKiAgICAtIElmIHRoZSBudW1iZXIgb2YgZmlsZXMgZXhjZWVkcyB0aGUgYWxsb3dlZCBjb3VudCwgYWxsIGZpbGVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGZsb3cuXG4gICAqICAgIC0gQW4gZXJyb3IgbWVzc2FnZSBpcyBhZGRlZCB0byB0aGUgZXJyb3IgYWxlcnRzLlxuICAgKlxuICAgKiAyLiBDaGVja3MgaWYgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGZpbGVzIHN1Ym1pdHRlZCBleGNlZWRzIHRoZSByZW1haW5pbmdGaWxlU2l6ZSBkZWZpbmVkIGluIHRoZSBjb25zdHJhaW50cy5cbiAgICogICAgLSBJZiB0aGUgdG90YWwgc2l6ZSBleGNlZWRzIHRoZSBhbGxvd2VkIHNpemUsIGFsbCBmaWxlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBmbG93LlxuICAgKiAgICAtIEFuIGVycm9yIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGVycm9yIGFsZXJ0cy5cbiAgICpcbiAgICogMy4gQ2hlY2tzIGlmIHRoZSBmaWxlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgc3VibWl0dGVkIGlzIG5vdCBhbGxvd2VkLlxuICAgKiAgICAtIElmIHRoZSBmaWxlIGV4dGVuc2lvbiBpcyBub3QgYWxsb3dlZCwgdGhlIGZpbGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBmbG93LlxuICAgKiAgICAtIEFuIGVycm9yIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGVycm9yIGFsZXJ0cy5cbiAgICovXG4gIHByaXZhdGUgX29uRmlsZXNTdWJtaXR0ZWQoKSB7XG4gICAgLy8gR2V0IGFsbCBmaWxlcyBmcm9tIHRoZSBmbG93XG4gICAgY29uc3QgZmlsZXMgPSBbLi4udGhpcy5mbG93LmZsb3dKcy5maWxlc107XG4gICAgLy8gQ2xlYXIgdGhlIGVycm9yIGFsZXJ0c1xuICAgIHRoaXMuZXJyb3JBbGVydHMgPSBbXTtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIG51bWJlciBvZiBmaWxlcyBzdWJtaXR0ZWQgZXhjZWVkcyB0aGUgcmVtYWluaW5nRmlsZUNvdW50IGRlZmluZWQgaW4gdGhlIGNvbnN0cmFpbnRzLlxuICAgICAqIElmIHRoZSBudW1iZXIgb2YgZmlsZXMgZXhjZWVkcyB0aGUgYWxsb3dlZCBjb3VudCwgYWxsIGZpbGVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGZsb3dcbiAgICAgKiBBbiBlcnJvciBtZXNzYWdlIGlzIGFkZGVkIHRvIHRoZSBlcnJvciBhbGVydHMuXG4gICAgICovXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IHRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS51cGxvYWRDb25maWckLnZhbHVlIS5jb25zdHJhaW50cy5yZW1haW5pbmdGaWxlQ291bnQpIHtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICB0aGlzLmZsb3cuZmxvd0pzLnJlbW92ZUZpbGUoZmlsZSk7XG4gICAgICB9XG4gICAgICBlcnJvcnMucHVzaCh0aGlzLnRyYW5zbG9jby50cmFuc2xhdGUoJ2NoYXREb2N1bWVudHNVcGxvYWQuZmlsZXNOdW1iZXJMaW1pdEV4Y2VlZGVkJywgeyBtYXg6IHRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS51cGxvYWRDb25maWckLnZhbHVlIS5jb25zdHJhaW50cy5yZW1haW5pbmdGaWxlQ291bnQgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZmlsZXMgc3VibWl0dGVkIGV4Y2VlZHMgdGhlIHJlbWFpbmluZ0ZpbGVTaXplIGRlZmluZWQgaW4gdGhlIGNvbnN0cmFpbnRzLlxuICAgICAqIElmIHRoZSB0b3RhbCBzaXplIGV4Y2VlZHMgdGhlIGFsbG93ZWQgc2l6ZSwgYWxsIGZpbGVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGZsb3dcbiAgICAgKiBBbiBlcnJvciBtZXNzYWdlIGlzIGFkZGVkIHRvIHRoZSBlcnJvciBhbGVydHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGZpbGVzIHRoYXQgY2FuIGJlIHVwbG9hZGVkIGlzIHRlbXBvcmFyeSBzZXQgdG8gdGhlIG1heGltdW0gb2YgMTI4IE1CIGFuZCB0aGUgcmVtYWluaW5nRmlsZVNpemVNQiBkZWZpbmVkIGluIHRoZSBjb25zdHJhaW50cy5cbiAgICAgKiBXYWl0aW5nIGZvciB0aGUgcGx1Z2luIHRvIGhhbmRsZSB0aGlzIGtlc3RyZWwgaXNzdWVcbiAgICAgKi9cbiAgICBlbHNlIGlmICh0aGlzLmRvY3VtZW50c1VwbG9hZFNlcnZpY2UuY29udmVydEJ5dGVzVG9NQih0aGlzLmZsb3cuZmxvd0pzLmdldFNpemUoKSkgPiBNYXRoLm1pbigxMjgsIHRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS51cGxvYWRDb25maWckLnZhbHVlIS5jb25zdHJhaW50cy5yZW1haW5pbmdGaWxlU2l6ZU1CKSkge1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIHRoaXMuZmxvdy5mbG93SnMucmVtb3ZlRmlsZShmaWxlKTtcbiAgICAgIH1cbiAgICAgIGVycm9ycy5wdXNoKHRoaXMudHJhbnNsb2NvLnRyYW5zbGF0ZSgnY2hhdERvY3VtZW50c1VwbG9hZC5maWxlc1NpemVMaW1pdEV4Y2VlZGVkJywgeyBtYXg6IE1hdGgubWluKDEyOCwgdGhpcy5kb2N1bWVudHNVcGxvYWRTZXJ2aWNlLnVwbG9hZENvbmZpZyQudmFsdWUhLmNvbnN0cmFpbnRzLnJlbWFpbmluZ0ZpbGVTaXplTUIpIH0pKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZmlsZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIHN1Ym1pdHRlZCBpcyBub3QgYWxsb3dlZC5cbiAgICAgKiBJZiB0aGUgZmlsZSBleHRlbnNpb24gaXMgbm90IGFsbG93ZWQsIHRoZSBmaWxlIGlzIHJlbW92ZWQgZnJvbSB0aGUgZmxvd1xuICAgICAqIEFuIGVycm9yIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGVycm9yIGFsZXJ0cy5cbiAgICAgKi9cbiAgICBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBpZiAoIXRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS51cGxvYWRDb25maWckLnZhbHVlIS5jb25zdHJhaW50cy5zdXBwb3J0ZWRGaWxlRXh0ZW5zaW9ucy5pbmNsdWRlcyhgJHtmaWxlLmdldEV4dGVuc2lvbigpfWApKSB7XG4gICAgICAgICAgdGhpcy5mbG93LmZsb3dKcy5yZW1vdmVGaWxlKGZpbGUpO1xuICAgICAgICAgIGVycm9ycy5wdXNoKHRoaXMudHJhbnNsb2NvLnRyYW5zbGF0ZSgnY2hhdERvY3VtZW50c1VwbG9hZC5maWxlRXh0ZW5zaW9uVW5zdXBwb3J0ZWQnLCB7IGV4dGVuc2lvbjogZmlsZS5nZXRFeHRlbnNpb24oKSB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgdW5pcXVlIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBlcnJvciBhbGVydHNcbiAgICB0aGlzLmVycm9yQWxlcnRzID0gWy4uLm5ldyBTZXQoZXJyb3JzKV07XG4gIH1cblxuICBwcml2YXRlIF9vbkZpbGVzQWRkZWQoZmlsZXM6IEZsb3dGaWxlW10pIHt9XG5cbiAgb25EcmFnZW50ZXIoKSB7XG4gICAgdGhpcy5kcmFnZ2luZyQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIG9uRHJhZ2xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBpZiAoXG4gICAgICAhZXZlbnQucmVsYXRlZFRhcmdldCB8fFxuICAgICAgIShldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiLmRyb3B6b25lXCIpXG4gICAgKSB7XG4gICAgICB0aGlzLmRyYWdnaW5nJC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBvbkRyb3AoKSB7XG4gICAgdGhpcy5kcmFnZ2luZyQubmV4dChmYWxzZSk7XG4gIH1cblxuICB0cmFja1RyYW5zZmVyKHRyYW5zZmVyOiBUcmFuc2Zlcikge1xuICAgIHJldHVybiB0cmFuc2Zlci5pZDtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEluaXRpYXRlcyB0aGUgdXBsb2FkIHByb2Nlc3MgYnkgaW52b2tpbmcgdGhlIGB1cGxvYWRgIG1ldGhvZFxuICAgKiBvZiB0aGUgYGZsb3dgIGluc3RhbmNlLlxuICAgKiBUaGUgYHVwbG9hZGAgbWV0aG9kIGlzIG92ZXJyaWRkZW4gaW4gdGhlIGBuZ09uSW5pdGAgbWV0aG9kIHRvIG1hdGNoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIGFzc2lzdGFudCBBUEkuXG4gICAqL1xuICB1cGxvYWQoKSB7XG4gICAgdGhpcy5mbG93LnVwbG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlcyB0aGUgZmlsZSB1cGxvYWQgcHJvY2VzcyBieSBwcmVwYXJpbmcgdGhlIGZvcm0gZGF0YSxcbiAgICogc2V0dGluZyB0aGUgdXBsb2FkaW5nIGZsYWcsIGFuZCBtYWtpbmcgYW4gQVBJIGNhbGwgdG8gdXBsb2FkIHRoZSBmaWxlcy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBDb2xsZWN0cyBhbGwgZmlsZXMgZnJvbSB0aGUgYGZsb3dKc2AgaW5zdGFuY2UgYW5kIGFwcGVuZHMgdGhlbSB0byBhIGBGb3JtRGF0YWAgb2JqZWN0LlxuICAgKiAtIFN1YnNjcmliZXMgdG8gdGhlIHVwbG9hZCBwcm9jZXNzIHRvIGhhbmRsZSBwcm9ncmVzcyB1cGRhdGVzLCBjb21wbGV0aW9uLCBhbmQgZXJyb3JzLlxuICAgKiAtIFRyaWdnZXJzIHRyYWNraW5nIHRoZSBpbmRleGluZyBwcm9jZXNzIHVwb24gc3VjY2Vzc2Z1bCB1cGxvYWQgY29tcGxldGlvbi5cbiAgICogLSBDbGVhbnMgdXAgdGhlIGBmbG93YCBpbnN0YW5jZSBhZnRlciB0aGUgdXBsb2FkIHByb2Nlc3MgaXMgZmluYWxpemVkLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFydFVwbG9hZCgpIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgLy8gQWRkIGFsbCBmaWxlcyB3aXRoIHRoZWlyIG9yaWdpbmFsIG5hbWVzXG4gICAgdGhpcy5mbG93LmZsb3dKcy5maWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoZmlsZS5uYW1lLCBmaWxlLmZpbGUpO1xuICAgIH0pO1xuXG4gICAgLy8gQ2xlYXIgdGhlIGVycm9yIGFsZXJ0c1xuICAgIHRoaXMuZXJyb3JBbGVydHMgPSBbXTtcbiAgICAvLyBTZXQgdGhlIHVwbG9hZGluZyBmbGFnIHRvIHRydWVcbiAgICB0aGlzLnVwbG9hZGluZyQubmV4dCh0cnVlKTtcblxuICAgIC8vIE1ha2UgdGhlIEFQSSBjYWxsIHRvIHVwbG9hZCB0aGUgZmlsZXNcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5kb2N1bWVudHNVcGxvYWRTZXJ2aWNlLnVwbG9hZERvY3VtZW50cyhmb3JtRGF0YSkucGlwZShcbiAgICAgICAgdGFwKChldmVudDogVXBsb2FkRXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3VwbG9hZFByb2dyZXNzJykge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRpbmdJbmZvcyQubmV4dChldmVudCBhcyBVcGxvYWRpbmdJbmZvcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChldmVudC50eXBlID09PSAncmVzcG9uc2UnKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrSW5kZXhpbmdQcm9jZXNzKGV2ZW50LmJvZHkuc3RhdHVzVG9rZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMudXBsb2FkaW5nJC5uZXh0KGZhbHNlKTsgLy8gU2V0IHRoZSB1cGxvYWRpbmcgZmxhZyB0byBmYWxzZSBPTkxZIGluIGNhc2Ugb2YgYW4gZXJyb3IuIE90aGVyd2lzZSwga2VlcCBpdCB0cnVlIHVudGlsIHRoZSBzdGFydCBvZiBpbmRleGluZyBwcm9jZXNzIGluIG9yZGVyIHRvIHByZXZlbnQgZmxpY2tlcmluZyBvZiB0aGUgVUlcbiAgICAgICAgICB0aGlzLnVwbG9hZGluZ0luZm9zJC5uZXh0KHVuZGVmaW5lZCk7IC8vIENsZWFyIHRoZSB1cGxvYWRpbmcgaW5mb3NcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcih0aGlzLnRyYW5zbG9jby50cmFuc2xhdGUoJ2NoYXREb2N1bWVudHNVcGxvYWQuZXJyb3JVcGxvYWRpbmdGaWxlcycpKTtcbiAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgIH0pLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgLy8gQ2xlYXIgdGhlIGZsb3cgaW5zdGFuY2UgYWZ0ZXIgdGhlIHVwbG9hZCBpcyBjb21wbGV0ZSBvciBhbiBlcnJvciBvY2N1cnNcbiAgICAgICAgICB0aGlzLmZsb3cuY2FuY2VsKCk7XG4gICAgICAgIH0pXG4gICAgICApLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja3MgdGhlIGluZGV4aW5nIHByb2Nlc3MgZm9yIGEgc2luZ2xlIGRvY3VtZW50cyB1cGxvYWQgc2Vzc2lvbiBieSBwb2xsaW5nIHRoZSBBUEkgZm9yIGl0cyBzdGF0dXMuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIEEgdW5pcXVlIHRva2VuIHJlcHJlc2VudGluZyB0aGUgc2luZ2xlIGRvY3VtZW50cyB1cGxvYWQgc2Vzc2lvbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBDbGVhcnMgdGhlIHVwbG9hZGluZyBmbGFncyBhbmQgc2V0cyB0aGUgaW5kZXhpbmcgZmxhZyB0byB0cnVlIGJlZm9yZSBzdGFydGluZyB0aGUgcHJvY2Vzcy5cbiAgICogLSBQb2xscyB0aGUgQVBJIGV2ZXJ5IChwb2xsaW5nSW50ZXJ2YWw6IGRlZmF1bHQgPSAxIHNlY29uZCkgdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgaW5kZXhpbmcgc3RhdHVzLlxuICAgKiAtIFVwZGF0ZXMgdGhlIGBpbmRleGluZ0luZm9zYCBwcm9wZXJ0eSB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzLlxuICAgKiAtIFN0b3BzIHBvbGxpbmcgd2hlbiB0aGUgaW5kZXhpbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQgb3IgYW4gZXJyb3Igb2NjdXJzLlxuICAgKiAtIENsZWFucyB1cCBieSByZXNldHRpbmcgdGhlIGluZGV4aW5nIGZsYWdzIGFuZCBjbGVhcmluZyB0aGUgYGluZGV4aW5nSW5mb3NgIHByb3BlcnR5IHdoZW4gdGhlIHByb2Nlc3MgaXMgZmluYWxpemVkLlxuICAgKi9cbiAgdHJhY2tJbmRleGluZ1Byb2Nlc3ModG9rZW46IHN0cmluZykge1xuICAgIC8vIENsZWFyIHRoZSB1cGxvYWRpbmcgZmxhZ3NcbiAgICB0aGlzLnVwbG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy51cGxvYWRpbmdJbmZvcyQubmV4dCh1bmRlZmluZWQpO1xuICAgIC8vIFNldCB0aGUgaW5kZXhpbmcgZmxhZyB0byB0cnVlXG4gICAgdGhpcy5pbmRleGluZyQubmV4dCh0cnVlKTtcblxuICAgIC8vIENvbWJpbmUgaW1tZWRpYXRlIEFQSSBjYWxsIHdpdGggaW50ZXJ2YWwtYmFzZWQgcG9sbGluZ1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBpbnRlcnZhbCh0aGlzLnBvbGxpbmdJbnRlcnZhbCkucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKDApLCAvLyBUcmlnZ2VyIHRoZSBBUEkgY2FsbCBpbW1lZGlhdGVseVxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5kb2N1bWVudHNVcGxvYWRTZXJ2aWNlLmdldEluZGV4aW5nU3RhdHVzKHRva2VuKSksXG4gICAgICAgIHRhcCgocmVzOiBJbmRleGluZ0luZm9zKSA9PiB0aGlzLmluZGV4aW5nSW5mb3MkLm5leHQocmVzKSksXG4gICAgICAgIHRha2VXaGlsZSgocmVzcG9uc2U6IEluZGV4aW5nSW5mb3MpID0+ICFyZXNwb25zZS5pc0NvbXBsZXRlZCwgdHJ1ZSksIC8vIFVzZSB0YWtlV2hpbGVJbmNsdXNpdmUoKSBwYXR0ZXJuIHRvIGVuc3VyZSB0aGF0IHRoZSBsYXN0IHZhbHVlIHdoZXJlIGlzQ29tcGxldGVkID09PSB0cnVlIGlzIGFsc28gaW5jbHVkZWQuXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKHRoaXMudHJhbnNsb2NvLnRyYW5zbGF0ZSgnY2hhdERvY3VtZW50c1VwbG9hZC5lcnJvckluZGV4aW5nU3RhdHVzJykpO1xuICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBsaXN0IG9mIHVwbG9hZGVkIGRvY3VtZW50cyBhdCB0aGUgZW5kIG9mIGluZGV4aW5nXG4gICAgICAgICAgdGhpcy5kb2N1bWVudHNVcGxvYWRTZXJ2aWNlLmdldERvY3VtZW50c0xpc3QoKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgpO1xuICAgICAgICAgIC8vIENsZWFyIHRoZSBpbmRleGluZyBmbGFnc1xuICAgICAgICAgIHRoaXMuaW5kZXhpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuaW5kZXhpbmdJbmZvcyQubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB9KVxuICAgICAgKS5zdWJzY3JpYmUoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgaW5kZXhpbmcgcHJvZ3Jlc3MgYXMgYSBwZXJjZW50YWdlIG9mIGNvbXBsZXRlZCBkb2N1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSBpbmZvcyAtIFRoZSBpbmRleGluZyBpbmZvcm1hdGlvbiBjb250YWluaW5nIHRoZSBsaXN0IG9mIGRvY3VtZW50cyBhbmQgdGhlaXIgc3RhdHVzZXMuXG4gICAqIEByZXR1cm5zIFRoZSBwcm9ncmVzcyBhcyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEsIHdoZXJlIDAgaW5kaWNhdGVzIG5vIHByb2dyZXNzIGFuZCAxIGluZGljYXRlcyBhbGwgZG9jdW1lbnRzIGFyZSBwcm9jZXNzZWQgKHByb2Nlc3NlZCBtZWFucyBlaXRoZXIgaW5kZXhlZCBvciBlcnJvcmVkKS5cbiAgICogICAgICAgICAgUmV0dXJucyAwIGlmIHRoZSBpbnB1dCBpcyBpbnZhbGlkIG9yIHRoZXJlIGFyZSBubyBkb2N1bWVudHMuXG4gICAqL1xuICBnZXRJbmRleGluZ1Byb2dyZXNzKGluZm9zOiBJbmRleGluZ0luZm9zIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgICBpZiAoIWluZm9zIHx8ICFpbmZvcy5kb2NzKSByZXR1cm4gMDtcbiAgICBjb25zdCBjb21wbGV0ZWQgPSBpbmZvcy5kb2NzLmZpbHRlcihkb2MgPT4gZG9jLnN0YXR1cyA9PT0gXCJJbmRleGVkXCIgfHwgZG9jLnN0YXR1cyA9PT0gXCJFcnJvclwiKS5sZW5ndGg7XG4gICAgY29uc3QgdG90YWwgPSBpbmZvcy5kb2NzLmxlbmd0aDtcbiAgICByZXR1cm4gY29tcGxldGVkL3RvdGFsO1xuICB9XG5cbn1cbiIsIjxuZy1jb250YWluZXIgI2Zsb3c9XCJmbG93XCIgW2Zsb3dDb25maWddPVwiZmxvd0NvbmZpZ1wiPjwvbmctY29udGFpbmVyPlxuPGRpdiBjbGFzcz1cImZpbGUtdXBsb2FkLWNvbnRhaW5lclwiPlxuICA8aW5wdXRcbiAgICB0eXBlPVwiZmlsZVwiXG4gICAgZmxvd0J1dHRvblxuICAgIFtmbG93XT1cImZsb3cuZmxvd0pzXCJcbiAgICBtdWx0aXBsZVxuICAgIGhpZGRlblxuICAgICNmaWxlSW5wdXQ+XG4gIDxkaXZcbiAgICBmbG93RHJvcFxuICAgIFtmbG93XT1cImZsb3cuZmxvd0pzXCJcbiAgICAoZHJhZ2VudGVyKT1cIm9uRHJhZ2VudGVyKClcIlxuICAgIChkcmFnbGVhdmUpPVwib25EcmFnbGVhdmUoJGV2ZW50KVwiXG4gICAgKGRyb3ApPVwib25Ecm9wKClcIlxuICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgY2xhc3M9XCJkcm9wem9uZVwiXG4gICAgW25nQ2xhc3NdPVwieydkcm9wem9uZS0tYWN0aXZlJzogKGRyYWdnaW5nJCB8IGFzeW5jKX1cIlxuICAgIFtoaWRkZW5dPVwiKHVwbG9hZGluZyQgfCBhc3luYykgfHwgKGluZGV4aW5nJCB8IGFzeW5jKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoZHJhZ2dpbmckIHwgYXN5bmMpOyBlbHNlIGRyYWdnaW5nQ29udGVudFwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jbG91ZC11cGxvYWQtYWx0XCI+PC9pPlxuICAgICAgICA8c3Bhbj57eyAnY2hhdERvY3VtZW50c1VwbG9hZC5kcmFnQW5kRHJvcCcgfCB0cmFuc2xvY28gfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1vcmFuZ2VcIj57eyAnY2hhdERvY3VtZW50c1VwbG9hZC5jbGlja1RvQnJvd3NlJyB8IHRyYW5zbG9jbyB9fTwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNkcmFnZ2luZ0NvbnRlbnQ+XG4gICAgICAgIDxzcGFuPnt7ICdjaGF0RG9jdW1lbnRzVXBsb2FkLmRyb3BGaWxlcycgfCB0cmFuc2xvY28gfX08L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiKHVwbG9hZGluZyQgfCBhc3luYykgfHwgKGluZGV4aW5nJCB8IGFzeW5jKVwiIGNsYXNzPVwiZHJvcHpvbmUgZHJvcHpvbmUtLWFjdGl2ZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodXBsb2FkaW5nJCB8IGFzeW5jKTsgZWxzZSBpbmRleGluZ1N0YXRlXCI+XG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1zcGlubmVyIGZhLXB1bHNlXCI+PC9pPlxuICAgICAgPHNwYW4+XG4gICAgICAgIHt7ICdjaGF0RG9jdW1lbnRzVXBsb2FkLnVwbG9hZGluZ0ZpbGVzJyB8IHRyYW5zbG9jbzogeyBjb3VudDogKGZsb3cudHJhbnNmZXJzJCB8IGFzeW5jKSEudHJhbnNmZXJzLmxlbmd0aCB9IH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cIih1cGxvYWRpbmdJbmZvcyQgfCBhc3luYykgYXMgdXBsb2FkaW5nSW5mb3NcIj57eyB1cGxvYWRpbmdJbmZvcy5wcm9ncmVzcyB8IG51bWJlcjonMS4wLTAnIH19JTwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2luZGV4aW5nU3RhdGU+XG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1zcGlubmVyIGZhLXB1bHNlXCI+PC9pPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImluZGV4aW5nSW5mb3MkIHwgYXN5bmMgYXMgaW5kZXhpbmdJbmZvXCI+XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgIHt7ICdjaGF0RG9jdW1lbnRzVXBsb2FkLmluZGV4aW5nRmlsZXMnIHwgdHJhbnNsb2NvOiB7IGNvdW50OiBpbmRleGluZ0luZm8uZG9jcy5sZW5ndGggfSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IGdldEluZGV4aW5nUHJvZ3Jlc3MoaW5kZXhpbmdJbmZvKSAqIDEwMCB8IG51bWJlcjonMS4wLTAnIH19JTwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuXG4gIDx1bCAqbmdJZj1cImVycm9yQWxlcnRzLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yLWxpc3QgbXQtM1wiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgZXJyb3JBbGVydHNcIj5cbiAgICAgIHt7IGVycm9yIH19XG4gICAgPC9saT5cbiAgPC91bD5cblxuICA8ZGl2ICpuZ0lmPVwiKChmbG93LnRyYW5zZmVycyQgfCBhc3luYyk/LnRyYW5zZmVycz8ubGVuZ3RoID4gMCkgJiYgISh1cGxvYWRpbmckIHwgYXN5bmMpXCIgY2xhc3M9XCJmaWxlLWxpc3QgbXQtM1wiPlxuICAgIDx1bD5cbiAgICAgIDxsaSAqbmdGb3I9XCJsZXQgdHJhbnNmZXIgb2YgKGZsb3cudHJhbnNmZXJzJCB8IGFzeW5jKSEudHJhbnNmZXJzOyB0cmFja0J5OiB0cmFja1RyYW5zZmVyXCI+XG4gICAgICAgIDxzcS1mb3JtYXQtaWNvbiBbZXh0ZW5zaW9uXT1cInRyYW5zZmVyLmZsb3dGaWxlLmdldEV4dGVuc2lvbigpXCIgY2xhc3M9XCJtZS0xXCI+PC9zcS1mb3JtYXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0xXCIgW3RpdGxlXT1cInRyYW5zZmVyLm5hbWVcIj57eyB0cmFuc2Zlci5uYW1lIH19PC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImZsb3cuY2FuY2VsRmlsZSh0cmFuc2ZlcilcIlxuICAgICAgICAgIFt0aXRsZV09XCInY2hhdERvY3VtZW50c1VwbG9hZC5jYW5jZWwnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICBjbGFzcz1cImJnLXRyYW5zcGFyZW50IGJvcmRlci0wIHAtMCBtLTAgY3Vyc29yLXBvaW50ZXIgdGV4dC1pbmhlcml0IGxlYWRpbmctbm9uZSBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2hcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggbXQtMlwiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGNhbmNlbC1idG4gbWUtMlwiXG4gICAgICAoY2xpY2spPVwiZmxvdy5jYW5jZWwoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiISgoZmxvdy50cmFuc2ZlcnMkIHwgYXN5bmMpPy50cmFuc2ZlcnM/Lmxlbmd0aCA+IDApIHx8ICh1cGxvYWRpbmckIHwgYXN5bmMpIHx8IChpbmRleGluZyQgfCBhc3luYylcIj5cbiAgICAgIHt7ICdjaGF0RG9jdW1lbnRzVXBsb2FkLmNhbmNlbCcgfCB0cmFuc2xvY28gfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwidXBsb2FkLWJ0blwiXG4gICAgICAoY2xpY2spPVwidXBsb2FkKClcIlxuICAgICAgW2Rpc2FibGVkXT1cIiEoKGZsb3cudHJhbnNmZXJzJCB8IGFzeW5jKT8udHJhbnNmZXJzPy5sZW5ndGggPiAwKSB8fCAodXBsb2FkaW5nJCB8IGFzeW5jKSB8fCAoaW5kZXhpbmckIHwgYXN5bmMpXCI+XG4gICAgICB7eyAnY2hhdERvY3VtZW50c1VwbG9hZC51cGxvYWQnIHwgdHJhbnNsb2NvIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -1,46 +1,30 @@
1
1
  import { Injectable, inject } from '@angular/core';
2
- import { BehaviorSubject, catchError, filter, from, map, take } from 'rxjs';
2
+ import { BehaviorSubject, catchError, filter, from, map, take, tap } from 'rxjs';
3
3
  import { HttpClient, HttpEventType, HttpHeaders } from '@angular/common/http';
4
4
  import { AppService } from '../services/app.service';
5
5
  import { getToken, globalConfig, post } from '@sinequa/atomic';
6
6
  import * as i0 from "@angular/core";
7
7
  export class DocumentsUploadService {
8
8
  constructor() {
9
- /** Documents' upload configuration. */
9
+ this.REQUEST_URL = "api/v1/plugin/SinequaAssistantREST";
10
+ /** Documents upload configuration. */
10
11
  this.uploadConfig$ = new BehaviorSubject(undefined);
12
+ /** Emit the list of indexed documents */
13
+ this.uploadedDocuments$ = new BehaviorSubject([]);
11
14
  this.appService = inject(AppService);
12
15
  this.http = inject(HttpClient);
13
16
  }
14
17
  /**
15
- * Initializes the file upload service with the provided chat service instance.
16
- *
17
- * @param chatService - An instance of ChatService. If not provided, an error is thrown.
18
- * @throws {Error} If the chatService instance is not provided or if there is an error during initialization.
18
+ * Initializes the file upload service.
19
19
  */
20
- init(chatService) {
21
- if (!chatService)
22
- throw new Error('A chatService instance must be provided');
23
- this.chatService = chatService;
20
+ init() {
24
21
  try {
25
- this.getRequestsUrl();
26
22
  this.getUploadConfig();
27
23
  }
28
24
  catch (error) {
29
25
  throw new Error(error);
30
26
  }
31
27
  }
32
- /**
33
- * Fetch the endpoint to use for the file upload related requests
34
- * @throws {Error} If the property 'restEndpoint' is not provided in the assistant configuration
35
- */
36
- getRequestsUrl() {
37
- if (!!this.chatService.assistantConfig$.value.connectionSettings.restEndpoint) {
38
- this.REQUEST_URL = this.chatService.assistantConfig$.value.connectionSettings.restEndpoint;
39
- }
40
- else {
41
- throw new Error(`The property 'restEndpoint' must be provided when attempting to use 'REST' in assistant instance`);
42
- }
43
- }
44
28
  /**
45
29
  * Retrieves the upload configuration for documents.
46
30
  * The response, which contains the upload configuration, is emitted to the `uploadConfig$` observable.
@@ -50,10 +34,9 @@ export class DocumentsUploadService {
50
34
  getUploadConfig() {
51
35
  const data = {
52
36
  action: "documentsUploadConfigGet",
53
- appName: this.appService.appName,
54
- debug: this.chatService.assistantConfig$.value.defaultValues.debug
37
+ appName: this.appService.appName
55
38
  };
56
- from(post(`plugin/${this.REQUEST_URL}`, data)).pipe(take(1), catchError((error) => {
39
+ from(post(this.REQUEST_URL, data)).pipe(take(1), catchError((error) => {
57
40
  throw new Error(`Error invoking documentsUploadConfigGet: ${error}`);
58
41
  })).subscribe((res) => this.uploadConfig$.next(res));
59
42
  }
@@ -118,8 +101,7 @@ export class DocumentsUploadService {
118
101
  // Add the required "data" field as a JSON string
119
102
  const data = {
120
103
  action: "documentsupload",
121
- appName: this.appService.appName,
122
- debug: this.chatService.assistantConfig$.value.defaultValues.debug
104
+ appName: this.appService.appName
123
105
  };
124
106
  formData.append('data', JSON.stringify(data));
125
107
  let headers = new HttpHeaders({ 'Accept': 'application/json' });
@@ -133,7 +115,7 @@ export class DocumentsUploadService {
133
115
  };
134
116
  if (enableProgress)
135
117
  options['reportProgress'] = true;
136
- const url = `${globalConfig.backendUrl}/${globalConfig.apiPath}/plugin/${this.REQUEST_URL}`;
118
+ const url = `${globalConfig.backendUrl}/${this.REQUEST_URL}`;
137
119
  /**
138
120
  * Need to use the HttpClient directly to avoid the JSONMethodPluginService's behavior
139
121
  * because it is altering the request and thus making it unable to properly set the Content-Type header with the boundary
@@ -174,10 +156,9 @@ export class DocumentsUploadService {
174
156
  const data = {
175
157
  action: "documentsUploadStatus",
176
158
  appName: this.appService.appName,
177
- statusToken: token,
178
- debug: this.chatService.assistantConfig$.value.defaultValues.debug
159
+ statusToken: token
179
160
  };
180
- return from(post(`plugin/${this.REQUEST_URL}`, data)).pipe(catchError((error) => {
161
+ return from(post(this.REQUEST_URL, data)).pipe(catchError((error) => {
181
162
  throw new Error(`Error invoking documentsUploadStatus: ${error}`);
182
163
  }));
183
164
  }
@@ -206,8 +187,7 @@ export class DocumentsUploadService {
206
187
  getDocumentsList(columns, skip, count) {
207
188
  const data = {
208
189
  action: "documentsList",
209
- appName: this.appService.appName,
210
- debug: this.chatService.assistantConfig$.value.defaultValues.debug
190
+ appName: this.appService.appName
211
191
  };
212
192
  if (columns)
213
193
  data["columns"] = columns;
@@ -215,7 +195,7 @@ export class DocumentsUploadService {
215
195
  data["skip"] = skip;
216
196
  if (count)
217
197
  data["count"] = count;
218
- return from(post(`plugin/${this.REQUEST_URL}`, data)).pipe(catchError((error) => {
198
+ return from(post(this.REQUEST_URL, data)).pipe(tap((res) => this.uploadedDocuments$.next(res.docs)), catchError((error) => {
219
199
  throw new Error(`Error invoking documentsList: ${error}`);
220
200
  }));
221
201
  }
@@ -233,10 +213,9 @@ export class DocumentsUploadService {
233
213
  const data = {
234
214
  action: "documentsDelete",
235
215
  docIds,
236
- appName: this.appService.appName,
237
- debug: this.chatService.assistantConfig$.value.defaultValues.debug
216
+ appName: this.appService.appName
238
217
  };
239
- return from(post(`plugin/${this.REQUEST_URL}`, data)).pipe(catchError((error) => {
218
+ return from(post(this.REQUEST_URL, data)).pipe(catchError((error) => {
240
219
  throw new Error(`Error invoking documentsDelete: ${error}`);
241
220
  }));
242
221
  }
@@ -252,10 +231,9 @@ export class DocumentsUploadService {
252
231
  deleteAllDocuments() {
253
232
  const data = {
254
233
  action: "documentsDeleteAll",
255
- appName: this.appService.appName,
256
- debug: this.chatService.assistantConfig$.value.defaultValues.debug
234
+ appName: this.appService.appName
257
235
  };
258
- return from(post(`plugin/${this.REQUEST_URL}`, data)).pipe(catchError((error) => {
236
+ return from(post(this.REQUEST_URL, data)).pipe(catchError((error) => {
259
237
  throw new Error(`Error invoking documentsDeleteAll: ${error}`);
260
238
  }));
261
239
  }
@@ -283,9 +261,12 @@ export class DocumentsUploadService {
283
261
  return bytes / (1024 * 1024);
284
262
  }
285
263
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentsUploadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
286
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentsUploadService }); }
264
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentsUploadService, providedIn: 'root' }); }
287
265
  }
288
266
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentsUploadService, decorators: [{
289
- type: Injectable
267
+ type: Injectable,
268
+ args: [{
269
+ providedIn: 'root'
270
+ }]
290
271
  }] });
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRzLXVwbG9hZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvZG9jdW1lbnRzLXVwbG9hZC9kb2N1bWVudHMtdXBsb2FkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQWMsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhGLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBeUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNySCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRy9ELE1BQU0sT0FBTyxzQkFBc0I7SUFEbkM7UUFLRSx1Q0FBdUM7UUFDdkMsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBMkIsU0FBUyxDQUFDLENBQUM7UUFHbEUsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxTQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBK1NsQztJQTdTQzs7Ozs7T0FLRztJQUNILElBQUksQ0FBQyxXQUFvQztRQUN2QyxJQUFJLENBQUMsV0FBVztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUU3RSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLENBQUM7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Q0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksY0FBYyxDQUFDLEtBQWE7UUFDakMsSUFBSSxLQUFLLEtBQUssQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNmLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUNMLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUN4RSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksZ0JBQWdCLENBQUMsS0FBYTtRQUNuQyxPQUFPLEtBQUssR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDOytHQXRUVSxzQkFBc0I7bUhBQXRCLHNCQUFzQjs7NEZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tICcuLi9jaGF0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjYXRjaEVycm9yLCBmaWx0ZXIsIGZyb20sIG1hcCwgT2JzZXJ2YWJsZSwgdGFrZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVsZXRlRG9jdW1lbnRzUmVzcG9uc2UsIEluZGV4aW5nSW5mb3MsIFVwbG9hZENvbmZpZywgVXBsb2FkZWREb2N1bWVudHMsIFVwbG9hZEV2ZW50IH0gZnJvbSAnLi9kb2N1bWVudHMtdXBsb2FkLm1vZGVsJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UsIEh0dHBVcGxvYWRQcm9ncmVzc0V2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQXBwU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FwcC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldFRva2VuLCBnbG9iYWxDb25maWcsIHBvc3QgfSBmcm9tICdAc2luZXF1YS9hdG9taWMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRG9jdW1lbnRzVXBsb2FkU2VydmljZSB7XG5cbiAgLyoqIE5hbWUgb2YgdGhlIGFzc2lzdGFudCBwbHVnaW4uICovXG4gIHB1YmxpYyBSRVFVRVNUX1VSTDogc3RyaW5nO1xuICAvKiogRG9jdW1lbnRzJyB1cGxvYWQgY29uZmlndXJhdGlvbi4gKi9cbiAgdXBsb2FkQ29uZmlnJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXBsb2FkQ29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwdWJsaWMgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlO1xuXG4gIHB1YmxpYyBhcHBTZXJ2aWNlID0gaW5qZWN0KEFwcFNlcnZpY2UpO1xuICBwdWJsaWMgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGZpbGUgdXBsb2FkIHNlcnZpY2Ugd2l0aCB0aGUgcHJvdmlkZWQgY2hhdCBzZXJ2aWNlIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhdFNlcnZpY2UgLSBBbiBpbnN0YW5jZSBvZiBDaGF0U2VydmljZS4gSWYgbm90IHByb3ZpZGVkLCBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY2hhdFNlcnZpY2UgaW5zdGFuY2UgaXMgbm90IHByb3ZpZGVkIG9yIGlmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICovXG4gIGluaXQoY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFjaGF0U2VydmljZSkgdGhyb3cgbmV3IEVycm9yKCdBIGNoYXRTZXJ2aWNlIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQnKTtcblxuICAgIHRoaXMuY2hhdFNlcnZpY2UgPSBjaGF0U2VydmljZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5nZXRSZXF1ZXN0c1VybCgpO1xuICAgICAgdGhpcy5nZXRVcGxvYWRDb25maWcoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGVuZHBvaW50IHRvIHVzZSBmb3IgdGhlIGZpbGUgdXBsb2FkIHJlbGF0ZWQgcmVxdWVzdHNcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwcm9wZXJ0eSAncmVzdEVuZHBvaW50JyBpcyBub3QgcHJvdmlkZWQgaW4gdGhlIGFzc2lzdGFudCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBnZXRSZXF1ZXN0c1VybCgpIHtcbiAgICBpZiAoISF0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmNvbm5lY3Rpb25TZXR0aW5ncy5yZXN0RW5kcG9pbnQpIHtcbiAgICAgIHRoaXMuUkVRVUVTVF9VUkwgPSB0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQudmFsdWUhLmNvbm5lY3Rpb25TZXR0aW5ncy5yZXN0RW5kcG9pbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5ICdyZXN0RW5kcG9pbnQnIG11c3QgYmUgcHJvdmlkZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHVzZSAnUkVTVCcgaW4gYXNzaXN0YW50IGluc3RhbmNlYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgdXBsb2FkIGNvbmZpZ3VyYXRpb24gZm9yIGRvY3VtZW50cy5cbiAgICogVGhlIHJlc3BvbnNlLCB3aGljaCBjb250YWlucyB0aGUgdXBsb2FkIGNvbmZpZ3VyYXRpb24sIGlzIGVtaXR0ZWQgdG8gdGhlIGB1cGxvYWRDb25maWckYCBvYnNlcnZhYmxlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgaW52b2tpbmcgdGhlIGBkb2N1bWVudHNVcGxvYWRDb25maWdHZXRgIGFjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXRVcGxvYWRDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJkb2N1bWVudHNVcGxvYWRDb25maWdHZXRcIixcbiAgICAgIGFwcE5hbWU6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG5cbiAgICBmcm9tKHBvc3Q8VXBsb2FkQ29uZmlnPihgcGx1Z2luLyR7dGhpcy5SRVFVRVNUX1VSTH1gLCBkYXRhKSkucGlwZShcbiAgICAgIHRha2UoMSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGludm9raW5nIGRvY3VtZW50c1VwbG9hZENvbmZpZ0dldDogJHtlcnJvcn1gKTtcbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUoKHJlczogVXBsb2FkQ29uZmlnKSA9PiB0aGlzLnVwbG9hZENvbmZpZyQubmV4dChyZXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWRzIGRvY3VtZW50cyB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB0YWtlcyBhIEZvcm1EYXRhIG9iamVjdCB3aGljaCBzaG91bGQgY29udGFpbiBhbGwgZmlsZXMgdG8gYmUgdXBsb2FkZWQuXG4gICAqIEVhY2ggZmlsZSBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlIEZvcm1EYXRhIG9iamVjdCB3aXRoIGl0cyBvcmlnaW5hbCBuYW1lLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgKiBmb3JtRGF0YS5hcHBlbmQoZmlsZS5uYW1lLCBmaWxlLmZpbGUpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGZvcm1EYXRhIC0gVGhlIEZvcm1EYXRhIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBiZSB1cGxvYWRlZC5cbiAgICogLSBFYWNoIGZpbGUgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBGb3JtRGF0YSBvYmplY3Qgd2l0aCBpdHMgb3JpZ2luYWwgbmFtZS5cbiAgICogRm9yIGV4YW1wbGU6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICogZm9ybURhdGEuYXBwZW5kKGZpbGUubmFtZSwgZmlsZS5maWxlKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBlbmFibGVQcm9ncmVzcyAtIChPcHRpb25hbCkgQSBib29sZWFuIHBhcmFtZXRlciB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgcHJvZ3Jlc3MgcmVwb3J0aW5nIGlzIGVuYWJsZWQuXG4gICAqIC0gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiAtIElmIGB0cnVlYCwgdGhlIGByZXBvcnRQcm9ncmVzc2Agb3B0aW9uIGlzIHNldCBpbiB0aGUgcmVxdWVzdCBvcHRpb25zLCBlbmFibGluZyB0aGUgdHJhY2sgb2YgdXBsb2FkIHByb2dyZXNzIGJhc2VkIG9uIHRoZSB1bmRlcmx5aW5nIGJyb3dzZXIncyBwcm9ncmVzcyBldmVudHMuXG4gICAqIC0gSWYgYGZhbHNlYCwgcHJvZ3Jlc3MgZXZlbnRzIGFyZSBub3QgcmVwb3J0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBldmVudHMgb2YgdHlwZSBgVXBsb2FkRXZlbnRgOlxuICAgKiAtIGBVcGxvYWRQcm9ncmVzc0V2ZW50YDogRW1pdHRlZCBkdXJpbmcgdGhlIHVwbG9hZCBwcm9jZXNzLCBjb250YWluaW5nOlxuICAgKiAgIC0gKiAgYHR5cGVgOiBcInVwbG9hZFByb2dyZXNzXCIgLSBUaGUgdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAqICAgLSAqICBgbG9hZGVkYDogbnVtYmVyIC0gVGhlIG51bWJlciBvZiBieXRlcyB1cGxvYWRlZCBzbyBmYXIuXG4gICAqICAgLSAqICBgdG90YWxgOiBudW1iZXIgLSBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHVwbG9hZGVkIChpZiBhdmFpbGFibGUpLlxuICAgKiAgIC0gKiAgYHByb2dyZXNzYDogbnVtYmVyIC0gVGhlIHBlcmNlbnRhZ2Ugb2YgdXBsb2FkIHByb2dyZXNzIChjYWxjdWxhdGVkIGFzIGAobG9hZGVkIC8gdG90YWwpICogMTAwYCkuXG4gICAqIC0gYFVwbG9hZFJlc3BvbnNlRXZlbnRgOiBFbWl0dGVkIHdoZW4gdGhlIHVwbG9hZCBpcyBjb21wbGV0ZSwgY29udGFpbmluZzpcbiAgICogICAtICogIGB0eXBlYDogXCJyZXNwb25zZVwiIC0gVGhlIHR5cGUgb2YgdGhlIGV2ZW50LlxuICAgKiAgIC0gKiAgYGJvZHlgOiBgVXBsb2FkUmVzcG9uc2VgIC0gVGhlIHNlcnZlcidzIHJlc3BvbnNlLCBpbmNsdWRpbmc6XG4gICAqICAgICAtICogLSAqIGBzdGF0dXNUb2tlbmA6IHN0cmluZyAtIEEgdG9rZW4gdG8gdHJhY2sgdGhlIHN0YXR1cyBvZiB0aGUgaW5kZXhpbmcgcHJvY2Vzcy5cbiAgICogICAgIC0gKiAtICogIGBleGVjdXRpb25UaW1lYDogc3RyaW5nIC0gVGhlIHRpbWUgdGFrZW4gdG8gZXhlY3V0ZSB0aGUgdXBsb2FkLlxuICAgKiAgICAgLSAqIC0gKiAgYGNvbm5lY3RvclJlc3BvbnNlYCAob3B0aW9uYWwpOiBBZGRpdGlvbmFsIHJlc3BvbnNlIGRhdGEgZnJvbSB0aGUgY29ubmVjdG9yLCBjb250YWluaW5nOlxuICAgKiAgICAgICAtICogLSAqIC0gKiAgYGNvbGxlY3Rpb25gOiBzdHJpbmcgLSBUaGUgY29sbGVjdGlvbiBuYW1lLlxuICAgKiAgICAgICAtICogLSAqIC0gKiAgYGFjdGlvbmA6IHN0cmluZyAtIFRoZSBhY3Rpb24gcGVyZm9ybWVkLlxuICAgKiAgICAgICAtICogLSAqIC0gKiAgYHN0YXRzYDogb2JqZWN0IC0gU3RhdGlzdGljcyBhYm91dCB0aGUgdXBsb2FkLCBpbmNsdWRpbmc6XG4gICAqICAgICAgICAgLSAqIC0gKiAtICogLSAqIGBuYkRvY1VwZGF0ZWRgOiBudW1iZXIgLSBUaGUgbnVtYmVyIG9mIGRvY3VtZW50cyB1cGRhdGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgaW52b2tpbmcgdGhlIGBkb2N1bWVudHN1cGxvYWRgIGFjdGlvbi5cbiAgICpcbiAgICogRXhhbXBsZSB1c2FnZTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgKiBmb3JtRGF0YS5hcHBlbmQoZmlsZS5uYW1lLCBmaWxlLmZpbGUpO1xuICAgKiB0aGlzLmRvY3VtZW50c1VwbG9hZFNlcnZpY2UudXBsb2FkRG9jdW1lbnRzKGZvcm1EYXRhKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgKiAgIGlmIChldmVudC50eXBlID09PSAndXBsb2FkUHJvZ3Jlc3MnKSB7XG4gICAqICAgICBjb25zb2xlLmxvZyhgUHJvZ3Jlc3M6ICR7ZXZlbnQucHJvZ3Jlc3N9JWApO1xuICAgKiAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xuICAgKiAgICAgY29uc29sZS5sb2coJ1VwbG9hZCBjb21wbGV0ZTonLCBldmVudC5ib2R5KTtcbiAgICogICB9XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyB1cGxvYWREb2N1bWVudHMoZm9ybURhdGE6IEZvcm1EYXRhLCBlbmFibGVQcm9ncmVzczogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFVwbG9hZEV2ZW50PiB7XG4gICAgLy8gQWRkIHRoZSByZXF1aXJlZCBcImRhdGFcIiBmaWVsZCBhcyBhIEpTT04gc3RyaW5nXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJkb2N1bWVudHN1cGxvYWRcIixcbiAgICAgIGFwcE5hbWU6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG4gICAgZm9ybURhdGEuYXBwZW5kKCdkYXRhJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgIGNvbnN0IHRva2VuID0gZ2V0VG9rZW4oKTtcbiAgICBpZih0b2tlbil7XG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoJ3NpbmVxdWEtY3NyZi10b2tlbicsdG9rZW4pO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zOiBhbnkgID0ge1xuICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgIG9ic2VydmU6ICdldmVudHMnLFxuICAgIH07XG4gICAgaWYgKGVuYWJsZVByb2dyZXNzKSBvcHRpb25zWydyZXBvcnRQcm9ncmVzcyddID0gdHJ1ZTtcblxuICAgIGNvbnN0IHVybCA9IGAke2dsb2JhbENvbmZpZy5iYWNrZW5kVXJsfS8ke2dsb2JhbENvbmZpZy5hcGlQYXRofS9wbHVnaW4vJHt0aGlzLlJFUVVFU1RfVVJMfWA7XG4gICAgLyoqXG4gICAgICogTmVlZCB0byB1c2UgdGhlIEh0dHBDbGllbnQgZGlyZWN0bHkgdG8gYXZvaWQgdGhlIEpTT05NZXRob2RQbHVnaW5TZXJ2aWNlJ3MgYmVoYXZpb3JcbiAgICAgKiBiZWNhdXNlIGl0IGlzIGFsdGVyaW5nIHRoZSByZXF1ZXN0IGFuZCB0aHVzIG1ha2luZyBpdCB1bmFibGUgdG8gcHJvcGVybHkgc2V0IHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIHdpdGggdGhlIGJvdW5kYXJ5XG4gICAgICovXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4odXJsLCBmb3JtRGF0YSwgb3B0aW9ucykucGlwZShcbiAgICAgIGZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBIdHRwVXBsb2FkUHJvZ3Jlc3NFdmVudCB8IEh0dHBSZXNwb25zZTxhbnk+ID0+XG4gICAgICAgIGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2UgfHwgKGVuYWJsZVByb2dyZXNzICYmIGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3MpXG4gICAgICApLFxuICAgICAgbWFwKChldmVudCk6IFVwbG9hZEV2ZW50ID0+IHtcbiAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgICAgY2FzZSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzOiB7XG4gICAgICAgICAgICBjb25zdCB7IGxvYWRlZCA9IDAsIHRvdGFsID0gMCB9ID0gZXZlbnQ7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAndXBsb2FkUHJvZ3Jlc3MnLCBsb2FkZWQsIHRvdGFsLCBwcm9ncmVzczogdG90YWwgPiAwID8gTWF0aC5yb3VuZCgobG9hZGVkIC8gdG90YWwpICogMTAwKSA6IDAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlOlxuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3Jlc3BvbnNlJywgYm9keTogZXZlbnQuYm9keSB9O1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGV2ZW50IHR5cGVcIik7IC8vIFNob3VsZCBub3QgcmVhY2ggaGVyZSwgYnV0IGZvciB0eXBlc2NyaXB0IHNha2UuXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbnZva2luZyBkb2N1bWVudHN1cGxvYWQ6ICR7ZXJyb3J9YCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBpbmRleGluZyBzdGF0dXMgb2YgYSBwcmVkZWZpbmVkIHVwbG9hZGVkIGRvY3VtZW50KHMpXG4gICAqIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBzdGF0dXMgdG9rZW4gcmV0dXJuZWQgZnJvbSB0aGUgdXBsb2FkIHByb2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBzdGF0dXMgdG9rZW4gdXNlZCB0byB0cmFjayB0aGUgaW5kZXhpbmcgcHJvY2Vzcy5cbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBzZXJ2ZXIgcmVzcG9uc2Ugb2YgdHlwZSBgSW5kZXhpbmdSZXNwb25zZWAuXG4gICAqIFRoZSBgSW5kZXhpbmdSZXNwb25zZWAgb2JqZWN0IGNvbnRhaW5zOlxuICAgKiAtIGBkb2NzYDogYXJyYXkgLSBBbiBhcnJheSBvZiBkb2N1bWVudCBzdGF0dXMgb2JqZWN0cywgZWFjaCBjb250YWluaW5nOlxuICAgKiAgIC0gKiBgaWRgOiBzdHJpbmcgLSBUaGUgZG9jdW1lbnQgSUQuXG4gICAqICAgLSAqIGBmaWxlTmFtZWA6IHN0cmluZyAtIFRoZSBuYW1lIG9mIHRoZSBmaWxlLlxuICAgKiAgIC0gKiBgb3BlcmF0aW9uYDogXCJBZGRcIiB8IFwiVXBkYXRlXCIgLSBUaGUgb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGUgZG9jdW1lbnQuXG4gICAqICAgLSAqIGBzdGF0dXNgOiBcIkluZGV4aW5nXCIgfCBcIkluZGV4ZWRcIiB8IFwiRXJyb3JcIiAtIFRoZSBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LlxuICAgKiAgIC0gKiBgcHJldmlvdXNJbmRleGF0aW9uVGltZWA6IHN0cmluZyB8IG51bGwgLSBUaGUgcHJldmlvdXMgaW5kZXhhdGlvbiB0aW1lLlxuICAgKiAgIC0gKiBgY3VycmVudEluZGV4YXRpb25UaW1lYDogc3RyaW5nIHwgbnVsbCAtIFRoZSBjdXJyZW50IGluZGV4YXRpb24gdGltZS5cbiAgICogLSBgZXhlY3V0aW9uVGltZWA6IHN0cmluZyAtIFRoZSB0aW1lIHRha2VuIHRvIHJldHJpZXZlIHRoZSBpbmRleGluZyBzdGF0dXMuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciBpbnZva2luZyB0aGUgYGRvY3VtZW50c1VwbG9hZFN0YXR1c2AgYWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldEluZGV4aW5nU3RhdHVzKHRva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEluZGV4aW5nSW5mb3M+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBcImRvY3VtZW50c1VwbG9hZFN0YXR1c1wiLFxuICAgICAgYXBwTmFtZTogdGhpcy5hcHBTZXJ2aWNlLmFwcE5hbWUsXG4gICAgICBzdGF0dXNUb2tlbjogdG9rZW4sXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcblxuICAgIHJldHVybiBmcm9tKHBvc3Q8SW5kZXhpbmdJbmZvcz4oYHBsdWdpbi8ke3RoaXMuUkVRVUVTVF9VUkx9YCwgZGF0YSkpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGludm9raW5nIGRvY3VtZW50c1VwbG9hZFN0YXR1czogJHtlcnJvcn1gKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIHVwbG9hZGVkIGRvY3VtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2NvbHVtbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2YgYWRkaXRpb25hbCBpbmRleCBjb2x1bW5zIHRvIGluY2x1ZGUgZm9yIGVhY2ggZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF0gLSBPcHRpb25hbCBudW1iZXIgb2YgZG9jdW1lbnRzIHRvIHNraXAgZm9yIHBhZ2luYXRpb24uIElmIHNldCwgY291bnQgYWxzbyBuZWVkcyB0byBiZSBzZXQuIE5vIHNraXAgaWYgbm90IHNldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtjb3VudF0gLSBPcHRpb25hbCBudW1iZXIgb2YgZG9jdW1lbnRzIHRvIHRha2UgZm9yIHBhZ2luYXRpb24gKHVubGltaXRlZCBpZiBub3Qgc2V0KS5cbiAgICogQHJldHVybnMge09ic2VydmFibGU8VXBsb2FkZWREb2N1bWVudHM+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGxpc3Qgb2YgdXBsb2FkZWQgZG9jdW1lbnRzLlxuICAgKiBUaGUgYFVwbG9hZGVkRG9jdW1lbnRzYCBvYmplY3QgY29udGFpbnM6XG4gICAqIC0gYGRvY3NgOiBhcnJheSAtIEFuIGFycmF5IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGRvY3VtZW50IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKiAgIC0gKiBgaWRgOiBzdHJpbmcgLSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZG9jdW1lbnQuXG4gICAqICAgLSAqIGBmaWxlTmFtZWA6IHN0cmluZyAtIFRoZSBuYW1lIG9mIHRoZSBmaWxlLlxuICAgKiAgIC0gKiBgdGl0bGVgOiBzdHJpbmcgLSBUaGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50LlxuICAgKiAgIC0gKiBgZmlsZUV4dGA6IHN0cmluZyAtIFRoZSBmaWxlIGV4dGVuc2lvbiBvZiB0aGUgZG9jdW1lbnQuXG4gICAqICAgLSAqIGBpbmRleGF0aW9uVGltZWA6IHN0cmluZyAtIFRoZSB0aW1lIHdoZW4gdGhlIGRvY3VtZW50IHdhcyBpbmRleGVkLlxuICAgKiAgIC0gKiBgc2l6ZWA6IG51bWJlciAtIFRoZSBzaXplIG9mIHRoZSBkb2N1bWVudC5cbiAgICogICAtICogYHNpemVEaXNwbGF5YDogc3RyaW5nIC0gQSBodW1hbi1yZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZG9jdW1lbnQgc2l6ZS5cbiAgICogICAtICogYFtrZXk6IHN0cmluZ11gOiBhbnkgLSBBZGRpdGlvbmFsIGNvbHVtbnMgYXNrZWQgaW4gdGhlIHJlcXVlc3QsIHZhbHVlIG9mIHRoZSBjb2x1bW4gZm9yIHRoZSBkb2N1bWVudC5cbiAgICogLSBgY291bnRgOiBudW1iZXIgLSBUaGUgY291bnQgb2YgZG9jdW1lbnRzIGluIHRoZSBjdXJyZW50IGJhdGNoIG9yIHN1YnNldC5cbiAgICogLSBgdG90YWxDb3VudGA6IG51bWJlciAtIFRoZSB0b3RhbCBjb3VudCBvZiBkb2N1bWVudHMgYXZhaWxhYmxlLlxuICAgKiAtIGBleGVjdXRpb25UaW1lYDogc3RyaW5nIC0gVGhlIHRpbWUgdGFrZW4gdG8gcHJvY2VzcyB0aGUgZG9jdW1lbnRzLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSByZXF1ZXN0IGZhaWxzLlxuICAgKi9cbiAgcHVibGljIGdldERvY3VtZW50c0xpc3QoY29sdW1ucz86IHN0cmluZ1tdLCBza2lwPzogbnVtYmVyLCBjb3VudD86IG51bWJlcik6IE9ic2VydmFibGU8VXBsb2FkZWREb2N1bWVudHM+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBcImRvY3VtZW50c0xpc3RcIixcbiAgICAgIGFwcE5hbWU6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG5cbiAgICBpZiAoY29sdW1ucykgZGF0YVtcImNvbHVtbnNcIl0gPSBjb2x1bW5zO1xuICAgIGlmIChza2lwKSBkYXRhW1wic2tpcFwiXSA9IHNraXA7XG4gICAgaWYgKGNvdW50KSBkYXRhW1wiY291bnRcIl0gPSBjb3VudDtcblxuICAgIHJldHVybiBmcm9tKHBvc3Q8VXBsb2FkZWREb2N1bWVudHM+KGBwbHVnaW4vJHt0aGlzLlJFUVVFU1RfVVJMfWAsIGRhdGEpKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbnZva2luZyBkb2N1bWVudHNMaXN0OiAke2Vycm9yfWApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIHVwbG9hZGVkIGRvY3VtZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgSURzLlxuICAgKlxuICAgKiBAcGFyYW0gZG9jSWRzIC0gQW4gYXJyYXkgb2YgZG9jdW1lbnQgSURzIHRvIGRlbGV0ZS5cbiAgICogQHJldHVybnMgQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBzZXJ2ZXIgcmVzcG9uc2Ugb2YgdHlwZSBgZGVsZXRlRG9jdW1lbnRzUmVzcG9uc2VgLlxuICAgKiBUaGUgYGRlbGV0ZURvY3VtZW50c1Jlc3BvbnNlYCBvYmplY3QgY29udGFpbnM6XG4gICAqIC0gYGRlbGV0ZWRDb3VudGA6IG51bWJlciAtIFRoZSBudW1iZXIgb2YgZGVsZXRlZCBkb2N1bWVudHMuXG4gICAqIC0gYGV4ZWN1dGlvblRpbWVgOiBzdHJpbmcgLSBUaGUgdGltZSB0YWtlbiB0byBkZWxldGUgdGhlIGRvY3VtZW50cy5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIGludm9raW5nIHRoZSBgZG9jdW1lbnRzRGVsZXRlYCBhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlRG9jdW1lbnRzKGRvY0lkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPGRlbGV0ZURvY3VtZW50c1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJkb2N1bWVudHNEZWxldGVcIixcbiAgICAgIGRvY0lkcyxcbiAgICAgIGFwcE5hbWU6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG5cbiAgICByZXR1cm4gZnJvbShwb3N0PGRlbGV0ZURvY3VtZW50c1Jlc3BvbnNlPihgcGx1Z2luLyR7dGhpcy5SRVFVRVNUX1VSTH1gLCBkYXRhKSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW52b2tpbmcgZG9jdW1lbnRzRGVsZXRlOiAke2Vycm9yfWApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYWxsIHVwbG9hZGVkIGRvY3VtZW50cy5cbiAgICpcbiAgICogQHJldHVybnMgQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBzZXJ2ZXIgcmVzcG9uc2Ugb2YgdHlwZSBgZGVsZXRlRG9jdW1lbnRzUmVzcG9uc2VgLlxuICAgKiBUaGUgYGRlbGV0ZURvY3VtZW50c1Jlc3BvbnNlYCBvYmplY3QgY29udGFpbnM6XG4gICAqIC0gYGRlbGV0ZWRDb3VudGA6IG51bWJlciAtIFRoZSBudW1iZXIgb2YgZGVsZXRlZCBkb2N1bWVudHMuXG4gICAqIC0gYGV4ZWN1dGlvblRpbWVgOiBzdHJpbmcgLSBUaGUgdGltZSB0YWtlbiB0byBkZWxldGUgdGhlIGRvY3VtZW50cy5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIGludm9raW5nIHRoZSBgZG9jdW1lbnRzRGVsZXRlQWxsYCBhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQWxsRG9jdW1lbnRzKCk6IE9ic2VydmFibGU8ZGVsZXRlRG9jdW1lbnRzUmVzcG9uc2U+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBcImRvY3VtZW50c0RlbGV0ZUFsbFwiLFxuICAgICAgYXBwTmFtZTogdGhpcy5hcHBTZXJ2aWNlLmFwcE5hbWUsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmRlYnVnXG4gICAgfTtcblxuICAgIHJldHVybiBmcm9tKHBvc3Q8ZGVsZXRlRG9jdW1lbnRzUmVzcG9uc2U+KGBwbHVnaW4vJHt0aGlzLlJFUVVFU1RfVVJMfWAsIGRhdGEpKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbnZva2luZyBkb2N1bWVudHNEZWxldGVBbGw6ICR7ZXJyb3J9YCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyB0aGUgZ2l2ZW4gZmlsZSBzaXplIGluIGJ5dGVzIGludG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBieXRlcyAtIFRoZSBzaXplIG9mIHRoZSBmaWxlIGluIGJ5dGVzLlxuICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGZpbGUgc2l6ZSBpbiBhIGh1bWFuLXJlYWRhYmxlIGZvcm1hdCAoZS5nLiwgXCIxMC4yNCBLQlwiLCBcIjEuMDAgTUJcIikuXG4gICAqL1xuICBwdWJsaWMgZm9ybWF0RmlsZVNpemUoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGJ5dGVzID09PSAwKSByZXR1cm4gXCIwIEJ5dGVzXCI7XG4gICAgY29uc3QgayA9IDEwMjQ7XG4gICAgY29uc3Qgc2l6ZXMgPSBbXCJCeXRlc1wiLCBcIktCXCIsIFwiTUJcIiwgXCJHQlwiLCBcIlRCXCJdO1xuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKTtcbiAgICByZXR1cm4gKFxuICAgICAgTnVtYmVyLnBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoMikpICsgXCIgXCIgKyBzaXplc1tpXVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIGdpdmVuIGZpbGUgc2l6ZSBpbiBieXRlcyBpbnRvIG1lZ2FieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGJ5dGVzIC0gVGhlIHNpemUgb2YgdGhlIGZpbGUgaW4gYnl0ZXMuXG4gICAqIEByZXR1cm5zIFRoZSBzaXplIG9mIHRoZSBmaWxlIGluIG1lZ2FieXRlcy5cbiAgICovXG4gIHB1YmxpYyBjb252ZXJ0Qnl0ZXNUb01CKGJ5dGVzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBieXRlcyAvICgxMDI0ICogMTAyNCk7XG4gIH1cblxufVxuIl19
272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRzLXVwbG9hZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvZG9jdW1lbnRzLXVwbG9hZC9kb2N1bWVudHMtdXBsb2FkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQWMsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3RixPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQXlDLE1BQU0sc0JBQXNCLENBQUM7QUFDckgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUsvRCxNQUFNLE9BQU8sc0JBQXNCO0lBSG5DO1FBS2tCLGdCQUFXLEdBQUcsb0NBQW9DLENBQUM7UUFDbkUsc0NBQXNDO1FBQy9CLGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQTJCLFNBQVMsQ0FBQyxDQUFDO1FBRWhGLHlDQUF5QztRQUNsQyx1QkFBa0IsR0FBRyxJQUFJLGVBQWUsQ0FBaUMsRUFBRSxDQUFDLENBQUM7UUFFN0UsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxTQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBdVJsQztJQXJSQzs7T0FFRztJQUNILElBQUk7UUFDRixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FB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dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjYXRjaEVycm9yLCBmaWx0ZXIsIGZyb20sIG1hcCwgT2JzZXJ2YWJsZSwgdGFrZSwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWxldGVEb2N1bWVudHNSZXNwb25zZSwgSW5kZXhpbmdJbmZvcywgVXBsb2FkQ29uZmlnLCBVcGxvYWRlZERvY3VtZW50LCBVcGxvYWRlZERvY3VtZW50cywgVXBsb2FkRXZlbnQgfSBmcm9tICcuL2RvY3VtZW50cy11cGxvYWQubW9kZWwnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEV2ZW50VHlwZSwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZSwgSHR0cFVwbG9hZFByb2dyZXNzRXZlbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXBwLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0VG9rZW4sIGdsb2JhbENvbmZpZywgcG9zdCB9IGZyb20gJ0BzaW5lcXVhL2F0b21pYyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERvY3VtZW50c1VwbG9hZFNlcnZpY2Uge1xuXG4gIHB1YmxpYyByZWFkb25seSBSRVFVRVNUX1VSTCA9IFwiYXBpL3YxL3BsdWdpbi9TaW5lcXVhQXNzaXN0YW50UkVTVFwiO1xuICAvKiogRG9jdW1lbnRzIHVwbG9hZCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgdXBsb2FkQ29uZmlnJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXBsb2FkQ29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8qKiBFbWl0IHRoZSBsaXN0IG9mIGluZGV4ZWQgZG9jdW1lbnRzICovXG4gIHB1YmxpYyB1cGxvYWRlZERvY3VtZW50cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVwbG9hZGVkRG9jdW1lbnRbXSB8IHVuZGVmaW5lZD4oW10pO1xuXG4gIHB1YmxpYyBhcHBTZXJ2aWNlID0gaW5qZWN0KEFwcFNlcnZpY2UpO1xuICBwdWJsaWMgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGZpbGUgdXBsb2FkIHNlcnZpY2UuXG4gICAqL1xuICBpbml0KCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmdldFVwbG9hZENvbmZpZygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHVwbG9hZCBjb25maWd1cmF0aW9uIGZvciBkb2N1bWVudHMuXG4gICAqIFRoZSByZXNwb25zZSwgd2hpY2ggY29udGFpbnMgdGhlIHVwbG9hZCBjb25maWd1cmF0aW9uLCBpcyBlbWl0dGVkIHRvIHRoZSBgdXBsb2FkQ29uZmlnJGAgb2JzZXJ2YWJsZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIGludm9raW5nIHRoZSBgZG9jdW1lbnRzVXBsb2FkQ29uZmlnR2V0YCBhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0VXBsb2FkQ29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwiZG9jdW1lbnRzVXBsb2FkQ29uZmlnR2V0XCIsXG4gICAgICBhcHBOYW1lOiB0aGlzLmFwcFNlcnZpY2UuYXBwTmFtZVxuICAgIH07XG5cbiAgICBmcm9tKHBvc3Q8VXBsb2FkQ29uZmlnPih0aGlzLlJFUVVFU1RfVVJMLCBkYXRhKSkucGlwZShcbiAgICAgIHRha2UoMSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGludm9raW5nIGRvY3VtZW50c1VwbG9hZENvbmZpZ0dldDogJHtlcnJvcn1gKTtcbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUoKHJlczogVXBsb2FkQ29uZmlnKSA9PiB0aGlzLnVwbG9hZENvbmZpZyQubmV4dChyZXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWRzIGRvY3VtZW50cyB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB0YWtlcyBhIEZvcm1EYXRhIG9iamVjdCB3aGljaCBzaG91bGQgY29udGFpbiBhbGwgZmlsZXMgdG8gYmUgdXBsb2FkZWQuXG4gICAqIEVhY2ggZmlsZSBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlIEZvcm1EYXRhIG9iamVjdCB3aXRoIGl0cyBvcmlnaW5hbCBuYW1lLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgKiBmb3JtRGF0YS5hcHBlbmQoZmlsZS5uYW1lLCBmaWxlLmZpbGUpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGZvcm1EYXRhIC0gVGhlIEZvcm1EYXRhIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBiZSB1cGxvYWRlZC5cbiAgICogLSBFYWNoIGZpbGUgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBGb3JtRGF0YSBvYmplY3Qgd2l0aCBpdHMgb3JpZ2luYWwgbmFtZS5cbiAgICogRm9yIGV4YW1wbGU6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICogZm9ybURhdGEuYXBwZW5kKGZpbGUubmFtZSwgZmlsZS5maWxlKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBlbmFibGVQcm9ncmVzcyAtIChPcHRpb25hbCkgQSBib29sZWFuIHBhcmFtZXRlciB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgcHJvZ3Jlc3MgcmVwb3J0aW5nIGlzIGVuYWJsZWQuXG4gICAqIC0gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiAtIElmIGB0cnVlYCwgdGhlIGByZXBvcnRQcm9ncmVzc2Agb3B0aW9uIGlzIHNldCBpbiB0aGUgcmVxdWVzdCBvcHRpb25zLCBlbmFibGluZyB0aGUgdHJhY2sgb2YgdXBsb2FkIHByb2dyZXNzIGJhc2VkIG9uIHRoZSB1bmRlcmx5aW5nIGJyb3dzZXIncyBwcm9ncmVzcyBldmVudHMuXG4gICAqIC0gSWYgYGZhbHNlYCwgcHJvZ3Jlc3MgZXZlbnRzIGFyZSBub3QgcmVwb3J0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBldmVudHMgb2YgdHlwZSBgVXBsb2FkRXZlbnRgOlxuICAgKiAtIGBVcGxvYWRQcm9ncmVzc0V2ZW50YDogRW1pdHRlZCBkdXJpbmcgdGhlIHVwbG9hZCBwcm9jZXNzLCBjb250YWluaW5nOlxuICAgKiAgIC0gKiAgYHR5cGVgOiBcInVwbG9hZFByb2dyZXNzXCIgLSBUaGUgdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAqICAgLSAqICBgbG9hZGVkYDogbnVtYmVyIC0gVGhlIG51bWJlciBvZiBieXRlcyB1cGxvYWRlZCBzbyBmYXIuXG4gICAqICAgLSAqICBgdG90YWxgOiBudW1iZXIgLSBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHVwbG9hZGVkIChpZiBhdmFpbGFibGUpLlxuICAgKiAgIC0gKiAgYHByb2dyZXNzYDogbnVtYmVyIC0gVGhlIHBlcmNlbnRhZ2Ugb2YgdXBsb2FkIHByb2dyZXNzIChjYWxjdWxhdGVkIGFzIGAobG9hZGVkIC8gdG90YWwpICogMTAwYCkuXG4gICAqIC0gYFVwbG9hZFJlc3BvbnNlRXZlbnRgOiBFbWl0dGVkIHdoZW4gdGhlIHVwbG9hZCBpcyBjb21wbGV0ZSwgY29udGFpbmluZzpcbiAgICogICAtICogIGB0eXBlYDogXCJyZXNwb25zZVwiIC0gVGhlIHR5cGUgb2YgdGhlIGV2ZW50LlxuICAgKiAgIC0gKiAgYGJvZHlgOiBgVXBsb2FkUmVzcG9uc2VgIC0gVGhlIHNlcnZlcidzIHJlc3BvbnNlLCBpbmNsdWRpbmc6XG4gICAqICAgICAtICogLSAqIGBzdGF0dXNUb2tlbmA6IHN0cmluZyAtIEEgdG9rZW4gdG8gdHJhY2sgdGhlIHN0YXR1cyBvZiB0aGUgaW5kZXhpbmcgcHJvY2Vzcy5cbiAgICogICAgIC0gKiAtICogIGBleGVjdXRpb25UaW1lYDogc3RyaW5nIC0gVGhlIHRpbWUgdGFrZW4gdG8gZXhlY3V0ZSB0aGUgdXBsb2FkLlxuICAgKiAgICAgLSAqIC0gKiAgYGNvbm5lY3RvclJlc3BvbnNlYCAob3B0aW9uYWwpOiBBZGRpdGlvbmFsIHJlc3BvbnNlIGRhdGEgZnJvbSB0aGUgY29ubmVjdG9yLCBjb250YWluaW5nOlxuICAgKiAgICAgICAtICogLSAqIC0gKiAgYGNvbGxlY3Rpb25gOiBzdHJpbmcgLSBUaGUgY29sbGVjdGlvbiBuYW1lLlxuICAgKiAgICAgICAtICogLSAqIC0gKiAgYGFjdGlvbmA6IHN0cmluZyAtIFRoZSBhY3Rpb24gcGVyZm9ybWVkLlxuICAgKiAgICAgICAtICogLSAqIC0gKiAgYHN0YXRzYDogb2JqZWN0IC0gU3RhdGlzdGljcyBhYm91dCB0aGUgdXBsb2FkLCBpbmNsdWRpbmc6XG4gICAqICAgICAgICAgLSAqIC0gKiAtICogLSAqIGBuYkRvY1VwZGF0ZWRgOiBudW1iZXIgLSBUaGUgbnVtYmVyIG9mIGRvY3VtZW50cyB1cGRhdGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgaW52b2tpbmcgdGhlIGBkb2N1bWVudHN1cGxvYWRgIGFjdGlvbi5cbiAgICpcbiAgICogRXhhbXBsZSB1c2FnZTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgKiBmb3JtRGF0YS5hcHBlbmQoZmlsZS5uYW1lLCBmaWxlLmZpbGUpO1xuICAgKiB0aGlzLmRvY3VtZW50c1VwbG9hZFNlcnZpY2UudXBsb2FkRG9jdW1lbnRzKGZvcm1EYXRhKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgKiAgIGlmIChldmVudC50eXBlID09PSAndXBsb2FkUHJvZ3Jlc3MnKSB7XG4gICAqICAgICBjb25zb2xlLmxvZyhgUHJvZ3Jlc3M6ICR7ZXZlbnQucHJvZ3Jlc3N9JWApO1xuICAgKiAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xuICAgKiAgICAgY29uc29sZS5sb2coJ1VwbG9hZCBjb21wbGV0ZTonLCBldmVudC5ib2R5KTtcbiAgICogICB9XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyB1cGxvYWREb2N1bWVudHMoZm9ybURhdGE6IEZvcm1EYXRhLCBlbmFibGVQcm9ncmVzczogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFVwbG9hZEV2ZW50PiB7XG4gICAgLy8gQWRkIHRoZSByZXF1aXJlZCBcImRhdGFcIiBmaWVsZCBhcyBhIEpTT04gc3RyaW5nXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJkb2N1bWVudHN1cGxvYWRcIixcbiAgICAgIGFwcE5hbWU6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lXG4gICAgfTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2RhdGEnLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG5cbiAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgY29uc3QgdG9rZW4gPSBnZXRUb2tlbigpO1xuICAgIGlmKHRva2VuKXtcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZCgnc2luZXF1YS1jc3JmLXRva2VuJyx0b2tlbik7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnM6IGFueSAgPSB7XG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cycsXG4gICAgfTtcbiAgICBpZiAoZW5hYmxlUHJvZ3Jlc3MpIG9wdGlvbnNbJ3JlcG9ydFByb2dyZXNzJ10gPSB0cnVlO1xuXG4gICAgY29uc3QgdXJsID0gYCR7Z2xvYmFsQ29uZmlnLmJhY2tlbmRVcmx9LyR7dGhpcy5SRVFVRVNUX1VSTH1gO1xuICAgIC8qKlxuICAgICAqIE5lZWQgdG8gdXNlIHRoZSBIdHRwQ2xpZW50IGRpcmVjdGx5IHRvIGF2b2lkIHRoZSBKU09OTWV0aG9kUGx1Z2luU2VydmljZSdzIGJlaGF2aW9yXG4gICAgICogYmVjYXVzZSBpdCBpcyBhbHRlcmluZyB0aGUgcmVxdWVzdCBhbmQgdGh1cyBtYWtpbmcgaXQgdW5hYmxlIHRvIHByb3Blcmx5IHNldCB0aGUgQ29udGVudC1UeXBlIGhlYWRlciB3aXRoIHRoZSBib3VuZGFyeVxuICAgICAqL1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KHVybCwgZm9ybURhdGEsIG9wdGlvbnMpLnBpcGUoXG4gICAgICBmaWx0ZXIoKGV2ZW50KTogZXZlbnQgaXMgSHR0cFVwbG9hZFByb2dyZXNzRXZlbnQgfCBIdHRwUmVzcG9uc2U8YW55PiA9PlxuICAgICAgICBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlIHx8IChlbmFibGVQcm9ncmVzcyAmJiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzKVxuICAgICAgKSxcbiAgICAgIG1hcCgoZXZlbnQpOiBVcGxvYWRFdmVudCA9PiB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzczoge1xuICAgICAgICAgICAgY29uc3QgeyBsb2FkZWQgPSAwLCB0b3RhbCA9IDAgfSA9IGV2ZW50O1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3VwbG9hZFByb2dyZXNzJywgbG9hZGVkLCB0b3RhbCwgcHJvZ3Jlc3M6IHRvdGFsID4gMCA/IE1hdGgucm91bmQoKGxvYWRlZCAvIHRvdGFsKSAqIDEwMCkgOiAwIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5SZXNwb25zZTpcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdyZXNwb25zZScsIGJvZHk6IGV2ZW50LmJvZHkgfTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBldmVudCB0eXBlXCIpOyAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUsIGJ1dCBmb3IgdHlwZXNjcmlwdCBzYWtlLlxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW52b2tpbmcgZG9jdW1lbnRzdXBsb2FkOiAke2Vycm9yfWApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgaW5kZXhpbmcgc3RhdHVzIG9mIGEgcHJlZGVmaW5lZCB1cGxvYWRlZCBkb2N1bWVudChzKVxuICAgKiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgc3RhdHVzIHRva2VuIHJldHVybmVkIGZyb20gdGhlIHVwbG9hZCBwcm9jZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgc3RhdHVzIHRva2VuIHVzZWQgdG8gdHJhY2sgdGhlIGluZGV4aW5nIHByb2Nlc3MuXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgc2VydmVyIHJlc3BvbnNlIG9mIHR5cGUgYEluZGV4aW5nUmVzcG9uc2VgLlxuICAgKiBUaGUgYEluZGV4aW5nUmVzcG9uc2VgIG9iamVjdCBjb250YWluczpcbiAgICogLSBgZG9jc2A6IGFycmF5IC0gQW4gYXJyYXkgb2YgZG9jdW1lbnQgc3RhdHVzIG9iamVjdHMsIGVhY2ggY29udGFpbmluZzpcbiAgICogICAtICogYGlkYDogc3RyaW5nIC0gVGhlIGRvY3VtZW50IElELlxuICAgKiAgIC0gKiBgZmlsZU5hbWVgOiBzdHJpbmcgLSBUaGUgbmFtZSBvZiB0aGUgZmlsZS5cbiAgICogICAtICogYG9wZXJhdGlvbmA6IFwiQWRkXCIgfCBcIlVwZGF0ZVwiIC0gVGhlIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhlIGRvY3VtZW50LlxuICAgKiAgIC0gKiBgc3RhdHVzYDogXCJJbmRleGluZ1wiIHwgXCJJbmRleGVkXCIgfCBcIkVycm9yXCIgLSBUaGUgc3RhdHVzIG9mIHRoZSBkb2N1bWVudC5cbiAgICogICAtICogYHByZXZpb3VzSW5kZXhhdGlvblRpbWVgOiBzdHJpbmcgfCBudWxsIC0gVGhlIHByZXZpb3VzIGluZGV4YXRpb24gdGltZS5cbiAgICogICAtICogYGN1cnJlbnRJbmRleGF0aW9uVGltZWA6IHN0cmluZyB8IG51bGwgLSBUaGUgY3VycmVudCBpbmRleGF0aW9uIHRpbWUuXG4gICAqIC0gYGV4ZWN1dGlvblRpbWVgOiBzdHJpbmcgLSBUaGUgdGltZSB0YWtlbiB0byByZXRyaWV2ZSB0aGUgaW5kZXhpbmcgc3RhdHVzLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgaW52b2tpbmcgdGhlIGBkb2N1bWVudHNVcGxvYWRTdGF0dXNgIGFjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXRJbmRleGluZ1N0YXR1cyh0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxJbmRleGluZ0luZm9zPiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJkb2N1bWVudHNVcGxvYWRTdGF0dXNcIixcbiAgICAgIGFwcE5hbWU6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgc3RhdHVzVG9rZW46IHRva2VuXG4gICAgfTtcblxuICAgIHJldHVybiBmcm9tKHBvc3Q8SW5kZXhpbmdJbmZvcz4odGhpcy5SRVFVRVNUX1VSTCwgZGF0YSkpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGludm9raW5nIGRvY3VtZW50c1VwbG9hZFN0YXR1czogJHtlcnJvcn1gKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIHVwbG9hZGVkIGRvY3VtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2NvbHVtbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2YgYWRkaXRpb25hbCBpbmRleCBjb2x1bW5zIHRvIGluY2x1ZGUgZm9yIGVhY2ggZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF0gLSBPcHRpb25hbCBudW1iZXIgb2YgZG9jdW1lbnRzIHRvIHNraXAgZm9yIHBhZ2luYXRpb24uIElmIHNldCwgY291bnQgYWxzbyBuZWVkcyB0byBiZSBzZXQuIE5vIHNraXAgaWYgbm90IHNldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtjb3VudF0gLSBPcHRpb25hbCBudW1iZXIgb2YgZG9jdW1lbnRzIHRvIHRha2UgZm9yIHBhZ2luYXRpb24gKHVubGltaXRlZCBpZiBub3Qgc2V0KS5cbiAgICogQHJldHVybnMge09ic2VydmFibGU8VXBsb2FkZWREb2N1bWVudHM+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGxpc3Qgb2YgdXBsb2FkZWQgZG9jdW1lbnRzLlxuICAgKiBUaGUgYFVwbG9hZGVkRG9jdW1lbnRzYCBvYmplY3QgY29udGFpbnM6XG4gICAqIC0gYGRvY3NgOiBhcnJheSAtIEFuIGFycmF5IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGRvY3VtZW50IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKiAgIC0gKiBgaWRgOiBzdHJpbmcgLSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZG9jdW1lbnQuXG4gICAqICAgLSAqIGBmaWxlTmFtZWA6IHN0cmluZyAtIFRoZSBuYW1lIG9mIHRoZSBmaWxlLlxuICAgKiAgIC0gKiBgdGl0bGVgOiBzdHJpbmcgLSBUaGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50LlxuICAgKiAgIC0gKiBgZmlsZUV4dGA6IHN0cmluZyAtIFRoZSBmaWxlIGV4dGVuc2lvbiBvZiB0aGUgZG9jdW1lbnQuXG4gICAqICAgLSAqIGBpbmRleGF0aW9uVGltZWA6IHN0cmluZyAtIFRoZSB0aW1lIHdoZW4gdGhlIGRvY3VtZW50IHdhcyBpbmRleGVkLlxuICAgKiAgIC0gKiBgc2l6ZWA6IG51bWJlciAtIFRoZSBzaXplIG9mIHRoZSBkb2N1bWVudC5cbiAgICogICAtICogYHNpemVEaXNwbGF5YDogc3RyaW5nIC0gQSBodW1hbi1yZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZG9jdW1lbnQgc2l6ZS5cbiAgICogICAtICogYFtrZXk6IHN0cmluZ11gOiBhbnkgLSBBZGRpdGlvbmFsIGNvbHVtbnMgYXNrZWQgaW4gdGhlIHJlcXVlc3QsIHZhbHVlIG9mIHRoZSBjb2x1bW4gZm9yIHRoZSBkb2N1bWVudC5cbiAgICogLSBgY291bnRgOiBudW1iZXIgLSBUaGUgY291bnQgb2YgZG9jdW1lbnRzIGluIHRoZSBjdXJyZW50IGJhdGNoIG9yIHN1YnNldC5cbiAgICogLSBgdG90YWxDb3VudGA6IG51bWJlciAtIFRoZSB0b3RhbCBjb3VudCBvZiBkb2N1bWVudHMgYXZhaWxhYmxlLlxuICAgKiAtIGBleGVjdXRpb25UaW1lYDogc3RyaW5nIC0gVGhlIHRpbWUgdGFrZW4gdG8gcHJvY2VzcyB0aGUgZG9jdW1lbnRzLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSByZXF1ZXN0IGZhaWxzLlxuICAgKi9cbiAgcHVibGljIGdldERvY3VtZW50c0xpc3QoY29sdW1ucz86IHN0cmluZ1tdLCBza2lwPzogbnVtYmVyLCBjb3VudD86IG51bWJlcik6IE9ic2VydmFibGU8VXBsb2FkZWREb2N1bWVudHM+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBcImRvY3VtZW50c0xpc3RcIixcbiAgICAgIGFwcE5hbWU6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lXG4gICAgfTtcblxuICAgIGlmIChjb2x1bW5zKSBkYXRhW1wiY29sdW1uc1wiXSA9IGNvbHVtbnM7XG4gICAgaWYgKHNraXApIGRhdGFbXCJza2lwXCJdID0gc2tpcDtcbiAgICBpZiAoY291bnQpIGRhdGFbXCJjb3VudFwiXSA9IGNvdW50O1xuXG4gICAgcmV0dXJuIGZyb20ocG9zdDxVcGxvYWRlZERvY3VtZW50cz4odGhpcy5SRVFVRVNUX1VSTCwgZGF0YSkpLnBpcGUoXG4gICAgICB0YXAoKHJlczogVXBsb2FkZWREb2N1bWVudHMpID0+IHRoaXMudXBsb2FkZWREb2N1bWVudHMkLm5leHQocmVzLmRvY3MpKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW52b2tpbmcgZG9jdW1lbnRzTGlzdDogJHtlcnJvcn1gKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIElEcy5cbiAgICpcbiAgICogQHBhcmFtIGRvY0lkcyAtIEFuIGFycmF5IG9mIGRvY3VtZW50IElEcyB0byBkZWxldGUuXG4gICAqIEByZXR1cm5zIEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgc2VydmVyIHJlc3BvbnNlIG9mIHR5cGUgYGRlbGV0ZURvY3VtZW50c1Jlc3BvbnNlYC5cbiAgICogVGhlIGBkZWxldGVEb2N1bWVudHNSZXNwb25zZWAgb2JqZWN0IGNvbnRhaW5zOlxuICAgKiAtIGBkZWxldGVkQ291bnRgOiBudW1iZXIgLSBUaGUgbnVtYmVyIG9mIGRlbGV0ZWQgZG9jdW1lbnRzLlxuICAgKiAtIGBleGVjdXRpb25UaW1lYDogc3RyaW5nIC0gVGhlIHRpbWUgdGFrZW4gdG8gZGVsZXRlIHRoZSBkb2N1bWVudHMuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciBpbnZva2luZyB0aGUgYGRvY3VtZW50c0RlbGV0ZWAgYWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGRlbGV0ZURvY3VtZW50cyhkb2NJZHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxkZWxldGVEb2N1bWVudHNSZXNwb25zZT4ge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwiZG9jdW1lbnRzRGVsZXRlXCIsXG4gICAgICBkb2NJZHMsXG4gICAgICBhcHBOYW1lOiB0aGlzLmFwcFNlcnZpY2UuYXBwTmFtZVxuICAgIH07XG5cbiAgICByZXR1cm4gZnJvbShwb3N0PGRlbGV0ZURvY3VtZW50c1Jlc3BvbnNlPih0aGlzLlJFUVVFU1RfVVJMLCBkYXRhKSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW52b2tpbmcgZG9jdW1lbnRzRGVsZXRlOiAke2Vycm9yfWApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYWxsIHVwbG9hZGVkIGRvY3VtZW50cy5cbiAgICpcbiAgICogQHJldHVybnMgQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBzZXJ2ZXIgcmVzcG9uc2Ugb2YgdHlwZSBgZGVsZXRlRG9jdW1lbnRzUmVzcG9uc2VgLlxuICAgKiBUaGUgYGRlbGV0ZURvY3VtZW50c1Jlc3BvbnNlYCBvYmplY3QgY29udGFpbnM6XG4gICAqIC0gYGRlbGV0ZWRDb3VudGA6IG51bWJlciAtIFRoZSBudW1iZXIgb2YgZGVsZXRlZCBkb2N1bWVudHMuXG4gICAqIC0gYGV4ZWN1dGlvblRpbWVgOiBzdHJpbmcgLSBUaGUgdGltZSB0YWtlbiB0byBkZWxldGUgdGhlIGRvY3VtZW50cy5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGlzIGFuIGVycm9yIGludm9raW5nIHRoZSBgZG9jdW1lbnRzRGVsZXRlQWxsYCBhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQWxsRG9jdW1lbnRzKCk6IE9ic2VydmFibGU8ZGVsZXRlRG9jdW1lbnRzUmVzcG9uc2U+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBcImRvY3VtZW50c0RlbGV0ZUFsbFwiLFxuICAgICAgYXBwTmFtZTogdGhpcy5hcHBTZXJ2aWNlLmFwcE5hbWVcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZyb20ocG9zdDxkZWxldGVEb2N1bWVudHNSZXNwb25zZT4odGhpcy5SRVFVRVNUX1VSTCwgZGF0YSkpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGludm9raW5nIGRvY3VtZW50c0RlbGV0ZUFsbDogJHtlcnJvcn1gKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIHRoZSBnaXZlbiBmaWxlIHNpemUgaW4gYnl0ZXMgaW50byBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIGJ5dGVzIC0gVGhlIHNpemUgb2YgdGhlIGZpbGUgaW4gYnl0ZXMuXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZmlsZSBzaXplIGluIGEgaHVtYW4tcmVhZGFibGUgZm9ybWF0IChlLmcuLCBcIjEwLjI0IEtCXCIsIFwiMS4wMCBNQlwiKS5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRGaWxlU2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiBcIjAgQnl0ZXNcIjtcbiAgICBjb25zdCBrID0gMTAyNDtcbiAgICBjb25zdCBzaXplcyA9IFtcIkJ5dGVzXCIsIFwiS0JcIiwgXCJNQlwiLCBcIkdCXCIsIFwiVEJcIl07XG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpO1xuICAgIHJldHVybiAoXG4gICAgICBOdW1iZXIucGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZCgyKSkgKyBcIiBcIiArIHNpemVzW2ldXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gZmlsZSBzaXplIGluIGJ5dGVzIGludG8gbWVnYWJ5dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gYnl0ZXMgLSBUaGUgc2l6ZSBvZiB0aGUgZmlsZSBpbiBieXRlcy5cbiAgICogQHJldHVybnMgVGhlIHNpemUgb2YgdGhlIGZpbGUgaW4gbWVnYWJ5dGVzLlxuICAgKi9cbiAgcHVibGljIGNvbnZlcnRCeXRlc1RvTUIoYnl0ZXM6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGJ5dGVzIC8gKDEwMjQgKiAxMDI0KTtcbiAgfVxuXG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ export function markdownItCodeBlockPlugin(md) {
2
+ const defaultFenceRenderer = md.renderer.rules.fence;
3
+ md.renderer.rules.fence = (tokens, idx, options, env, self) => {
4
+ const token = tokens[idx];
5
+ const info = token.info ? md.utils.unescapeAll(token.info).trim() : '';
6
+ const langName = info.split(/(\s+)/g)[0];
7
+ const defaultRendered = defaultFenceRenderer(tokens, idx, options, env, self);
8
+ // We add a wrapper and a copy button.
9
+ // The button will have an attribute `[copy-to-clipboard]` which can be handled by an Angular directive
10
+ // to implement the copy functionality. The code to be copied is passed as an input.
11
+ return `<code-block-reference langname="${langName}">${defaultRendered}</code-block-reference>`;
12
+ };
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1ibG9jay5wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9tYXJrZG93bi1pdC1wbHVnaW5zL2NvZGUtYmxvY2sucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxFQUFjO0lBQ3RELE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBTSxDQUFDO0lBRXRELEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUM1RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFOUUsc0NBQXNDO1FBQ3RDLHVHQUF1RztRQUN2RyxvRkFBb0Y7UUFDcEYsT0FBTyxtQ0FBbUMsUUFBUSxLQUFLLGVBQWUseUJBQXlCLENBQUM7SUFDbEcsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIE1hcmtkb3duSXQgZnJvbSBcIm1hcmtkb3duLWl0XCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWFya2Rvd25JdENvZGVCbG9ja1BsdWdpbihtZDogTWFya2Rvd25JdCkge1xyXG4gIGNvbnN0IGRlZmF1bHRGZW5jZVJlbmRlcmVyID0gbWQucmVuZGVyZXIucnVsZXMuZmVuY2UhO1xyXG5cclxuICBtZC5yZW5kZXJlci5ydWxlcy5mZW5jZSA9ICh0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52LCBzZWxmKSA9PiB7XHJcbiAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpZHhdO1xyXG4gICAgY29uc3QgaW5mbyA9IHRva2VuLmluZm8gPyBtZC51dGlscy51bmVzY2FwZUFsbCh0b2tlbi5pbmZvKS50cmltKCkgOiAnJztcclxuICAgIGNvbnN0IGxhbmdOYW1lID0gaW5mby5zcGxpdCgvKFxccyspL2cpWzBdO1xyXG4gICAgY29uc3QgZGVmYXVsdFJlbmRlcmVkID0gZGVmYXVsdEZlbmNlUmVuZGVyZXIodG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiwgc2VsZik7XHJcblxyXG4gICAgLy8gV2UgYWRkIGEgd3JhcHBlciBhbmQgYSBjb3B5IGJ1dHRvbi5cclxuICAgIC8vIFRoZSBidXR0b24gd2lsbCBoYXZlIGFuIGF0dHJpYnV0ZSBgW2NvcHktdG8tY2xpcGJvYXJkXWAgd2hpY2ggY2FuIGJlIGhhbmRsZWQgYnkgYW4gQW5ndWxhciBkaXJlY3RpdmVcclxuICAgIC8vIHRvIGltcGxlbWVudCB0aGUgY29weSBmdW5jdGlvbmFsaXR5LiBUaGUgY29kZSB0byBiZSBjb3BpZWQgaXMgcGFzc2VkIGFzIGFuIGlucHV0LlxyXG4gICAgcmV0dXJuIGA8Y29kZS1ibG9jay1yZWZlcmVuY2UgbGFuZ25hbWU9XCIke2xhbmdOYW1lfVwiPiR7ZGVmYXVsdFJlbmRlcmVkfTwvY29kZS1ibG9jay1yZWZlcmVuY2U+YDtcclxuICB9O1xyXG59XHJcbiJdfQ==