stream-chat-angular 6.4.1 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +12 -18
  2. package/assets/version.d.ts +1 -1
  3. package/{esm2020 → esm2022}/assets/version.mjs +2 -2
  4. package/{esm2020 → esm2022}/lib/attachment-configuration.service.mjs +4 -4
  5. package/esm2022/lib/attachment-list/attachment-list.component.mjs +232 -0
  6. package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
  7. package/{esm2020 → esm2022}/lib/attachment.service.mjs +5 -5
  8. package/{esm2020 → esm2022}/lib/avatar/avatar.component.mjs +5 -5
  9. package/{esm2020 → esm2022}/lib/avatar-placeholder/avatar-placeholder.component.mjs +6 -6
  10. package/esm2022/lib/channel/channel.component.mjs +45 -0
  11. package/{esm2020 → esm2022}/lib/channel-header/channel-header.component.mjs +6 -6
  12. package/esm2022/lib/channel-list/channel-list.component.mjs +47 -0
  13. package/{esm2020 → esm2022}/lib/channel-preview/channel-preview.component.mjs +6 -6
  14. package/esm2022/lib/channel.service.mjs +1575 -0
  15. package/{esm2020 → esm2022}/lib/chat-client.service.mjs +5 -5
  16. package/{esm2020 → esm2022}/lib/custom-templates.service.mjs +5 -5
  17. package/{esm2020 → esm2022}/lib/date-parser.service.mjs +5 -5
  18. package/{esm2020 → esm2022}/lib/icon/icon-placeholder/icon-placeholder.component.mjs +6 -6
  19. package/{esm2020 → esm2022}/lib/icon/icon.component.mjs +5 -5
  20. package/{esm2020 → esm2022}/lib/icon/icon.module.mjs +11 -11
  21. package/{esm2020 → esm2022}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
  22. package/{esm2020 → esm2022}/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +6 -6
  23. package/esm2022/lib/message/message.component.mjs +501 -0
  24. package/{esm2020 → esm2022}/lib/message-actions-box/message-actions-box.component.mjs +6 -6
  25. package/{esm2020 → esm2022}/lib/message-actions.service.mjs +5 -5
  26. package/{esm2020 → esm2022}/lib/message-blocked/message-blocked.component.mjs +4 -4
  27. package/{esm2020 → esm2022}/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +6 -6
  28. package/{esm2020 → esm2022}/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +6 -6
  29. package/{esm2020 → esm2022}/lib/message-input/emoji-input.service.mjs +5 -5
  30. package/{esm2020 → esm2022}/lib/message-input/message-input-config.service.mjs +5 -5
  31. package/{esm2020 → esm2022}/lib/message-input/message-input.component.mjs +7 -7
  32. package/{esm2020 → esm2022}/lib/message-input/textarea/textarea.component.mjs +5 -5
  33. package/{esm2020 → esm2022}/lib/message-input/textarea.directive.mjs +5 -5
  34. package/{esm2020 → esm2022}/lib/message-input/voice-recorder.service.mjs +5 -5
  35. package/esm2022/lib/message-list/message-list.component.mjs +717 -0
  36. package/{esm2020 → esm2022}/lib/message-reactions/message-reactions.component.mjs +6 -6
  37. package/{esm2020 → esm2022}/lib/message-reactions-selector/message-reactions-selector.component.mjs +5 -5
  38. package/{esm2020 → esm2022}/lib/message-reactions.service.mjs +5 -5
  39. package/{esm2020 → esm2022}/lib/message-text/message-text.component.mjs +6 -6
  40. package/{esm2020 → esm2022}/lib/message.service.mjs +5 -5
  41. package/{esm2020 → esm2022}/lib/modal/modal.component.mjs +6 -6
  42. package/{esm2020 → esm2022}/lib/modal/stream-modal.module.mjs +5 -5
  43. package/{esm2020 → esm2022}/lib/notification/notification.component.mjs +6 -6
  44. package/{esm2020 → esm2022}/lib/notification-list/notification-list.component.mjs +6 -6
  45. package/{esm2020 → esm2022}/lib/notification-list/stream-notification.module.mjs +5 -5
  46. package/{esm2020 → esm2022}/lib/notification.service.mjs +5 -5
  47. package/{esm2020 → esm2022}/lib/paginated-list/paginated-list.component.mjs +6 -6
  48. package/{esm2020 → esm2022}/lib/paginated-list/stream-paginated-list.module.mjs +5 -5
  49. package/{esm2020 → esm2022}/lib/polls/base-poll.component.mjs +5 -5
  50. package/esm2022/lib/polls/poll/poll.component.mjs +34 -0
  51. package/{esm2020 → esm2022}/lib/polls/poll-actions/add-option/add-option.component.mjs +4 -4
  52. package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-actions.component.mjs +6 -6
  53. package/esm2022/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.mjs +82 -0
  54. package/esm2022/lib/polls/poll-actions/poll-results/poll-results-list/poll-results-list.component.mjs +63 -0
  55. package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-results/poll-vote/poll-vote.component.mjs +6 -6
  56. package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component.mjs +5 -5
  57. package/{esm2020 → esm2022}/lib/polls/poll-actions/upsert-answer/upsert-answer.component.mjs +4 -4
  58. package/esm2022/lib/polls/poll-composer/poll-composer.component.mjs +134 -0
  59. package/{esm2020 → esm2022}/lib/polls/poll-header/poll-header.component.mjs +4 -4
  60. package/{esm2020 → esm2022}/lib/polls/poll-option-selector/poll-option-selector.component.mjs +5 -5
  61. package/{esm2020 → esm2022}/lib/polls/poll-options-list/poll-options-list.component.mjs +5 -5
  62. package/{esm2020 → esm2022}/lib/polls/poll-preview/poll-preview.component.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/polls/stream-polls.module.mjs +41 -41
  64. package/esm2022/lib/stream-autocomplete-textarea.module.mjs +33 -0
  65. package/{esm2020 → esm2022}/lib/stream-avatar.module.mjs +5 -5
  66. package/{esm2020 → esm2022}/lib/stream-chat.module.mjs +67 -67
  67. package/esm2022/lib/stream-i18n.service.mjs +34 -0
  68. package/esm2022/lib/stream-textarea.module.mjs +31 -0
  69. package/{esm2020 → esm2022}/lib/theme.service.mjs +5 -5
  70. package/{esm2020 → esm2022}/lib/thread/thread.component.mjs +6 -6
  71. package/{esm2020 → esm2022}/lib/transliteration.service.mjs +5 -5
  72. package/{esm2020 → esm2022}/lib/types.mjs +1 -1
  73. package/{esm2020 → esm2022}/lib/user-list/user-list.component.mjs +5 -5
  74. package/{esm2020 → esm2022}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
  75. package/{esm2020 → esm2022}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
  76. package/{esm2020 → esm2022}/lib/voice-recorder/transcoder.service.mjs +5 -5
  77. package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +5 -5
  78. package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder.component.mjs +6 -6
  79. package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
  80. package/{esm2020 → esm2022}/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +5 -5
  81. package/{esm2020 → esm2022}/lib/voice-recording/voice-recording.component.mjs +6 -6
  82. package/{esm2020 → esm2022}/lib/voice-recording/voice-recording.module.mjs +5 -5
  83. package/{fesm2020 → fesm2022}/stream-chat-angular.mjs +463 -470
  84. package/fesm2022/stream-chat-angular.mjs.map +1 -0
  85. package/lib/attachment-list/attachment-list.component.d.ts +1 -1
  86. package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
  87. package/lib/avatar/avatar.component.d.ts +1 -1
  88. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
  89. package/lib/channel-preview/channel-preview.component.d.ts +1 -1
  90. package/lib/chat-client.service.d.ts +1 -1
  91. package/lib/custom-templates.service.d.ts +1 -0
  92. package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +1 -1
  93. package/lib/icon/icon.component.d.ts +2 -2
  94. package/lib/message/message.component.d.ts +1 -1
  95. package/lib/message-actions-box/message-actions-box.component.d.ts +1 -1
  96. package/lib/message-blocked/message-blocked.component.d.ts +1 -1
  97. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -1
  98. package/lib/message-input/message-input.component.d.ts +1 -1
  99. package/lib/message-input/textarea/textarea.component.d.ts +1 -1
  100. package/lib/message-input/textarea.directive.d.ts +1 -1
  101. package/lib/message-list/group-styles.d.ts +1 -1
  102. package/lib/message-list/message-list.component.d.ts +1 -1
  103. package/lib/message-reactions/message-reactions.component.d.ts +1 -1
  104. package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +1 -1
  105. package/lib/message-text/message-text.component.d.ts +2 -2
  106. package/lib/modal/modal.component.d.ts +1 -1
  107. package/lib/notification/notification.component.d.ts +1 -1
  108. package/lib/paginated-list/paginated-list.component.d.ts +5 -2
  109. package/lib/polls/base-poll.component.d.ts +1 -1
  110. package/lib/polls/poll-actions/add-option/add-option.component.d.ts +1 -1
  111. package/lib/polls/poll-actions/poll-actions.component.d.ts +2 -2
  112. package/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.d.ts +1 -1
  113. package/lib/polls/poll-actions/poll-results/poll-vote/poll-vote.component.d.ts +1 -1
  114. package/lib/polls/poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component.d.ts +1 -1
  115. package/lib/polls/poll-actions/upsert-answer/upsert-answer.component.d.ts +1 -1
  116. package/lib/polls/poll-composer/poll-composer.component.d.ts +2 -2
  117. package/lib/polls/poll-header/poll-header.component.d.ts +1 -1
  118. package/lib/polls/poll-option-selector/poll-option-selector.component.d.ts +1 -1
  119. package/lib/polls/poll-options-list/poll-options-list.component.d.ts +1 -1
  120. package/lib/types.d.ts +79 -79
  121. package/lib/user-list/user-list.component.d.ts +1 -1
  122. package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
  123. package/lib/voice-recorder/media-recorder.d.ts +2 -2
  124. package/lib/voice-recorder/transcoder.service.d.ts +4 -4
  125. package/lib/voice-recorder/voice-recorder.component.d.ts +1 -1
  126. package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +1 -1
  127. package/lib/voice-recording/voice-recording.component.d.ts +1 -1
  128. package/package.json +11 -17
  129. package/src/assets/version.ts +1 -1
  130. package/esm2020/lib/attachment-list/attachment-list.component.mjs +0 -232
  131. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
  132. package/esm2020/lib/channel/channel.component.mjs +0 -45
  133. package/esm2020/lib/channel-list/channel-list.component.mjs +0 -47
  134. package/esm2020/lib/channel.service.mjs +0 -1575
  135. package/esm2020/lib/message/message.component.mjs +0 -501
  136. package/esm2020/lib/message-list/message-list.component.mjs +0 -717
  137. package/esm2020/lib/polls/poll/poll.component.mjs +0 -34
  138. package/esm2020/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.mjs +0 -82
  139. package/esm2020/lib/polls/poll-actions/poll-results/poll-results-list/poll-results-list.component.mjs +0 -63
  140. package/esm2020/lib/polls/poll-composer/poll-composer.component.mjs +0 -134
  141. package/esm2020/lib/stream-autocomplete-textarea.module.mjs +0 -33
  142. package/esm2020/lib/stream-i18n.service.mjs +0 -41
  143. package/esm2020/lib/stream-textarea.module.mjs +0 -31
  144. package/fesm2015/stream-chat-angular.mjs +0 -10596
  145. package/fesm2015/stream-chat-angular.mjs.map +0 -1
  146. package/fesm2020/stream-chat-angular.mjs.map +0 -1
  147. /package/{esm2020 → esm2022}/assets/i18n/en.mjs +0 -0
  148. /package/{esm2020 → esm2022}/lib/channel-query.mjs +0 -0
  149. /package/{esm2020 → esm2022}/lib/file-utils.mjs +0 -0
  150. /package/{esm2020 → esm2022}/lib/format-duration.mjs +0 -0
  151. /package/{esm2020 → esm2022}/lib/get-channel-display-text.mjs +0 -0
  152. /package/{esm2020 → esm2022}/lib/get-message-translation.mjs +0 -0
  153. /package/{esm2020 → esm2022}/lib/injection-tokens.mjs +0 -0
  154. /package/{esm2020 → esm2022}/lib/is-image-attachment.mjs +0 -0
  155. /package/{esm2020 → esm2022}/lib/is-on-separate-date.mjs +0 -0
  156. /package/{esm2020 → esm2022}/lib/is-safari.mjs +0 -0
  157. /package/{esm2020 → esm2022}/lib/list-users.mjs +0 -0
  158. /package/{esm2020 → esm2022}/lib/message-input/textarea.interface.mjs +0 -0
  159. /package/{esm2020 → esm2022}/lib/message-list/group-styles.mjs +0 -0
  160. /package/{esm2020 → esm2022}/lib/message-preview.mjs +0 -0
  161. /package/{esm2020 → esm2022}/lib/parse-date.mjs +0 -0
  162. /package/{esm2020 → esm2022}/lib/polls/poll-composer/validators.mjs +0 -0
  163. /package/{esm2020 → esm2022}/lib/polls/unique.validator.mjs +0 -0
  164. /package/{esm2020 → esm2022}/lib/read-by.mjs +0 -0
  165. /package/{esm2020 → esm2022}/lib/types-custom.mjs +0 -0
  166. /package/{esm2020 → esm2022}/lib/virtualized-list.service.mjs +0 -0
  167. /package/{esm2020 → esm2022}/lib/virtualized-message-list.service.mjs +0 -0
  168. /package/{esm2020 → esm2022}/lib/voice-recorder/media-recorder.mjs +0 -0
  169. /package/{esm2020 → esm2022}/lib/voice-recorder/mp3-transcoder.mjs +0 -0
  170. /package/{esm2020 → esm2022}/lib/wave-form-sampler.mjs +0 -0
  171. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  172. /package/{esm2020 → esm2022}/stream-chat-angular.mjs +0 -0
  173. /package/{esm2020 → esm2022}/stream-chat.mjs +0 -0
@@ -573,18 +573,18 @@ export class MessageInputComponent {
573
573
  this.pollId = undefined;
574
574
  }
575
575
  }
576
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MessageInputComponent, deps: [{ token: i1.ChannelService }, { token: i2.NotificationService }, { token: i3.AttachmentService }, { token: i4.MessageInputConfigService }, { token: textareaInjectionToken }, { token: i0.ComponentFactoryResolver }, { token: i0.ChangeDetectorRef }, { token: i5.EmojiInputService }, { token: i6.CustomTemplatesService }, { token: i7.MessageActionsService }, { token: i8.VoiceRecorderService }, { token: i9.AudioRecorderService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
577
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MessageInputComponent, selector: "stream-message-input", inputs: { isFileUploadEnabled: "isFileUploadEnabled", areMentionsEnabled: "areMentionsEnabled", mentionScope: "mentionScope", mode: "mode", isMultipleFileUploadEnabled: "isMultipleFileUploadEnabled", message: "message", sendMessage$: "sendMessage$", inputMode: "inputMode", autoFocus: "autoFocus", watchForMessageToEdit: "watchForMessageToEdit", displaySendButton: "displaySendButton", displayVoiceRecordingButton: "displayVoiceRecordingButton", displayPollCreateButton: "displayPollCreateButton" }, outputs: { messageUpdate: "messageUpdate", messageDraftChange: "messageDraftChange" }, host: { properties: { "class": "this.class" } }, providers: [AttachmentService, EmojiInputService, VoiceRecorderService], queries: [{ propertyName: "voiceRecorderRef", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "textareaAnchor", first: true, predicate: TextareaDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"str-chat__message-input str-chat-angular__message-input\"\n [style.display]=\"isVoiceRecording ? 'none' : 'flex'\"\n>\n <div *ngIf=\"quotedMessage\" class=\"str-chat__quoted-message-preview-header\">\n <div class=\"str-chat__quoted-message-reply-to-message\">\n {{ \"streamChat.Reply to Message\" | translate }}\n </div>\n <button\n class=\"str-chat__quoted-message-remove\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToQuote()\"\n (keyup.enter)=\"deselectMessageToQuote()\"\n >\n <stream-icon-placeholder icon=\"close\" />\n </button>\n </div>\n <div *ngIf=\"isUpdate\" class=\"str-chat__quoted-message-preview-header\">\n <div class=\"str-chat__quoted-message-reply-to-message\">\n {{ \"streamChat.Edit Message\" | translate }}\n </div>\n <button\n class=\"str-chat__quoted-message-remove\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToEdit()\"\n (keyup.enter)=\"deselectMessageToEdit()\"\n >\n <stream-icon-placeholder icon=\"close\" />\n </button>\n </div>\n <ng-container *ngIf=\"canSendMessages; else notAllowed\">\n <div\n class=\"str-chat__message-input-inner str-chat-angular__message-input-inner\"\n >\n <ng-content select=\"[message-input-start]\"></ng-content>\n <ng-container\n *ngIf=\"isFileUploadEnabled && isFileUploadAuthorized && canSendMessages\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n customAttachmentUploadTemplate || defaultAttachmentUpload;\n context: getAttachmentUploadContext()\n \"\n />\n <ng-template #defaultAttachmentUpload>\n <div\n class=\"str-chat__file-input-container\"\n data-testid=\"file-upload-button\"\n >\n <input\n #fileInput\n type=\"file\"\n class=\"str-chat__file-input\"\n data-testid=\"file-input\"\n [multiple]=\"isMultipleFileUploadEnabled\"\n id=\"{{ fileInputId }}\"\n [disabled]=\"\n (attachmentService.attachmentsCounter$ | async)! >=\n attachmentService.maxNumberOfAttachments\n \"\n (change)=\"filesSelected(fileInput.files)\"\n />\n <label class=\"str-chat__file-input-label\" for=\"{{ fileInputId }}\">\n <stream-icon-placeholder icon=\"attach\" />\n </label>\n </div>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"canSendPolls && displayPollCreateButton && mode !== 'thread'\"\n >\n <button\n class=\"str-chat-angular__create-poll\"\n (click)=\"openPollComposer()\"\n >\n <stream-icon-placeholder icon=\"poll\" />\n </button>\n </ng-container>\n <div class=\"str-chat__message-textarea-container\">\n <div\n *ngIf=\"quotedMessage\"\n data-testid=\"quoted-message-container\"\n class=\"str-chat__quoted-message-preview\"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"quoted-message-sender\"\n [imageUrl]=\"quotedMessage.user?.image\"\n [name]=\"quotedMessage.user?.name || quotedMessage.user?.id\"\n [user]=\"quotedMessage.user || undefined\"\n />\n <div\n class=\"quoted-message-preview-content-inner str-chat__quoted-message-bubble\"\n >\n <stream-attachment-list\n *ngIf=\"\n quotedMessage?.attachments && quotedMessage?.attachments?.length\n \"\n [attachments]=\"quotedMessageAttachments\"\n [messageId]=\"quotedMessage.id\"\n />\n <ng-container\n *ngIf=\"\n quotedMessage?.poll_id &&\n (customTemplatesService.pollTemplate$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.pollTemplate$ | async)!;\n context: {\n pollId: quotedMessage?.poll_id,\n messageId: quotedMessage?.id,\n isQuote: true\n }\n \"\n />\n </ng-container>\n <div class=\"str-chat__quoted-message-text\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageTextTemplate$ | async) ||\n defaultText;\n context: getQuotedMessageTextContext()\n \"\n />\n <ng-template\n #defaultText\n let-message=\"message\"\n let-isQuoted=\"isQuoted\"\n let-shouldTranslate=\"shouldTranslate\"\n >\n <stream-message-text\n [message]=\"message\"\n [isQuoted]=\"isQuoted\"\n [shouldTranslate]=\"shouldTranslate\"\n data-testid=\"quoted-message-text\"\n />\n </ng-template>\n </div>\n </div>\n </div>\n <ng-template\n #defaultAttachmentsPreview\n let-attachmentUploads$=\"attachmentUploads$\"\n let-retryUploadHandler=\"retryUploadHandler\"\n let-deleteUploadHandler=\"deleteUploadHandler\"\n >\n <stream-attachment-preview-list\n class=\"str-chat__attachment-preview-list-angular-host\"\n [attachmentUploads$]=\"attachmentUploads$\"\n (retryAttachmentUpload)=\"retryUploadHandler($event)\"\n (deleteAttachment)=\"deleteUploadHandler($event)\"\n />\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n attachmentPreviewListTemplate || defaultAttachmentsPreview;\n context: getAttachmentPreviewListContext()\n \"\n />\n <div class=\"str-chat__message-textarea-with-emoji-picker\">\n <ng-container\n streamTextarea\n [componentRef]=\"textareaRef\"\n [areMentionsEnabled]=\"areMentionsEnabled\"\n [mentionScope]=\"mentionScope\"\n [inputMode]=\"inputMode\"\n [autoFocus]=\"autoFocus\"\n [placeholder]=\"textareaPlaceholder\"\n [(value)]=\"textareaValue\"\n (valueChange)=\"typingStart$.next(); updateMessageDraft()\"\n (send)=\"messageSent()\"\n (userMentions)=\"userMentionsChanged($event)\"\n (pasteFromClipboard)=\"itemsPasted($event)\"\n />\n <ng-container *ngIf=\"emojiPickerTemplate\" data-testid=\"emoji-picker\">\n <ng-container\n *ngTemplateOutlet=\"\n emojiPickerTemplate;\n context: getEmojiPickerContext()\n \"\n />\n </ng-container>\n </div>\n </div>\n <button\n *ngIf=\"canSendMessages && !isCooldownInProgress && displaySendButton\"\n data-testid=\"send-button\"\n class=\"str-chat__send-button\"\n [disabled]=\"\n (attachmentUploadInProgressCounter$ | async)! > 0 ||\n (attachmentService.attachmentsCounter$ | async)! >\n attachmentService.maxNumberOfAttachments ||\n (!textareaValue &&\n (attachmentUploads$ | async)!.length === 0 &&\n (customAttachments$ | async)!.length === 0)\n \"\n (click)=\"messageSent()\"\n (keyup.enter)=\"messageSent()\"\n >\n <stream-icon-placeholder icon=\"send\" />\n </button>\n <div\n *ngIf=\"isCooldownInProgress\"\n class=\"str-chat__message-input-cooldown\"\n data-testid=\"cooldown-timer\"\n >\n {{ cooldown$ | async }}\n </div>\n <button\n *ngIf=\"displayVoiceRecordingButton\"\n class=\"str-chat__start-recording-audio-button\"\n data-testid=\"start-voice-recording\"\n [disabled]=\"\n voiceRecorderService.isRecorderVisible$.value ||\n audioRecorder?.isRecording ||\n (attachmentService.attachmentsCounter$ | async)! >=\n attachmentService.maxNumberOfAttachments\n \"\n (click)=\"startVoiceRecording()\"\n (keyup.enter)=\"startVoiceRecording()\"\n >\n <stream-icon-placeholder icon=\"mic\" />\n </button>\n <ng-content select=\"[message-input-end]\"></ng-content>\n </div>\n </ng-container>\n <ng-template #notAllowed>\n <div\n class=\"str-chat__message-input-not-allowed\"\n data-testid=\"disabled-textarea\"\n >\n {{ disabledTextareaText | translate }}\n </div>\n </ng-template>\n</div>\n<ng-template\n *ngIf=\"voiceRecorderRef\"\n [ngTemplateOutlet]=\"voiceRecorderRef\"\n [ngTemplateOutletContext]=\"{ service: voiceRecorderService }\"\n></ng-template>\n<ng-template\n *ngIf=\"\n isComposerOpen && (customTemplatesService.pollComposerTemplate$ | async)\n \"\n [ngTemplateOutlet]=\"(customTemplatesService.pollComposerTemplate$ | async)!\"\n [ngTemplateOutletContext]=\"{\n pollCompose: addPoll,\n cancel: closePollComposer\n }\"\n></ng-template>\n", dependencies: [{ kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i11.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "location", "channel", "user", "type", "initialsType", "showOnlineIndicator"] }, { kind: "component", type: i12.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon"] }, { kind: "component", type: i13.AttachmentListComponent, selector: "stream-attachment-list", inputs: ["messageId", "parentMessageId", "attachments"], outputs: ["imageModalStateChange"] }, { kind: "component", type: i14.AttachmentPreviewListComponent, selector: "stream-attachment-preview-list", inputs: ["attachmentUploads$"], outputs: ["retryAttachmentUpload", "deleteAttachment"] }, { kind: "directive", type: i15.TextareaDirective, selector: "[streamTextarea]", inputs: ["componentRef", "areMentionsEnabled", "mentionScope", "inputMode", "value", "placeholder", "autoFocus"], outputs: ["valueChange", "send", "userMentions", "pasteFromClipboard"] }, { kind: "component", type: i16.MessageTextComponent, selector: "stream-message-text", inputs: ["message", "isQuoted", "shouldTranslate"] }, { kind: "pipe", type: i10.AsyncPipe, name: "async" }, { kind: "pipe", type: i17.TranslatePipe, name: "translate" }] }); }
576
578
  }
577
- MessageInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageInputComponent, deps: [{ token: i1.ChannelService }, { token: i2.NotificationService }, { token: i3.AttachmentService }, { token: i4.MessageInputConfigService }, { token: textareaInjectionToken }, { token: i0.ComponentFactoryResolver }, { token: i0.ChangeDetectorRef }, { token: i5.EmojiInputService }, { token: i6.CustomTemplatesService }, { token: i7.MessageActionsService }, { token: i8.VoiceRecorderService }, { token: i9.AudioRecorderService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
578
- MessageInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: MessageInputComponent, selector: "stream-message-input", inputs: { isFileUploadEnabled: "isFileUploadEnabled", areMentionsEnabled: "areMentionsEnabled", mentionScope: "mentionScope", mode: "mode", isMultipleFileUploadEnabled: "isMultipleFileUploadEnabled", message: "message", sendMessage$: "sendMessage$", inputMode: "inputMode", autoFocus: "autoFocus", watchForMessageToEdit: "watchForMessageToEdit", displaySendButton: "displaySendButton", displayVoiceRecordingButton: "displayVoiceRecordingButton", displayPollCreateButton: "displayPollCreateButton" }, outputs: { messageUpdate: "messageUpdate", messageDraftChange: "messageDraftChange" }, host: { properties: { "class": "this.class" } }, providers: [AttachmentService, EmojiInputService, VoiceRecorderService], queries: [{ propertyName: "voiceRecorderRef", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "textareaAnchor", first: true, predicate: TextareaDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"str-chat__message-input str-chat-angular__message-input\"\n [style.display]=\"isVoiceRecording ? 'none' : 'flex'\"\n>\n <div *ngIf=\"quotedMessage\" class=\"str-chat__quoted-message-preview-header\">\n <div class=\"str-chat__quoted-message-reply-to-message\">\n {{ \"streamChat.Reply to Message\" | translate }}\n </div>\n <button\n class=\"str-chat__quoted-message-remove\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToQuote()\"\n (keyup.enter)=\"deselectMessageToQuote()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </button>\n </div>\n <div *ngIf=\"isUpdate\" class=\"str-chat__quoted-message-preview-header\">\n <div class=\"str-chat__quoted-message-reply-to-message\">\n {{ \"streamChat.Edit Message\" | translate }}\n </div>\n <button\n class=\"str-chat__quoted-message-remove\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToEdit()\"\n (keyup.enter)=\"deselectMessageToEdit()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </button>\n </div>\n <ng-container *ngIf=\"canSendMessages; else notAllowed\">\n <div\n class=\"str-chat__message-input-inner str-chat-angular__message-input-inner\"\n >\n <ng-content select=\"[message-input-start]\"></ng-content>\n <ng-container\n *ngIf=\"isFileUploadEnabled && isFileUploadAuthorized && canSendMessages\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n customAttachmentUploadTemplate || defaultAttachmentUpload;\n context: getAttachmentUploadContext()\n \"\n ></ng-container>\n <ng-template #defaultAttachmentUpload>\n <div\n class=\"str-chat__file-input-container\"\n data-testid=\"file-upload-button\"\n >\n <input\n #fileInput\n type=\"file\"\n class=\"str-chat__file-input\"\n data-testid=\"file-input\"\n [multiple]=\"isMultipleFileUploadEnabled\"\n id=\"{{ fileInputId }}\"\n [disabled]=\"\n (attachmentService.attachmentsCounter$ | async)! >=\n attachmentService.maxNumberOfAttachments\n \"\n (change)=\"filesSelected(fileInput.files)\"\n />\n <label class=\"str-chat__file-input-label\" for=\"{{ fileInputId }}\">\n <stream-icon-placeholder icon=\"attach\"></stream-icon-placeholder>\n </label>\n </div>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"canSendPolls && displayPollCreateButton && mode !== 'thread'\"\n >\n <button\n class=\"str-chat-angular__create-poll\"\n (click)=\"openPollComposer()\"\n >\n <stream-icon-placeholder icon=\"poll\"></stream-icon-placeholder>\n </button>\n </ng-container>\n <div class=\"str-chat__message-textarea-container\">\n <div\n *ngIf=\"quotedMessage\"\n data-testid=\"quoted-message-container\"\n class=\"str-chat__quoted-message-preview\"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"quoted-message-sender\"\n [imageUrl]=\"quotedMessage.user?.image\"\n [name]=\"quotedMessage.user?.name || quotedMessage.user?.id\"\n [user]=\"quotedMessage.user || undefined\"\n ></stream-avatar-placeholder>\n <div\n class=\"quoted-message-preview-content-inner str-chat__quoted-message-bubble\"\n >\n <stream-attachment-list\n *ngIf=\"\n quotedMessage?.attachments && quotedMessage?.attachments?.length\n \"\n [attachments]=\"quotedMessageAttachments\"\n [messageId]=\"quotedMessage.id\"\n ></stream-attachment-list>\n <ng-container\n *ngIf=\"\n quotedMessage?.poll_id &&\n (customTemplatesService.pollTemplate$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.pollTemplate$ | async)!;\n context: {\n pollId: quotedMessage?.poll_id,\n messageId: quotedMessage?.id,\n isQuote: true\n }\n \"\n ></ng-container>\n </ng-container>\n <div class=\"str-chat__quoted-message-text\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageTextTemplate$ | async) ||\n defaultText;\n context: getQuotedMessageTextContext()\n \"\n ></ng-container>\n <ng-template\n #defaultText\n let-message=\"message\"\n let-isQuoted=\"isQuoted\"\n let-shouldTranslate=\"shouldTranslate\"\n >\n <stream-message-text\n [message]=\"message\"\n [isQuoted]=\"isQuoted\"\n [shouldTranslate]=\"shouldTranslate\"\n data-testid=\"quoted-message-text\"\n ></stream-message-text>\n </ng-template>\n </div>\n </div>\n </div>\n <ng-template\n #defaultAttachmentsPreview\n let-attachmentUploads$=\"attachmentUploads$\"\n let-retryUploadHandler=\"retryUploadHandler\"\n let-deleteUploadHandler=\"deleteUploadHandler\"\n >\n <stream-attachment-preview-list\n class=\"str-chat__attachment-preview-list-angular-host\"\n [attachmentUploads$]=\"attachmentUploads$\"\n (retryAttachmentUpload)=\"retryUploadHandler($event)\"\n (deleteAttachment)=\"deleteUploadHandler($event)\"\n ></stream-attachment-preview-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n attachmentPreviewListTemplate || defaultAttachmentsPreview;\n context: getAttachmentPreviewListContext()\n \"\n ></ng-container>\n <div class=\"str-chat__message-textarea-with-emoji-picker\">\n <ng-container\n streamTextarea\n [componentRef]=\"textareaRef\"\n [areMentionsEnabled]=\"areMentionsEnabled\"\n [mentionScope]=\"mentionScope\"\n [inputMode]=\"inputMode\"\n [autoFocus]=\"autoFocus\"\n [placeholder]=\"textareaPlaceholder\"\n [(value)]=\"textareaValue\"\n (valueChange)=\"typingStart$.next(); updateMessageDraft()\"\n (send)=\"messageSent()\"\n (userMentions)=\"userMentionsChanged($event)\"\n (pasteFromClipboard)=\"itemsPasted($event)\"\n ></ng-container>\n <ng-container *ngIf=\"emojiPickerTemplate\" data-testid=\"emoji-picker\">\n <ng-container\n *ngTemplateOutlet=\"\n emojiPickerTemplate;\n context: getEmojiPickerContext()\n \"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n <button\n *ngIf=\"canSendMessages && !isCooldownInProgress && displaySendButton\"\n data-testid=\"send-button\"\n class=\"str-chat__send-button\"\n [disabled]=\"\n (attachmentUploadInProgressCounter$ | async)! > 0 ||\n (attachmentService.attachmentsCounter$ | async)! >\n attachmentService.maxNumberOfAttachments ||\n (!textareaValue &&\n (attachmentUploads$ | async)!.length === 0 &&\n (customAttachments$ | async)!.length === 0)\n \"\n (click)=\"messageSent()\"\n (keyup.enter)=\"messageSent()\"\n >\n <stream-icon-placeholder icon=\"send\"></stream-icon-placeholder>\n </button>\n <div\n *ngIf=\"isCooldownInProgress\"\n class=\"str-chat__message-input-cooldown\"\n data-testid=\"cooldown-timer\"\n >\n {{ cooldown$ | async }}\n </div>\n <button\n *ngIf=\"displayVoiceRecordingButton\"\n class=\"str-chat__start-recording-audio-button\"\n data-testid=\"start-voice-recording\"\n [disabled]=\"\n voiceRecorderService.isRecorderVisible$.value ||\n audioRecorder?.isRecording ||\n (attachmentService.attachmentsCounter$ | async)! >=\n attachmentService.maxNumberOfAttachments\n \"\n (click)=\"startVoiceRecording()\"\n (keyup.enter)=\"startVoiceRecording()\"\n >\n <stream-icon-placeholder icon=\"mic\"></stream-icon-placeholder>\n </button>\n <ng-content select=\"[message-input-end]\"></ng-content>\n </div>\n </ng-container>\n <ng-template #notAllowed>\n <div\n class=\"str-chat__message-input-not-allowed\"\n data-testid=\"disabled-textarea\"\n >\n {{ disabledTextareaText | translate }}\n </div>\n </ng-template>\n</div>\n<ng-template\n *ngIf=\"voiceRecorderRef\"\n [ngTemplateOutlet]=\"voiceRecorderRef\"\n [ngTemplateOutletContext]=\"{ service: voiceRecorderService }\"\n></ng-template>\n<ng-template\n *ngIf=\"\n isComposerOpen && (customTemplatesService.pollComposerTemplate$ | async)\n \"\n [ngTemplateOutlet]=\"(customTemplatesService.pollComposerTemplate$ | async)!\"\n [ngTemplateOutletContext]=\"{\n pollCompose: addPoll,\n cancel: closePollComposer\n }\"\n></ng-template>\n", dependencies: [{ kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i11.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "location", "channel", "user", "type", "initialsType", "showOnlineIndicator"] }, { kind: "component", type: i12.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon"] }, { kind: "component", type: i13.AttachmentListComponent, selector: "stream-attachment-list", inputs: ["messageId", "parentMessageId", "attachments"], outputs: ["imageModalStateChange"] }, { kind: "component", type: i14.AttachmentPreviewListComponent, selector: "stream-attachment-preview-list", inputs: ["attachmentUploads$"], outputs: ["retryAttachmentUpload", "deleteAttachment"] }, { kind: "directive", type: i15.TextareaDirective, selector: "[streamTextarea]", inputs: ["componentRef", "areMentionsEnabled", "mentionScope", "inputMode", "value", "placeholder", "autoFocus"], outputs: ["valueChange", "send", "userMentions", "pasteFromClipboard"] }, { kind: "component", type: i16.MessageTextComponent, selector: "stream-message-text", inputs: ["message", "isQuoted", "shouldTranslate"] }, { kind: "pipe", type: i10.AsyncPipe, name: "async" }, { kind: "pipe", type: i17.TranslatePipe, name: "translate" }] });
579
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MessageInputComponent, decorators: [{
579
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MessageInputComponent, decorators: [{
580
580
  type: Component,
581
- args: [{ selector: 'stream-message-input', providers: [AttachmentService, EmojiInputService, VoiceRecorderService], template: "<div\n class=\"str-chat__message-input str-chat-angular__message-input\"\n [style.display]=\"isVoiceRecording ? 'none' : 'flex'\"\n>\n <div *ngIf=\"quotedMessage\" class=\"str-chat__quoted-message-preview-header\">\n <div class=\"str-chat__quoted-message-reply-to-message\">\n {{ \"streamChat.Reply to Message\" | translate }}\n </div>\n <button\n class=\"str-chat__quoted-message-remove\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToQuote()\"\n (keyup.enter)=\"deselectMessageToQuote()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </button>\n </div>\n <div *ngIf=\"isUpdate\" class=\"str-chat__quoted-message-preview-header\">\n <div class=\"str-chat__quoted-message-reply-to-message\">\n {{ \"streamChat.Edit Message\" | translate }}\n </div>\n <button\n class=\"str-chat__quoted-message-remove\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToEdit()\"\n (keyup.enter)=\"deselectMessageToEdit()\"\n >\n <stream-icon-placeholder icon=\"close\"></stream-icon-placeholder>\n </button>\n </div>\n <ng-container *ngIf=\"canSendMessages; else notAllowed\">\n <div\n class=\"str-chat__message-input-inner str-chat-angular__message-input-inner\"\n >\n <ng-content select=\"[message-input-start]\"></ng-content>\n <ng-container\n *ngIf=\"isFileUploadEnabled && isFileUploadAuthorized && canSendMessages\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n customAttachmentUploadTemplate || defaultAttachmentUpload;\n context: getAttachmentUploadContext()\n \"\n ></ng-container>\n <ng-template #defaultAttachmentUpload>\n <div\n class=\"str-chat__file-input-container\"\n data-testid=\"file-upload-button\"\n >\n <input\n #fileInput\n type=\"file\"\n class=\"str-chat__file-input\"\n data-testid=\"file-input\"\n [multiple]=\"isMultipleFileUploadEnabled\"\n id=\"{{ fileInputId }}\"\n [disabled]=\"\n (attachmentService.attachmentsCounter$ | async)! >=\n attachmentService.maxNumberOfAttachments\n \"\n (change)=\"filesSelected(fileInput.files)\"\n />\n <label class=\"str-chat__file-input-label\" for=\"{{ fileInputId }}\">\n <stream-icon-placeholder icon=\"attach\"></stream-icon-placeholder>\n </label>\n </div>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"canSendPolls && displayPollCreateButton && mode !== 'thread'\"\n >\n <button\n class=\"str-chat-angular__create-poll\"\n (click)=\"openPollComposer()\"\n >\n <stream-icon-placeholder icon=\"poll\"></stream-icon-placeholder>\n </button>\n </ng-container>\n <div class=\"str-chat__message-textarea-container\">\n <div\n *ngIf=\"quotedMessage\"\n data-testid=\"quoted-message-container\"\n class=\"str-chat__quoted-message-preview\"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"quoted-message-sender\"\n [imageUrl]=\"quotedMessage.user?.image\"\n [name]=\"quotedMessage.user?.name || quotedMessage.user?.id\"\n [user]=\"quotedMessage.user || undefined\"\n ></stream-avatar-placeholder>\n <div\n class=\"quoted-message-preview-content-inner str-chat__quoted-message-bubble\"\n >\n <stream-attachment-list\n *ngIf=\"\n quotedMessage?.attachments && quotedMessage?.attachments?.length\n \"\n [attachments]=\"quotedMessageAttachments\"\n [messageId]=\"quotedMessage.id\"\n ></stream-attachment-list>\n <ng-container\n *ngIf=\"\n quotedMessage?.poll_id &&\n (customTemplatesService.pollTemplate$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.pollTemplate$ | async)!;\n context: {\n pollId: quotedMessage?.poll_id,\n messageId: quotedMessage?.id,\n isQuote: true\n }\n \"\n ></ng-container>\n </ng-container>\n <div class=\"str-chat__quoted-message-text\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageTextTemplate$ | async) ||\n defaultText;\n context: getQuotedMessageTextContext()\n \"\n ></ng-container>\n <ng-template\n #defaultText\n let-message=\"message\"\n let-isQuoted=\"isQuoted\"\n let-shouldTranslate=\"shouldTranslate\"\n >\n <stream-message-text\n [message]=\"message\"\n [isQuoted]=\"isQuoted\"\n [shouldTranslate]=\"shouldTranslate\"\n data-testid=\"quoted-message-text\"\n ></stream-message-text>\n </ng-template>\n </div>\n </div>\n </div>\n <ng-template\n #defaultAttachmentsPreview\n let-attachmentUploads$=\"attachmentUploads$\"\n let-retryUploadHandler=\"retryUploadHandler\"\n let-deleteUploadHandler=\"deleteUploadHandler\"\n >\n <stream-attachment-preview-list\n class=\"str-chat__attachment-preview-list-angular-host\"\n [attachmentUploads$]=\"attachmentUploads$\"\n (retryAttachmentUpload)=\"retryUploadHandler($event)\"\n (deleteAttachment)=\"deleteUploadHandler($event)\"\n ></stream-attachment-preview-list>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n attachmentPreviewListTemplate || defaultAttachmentsPreview;\n context: getAttachmentPreviewListContext()\n \"\n ></ng-container>\n <div class=\"str-chat__message-textarea-with-emoji-picker\">\n <ng-container\n streamTextarea\n [componentRef]=\"textareaRef\"\n [areMentionsEnabled]=\"areMentionsEnabled\"\n [mentionScope]=\"mentionScope\"\n [inputMode]=\"inputMode\"\n [autoFocus]=\"autoFocus\"\n [placeholder]=\"textareaPlaceholder\"\n [(value)]=\"textareaValue\"\n (valueChange)=\"typingStart$.next(); updateMessageDraft()\"\n (send)=\"messageSent()\"\n (userMentions)=\"userMentionsChanged($event)\"\n (pasteFromClipboard)=\"itemsPasted($event)\"\n ></ng-container>\n <ng-container *ngIf=\"emojiPickerTemplate\" data-testid=\"emoji-picker\">\n <ng-container\n *ngTemplateOutlet=\"\n emojiPickerTemplate;\n context: getEmojiPickerContext()\n \"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n <button\n *ngIf=\"canSendMessages && !isCooldownInProgress && displaySendButton\"\n data-testid=\"send-button\"\n class=\"str-chat__send-button\"\n [disabled]=\"\n (attachmentUploadInProgressCounter$ | async)! > 0 ||\n (attachmentService.attachmentsCounter$ | async)! >\n attachmentService.maxNumberOfAttachments ||\n (!textareaValue &&\n (attachmentUploads$ | async)!.length === 0 &&\n (customAttachments$ | async)!.length === 0)\n \"\n (click)=\"messageSent()\"\n (keyup.enter)=\"messageSent()\"\n >\n <stream-icon-placeholder icon=\"send\"></stream-icon-placeholder>\n </button>\n <div\n *ngIf=\"isCooldownInProgress\"\n class=\"str-chat__message-input-cooldown\"\n data-testid=\"cooldown-timer\"\n >\n {{ cooldown$ | async }}\n </div>\n <button\n *ngIf=\"displayVoiceRecordingButton\"\n class=\"str-chat__start-recording-audio-button\"\n data-testid=\"start-voice-recording\"\n [disabled]=\"\n voiceRecorderService.isRecorderVisible$.value ||\n audioRecorder?.isRecording ||\n (attachmentService.attachmentsCounter$ | async)! >=\n attachmentService.maxNumberOfAttachments\n \"\n (click)=\"startVoiceRecording()\"\n (keyup.enter)=\"startVoiceRecording()\"\n >\n <stream-icon-placeholder icon=\"mic\"></stream-icon-placeholder>\n </button>\n <ng-content select=\"[message-input-end]\"></ng-content>\n </div>\n </ng-container>\n <ng-template #notAllowed>\n <div\n class=\"str-chat__message-input-not-allowed\"\n data-testid=\"disabled-textarea\"\n >\n {{ disabledTextareaText | translate }}\n </div>\n </ng-template>\n</div>\n<ng-template\n *ngIf=\"voiceRecorderRef\"\n [ngTemplateOutlet]=\"voiceRecorderRef\"\n [ngTemplateOutletContext]=\"{ service: voiceRecorderService }\"\n></ng-template>\n<ng-template\n *ngIf=\"\n isComposerOpen && (customTemplatesService.pollComposerTemplate$ | async)\n \"\n [ngTemplateOutlet]=\"(customTemplatesService.pollComposerTemplate$ | async)!\"\n [ngTemplateOutletContext]=\"{\n pollCompose: addPoll,\n cancel: closePollComposer\n }\"\n></ng-template>\n" }]
582
- }], ctorParameters: function () { return [{ type: i1.ChannelService }, { type: i2.NotificationService }, { type: i3.AttachmentService }, { type: i4.MessageInputConfigService }, { type: i0.Type, decorators: [{
581
+ args: [{ selector: 'stream-message-input', providers: [AttachmentService, EmojiInputService, VoiceRecorderService], template: "<div\n class=\"str-chat__message-input str-chat-angular__message-input\"\n [style.display]=\"isVoiceRecording ? 'none' : 'flex'\"\n>\n <div *ngIf=\"quotedMessage\" class=\"str-chat__quoted-message-preview-header\">\n <div class=\"str-chat__quoted-message-reply-to-message\">\n {{ \"streamChat.Reply to Message\" | translate }}\n </div>\n <button\n class=\"str-chat__quoted-message-remove\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToQuote()\"\n (keyup.enter)=\"deselectMessageToQuote()\"\n >\n <stream-icon-placeholder icon=\"close\" />\n </button>\n </div>\n <div *ngIf=\"isUpdate\" class=\"str-chat__quoted-message-preview-header\">\n <div class=\"str-chat__quoted-message-reply-to-message\">\n {{ \"streamChat.Edit Message\" | translate }}\n </div>\n <button\n class=\"str-chat__quoted-message-remove\"\n data-testid=\"remove-quote\"\n (click)=\"deselectMessageToEdit()\"\n (keyup.enter)=\"deselectMessageToEdit()\"\n >\n <stream-icon-placeholder icon=\"close\" />\n </button>\n </div>\n <ng-container *ngIf=\"canSendMessages; else notAllowed\">\n <div\n class=\"str-chat__message-input-inner str-chat-angular__message-input-inner\"\n >\n <ng-content select=\"[message-input-start]\"></ng-content>\n <ng-container\n *ngIf=\"isFileUploadEnabled && isFileUploadAuthorized && canSendMessages\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n customAttachmentUploadTemplate || defaultAttachmentUpload;\n context: getAttachmentUploadContext()\n \"\n />\n <ng-template #defaultAttachmentUpload>\n <div\n class=\"str-chat__file-input-container\"\n data-testid=\"file-upload-button\"\n >\n <input\n #fileInput\n type=\"file\"\n class=\"str-chat__file-input\"\n data-testid=\"file-input\"\n [multiple]=\"isMultipleFileUploadEnabled\"\n id=\"{{ fileInputId }}\"\n [disabled]=\"\n (attachmentService.attachmentsCounter$ | async)! >=\n attachmentService.maxNumberOfAttachments\n \"\n (change)=\"filesSelected(fileInput.files)\"\n />\n <label class=\"str-chat__file-input-label\" for=\"{{ fileInputId }}\">\n <stream-icon-placeholder icon=\"attach\" />\n </label>\n </div>\n </ng-template>\n </ng-container>\n <ng-container\n *ngIf=\"canSendPolls && displayPollCreateButton && mode !== 'thread'\"\n >\n <button\n class=\"str-chat-angular__create-poll\"\n (click)=\"openPollComposer()\"\n >\n <stream-icon-placeholder icon=\"poll\" />\n </button>\n </ng-container>\n <div class=\"str-chat__message-textarea-container\">\n <div\n *ngIf=\"quotedMessage\"\n data-testid=\"quoted-message-container\"\n class=\"str-chat__quoted-message-preview\"\n >\n <stream-avatar-placeholder\n data-testid=\"qouted-message-avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n type=\"user\"\n location=\"quoted-message-sender\"\n [imageUrl]=\"quotedMessage.user?.image\"\n [name]=\"quotedMessage.user?.name || quotedMessage.user?.id\"\n [user]=\"quotedMessage.user || undefined\"\n />\n <div\n class=\"quoted-message-preview-content-inner str-chat__quoted-message-bubble\"\n >\n <stream-attachment-list\n *ngIf=\"\n quotedMessage?.attachments && quotedMessage?.attachments?.length\n \"\n [attachments]=\"quotedMessageAttachments\"\n [messageId]=\"quotedMessage.id\"\n />\n <ng-container\n *ngIf=\"\n quotedMessage?.poll_id &&\n (customTemplatesService.pollTemplate$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.pollTemplate$ | async)!;\n context: {\n pollId: quotedMessage?.poll_id,\n messageId: quotedMessage?.id,\n isQuote: true\n }\n \"\n />\n </ng-container>\n <div class=\"str-chat__quoted-message-text\">\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageTextTemplate$ | async) ||\n defaultText;\n context: getQuotedMessageTextContext()\n \"\n />\n <ng-template\n #defaultText\n let-message=\"message\"\n let-isQuoted=\"isQuoted\"\n let-shouldTranslate=\"shouldTranslate\"\n >\n <stream-message-text\n [message]=\"message\"\n [isQuoted]=\"isQuoted\"\n [shouldTranslate]=\"shouldTranslate\"\n data-testid=\"quoted-message-text\"\n />\n </ng-template>\n </div>\n </div>\n </div>\n <ng-template\n #defaultAttachmentsPreview\n let-attachmentUploads$=\"attachmentUploads$\"\n let-retryUploadHandler=\"retryUploadHandler\"\n let-deleteUploadHandler=\"deleteUploadHandler\"\n >\n <stream-attachment-preview-list\n class=\"str-chat__attachment-preview-list-angular-host\"\n [attachmentUploads$]=\"attachmentUploads$\"\n (retryAttachmentUpload)=\"retryUploadHandler($event)\"\n (deleteAttachment)=\"deleteUploadHandler($event)\"\n />\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n attachmentPreviewListTemplate || defaultAttachmentsPreview;\n context: getAttachmentPreviewListContext()\n \"\n />\n <div class=\"str-chat__message-textarea-with-emoji-picker\">\n <ng-container\n streamTextarea\n [componentRef]=\"textareaRef\"\n [areMentionsEnabled]=\"areMentionsEnabled\"\n [mentionScope]=\"mentionScope\"\n [inputMode]=\"inputMode\"\n [autoFocus]=\"autoFocus\"\n [placeholder]=\"textareaPlaceholder\"\n [(value)]=\"textareaValue\"\n (valueChange)=\"typingStart$.next(); updateMessageDraft()\"\n (send)=\"messageSent()\"\n (userMentions)=\"userMentionsChanged($event)\"\n (pasteFromClipboard)=\"itemsPasted($event)\"\n />\n <ng-container *ngIf=\"emojiPickerTemplate\" data-testid=\"emoji-picker\">\n <ng-container\n *ngTemplateOutlet=\"\n emojiPickerTemplate;\n context: getEmojiPickerContext()\n \"\n />\n </ng-container>\n </div>\n </div>\n <button\n *ngIf=\"canSendMessages && !isCooldownInProgress && displaySendButton\"\n data-testid=\"send-button\"\n class=\"str-chat__send-button\"\n [disabled]=\"\n (attachmentUploadInProgressCounter$ | async)! > 0 ||\n (attachmentService.attachmentsCounter$ | async)! >\n attachmentService.maxNumberOfAttachments ||\n (!textareaValue &&\n (attachmentUploads$ | async)!.length === 0 &&\n (customAttachments$ | async)!.length === 0)\n \"\n (click)=\"messageSent()\"\n (keyup.enter)=\"messageSent()\"\n >\n <stream-icon-placeholder icon=\"send\" />\n </button>\n <div\n *ngIf=\"isCooldownInProgress\"\n class=\"str-chat__message-input-cooldown\"\n data-testid=\"cooldown-timer\"\n >\n {{ cooldown$ | async }}\n </div>\n <button\n *ngIf=\"displayVoiceRecordingButton\"\n class=\"str-chat__start-recording-audio-button\"\n data-testid=\"start-voice-recording\"\n [disabled]=\"\n voiceRecorderService.isRecorderVisible$.value ||\n audioRecorder?.isRecording ||\n (attachmentService.attachmentsCounter$ | async)! >=\n attachmentService.maxNumberOfAttachments\n \"\n (click)=\"startVoiceRecording()\"\n (keyup.enter)=\"startVoiceRecording()\"\n >\n <stream-icon-placeholder icon=\"mic\" />\n </button>\n <ng-content select=\"[message-input-end]\"></ng-content>\n </div>\n </ng-container>\n <ng-template #notAllowed>\n <div\n class=\"str-chat__message-input-not-allowed\"\n data-testid=\"disabled-textarea\"\n >\n {{ disabledTextareaText | translate }}\n </div>\n </ng-template>\n</div>\n<ng-template\n *ngIf=\"voiceRecorderRef\"\n [ngTemplateOutlet]=\"voiceRecorderRef\"\n [ngTemplateOutletContext]=\"{ service: voiceRecorderService }\"\n></ng-template>\n<ng-template\n *ngIf=\"\n isComposerOpen && (customTemplatesService.pollComposerTemplate$ | async)\n \"\n [ngTemplateOutlet]=\"(customTemplatesService.pollComposerTemplate$ | async)!\"\n [ngTemplateOutletContext]=\"{\n pollCompose: addPoll,\n cancel: closePollComposer\n }\"\n></ng-template>\n" }]
582
+ }], ctorParameters: () => [{ type: i1.ChannelService }, { type: i2.NotificationService }, { type: i3.AttachmentService }, { type: i4.MessageInputConfigService }, { type: i0.Type, decorators: [{
583
583
  type: Inject,
584
584
  args: [textareaInjectionToken]
585
585
  }] }, { type: i0.ComponentFactoryResolver }, { type: i0.ChangeDetectorRef }, { type: i5.EmojiInputService }, { type: i6.CustomTemplatesService }, { type: i7.MessageActionsService }, { type: i8.VoiceRecorderService }, { type: i9.AudioRecorderService, decorators: [{
586
586
  type: Optional
587
- }] }]; }, propDecorators: { isFileUploadEnabled: [{
587
+ }] }], propDecorators: { isFileUploadEnabled: [{
588
588
  type: Input
589
589
  }], areMentionsEnabled: [{
590
590
  type: Input
@@ -626,4 +626,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
626
626
  type: ViewChild,
627
627
  args: [TextareaDirective, { static: false }]
628
628
  }] } });
629
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS1pbnB1dC9tZXNzYWdlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWlucHV0L21lc3NhZ2UtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFHVCxZQUFZLEVBRVosWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBRU4sV0FBVyxFQUVYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFjLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVE3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVk3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdoRTs7R0FFRztBQU9ILE1BQU0sT0FBTyxxQkFBcUI7SUE0SGhDLFlBQ1UsY0FBOEIsRUFDOUIsbUJBQXdDLEVBQ2hDLGlCQUFvQyxFQUM1QyxhQUF3QyxFQUV4QyxZQUFxQyxFQUNyQyx3QkFBa0QsRUFDbEQsS0FBd0IsRUFDeEIsaUJBQW9DLEVBQ25DLHNCQUE4QyxFQUMvQyxxQkFBNEMsRUFDcEMsb0JBQTBDLEVBQ3ZDLGFBQW9DO1FBWi9DLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ2hDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDNUMsa0JBQWEsR0FBYixhQUFhLENBQTJCO1FBRXhDLGlCQUFZLEdBQVosWUFBWSxDQUF5QjtRQUNyQyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3hCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDbkMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUMvQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQ3BDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDdkMsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBMUh6RDs7V0FFRztRQUNNLFNBQUksR0FBc0IsTUFBTSxDQUFDO1FBaUIxQzs7V0FFRztRQUNNLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDMUI7Ozs7V0FJRztRQUNNLDBCQUFxQixHQUFHLElBQUksQ0FBQztRQUN0Qzs7V0FFRztRQUNNLHNCQUFpQixHQUFHLElBQUksQ0FBQztRQUNsQzs7V0FFRztRQUNNLGdDQUEyQixHQUFHLEtBQUssQ0FBQztRQUM3Qzs7V0FFRztRQUNNLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQUN6Qzs7V0FFRztRQUNnQixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUUvQyxDQUFDO1FBQ0w7Ozs7Ozs7Ozs7OztXQVlHO1FBQ2dCLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUVyRCxDQUFDO1FBSVcsVUFBSyxHQUFHLHNDQUFzQyxDQUFDO1FBQzlELHFCQUFnQixHQUFHLElBQUksQ0FBQztRQVF4QixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUVuQixtQkFBYyxHQUFtQixFQUFFLENBQUM7UUFFcEMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRW5DLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQVM3QixnQkFBVyxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBSWYsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBRW5DLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBR1osK0JBQTBCLEdBQUcsOEJBQThCLENBQUM7UUFDNUQsZ0NBQTJCLEdBQUcseUJBQXlCLENBQUM7UUFHakUsbUNBQThCLEdBQUcsS0FBSyxDQUFDO1FBQ3ZDLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQWdaL0Isc0JBQWlCLEdBQUcsR0FBRyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzlCLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQztRQXhZQSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDO1FBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsa0NBQWtDLENBQUMsU0FBUyxDQUNqRSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1YsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7YUFDbkM7UUFDSCxDQUFDLENBQ0YsQ0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0I7YUFDdEMsSUFBSSxDQUNILG9CQUFvQixDQUNsQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLE1BQU07WUFDaEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQ3RELENBQ0Y7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN2RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3ZELElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRTtnQkFDN0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDekQseUVBQXlFO2dCQUN6RSxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3JEO1lBQ0QsTUFBTSxZQUFZLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBNEIsQ0FBQztZQUNqRSxJQUFJLFlBQVksRUFBRTtnQkFDaEIsSUFBSSxDQUFDLHNCQUFzQjtvQkFDekIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUMzQjtRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMsOEJBQThCLEdBQUcsS0FBSyxLQUFLLE9BQU8sQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2xELE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3ZDLElBQ0UsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxhQUFhLENBQUM7Z0JBQ3pDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDcEQsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUN4QztnQkFDQSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDM0I7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7WUFDN0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUM7UUFDcEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQztRQUNwRSxJQUFJLENBQUMsa0NBQWtDO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQ0FBa0MsQ0FBQztRQUM1RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztRQUNsRSxJQUFJLENBQUMsMkJBQTJCO1lBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUM7UUFDakQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUM7UUFDaEUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztRQUNwRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO1FBRTlDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FDekIsR0FBRyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQ25FLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbkUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLGFBQWEsQ0FBQztZQUNaLElBQUksQ0FBQyxjQUFjLENBQUMsa0NBQWtDO1lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYztTQUNuQyxDQUFDO2FBQ0MsSUFBSSxDQUNILEdBQUcsQ0FDRCxDQUFDLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxFQUd4QixFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxPQUFRLENBQUMsQ0FDcEQsQ0FDRjthQUNBLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRTtZQUMxQyxNQUFNLFFBQVEsR0FDWCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQW1CO2dCQUNuQyxpQkFBaUI7Z0JBQ2pCLElBQUksQ0FBQyxLQUFLLENBQ1AsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFtQjtvQkFDakMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUM5RCxDQUFDO1lBQ0osSUFDRSxRQUFRO2dCQUNSLFFBQVEsR0FBRyxDQUFDO2dCQUNaLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBNkIsQ0FBQSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFDbkU7Z0JBQ0EsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QjtpQkFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQzNELElBQUksU0FBUyxFQUFFO2dCQUNiLEtBQUssSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQzFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN0RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsOEJBQThCLENBQUMsU0FBUyxDQUNsRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBSSxDQUFDLDZCQUE2QixHQUFHLFFBQVEsQ0FBQztZQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FDRixDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLCtCQUErQixDQUFDLFNBQVMsQ0FDbkUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxRQUFRLENBQUM7WUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDbkIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDL0I7UUFDRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTtZQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztTQUNuRTtRQUNELElBQUksT0FBTyxDQUFDLDJCQUEyQixFQUFFO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCO2dCQUM1QyxJQUFJLENBQUMsMkJBQTJCLENBQUM7U0FDcEM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTtZQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztTQUNqRTtRQUNELElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtZQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUU7WUFDakMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUMvQztRQUNELElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtZQUN4QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQzNDO1lBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNyQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQ3ZELEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUM5QixDQUFDO2FBQ0g7U0FDRjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDL0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxpQ0FBMEMsQ0FBQztRQUMvQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0NBQWtDO2FBQ3RELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNiLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxpQ0FBaUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksaUNBQWlDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxnQkFBZ0I7b0JBQ25CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FDL0MscURBQXFELENBQ3RELENBQUM7YUFDTDtZQUNELE9BQU87U0FDUjtRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDOUIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO1FBQ3hELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtRQUN2RCxNQUFNLDBCQUEwQixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPO1FBQ25FLElBQ0UsQ0FBQyxDQUFDLElBQUksSUFBSSwwQkFBMEIsQ0FBQztZQUNyQyxDQUFDLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQzFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDWjtZQUNBLE9BQU87U0FDUjtRQUNELElBQUksMEJBQTBCLEVBQUU7WUFDOUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztTQUNYO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM1QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQy9DLDhEQUE4RCxDQUMvRCxDQUFDO1lBQ0YsT0FBTztTQUNSO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztTQUN6QjtRQUNELElBQUk7WUFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVE7Z0JBQ2xDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQztvQkFDaEMsR0FBRyxJQUFJLENBQUMsT0FBUTtvQkFDaEIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsV0FBVyxFQUFFLFdBQVc7aUJBQ3pCLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUM3QixJQUFJLEVBQ0osV0FBVyxFQUNYLElBQUksQ0FBQyxjQUFjLEVBQ25CLElBQUksQ0FBQyxlQUFlLEVBQ3BCLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxFQUN0QixTQUFTLEVBQ1QsTUFBTSxDQUNQLENBQUMsQ0FBQztZQUNQLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2FBQzlCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2FBQ2pEO1NBQ0Y7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNqQixJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQy9DLHdDQUF3QyxDQUN6QyxDQUFDO2FBQ0g7U0FDRjtnQkFBUztZQUNSLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDOUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDM0I7UUFDRCxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3RCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxxREFBcUQsQ0FBQyxJQUFJLENBQy9ELElBQUksQ0FBQyxhQUFhLENBQ25CLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSx3QkFBd0I7UUFDMUIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQztRQUM1RCxPQUFPLG1CQUFtQixJQUFJLG1CQUFtQixDQUFDLE1BQU07WUFDdEQsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNULENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUTtnQkFDM0IsQ0FBQyxDQUFDLDBEQUEwRDtnQkFDNUQsQ0FBQyxDQUFDLG9EQUFvRCxDQUFDO1NBQzFEO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQXFCO1FBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsRUFBRTtZQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN6RDthQUFNO1lBQ0wsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN2RSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3JEO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUF5QjtRQUMzQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTztZQUNMLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVztTQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVELCtCQUErQjtRQUM3QixPQUFPO1lBQ0wsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQjtZQUM3RCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDakQsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQy9DLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBRUQsMEJBQTBCO1FBQ3hCLE9BQU87WUFDTCwyQkFBMkIsRUFBRSxJQUFJLENBQUMsMkJBQTJCO1lBQzdELGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7U0FDMUMsQ0FBQztJQUNKLENBQUM7SUFFRCwyQkFBMkI7UUFDekIsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYTtZQUMzQixRQUFRLEVBQUUsSUFBSTtZQUNkLGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQjtRQUN2QixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRTtZQUNuQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFhRCxtQkFBbUIsQ0FBQyxZQUE0QjtRQUM5QyxJQUNFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUM5QztZQUNBLElBQUksQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDO1lBQ25DLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUNFLElBQUksQ0FBQyxjQUFjO1lBQ25CLElBQUksQ0FBQyxnQkFBZ0I7WUFDckIsSUFBSSxDQUFDLDhCQUE4QjtZQUNuQyxJQUFJLENBQUMsUUFBUSxFQUNiO1lBQ0EsT0FBTztTQUNSO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFOUQsSUFDRSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQ25CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNO1lBQzNCLENBQUMsV0FBVyxFQUFFLE1BQU07WUFDcEIsQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUNaLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLEVBQ3ZCO1lBQ0EsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN6QzthQUFNO1lBQ0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztnQkFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFO2dCQUN0RCxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNELE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUMvQixpQkFBaUIsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7YUFDMUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFNBQXlCO1FBQ2pELElBQUk7WUFDRixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsNkJBQTZCLEVBQUU7Z0JBQ3BELE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQzFCO1NBQ0Y7Z0JBQVM7WUFDUixJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFEO0lBQ0gsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxLQUFvQjtRQUM1QixJQUNFLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxLQUFLLEtBQUssQ0FBQyxXQUFXO1lBQ3ZDLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxLQUFLLElBQUksQ0FBQyxlQUFlO1lBQ2xELElBQUksQ0FBQyxRQUFRLEVBQ2I7WUFDQSxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUUzQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsY0FBYztZQUNqQixLQUFLLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9ELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7UUFDdEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUMxQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQ2xDLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRU8sWUFBWSxDQUFDLE1BQXdCO1FBQzNDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixvRUFBb0U7WUFDcEUsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2RCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0RDtJQUNILENBQUM7SUFFTyxXQUFXLENBQUMsSUFBVTtRQUM1QixLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFTyxZQUFZO1FBQ2xCLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztTQUM5QjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JFLE9BQU87U0FDUjtRQUVELE1BQU0sZ0JBQWdCLEdBQ3BCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFdBQVc7WUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FDbEQsZ0JBQWdCLENBQ2pCLENBQUM7UUFDSixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQTRCLENBQUM7UUFDdEUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztTQUM5QjthQUFNO1lBQ0wsSUFBSSxDQUFDLGVBQWU7Z0JBQ2xCLFlBQVksQ0FBQyxPQUFPLENBQ2xCLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FDckQsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVELElBQVksZUFBZTtRQUN6QixJQUFJLGVBQWUsR0FBdUIsU0FBUyxDQUFDO1FBQ3BELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0I7aUJBQ3ZDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDYixTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDOUM7UUFFRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRU8sYUFBYSxDQUFDLFFBQWdCO1FBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUM7UUFDNUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDUixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQztJQUM3RCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDL0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztZQUN6QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDNUI7U0FDRjtRQUNELElBQ0UsSUFBSSxDQUFDLGFBQWE7WUFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7Z0JBQ3RELENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUMzRDtZQUNBLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNsQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDNUI7U0FDRjtJQUNILENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FDMUMsSUFBSSxDQUFDLE9BQVEsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUNoQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBUSxDQUFDLE9BQU8sQ0FBQztTQUNyQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7U0FDekI7SUFDSCxDQUFDOztrSEFwdUJVLHFCQUFxQiw2SkFpSXRCLHNCQUFzQjtzR0FqSXJCLHFCQUFxQiwycUJBRnJCLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsd0VBaUZ6RCxXQUFXLHlMQThCZCxpQkFBaUIscUVDNUs5QiwrblRBOFBBOzJGRC9MYSxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0Usc0JBQXNCLGFBR3JCLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUM7OzBCQW1JcEUsTUFBTTsyQkFBQyxzQkFBc0I7OzBCQVE3QixRQUFROzRDQW5JRixtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBSUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsSUFBSTtzQkFBWixLQUFLO2dCQUlHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFJRyxPQUFPO3NCQUFmLEtBQUs7Z0JBSUcsWUFBWTtzQkFBcEIsS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBTUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUlHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFJRywyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBSUcsdUJBQXVCO3NCQUEvQixLQUFLO2dCQUlhLGFBQWE7c0JBQS9CLE1BQU07Z0JBZ0JZLGtCQUFrQjtzQkFBcEMsTUFBTTtnQkFHb0IsZ0JBQWdCO3NCQUExQyxZQUFZO3VCQUFDLFdBQVc7Z0JBR1YsS0FBSztzQkFBbkIsV0FBVztnQkEwQm9CLFNBQVM7c0JBQXhDLFNBQVM7dUJBQUMsV0FBVztnQkFFZCxjQUFjO3NCQURyQixTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgQ29tcG9uZW50UmVmLFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpcnN0LCBtYXAsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnQsXG4gIENoYW5uZWwsXG4gIERyYWZ0TWVzc2FnZVBheWxvYWQsXG4gIERyYWZ0UmVzcG9uc2UsXG4gIFVzZXJSZXNwb25zZSxcbn0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQXR0YWNobWVudFNlcnZpY2UgfSBmcm9tICcuLi9hdHRhY2htZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGV4dGFyZWFJbmplY3Rpb25Ub2tlbiB9IGZyb20gJy4uL2luamVjdGlvbi10b2tlbnMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQcmV2aWV3TGlzdENvbnRleHQsXG4gIEF0dGFjaG1lbnRVcGxvYWQsXG4gIEF1ZGlvUmVjb3JkaW5nLFxuICBDdXN0b21BdHRhY2htZW50VXBsb2FkQ29udGV4dCxcbiAgRW1vamlQaWNrZXJDb250ZXh0LFxuICBNZXNzYWdlVGV4dENvbnRleHQsXG4gIFN0cmVhbU1lc3NhZ2UsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE1lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL21lc3NhZ2UtaW5wdXQtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dGFyZWFEaXJlY3RpdmUgfSBmcm9tICcuL3RleHRhcmVhLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUZXh0YXJlYUludGVyZmFjZSB9IGZyb20gJy4vdGV4dGFyZWEuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVtb2ppSW5wdXRTZXJ2aWNlIH0gZnJvbSAnLi9lbW9qaS1pbnB1dC5zZXJ2aWNlJztcbmltcG9ydCB7IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuLi9jdXN0b20tdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBNZXNzYWdlQWN0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9tZXNzYWdlLWFjdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBWb2ljZVJlY29yZGVyU2VydmljZSB9IGZyb20gJy4vdm9pY2UtcmVjb3JkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBdWRpb1JlY29yZGVyU2VydmljZSB9IGZyb20gJy4uL3ZvaWNlLXJlY29yZGVyL2F1ZGlvLXJlY29yZGVyLnNlcnZpY2UnO1xuXG4vKipcbiAqIFRoZSBgTWVzc2FnZUlucHV0YCBjb21wb25lbnQgZGlzcGxheXMgYW4gaW5wdXQgd2hlcmUgdXNlcnMgY2FuIHR5cGUgdGhlaXIgbWVzc2FnZXMgYW5kIHVwbG9hZCBmaWxlcywgYW5kIHNlbmRzIHRoZSBtZXNzYWdlIHRvIHRoZSBhY3RpdmUgY2hhbm5lbC4gVGhlIGNvbXBvbmVudCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIG5ldyBtZXNzYWdlcyBvciB1cGRhdGUgZXhpc3Rpbmcgb25lcy4gVG8gc2VuZCBtZXNzYWdlcywgdGhlIGNoYXQgdXNlciBuZWVkcyB0byBoYXZlIHRoZSBuZWNlc3NhcnkgW2NoYW5uZWwgY2FwYWJpbGl0eV0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2NoYW5uZWxfY2FwYWJpbGl0aWVzLykuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lc3NhZ2UtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxuICBwcm92aWRlcnM6IFtBdHRhY2htZW50U2VydmljZSwgRW1vamlJbnB1dFNlcnZpY2UsIFZvaWNlUmVjb3JkZXJTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUlucHV0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdFxue1xuICAvKipcbiAgICogSWYgZmlsZSB1cGxvYWQgaXMgZW5hYmxlZCwgdGhlIHVzZXIgY2FuIG9wZW4gYSBmaWxlIHNlbGVjdG9yIGZyb20gdGhlIGlucHV0LiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB1c2VyIGFsc28gbmVlZHMgdG8gaGF2ZSB0aGUgbmVjZXNzYXJ5IFtjaGFubmVsIGNhcGFiaWxpdHldKC9jaGF0L2RvY3MvamF2YXNjcmlwdC9jaGFubmVsX2NhcGFiaWxpdGllcy8pLiBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgaXQgaXMgc2V0IGZyb20gdGhlIFtgTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZS8pLlxuICAgKi9cbiAgQElucHV0KCkgaXNGaWxlVXBsb2FkRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIElmIHRydWUsIHVzZXJzIGNhbiBtZW50aW9uIG90aGVyIHVzZXJzIGluIG1lc3NhZ2VzLiBZb3UgYWxzbyBbbmVlZCB0byB1c2UgdGhlIGBBdXRvY29tcGxldGVUZXh0YXJlYWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29uY2VwdHMvb3B0LWluLWFyY2hpdGVjdHVyZS8pIGZvciB0aGlzIGZlYXR1cmUgdG8gd29yay4gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIGl0IGlzIHNldCBmcm9tIHRoZSBbYE1lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2VgXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL01lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2UvKS5cbiAgICovXG4gIEBJbnB1dCgpIGFyZU1lbnRpb25zRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBzY29wZSBmb3IgdXNlciBtZW50aW9ucywgZWl0aGVyIG1lbWJlcnMgb2YgdGhlIGN1cnJlbnQgY2hhbm5lbCBvZiBtZW1iZXJzIG9mIHRoZSBhcHBsaWNhdGlvbi4gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIGl0IGlzIHNldCBmcm9tIHRoZSBbYE1lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2VgXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL01lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2UvKS5cbiAgICovXG4gIEBJbnB1dCgpIG1lbnRpb25TY29wZTogJ2NoYW5uZWwnIHwgJ2FwcGxpY2F0aW9uJyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIG1lc3NhZ2UgaXMgYmVpbmcgZGlzcGFseWVkIGluIGEgY2hhbm5lbCBvciBpbiBhIFt0aHJlYWRdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC90aHJlYWRzLykuXG4gICAqL1xuICBASW5wdXQoKSBtb2RlOiAndGhyZWFkJyB8ICdtYWluJyA9ICdtYWluJztcbiAgLyoqXG4gICAqIElmIHRydWUsIHVzZXJzIGNhbiBzZWxlY3QgbXVsdGlwbGUgZmlsZXMgdG8gdXBsb2FkLiBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgaXQgaXMgc2V0IGZyb20gdGhlIFtgTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZS8pLlxuICAgKi9cbiAgQElucHV0KCkgaXNNdWx0aXBsZUZpbGVVcGxvYWRFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgdG8gZWRpdFxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEFuIG9ic2VydmFibGUgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmlnZ2VyIG1lc3NhZ2Ugc2VuZGluZyBmcm9tIHRoZSBvdXRzaWRlXG4gICAqL1xuICBASW5wdXQoKSBzZW5kTWVzc2FnZSQ6IE9ic2VydmFibGU8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBJbiBgZGVza3RvcGAgbW9kZSB0aGUgYEVudGVyYCBrZXkgd2lsbCB0cmlnZ2VyIG1lc3NhZ2Ugc2VuZGluZywgaW4gYG1vYmlsZWAgbW9kZSB0aGUgYEVudGVyYCBrZXkgd2lsbCBpbnNlcnQgYSBuZXcgbGluZSB0byB0aGUgbWVzc2FnZSBpbnB1dC4gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIGl0IGlzIHNldCBmcm9tIHRoZSBbYE1lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2VgXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL01lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2UvKS5cbiAgICovXG4gIEBJbnB1dCgpIGlucHV0TW9kZTogJ2Rlc2t0b3AnIHwgJ21vYmlsZSc7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGF1dG8gZm9jdXMgb24gdGhlIHRleHRhcmVhIGVsZW1lbnRcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IHRydWU7XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBpbnB1dCB3aWxsIHJlYWN0IHRvIGNoYW5nZXMgaW4gYG1lc3NhZ2VUb0VkaXQkYCBmcm9tIFtgTWVzc2FnZUFjdGlvbnNTZXJ2aWNlYF0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9NZXNzYWdlQWN0aW9uc1NlcnZpY2UvKSBhbmQgZGlzcGxheSB0aGUgbWVzc2FnZSB0byBiZSBlZGl0ZWQgKHRha2luZyBpbnRvIGFjY291bnQgdGhlIGN1cnJlbnQgYG1vZGVgKS5cbiAgICpcbiAgICogSWYgeW91IGRvbid0IG5lZWQgdGhhdCBiZWhhdmlvciwgeW91IGNhbiB0dXJuIHRoaXMgb2Ygd2l0aCB0aGlzIGZsYWcuIEluIHRoYXQgY2FzZSB5b3Ugc2hvdWxkIGNyZWF0ZSB5b3VyIG93biBlZGl0IG1lc3NhZ2UgVUkuXG4gICAqL1xuICBASW5wdXQoKSB3YXRjaEZvck1lc3NhZ2VUb0VkaXQgPSB0cnVlO1xuICAvKipcbiAgICogVXNlIHRoaXMgaW5wdXQgdG8gY29udHJvbCB3ZXRoZXIgYSBzZW5kIGJ1dHRvbiBpcyByZW5kZXJlZCBvciBub3QuIElmIHlvdSBkb24ndCByZW5kZXIgYSBzZW5kIGJ1dHRvbiwgeW91IGNhbiBzdGlsbCB0cmlnZ2VyIG1lc3NhZ2Ugc2VuZCB1c2luZyB0aGUgYHNlbmRNZXNzYWdlJGAgaW5wdXQuXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5U2VuZEJ1dHRvbiA9IHRydWU7XG4gIC8qKlxuICAgKiBZb3UgY2FuIGVuYWJsZS9kaXNhYmxlIHZvaWNlIHJlY29yZGluZ3Mgd2l0aCB0aGlzIGlucHV0XG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5Vm9pY2VSZWNvcmRpbmdCdXR0b24gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFlvdSBjYW4gZW5hYmxlL2Rpc2FibGUgcG9sbHMgd2l0aCB0aGlzIGlucHV0XG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5UG9sbENyZWF0ZUJ1dHRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogRW1pdHMgd2hlbiBhIG1lc3NhZ2Ugd2FzIHN1Y2Nlc3NmdWx5IHNlbnQgb3IgdXBkYXRlZFxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG1lc3NhZ2VVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlO1xuICB9PigpO1xuICAvKipcbiAgICogRW1pdHMgdGhlIG1lc3NzYWdlIGRyYWZ0IHdoZW5ldmVyIHRoZSBjb21wb3NlZCBtZXNzYWdlIGNoYW5nZXMuXG4gICAqICAgLSBJZiB0aGUgdXNlciBjbGVhcnMgdGhlIG1lc3NhZ2UgaW5wdXQsIG9yIHNlbmRzIHRoZSBtZXNzYWdlLCB1bmRlZmluZWQgaXMgZW1pdHRlZC5cbiAgICogICAtIElmIGFjdGl2ZSBjaGFubmVsIGNoYW5nZXMsIG5vdGhpbmcgaXMgZW1pdHRlZC5cbiAgICpcbiAgICogVG8gc2F2ZSBhbmQgZmV0Y2ggbWVzc2FnZSBkcmFmdHMsIHlvdSBjYW4gdXNlIHRoZSBbU3RyZWFtIG1lc3NhZ2UgZHJhZnRzIEFQSV0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvZHJhZnRzLykuXG4gICAqXG4gICAqIE1lc3NhZ2UgZHJhZnQgb25seSB3b3JrcyBmb3IgbmV3IG1lc3NhZ2VzLCBub3RoaW5nIGlzIGVtaXR0ZWQgd2hlbiBpbnB1dCBpcyBpbiBlZGl0IG1vZGUgKGlmIGBtZXNzYWdlYCBpbnB1dCBpcyBzZXQpLlxuICAgKlxuICAgKiBUbyBsb2FkIGEgbWVzc2FnZSBkcmFmdCBpbnRvIHRoZSBpbnB1dCwgdXNlIHRoZSBgbG9hZERyYWZ0YCBtZXRob2QuXG4gICAqICAgLSBJZiBjaGFubmVsIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIGFjdGl2ZSBjaGFubmVsIGlkLCB0aGUgZHJhZnQgaXMgaWdub3JlZC5cbiAgICogICAtIElmIGEgdGhyZWFkIG1lc3NhZ2UgaXMgbG9hZGVkLCBhbmQgdGhlIGlucHV0IGlzbid0IGluIHRocmVhZCBtb2RlIG9yIHBhcmVudCBpZHMgZG9uJ3QgbWF0Y2gsIHRoZSBkcmFmdCBpcyBpZ25vcmVkLlxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG1lc3NhZ2VEcmFmdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgRHJhZnRNZXNzYWdlUGF5bG9hZCB8IHVuZGVmaW5lZFxuICA+KCk7XG4gIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpIHZvaWNlUmVjb3JkZXJSZWY6XG4gICAgfCBUZW1wbGF0ZVJlZjx7IHNlcnZpY2U6IFZvaWNlUmVjb3JkZXJTZXJ2aWNlIH0+XG4gICAgfCB1bmRlZmluZWQ7XG4gIEBIb3N0QmluZGluZygpIGNsYXNzID0gJ3N0ci1jaGF0X19tZXNzYWdlLWlucHV0LWFuZ3VsYXItaG9zdCc7XG4gIGlzVm9pY2VSZWNvcmRpbmcgPSB0cnVlO1xuICBpc0ZpbGVVcGxvYWRBdXRob3JpemVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBjYW5TZW5kTGlua3M6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIGNhblNlbmRNZXNzYWdlczogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgY2FuU2VuZFBvbGxzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBhdHRhY2htZW50VXBsb2FkcyQ6IE9ic2VydmFibGU8QXR0YWNobWVudFVwbG9hZFtdPjtcbiAgY3VzdG9tQXR0YWNobWVudHMkOiBPYnNlcnZhYmxlPEF0dGFjaG1lbnRbXT47XG4gIGF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlciQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgdGV4dGFyZWFWYWx1ZSA9ICcnO1xuICB0ZXh0YXJlYVJlZjogQ29tcG9uZW50UmVmPFRleHRhcmVhSW50ZXJmYWNlICYgUGFydGlhbDxPbkNoYW5nZXM+PiB8IHVuZGVmaW5lZDtcbiAgbWVudGlvbmVkVXNlcnM6IFVzZXJSZXNwb25zZVtdID0gW107XG4gIHF1b3RlZE1lc3NhZ2U6IHVuZGVmaW5lZCB8IFN0cmVhbU1lc3NhZ2U7XG4gIHR5cGluZ1N0YXJ0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIGNvb2xkb3duJDogT2JzZXJ2YWJsZTxudW1iZXI+IHwgdW5kZWZpbmVkO1xuICBpc0Nvb2xkb3duSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICBlbW9qaVBpY2tlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxFbW9qaVBpY2tlckNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21BdHRhY2htZW50VXBsb2FkVGVtcGxhdGU6XG4gICAgfCBUZW1wbGF0ZVJlZjxDdXN0b21BdHRhY2htZW50VXBsb2FkQ29udGV4dD5cbiAgICB8IHVuZGVmaW5lZDtcbiAgYXR0YWNobWVudFByZXZpZXdMaXN0VGVtcGxhdGU6XG4gICAgfCBUZW1wbGF0ZVJlZjxBdHRhY2htZW50UHJldmlld0xpc3RDb250ZXh0PlxuICAgIHwgdW5kZWZpbmVkO1xuICB0ZXh0YXJlYVBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIGZpbGVJbnB1dElkID0gdXVpZHY0KCk7XG4gIGlzQ29tcG9zZXJPcGVuID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIHByaXZhdGUgZmlsZUlucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChUZXh0YXJlYURpcmVjdGl2ZSwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHByaXZhdGUgdGV4dGFyZWFBbmNob3IhOiBUZXh0YXJlYURpcmVjdGl2ZTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGhpZGVOb3RpZmljYXRpb246ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpc1ZpZXdJbml0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjaGFubmVsOiBDaGFubmVsIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNlbmRNZXNzYWdlU3ViY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0VGV4dGFyZWFQbGFjZWhvbGRlciA9ICdzdHJlYW1DaGF0LlR5cGUgeW91ciBtZXNzYWdlJztcbiAgcHJpdmF0ZSByZWFkb25seSBzbG93TW9kZVRleHRhcmVhUGxhY2Vob2xkZXIgPSAnc3RyZWFtQ2hhdC5TbG93IE1vZGUgT04nO1xuICBwcml2YXRlIG1lc3NhZ2VUb0VkaXQ/OiBTdHJlYW1NZXNzYWdlO1xuICBwcml2YXRlIHBvbGxJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlzQ2hhbm5lbENoYW5nZVJlc2V0SW5Qcm9ncmVzcyA9IGZhbHNlO1xuICBwcml2YXRlIGlzU2VuZGluZ01lc3NhZ2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0xvYWRpbmdEcmFmdCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXR0YWNobWVudFNlcnZpY2U6IEF0dGFjaG1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZSxcbiAgICBASW5qZWN0KHRleHRhcmVhSW5qZWN0aW9uVG9rZW4pXG4gICAgcHJpdmF0ZSB0ZXh0YXJlYVR5cGU6IFR5cGU8VGV4dGFyZWFJbnRlcmZhY2U+LFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBlbW9qaUlucHV0U2VydmljZTogRW1vamlJbnB1dFNlcnZpY2UsXG4gICAgcmVhZG9ubHkgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VBY3Rpb25zU2VydmljZTogTWVzc2FnZUFjdGlvbnNTZXJ2aWNlLFxuICAgIHB1YmxpYyByZWFkb25seSB2b2ljZVJlY29yZGVyU2VydmljZTogVm9pY2VSZWNvcmRlclNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIGF1ZGlvUmVjb3JkZXI/OiBBdWRpb1JlY29yZGVyU2VydmljZVxuICApIHtcbiAgICB0aGlzLnRleHRhcmVhUGxhY2Vob2xkZXIgPSB0aGlzLmRlZmF1bHRUZXh0YXJlYVBsYWNlaG9sZGVyO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5hdHRhY2htZW50U2VydmljZS5hdHRhY2htZW50VXBsb2FkSW5Qcm9ncmVzc0NvdW50ZXIkLnN1YnNjcmliZShcbiAgICAgICAgKGNvdW50ZXIpID0+IHtcbiAgICAgICAgICBpZiAoY291bnRlciA9PT0gMCAmJiB0aGlzLmhpZGVOb3RpZmljYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZU5vdGlmaWNhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5oaWRlTm90aWZpY2F0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmF0dGFjaG1lbnRVcGxvYWRzJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChcbiAgICAgICAgICAgIChwcmV2LCBjdXJyZW50KSA9PlxuICAgICAgICAgICAgICBwcmV2LmZpbHRlcigodikgPT4gdi5zdGF0ZSA9PT0gJ3N1Y2Nlc3MnKS5sZW5ndGggPT09XG4gICAgICAgICAgICAgIGN1cnJlbnQuZmlsdGVyKCh2KSA9PiB2LnN0YXRlID09PSAnc3VjY2VzcycpLmxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU1lc3NhZ2VEcmFmdCgpO1xuICAgICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmN1c3RvbUF0dGFjaG1lbnRzJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZU1lc3NhZ2VEcmFmdCgpO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsJC5zdWJzY3JpYmUoKGNoYW5uZWwpID0+IHtcbiAgICAgICAgaWYgKGNoYW5uZWwgJiYgdGhpcy5jaGFubmVsICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuY2hhbm5lbC5pZCkge1xuICAgICAgICAgIHRoaXMudGV4dGFyZWFWYWx1ZSA9ICcnO1xuICAgICAgICAgIHRoaXMuYXR0YWNobWVudFNlcnZpY2UucmVzZXRBdHRhY2htZW50VXBsb2FkcygpO1xuICAgICAgICAgIHRoaXMucG9sbElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMudm9pY2VSZWNvcmRlclNlcnZpY2UuaXNSZWNvcmRlclZpc2libGUkLm5leHQoZmFsc2UpO1xuICAgICAgICAgIC8vIFByZWVtcHRpdmVseSBkZXNlbGVjdCBxdW90ZWQgbWVzc2FnZSwgdG8gYXZvaWQgdW53YW50ZWQgZHJhZnQgZW1pc3Npb25cbiAgICAgICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLnNlbGVjdE1lc3NhZ2VUb1F1b3RlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gY2hhbm5lbD8uZGF0YT8ub3duX2NhcGFiaWxpdGllcyBhcyBzdHJpbmdbXTtcbiAgICAgICAgaWYgKGNhcGFiaWxpdGllcykge1xuICAgICAgICAgIHRoaXMuaXNGaWxlVXBsb2FkQXV0aG9yaXplZCA9XG4gICAgICAgICAgICBjYXBhYmlsaXRpZXMuaW5kZXhPZigndXBsb2FkLWZpbGUnKSAhPT0gLTE7XG4gICAgICAgICAgdGhpcy5jYW5TZW5kTGlua3MgPSBjYXBhYmlsaXRpZXMuaW5kZXhPZignc2VuZC1saW5rcycpICE9PSAtMTtcbiAgICAgICAgICB0aGlzLmNhblNlbmRQb2xscyA9IGNhcGFiaWxpdGllcy5pbmRleE9mKCdzZW5kLXBvbGwnKSAhPT0gLTE7XG4gICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcbiAgICAgICAgICB0aGlzLnNldENhblNlbmRNZXNzYWdlcygpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmNoYW5uZWxTd2l0Y2hTdGF0ZSQuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLmlzQ2hhbm5lbENoYW5nZVJlc2V0SW5Qcm9ncmVzcyA9IHN0YXRlID09PSAnc3RhcnQnO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5tZXNzYWdlVG9RdW90ZSQuc3Vic2NyaWJlKChtKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzVGhyZWFkUmVwbHkgPSBtICYmIG0ucGFyZW50X2lkO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRoaXMubW9kZSA9PT0gJ3RocmVhZCcgJiYgaXNUaHJlYWRSZXBseSkgfHxcbiAgICAgICAgICAodGhpcy5tb2RlID09PSAndGhyZWFkJyAmJiB0aGlzLnF1b3RlZE1lc3NhZ2UgJiYgIW0pIHx8XG4gICAgICAgICAgKHRoaXMubW9kZSA9PT0gJ21haW4nICYmICFpc1RocmVhZFJlcGx5KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnF1b3RlZE1lc3NhZ2UgPSBtO1xuICAgICAgICAgIHRoaXMudXBkYXRlTWVzc2FnZURyYWZ0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLm1lc3NhZ2VUb0VkaXQkLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2VUb0VkaXQgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLmNoZWNrSWZJbkVkaXRNb2RlKCk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5hdHRhY2htZW50VXBsb2FkcyQgPSB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmF0dGFjaG1lbnRVcGxvYWRzJDtcbiAgICB0aGlzLmN1c3RvbUF0dGFjaG1lbnRzJCA9IHRoaXMuYXR0YWNobWVudFNlcnZpY2UuY3VzdG9tQXR0YWNobWVudHMkO1xuICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyJCA9XG4gICAgICB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlciQ7XG4gICAgdGhpcy5pc0ZpbGVVcGxvYWRFbmFibGVkID0gdGhpcy5jb25maWdTZXJ2aWNlLmlzRmlsZVVwbG9hZEVuYWJsZWQ7XG4gICAgdGhpcy5pc011bHRpcGxlRmlsZVVwbG9hZEVuYWJsZWQgPVxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmlzTXVsdGlwbGVGaWxlVXBsb2FkRW5hYmxlZDtcbiAgICB0aGlzLmFyZU1lbnRpb25zRW5hYmxlZCA9IHRoaXMuY29uZmlnU2VydmljZS5hcmVNZW50aW9uc0VuYWJsZWQ7XG4gICAgdGhpcy5tZW50aW9uU2NvcGUgPSB0aGlzLmNvbmZpZ1NlcnZpY2UubWVudGlvblNjb3BlO1xuICAgIHRoaXMuaW5wdXRNb2RlID0gdGhpcy5jb25maWdTZXJ2aWNlLmlucHV0TW9kZTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy50eXBpbmdTdGFydCQuc3Vic2NyaWJlKFxuICAgICAgICAoKSA9PiB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UudHlwaW5nU3RhcnRlZCh0aGlzLnBhcmVudE1lc3NhZ2VJZClcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy52b2ljZVJlY29yZGVyU2VydmljZS5pc1JlY29yZGVyVmlzaWJsZSQuc3Vic2NyaWJlKChpc1Zpc2libGUpID0+IHtcbiAgICAgICAgdGhpcy5pc1ZvaWNlUmVjb3JkaW5nID0gaXNWaXNpYmxlO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHMkLFxuICAgICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmFjdGl2ZUNoYW5uZWwkLFxuICAgICAgXSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKFxuICAgICAgICAgICAgKFtsYXRlc3RNZXNzYWdlcywgY2hhbm5lbF0pOiBbXG4gICAgICAgICAgICAgIERhdGUgfCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIENoYW5uZWwgfCB1bmRlZmluZWRcbiAgICAgICAgICAgIF0gPT4gW2xhdGVzdE1lc3NhZ2VzW2NoYW5uZWw/LmNpZCB8fCAnJ10sIGNoYW5uZWwhXVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChbbGF0ZXN0TWVzc2FnZURhdGUsIGNoYW5uZWxdKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29vbGRvd24gPVxuICAgICAgICAgICAgKGNoYW5uZWw/LmRhdGE/LmNvb2xkb3duIGFzIG51bWJlcikgJiZcbiAgICAgICAgICAgIGxhdGVzdE1lc3NhZ2VEYXRlICYmXG4gICAgICAgICAgICBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAoY2hhbm5lbD8uZGF0YT8uY29vbGRvd24gYXMgbnVtYmVyKSAtXG4gICAgICAgICAgICAgICAgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbGF0ZXN0TWVzc2FnZURhdGUuZ2V0VGltZSgpKSAvIDEwMDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29vbGRvd24gJiZcbiAgICAgICAgICAgIGNvb2xkb3duID4gMCAmJlxuICAgICAgICAgICAgKGNoYW5uZWw/LmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW10pLmluY2x1ZGVzKCdzbG93LW1vZGUnKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zdGFydENvb2xkb3duKGNvb2xkb3duKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb29sZG93bkluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcENvb2xkb3duKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlUmVjb3JkZXJTZXJ2aWNlLnJlY29yZGluZyQuc3Vic2NyaWJlKChyZWNvcmRpbmcpID0+IHtcbiAgICAgICAgaWYgKHJlY29yZGluZykge1xuICAgICAgICAgIHZvaWQgdGhpcy52b2ljZVJlY29yZGluZ1JlYWR5KHJlY29yZGluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmVtb2ppUGlja2VyVGVtcGxhdGUkLnN1YnNjcmliZSgodGVtcGxhdGUpID0+IHtcbiAgICAgICAgdGhpcy5lbW9qaVBpY2tlclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmF0dGFjaG1lbnRQcmV2aWV3TGlzdFRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuYXR0YWNobWVudFByZXZpZXdMaXN0VGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuY3VzdG9tQXR0YWNobWVudFVwbG9hZFRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuY3VzdG9tQXR0YWNobWVudFVwbG9hZFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3SW5pdGVkID0gdHJ1ZTtcbiAgICB0aGlzLmluaXRUZXh0YXJlYSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMubWVzc2FnZVRvVXBkYXRlQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5pc0ZpbGVVcGxvYWRFbmFibGVkKSB7XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuaXNGaWxlVXBsb2FkRW5hYmxlZCA9IHRoaXMuaXNGaWxlVXBsb2FkRW5hYmxlZDtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuaXNNdWx0aXBsZUZpbGVVcGxvYWRFbmFibGVkKSB7XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuaXNNdWx0aXBsZUZpbGVVcGxvYWRFbmFibGVkID1cbiAgICAgICAgdGhpcy5pc011bHRpcGxlRmlsZVVwbG9hZEVuYWJsZWQ7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmFyZU1lbnRpb25zRW5hYmxlZCkge1xuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmFyZU1lbnRpb25zRW5hYmxlZCA9IHRoaXMuYXJlTWVudGlvbnNFbmFibGVkO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5tZW50aW9uU2NvcGUpIHtcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5tZW50aW9uU2NvcGUgPSB0aGlzLm1lbnRpb25TY29wZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubW9kZSkge1xuICAgICAgdGhpcy5zZXRDYW5TZW5kTWVzc2FnZXMoKTtcbiAgICAgIHRoaXMuY2hlY2tJZkluRWRpdE1vZGUoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMud2F0Y2hGb3JNZXNzYWdlVG9FZGl0KSB7XG4gICAgICB0aGlzLmNoZWNrSWZJbkVkaXRNb2RlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmlucHV0TW9kZSkge1xuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmlucHV0TW9kZSA9IHRoaXMuaW5wdXRNb2RlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5zZW5kTWVzc2FnZSQpIHtcbiAgICAgIGlmICh0aGlzLnNlbmRNZXNzYWdlU3ViY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZVN1YmNyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZW5kTWVzc2FnZSQpIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZVN1YmNyaXB0aW9uID0gdGhpcy5zZW5kTWVzc2FnZSQuc3Vic2NyaWJlKFxuICAgICAgICAgICgpID0+IHZvaWQgdGhpcy5tZXNzYWdlU2VudCgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VuZE1lc3NhZ2VTdWJjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZW5kTWVzc2FnZVN1YmNyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgYXN5bmMgbWVzc2FnZVNlbnQoKSB7XG4gICAgaWYgKHRoaXMuaXNDb29sZG93bkluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc1NlbmRpbmdNZXNzYWdlID0gdHJ1ZTtcbiAgICBsZXQgYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyITogbnVtYmVyO1xuICAgIHRoaXMuYXR0YWNobWVudFNlcnZpY2UuYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyJFxuICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNvdW50ZXIpID0+IChhdHRhY2htZW50VXBsb2FkSW5Qcm9ncmVzc0NvdW50ZXIgPSBjb3VudGVyKSk7XG4gICAgaWYgKGF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlciA+IDApIHtcbiAgICAgIGlmICghdGhpcy5oaWRlTm90aWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuaGlkZU5vdGlmaWNhdGlvbiA9XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFBlcm1hbmVudE5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdzdHJlYW1DaGF0LldhaXQgdW50aWwgYWxsIGF0dGFjaG1lbnRzIGhhdmUgdXBsb2FkZWQnXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXR0YWNobWVudHMgPSB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLm1hcFRvQXR0YWNobWVudHMoKTtcbiAgICBsZXQgdGV4dCA9IHRoaXMudGV4dGFyZWFWYWx1ZTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eXFxuKy9nLCAnJyk7IC8vIGxlYWRpbmcgZW1wdHkgbGluZXNcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXG4rJC9nLCAnJyk7IC8vIGVuZGluZyBlbXB0eSBsaW5lc1xuICAgIGNvbnN0IHRleHRDb250YWluc09ubHlTcGFjZUNoYXJzID0gIXRleHQucmVwbGFjZSgvIC9nLCAnJyk7IC8vc3BjYWVcbiAgICBpZiAoXG4gICAgICAoIXRleHQgfHwgdGV4dENvbnRhaW5zT25seVNwYWNlQ2hhcnMpICYmXG4gICAgICAoIWF0dGFjaG1lbnRzIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgICF0aGlzLnBvbGxJZFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGV4dENvbnRhaW5zT25seVNwYWNlQ2hhcnMpIHtcbiAgICAgIHRleHQgPSAnJztcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGFpbnNMaW5rcyAmJiAhdGhpcy5jYW5TZW5kTGlua3MpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oXG4gICAgICAgICdzdHJlYW1DaGF0LlNlbmRpbmcgbGlua3MgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb252ZXJzYXRpb24nXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwb2xsSWQgPSB0aGlzLnBvbGxJZDtcbiAgICBpZiAoIXRoaXMuaXNVcGRhdGUpIHtcbiAgICAgIHRoaXMudGV4dGFyZWFWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy5wb2xsSWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgKHRoaXMuaXNVcGRhdGVcbiAgICAgICAgPyB0aGlzLmNoYW5uZWxTZXJ2aWNlLnVwZGF0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4udGhpcy5tZXNzYWdlISxcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgICBhdHRhY2htZW50czogYXR0YWNobWVudHMsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiB0aGlzLmNoYW5uZWxTZXJ2aWNlLnNlbmRNZXNzYWdlKFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgICAgICAgdGhpcy5tZW50aW9uZWRVc2VycyxcbiAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgdGhpcy5xdW90ZWRNZXNzYWdlPy5pZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBvbGxJZFxuICAgICAgICAgICkpO1xuICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlLmVtaXQoeyBtZXNzYWdlIH0pO1xuICAgICAgaWYgKHRoaXMuaXNVcGRhdGUpIHtcbiAgICAgICAgdGhpcy5kZXNlbGVjdE1lc3NhZ2VUb0VkaXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXR0YWNobWVudFNlcnZpY2UucmVzZXRBdHRhY2htZW50VXBsb2FkcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmlzU2VuZGluZ01lc3NhZ2UgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmlzVXBkYXRlKSB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oXG4gICAgICAgICAgJ3N0cmVhbUNoYXQuRWRpdCBtZXNzYWdlIHJlcXVlc3QgZmFpbGVkJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzU2VuZGluZ01lc3NhZ2UgPSBmYWxzZTtcbiAgICAgIHRoaXMudXBkYXRlTWVzc2FnZURyYWZ0KCk7XG4gICAgfVxuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS50eXBpbmdTdG9wcGVkKHRoaXMucGFyZW50TWVzc2FnZUlkKTtcbiAgICBpZiAodGhpcy5xdW90ZWRNZXNzYWdlKSB7XG4gICAgICB0aGlzLmRlc2VsZWN0TWVzc2FnZVRvUXVvdGUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY29udGFpbnNMaW5rcygpIHtcbiAgICByZXR1cm4gLyg/Oig/Omh0dHBzP3xmdHApOlxcL1xcLyk/W1xcdy9cXC0/PSUuXStcXC5bXFx3L1xcLSY/PSUuXSsvLnRlc3QoXG4gICAgICB0aGlzLnRleHRhcmVhVmFsdWVcbiAgICApO1xuICB9XG5cbiAgZ2V0IHF1b3RlZE1lc3NhZ2VBdHRhY2htZW50cygpIHtcbiAgICBjb25zdCBvcmlnaW5hbEF0dGFjaG1lbnRzID0gdGhpcy5xdW90ZWRNZXNzYWdlPy5hdHRhY2htZW50cztcbiAgICByZXR1cm4gb3JpZ2luYWxBdHRhY2htZW50cyAmJiBvcmlnaW5hbEF0dGFjaG1lbnRzLmxlbmd0aFxuICAgICAgPyBbb3JpZ2luYWxBdHRhY2htZW50c1swXV1cbiAgICAgIDogW107XG4gIH1cblxuICBnZXQgZGlzYWJsZWRUZXh0YXJlYVRleHQoKSB7XG4gICAgaWYgKCF0aGlzLmNhblNlbmRNZXNzYWdlcykge1xuICAgICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ3RocmVhZCdcbiAgICAgICAgPyBcInN0cmVhbUNoYXQuWW91IGNhbid0IHNlbmQgdGhyZWFkIHJlcGxpZXMgaW4gdGhpcyBjaGFubmVsXCJcbiAgICAgICAgOiBcInN0cmVhbUNoYXQuWW91IGNhbid0IHNlbmQgbWVzc2FnZXMgaW4gdGhpcyBjaGFubmVsXCI7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGl0ZW1zUGFzdGVkKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuY3VzdG9tUGFzdGVFdmVudEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jdXN0b21QYXN0ZUV2ZW50SGFuZGxlcihldmVudCwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChldmVudC5jbGlwYm9hcmREYXRhPy5maWxlcyAmJiBldmVudC5jbGlwYm9hcmREYXRhPy5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHZvaWQgdGhpcy5maWxlc1NlbGVjdGVkKGV2ZW50LmNsaXBib2FyZERhdGE/LmZpbGVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBmaWxlc1NlbGVjdGVkKGZpbGVMaXN0OiBGaWxlTGlzdCB8IG51bGwpIHtcbiAgICBhd2FpdCB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmZpbGVzU2VsZWN0ZWQoZmlsZUxpc3QpO1xuICAgIHRoaXMuY2xlYXJGaWxlSW5wdXQoKTtcbiAgfVxuXG4gIGRlc2VsZWN0TWVzc2FnZVRvUXVvdGUoKSB7XG4gICAgdGhpcy5jaGFubmVsU2VydmljZS5zZWxlY3RNZXNzYWdlVG9RdW90ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgZGVzZWxlY3RNZXNzYWdlVG9FZGl0KCkge1xuICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLm1lc3NhZ2VUb0VkaXQkLm5leHQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIGdldEVtb2ppUGlja2VyQ29udGV4dCgpOiBFbW9qaVBpY2tlckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBlbW9qaUlucHV0JDogdGhpcy5lbW9qaUlucHV0U2VydmljZS5lbW9qaUlucHV0JCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0QXR0YWNobWVudFByZXZpZXdMaXN0Q29udGV4dCgpOiBBdHRhY2htZW50UHJldmlld0xpc3RDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0YWNobWVudFVwbG9hZHMkOiB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmF0dGFjaG1lbnRVcGxvYWRzJCxcbiAgICAgIGRlbGV0ZVVwbG9hZEhhbmRsZXI6IHRoaXMuZGVsZXRlVXBsb2FkLmJpbmQodGhpcyksXG4gICAgICByZXRyeVVwbG9hZEhhbmRsZXI6IHRoaXMucmV0cnlVcGxvYWQuYmluZCh0aGlzKSxcbiAgICAgIHNlcnZpY2U6IHRoaXMuYXR0YWNobWVudFNlcnZpY2UsXG4gICAgfTtcbiAgfVxuXG4gIGdldEF0dGFjaG1lbnRVcGxvYWRDb250ZXh0KCk6IEN1c3RvbUF0dGFjaG1lbnRVcGxvYWRDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNNdWx0aXBsZUZpbGVVcGxvYWRFbmFibGVkOiB0aGlzLmlzTXVsdGlwbGVGaWxlVXBsb2FkRW5hYmxlZCxcbiAgICAgIGF0dGFjaG1lbnRTZXJ2aWNlOiB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLFxuICAgIH07XG4gIH1cblxuICBnZXRRdW90ZWRNZXNzYWdlVGV4dENvbnRleHQoKTogTWVzc2FnZVRleHRDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5xdW90ZWRNZXNzYWdlLFxuICAgICAgaXNRdW90ZWQ6IHRydWUsXG4gICAgICBzaG91bGRUcmFuc2xhdGU6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0Vm9pY2VSZWNvcmRpbmcoKSB7XG4gICAgYXdhaXQgdGhpcy5hdWRpb1JlY29yZGVyPy5zdGFydCgpO1xuICAgIGlmICh0aGlzLmF1ZGlvUmVjb3JkZXI/LmlzUmVjb3JkaW5nKSB7XG4gICAgICB0aGlzLnZvaWNlUmVjb3JkZXJTZXJ2aWNlLmlzUmVjb3JkZXJWaXNpYmxlJC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5Qb2xsQ29tcG9zZXIoKSB7XG4gICAgdGhpcy5pc0NvbXBvc2VyT3BlbiA9IHRydWU7XG4gIH1cblxuICBjbG9zZVBvbGxDb21wb3NlciA9ICgpID0+IHtcbiAgICB0aGlzLmlzQ29tcG9zZXJPcGVuID0gZmFsc2U7XG4gIH07XG5cbiAgYWRkUG9sbCA9IChwb2xsSWQ6IHN0cmluZykgPT4ge1xuICAgIHRoaXMuaXNDb21wb3Nlck9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnBvbGxJZCA9IHBvbGxJZDtcbiAgICB0aGlzLnVwZGF0ZU1lc3NhZ2VEcmFmdCgpO1xuICAgIHZvaWQgdGhpcy5tZXNzYWdlU2VudCgpO1xuICB9O1xuXG4gIHVzZXJNZW50aW9uc0NoYW5nZWQodXNlck1lbnRpb25zOiBVc2VyUmVzcG9uc2VbXSkge1xuICAgIGlmIChcbiAgICAgIHVzZXJNZW50aW9ucy5tYXAoKHUpID0+IHUuaWQpLmpvaW4oJywnKSAhPT1cbiAgICAgIHRoaXMubWVudGlvbmVkVXNlcnMubWFwKCh1KSA9PiB1LmlkKS5qb2luKCcsJylcbiAgICApIHtcbiAgICAgIHRoaXMubWVudGlvbmVkVXNlcnMgPSB1c2VyTWVudGlvbnM7XG4gICAgICB0aGlzLnVwZGF0ZU1lc3NhZ2VEcmFmdCgpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU1lc3NhZ2VEcmFmdCgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTG9hZGluZ0RyYWZ0IHx8XG4gICAgICB0aGlzLmlzU2VuZGluZ01lc3NhZ2UgfHxcbiAgICAgIHRoaXMuaXNDaGFubmVsQ2hhbmdlUmVzZXRJblByb2dyZXNzIHx8XG4gICAgICB0aGlzLmlzVXBkYXRlXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gdGhpcy5hdHRhY2htZW50U2VydmljZS5tYXBUb0F0dGFjaG1lbnRzKCk7XG5cbiAgICBpZiAoXG4gICAgICAhdGhpcy50ZXh0YXJlYVZhbHVlICYmXG4gICAgICAhdGhpcy5tZW50aW9uZWRVc2Vycy5sZW5ndGggJiZcbiAgICAgICFhdHRhY2htZW50cz8ubGVuZ3RoICYmXG4gICAgICAhdGhpcy5wb2xsSWQgJiZcbiAgICAgICF0aGlzLnF1b3RlZE1lc3NhZ2U/LmlkXG4gICAgKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VEcmFmdENoYW5nZS5lbWl0KHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVzc2FnZURyYWZ0Q2hhbmdlLmVtaXQoe1xuICAgICAgICB0ZXh0OiB0aGlzLnRleHRhcmVhVmFsdWUsXG4gICAgICAgIGF0dGFjaG1lbnRzOiB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLm1hcFRvQXR0YWNobWVudHMoKSxcbiAgICAgICAgbWVudGlvbmVkX3VzZXJzOiB0aGlzLm1lbnRpb25lZFVzZXJzLm1hcCgodXNlcikgPT4gdXNlci5pZCksXG4gICAgICAgIHBvbGxfaWQ6IHRoaXMucG9sbElkLFxuICAgICAgICBwYXJlbnRfaWQ6IHRoaXMucGFyZW50TWVzc2FnZUlkLFxuICAgICAgICBxdW90ZWRfbWVzc2FnZV9pZDogdGhpcy5xdW90ZWRNZXNzYWdlPy5pZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHZvaWNlUmVjb3JkaW5nUmVhZHkocmVjb3JkaW5nOiBBdWRpb1JlY29yZGluZykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLnVwbG9hZFZvaWNlUmVjb3JkaW5nKHJlY29yZGluZyk7XG4gICAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLnNlbmRWb2ljZVJlY29yZGluZ0ltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWVzc2FnZVNlbnQoKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy52b2ljZVJlY29yZGVyU2VydmljZS5pc1JlY29yZGVyVmlzaWJsZSQubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzVXBkYXRlKCkge1xuICAgIHJldHVybiAhIXRoaXMubWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZHJhZnQgRHJhZnRSZXNwb25zZSB0byBsb2FkIGludG8gdGhlIG1lc3NhZ2UgaW5wdXQuXG4gICAqIC0gRHJhZnQgbWVzc2FnZXMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciBuZXcgbWVzc2FnZXMsIGlucHV0IGlzIGlnbm9yZWQgaW4gZWRpdCBtb2RlIChpZiBgbWVzc2FnZWAgaW5wdXQgaXMgc2V0KS5cbiAgICogLSBJZiBjaGFubmVsIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIGFjdGl2ZSBjaGFubmVsIGlkLCB0aGUgZHJhZnQgaXMgaWdub3JlZC5cbiAgICogLSBJZiBhIHRocmVhZCBtZXNzYWdlIGlzIGxvYWRlZCwgYW5kIHRoZSBpbnB1dCBpc24ndCBpbiB0aHJlYWQgbW9kZSBvciBwYXJlbnQgaWRzIGRvbid0IG1hdGNoLCB0aGUgZHJhZnQgaXMgaWdub3JlZC5cbiAgICovXG4gIGxvYWREcmFmdChkcmFmdDogRHJhZnRSZXNwb25zZSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY2hhbm5lbD8uY2lkICE9PSBkcmFmdC5jaGFubmVsX2NpZCB8fFxuICAgICAgZHJhZnQ/Lm1lc3NhZ2U/LnBhcmVudF9pZCAhPT0gdGhpcy5wYXJlbnRNZXNzYWdlSWQgfHxcbiAgICAgIHRoaXMuaXNVcGRhdGVcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0xvYWRpbmdEcmFmdCA9IHRydWU7XG5cbiAgICB0aGlzLnRleHRhcmVhVmFsdWUgPSBkcmFmdC5tZXNzYWdlPy50ZXh0IHx8ICcnO1xuICAgIHRoaXMubWVudGlvbmVkVXNlcnMgPVxuICAgICAgZHJhZnQ/Lm1lc3NhZ2U/Lm1lbnRpb25lZF91c2Vycz8ubWFwKChpZCkgPT4gKHsgaWQgfSkpIHx8IFtdO1xuICAgIHRoaXMucG9sbElkID0gZHJhZnQ/Lm1lc3NhZ2U/LnBvbGxfaWQ7XG4gICAgdGhpcy5hdHRhY2htZW50U2VydmljZS5yZXNldEF0dGFjaG1lbnRVcGxvYWRzKCk7XG4gICAgdGhpcy5hdHRhY2htZW50U2VydmljZS5jcmVhdGVGcm9tQXR0YWNobWVudHMoXG4gICAgICBkcmFmdD8ubWVzc2FnZT8uYXR0YWNobWVudHMgfHwgW11cbiAgICApO1xuICAgIHRoaXMuY2hhbm5lbFNlcnZpY2Uuc2VsZWN0TWVzc2FnZVRvUXVvdGUoZHJhZnQucXVvdGVkX21lc3NhZ2UpO1xuICAgIHRoaXMuaXNMb2FkaW5nRHJhZnQgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlVXBsb2FkKHVwbG9hZDogQXR0YWNobWVudFVwbG9hZCkge1xuICAgIGlmICh0aGlzLmlzVXBkYXRlKSB7XG4gICAgICAvLyBEZWxheSBkZWxldGUgdG8gYXZvaWQgbW9kYWwgZGV0ZWN0aW5nIHRoaXMgY2xpY2sgYXMgb3V0c2lkZSBjbGlja1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHZvaWQgdGhpcy5hdHRhY2htZW50U2VydmljZS5kZWxldGVBdHRhY2htZW50KHVwbG9hZCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm9pZCB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmRlbGV0ZUF0dGFjaG1lbnQodXBsb2FkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJldHJ5VXBsb2FkKGZpbGU6IEZpbGUpIHtcbiAgICB2b2lkIHRoaXMuYXR0YWNobWVudFNlcnZpY2UucmV0cnlBdHRhY2htZW50VXBsb2FkKGZpbGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckZpbGVJbnB1dCgpIHtcbiAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGluaXRUZXh0YXJlYSgpIHtcbiAgICAvLyBjbGVhbnVwIHByZXZpb3VzbHkgYnVpbHQgdGV4dGFyZWFcbiAgICBpZiAoIXRoaXMuY2FuU2VuZE1lc3NhZ2VzKSB7XG4gICAgICB0aGlzLnRleHRhcmVhUmVmID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jYW5TZW5kTWVzc2FnZXMgfHwgdGhpcy50ZXh0YXJlYVJlZiB8fCAhdGhpcy50ZXh0YXJlYUFuY2hvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPVxuICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodGhpcy50ZXh0YXJlYVR5cGUpO1xuICAgIHRoaXMudGV4dGFyZWFSZWYgPVxuICAgICAgdGhpcy50ZXh0YXJlYUFuY2hvci52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudDxUZXh0YXJlYUludGVyZmFjZT4oXG4gICAgICAgIGNvbXBvbmVudEZhY3RvcnlcbiAgICAgICk7XG4gICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHNldENhblNlbmRNZXNzYWdlcygpIHtcbiAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSB0aGlzLmNoYW5uZWw/LmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW107XG4gICAgaWYgKCFjYXBhYmlsaXRpZXMpIHtcbiAgICAgIHRoaXMuY2FuU2VuZE1lc3NhZ2VzID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FuU2VuZE1lc3NhZ2VzID1cbiAgICAgICAgY2FwYWJpbGl0aWVzLmluZGV4T2YoXG4gICAgICAgICAgdGhpcy5tb2RlID09PSAnbWFpbicgPyAnc2VuZC1tZXNzYWdlJyA6ICdzZW5kLXJlcGx5J1xuICAgICAgICApICE9PSAtMSB8fCB0aGlzLmlzVXBkYXRlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5pbml0VGV4dGFyZWEoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBwYXJlbnRNZXNzYWdlSWQoKSB7XG4gICAgbGV0IHBhcmVudE1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICd0aHJlYWQnKSB7XG4gICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZCRcbiAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgLnN1YnNjcmliZSgoaWQpID0+IChwYXJlbnRNZXNzYWdlSWQgPSBpZCkpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnRNZXNzYWdlSWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q29vbGRvd24oY29vbGRvd246IG51bWJlcikge1xuICAgIHRoaXMudGV4dGFyZWFQbGFjZWhvbGRlciA9IHRoaXMuc2xvd01vZGVUZXh0YXJlYVBsYWNlaG9sZGVyO1xuICAgIHRoaXMuaXNDb29sZG93bkluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIHRoaXMuY29vbGRvd24kID0gdGltZXIoMCwgMTAwMCkucGlwZShcbiAgICAgIHRha2UoY29vbGRvd24gKyAxKSxcbiAgICAgIG1hcCgodikgPT4gY29vbGRvd24gLSB2KSxcbiAgICAgIHRhcCgodikgPT4ge1xuICAgICAgICBpZiAodiA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc3RvcENvb2xkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENvb2xkb3duKCkge1xuICAgIHRoaXMuY29vbGRvd24kID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNDb29sZG93bkluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLnRleHRhcmVhUGxhY2Vob2xkZXIgPSB0aGlzLmRlZmF1bHRUZXh0YXJlYVBsYWNlaG9sZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmSW5FZGl0TW9kZSgpIHtcbiAgICBpZiAoIXRoaXMud2F0Y2hGb3JNZXNzYWdlVG9FZGl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5tZXNzYWdlVG9FZGl0ICYmIHRoaXMubWVzc2FnZSkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5tZXNzYWdlVG9VcGRhdGVDaGFuZ2VkKCk7XG4gICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMubWVzc2FnZVRvRWRpdCAmJlxuICAgICAgKCh0aGlzLm1vZGUgPT09ICdtYWluJyAmJiAhdGhpcy5tZXNzYWdlVG9FZGl0LnBhcmVudF9pZCkgfHxcbiAgICAgICAgKHRoaXMubW9kZSA9PT0gJ3RocmVhZCcgJiYgdGhpcy5tZXNzYWdlVG9FZGl0LnBhcmVudF9pZCkpXG4gICAgKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VUb0VkaXQ7XG4gICAgICB0aGlzLm1lc3NhZ2VUb1VwZGF0ZUNoYW5nZWQoKTtcbiAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VUb1VwZGF0ZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5hdHRhY2htZW50U2VydmljZS5yZXNldEF0dGFjaG1lbnRVcGxvYWRzKCk7XG4gICAgdGhpcy5zZXRDYW5TZW5kTWVzc2FnZXMoKTtcbiAgICBpZiAodGhpcy5pc1VwZGF0ZSkge1xuICAgICAgdGhpcy5hdHRhY2htZW50U2VydmljZS5jcmVhdGVGcm9tQXR0YWNobWVudHMoXG4gICAgICAgIHRoaXMubWVzc2FnZSEuYXR0YWNobWVudHMgfHwgW11cbiAgICAgICk7XG4gICAgICB0aGlzLnRleHRhcmVhVmFsdWUgPSB0aGlzLm1lc3NhZ2UhLnRleHQgfHwgJyc7XG4gICAgICB0aGlzLnBvbGxJZCA9IHRoaXMubWVzc2FnZSEucG9sbF9pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXh0YXJlYVZhbHVlID0gJyc7XG4gICAgICB0aGlzLnBvbGxJZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1pbnB1dCBzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWlucHV0XCJcbiAgW3N0eWxlLmRpc3BsYXldPVwiaXNWb2ljZVJlY29yZGluZyA/ICdub25lJyA6ICdmbGV4J1wiXG4+XG4gIDxkaXYgKm5nSWY9XCJxdW90ZWRNZXNzYWdlXCIgY2xhc3M9XCJzdHItY2hhdF9fcXVvdGVkLW1lc3NhZ2UtcHJldmlldy1oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX3F1b3RlZC1tZXNzYWdlLXJlcGx5LXRvLW1lc3NhZ2VcIj5cbiAgICAgIHt7IFwic3RyZWFtQ2hhdC5SZXBseSB0byBNZXNzYWdlXCIgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS1yZW1vdmVcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJyZW1vdmUtcXVvdGVcIlxuICAgICAgKGNsaWNrKT1cImRlc2VsZWN0TWVzc2FnZVRvUXVvdGUoKVwiXG4gICAgICAoa2V5dXAuZW50ZXIpPVwiZGVzZWxlY3RNZXNzYWdlVG9RdW90ZSgpXCJcbiAgICA+XG4gICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cImNsb3NlXCI+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJpc1VwZGF0ZVwiIGNsYXNzPVwic3RyLWNoYXRfX3F1b3RlZC1tZXNzYWdlLXByZXZpZXctaGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS1yZXBseS10by1tZXNzYWdlXCI+XG4gICAgICB7eyBcInN0cmVhbUNoYXQuRWRpdCBNZXNzYWdlXCIgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS1yZW1vdmVcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJyZW1vdmUtcXVvdGVcIlxuICAgICAgKGNsaWNrKT1cImRlc2VsZWN0TWVzc2FnZVRvRWRpdCgpXCJcbiAgICAgIChrZXl1cC5lbnRlcik9XCJkZXNlbGVjdE1lc3NhZ2VUb0VkaXQoKVwiXG4gICAgPlxuICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyIGljb249XCJjbG9zZVwiPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FuU2VuZE1lc3NhZ2VzOyBlbHNlIG5vdEFsbG93ZWRcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWlucHV0LWlubmVyIHN0ci1jaGF0LWFuZ3VsYXJfX21lc3NhZ2UtaW5wdXQtaW5uZXJcIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttZXNzYWdlLWlucHV0LXN0YXJ0XVwiPjwvbmctY29udGVudD5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJpc0ZpbGVVcGxvYWRFbmFibGVkICYmIGlzRmlsZVVwbG9hZEF1dGhvcml6ZWQgJiYgY2FuU2VuZE1lc3NhZ2VzXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBjdXN0b21BdHRhY2htZW50VXBsb2FkVGVtcGxhdGUgfHwgZGVmYXVsdEF0dGFjaG1lbnRVcGxvYWQ7XG4gICAgICAgICAgICBjb250ZXh0OiBnZXRBdHRhY2htZW50VXBsb2FkQ29udGV4dCgpXG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRBdHRhY2htZW50VXBsb2FkPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2ZpbGUtaW5wdXQtY29udGFpbmVyXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZmlsZS11cGxvYWQtYnV0dG9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgI2ZpbGVJbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2ZpbGUtaW5wdXRcIlxuICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZpbGUtaW5wdXRcIlxuICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiaXNNdWx0aXBsZUZpbGVVcGxvYWRFbmFibGVkXCJcbiAgICAgICAgICAgICAgaWQ9XCJ7eyBmaWxlSW5wdXRJZCB9fVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAoYXR0YWNobWVudFNlcnZpY2UuYXR0YWNobWVudHNDb3VudGVyJCB8IGFzeW5jKSEgPj1cbiAgICAgICAgICAgICAgICBhdHRhY2htZW50U2VydmljZS5tYXhOdW1iZXJPZkF0dGFjaG1lbnRzXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiZmlsZXNTZWxlY3RlZChmaWxlSW5wdXQuZmlsZXMpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzdHItY2hhdF9fZmlsZS1pbnB1dC1sYWJlbFwiIGZvcj1cInt7IGZpbGVJbnB1dElkIH19XCI+XG4gICAgICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlciBpY29uPVwiYXR0YWNoXCI+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjYW5TZW5kUG9sbHMgJiYgZGlzcGxheVBvbGxDcmVhdGVCdXR0b24gJiYgbW9kZSAhPT0gJ3RocmVhZCdcIlxuICAgICAgPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdC1hbmd1bGFyX19jcmVhdGUtcG9sbFwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5Qb2xsQ29tcG9zZXIoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cInBvbGxcIj48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXRleHRhcmVhLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJxdW90ZWRNZXNzYWdlXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cInF1b3RlZC1tZXNzYWdlLWNvbnRhaW5lclwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fcXVvdGVkLW1lc3NhZ2UtcHJldmlld1wiXG4gICAgICAgID5cbiAgICAgICAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJxb3V0ZWQtbWVzc2FnZS1hdmF0YXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdC1hbmd1bGFyX19hdmF0YXItaG9zdCBzdHItY2hhdF9fbWVzc2FnZS1zZW5kZXItYXZhdGFyXCJcbiAgICAgICAgICAgIHR5cGU9XCJ1c2VyXCJcbiAgICAgICAgICAgIGxvY2F0aW9uPVwicXVvdGVkLW1lc3NhZ2Utc2VuZGVyXCJcbiAgICAgICAgICAgIFtpbWFnZVVybF09XCJxdW90ZWRNZXNzYWdlLnVzZXI/LmltYWdlXCJcbiAgICAgICAgICAgIFtuYW1lXT1cInF1b3RlZE1lc3NhZ2UudXNlcj8ubmFtZSB8fCBxdW90ZWRNZXNzYWdlLnVzZXI/LmlkXCJcbiAgICAgICAgICAgIFt1c2VyXT1cInF1b3RlZE1lc3NhZ2UudXNlciB8fCB1bmRlZmluZWRcIlxuICAgICAgICAgID48L3N0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJxdW90ZWQtbWVzc2FnZS1wcmV2aWV3LWNvbnRlbnQtaW5uZXIgc3RyLWNoYXRfX3F1b3RlZC1tZXNzYWdlLWJ1YmJsZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHN0cmVhbS1hdHRhY2htZW50LWxpc3RcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBxdW90ZWRNZXNzYWdlPy5hdHRhY2htZW50cyAmJiBxdW90ZWRNZXNzYWdlPy5hdHRhY2htZW50cz8ubGVuZ3RoXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFthdHRhY2htZW50c109XCJxdW90ZWRNZXNzYWdlQXR0YWNobWVudHNcIlxuICAgICAgICAgICAgICBbbWVzc2FnZUlkXT1cInF1b3RlZE1lc3NhZ2UuaWRcIlxuICAgICAgICAgICAgPjwvc3RyZWFtLWF0dGFjaG1lbnQtbGlzdD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBxdW90ZWRNZXNzYWdlPy5wb2xsX2lkICYmXG4gICAgICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UucG9sbFRlbXBsYXRlJCB8IGFzeW5jKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnBvbGxUZW1wbGF0ZSQgfCBhc3luYykhO1xuICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICBwb2xsSWQ6IHF1b3RlZE1lc3NhZ2U/LnBvbGxfaWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogcXVvdGVkTWVzc2FnZT8uaWQsXG4gICAgICAgICAgICAgICAgICAgIGlzUXVvdGU6IHRydWVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fcXVvdGVkLW1lc3NhZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VUZXh0VGVtcGxhdGUkIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUZXh0O1xuICAgICAgICAgICAgICAgICAgY29udGV4dDogZ2V0UXVvdGVkTWVzc2FnZVRleHRDb250ZXh0KClcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICNkZWZhdWx0VGV4dFxuICAgICAgICAgICAgICAgIGxldC1tZXNzYWdlPVwibWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgbGV0LWlzUXVvdGVkPVwiaXNRdW90ZWRcIlxuICAgICAgICAgICAgICAgIGxldC1zaG91bGRUcmFuc2xhdGU9XCJzaG91bGRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHN0cmVhbS1tZXNzYWdlLXRleHRcbiAgICAgICAgICAgICAgICAgIFttZXNzYWdlXT1cIm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgW2lzUXVvdGVkXT1cImlzUXVvdGVkXCJcbiAgICAgICAgICAgICAgICAgIFtzaG91bGRUcmFuc2xhdGVdPVwic2hvdWxkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwicXVvdGVkLW1lc3NhZ2UtdGV4dFwiXG4gICAgICAgICAgICAgICAgPjwvc3RyZWFtLW1lc3NhZ2UtdGV4dD5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgI2RlZmF1bHRBdHRhY2htZW50c1ByZXZpZXdcbiAgICAgICAgICBsZXQtYXR0YWNobWVudFVwbG9hZHMkPVwiYXR0YWNobWVudFVwbG9hZHMkXCJcbiAgICAgICAgICBsZXQtcmV0cnlVcGxvYWRIYW5kbGVyPVwicmV0cnlVcGxvYWRIYW5kbGVyXCJcbiAgICAgICAgICBsZXQtZGVsZXRlVXBsb2FkSGFuZGxlcj1cImRlbGV0ZVVwbG9hZEhhbmRsZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN0cmVhbS1hdHRhY2htZW50LXByZXZpZXctbGlzdFxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LWxpc3QtYW5ndWxhci1ob3N0XCJcbiAgICAgICAgICAgIFthdHRhY2htZW50VXBsb2FkcyRdPVwiYXR0YWNobWVudFVwbG9hZHMkXCJcbiAgICAgICAgICAgIChyZXRyeUF0dGFjaG1lbnRVcGxvYWQpPVwicmV0cnlVcGxvYWRIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgKGRlbGV0ZUF0dGFjaG1lbnQpPVwiZGVsZXRlVXBsb2FkSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICA+PC9zdHJlYW0tYXR0YWNobWVudC1wcmV2aWV3LWxpc3Q+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgYXR0YWNobWVudFByZXZpZXdMaXN0VGVtcGxhdGUgfHwgZGVmYXVsdEF0dGFjaG1lbnRzUHJldmlldztcbiAgICAgICAgICAgIGNvbnRleHQ6IGdldEF0dGFjaG1lbnRQcmV2aWV3TGlzdENvbnRleHQoKVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXRleHRhcmVhLXdpdGgtZW1vamktcGlja2VyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgc3RyZWFtVGV4dGFyZWFcbiAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwidGV4dGFyZWFSZWZcIlxuICAgICAgICAgICAgW2FyZU1lbnRpb25zRW5hYmxlZF09XCJhcmVNZW50aW9uc0VuYWJsZWRcIlxuICAgICAgICAgICAgW21lbnRpb25TY29wZV09XCJtZW50aW9uU2NvcGVcIlxuICAgICAgICAgICAgW2lucHV0TW9kZV09XCJpbnB1dE1vZGVcIlxuICAgICAgICAgICAgW2F1dG9Gb2N1c109XCJhdXRvRm9jdXNcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInRleHRhcmVhUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgWyh2YWx1ZSldPVwidGV4dGFyZWFWYWx1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwidHlwaW5nU3RhcnQkLm5leHQoKTsgdXBkYXRlTWVzc2FnZURyYWZ0KClcIlxuICAgICAgICAgICAgKHNlbmQpPVwibWVzc2FnZVNlbnQoKVwiXG4gICAgICAgICAgICAodXNlck1lbnRpb25zKT1cInVzZXJNZW50aW9uc0NoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAocGFzdGVGcm9tQ2xpcGJvYXJkKT1cIml0ZW1zUGFzdGVkKCRldmVudClcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW1vamlQaWNrZXJUZW1wbGF0ZVwiIGRhdGEtdGVzdGlkPVwiZW1vamktcGlja2VyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgZW1vamlQaWNrZXJUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBnZXRFbW9qaVBpY2tlckNvbnRleHQoKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImNhblNlbmRNZXNzYWdlcyAmJiAhaXNDb29sZG93bkluUHJvZ3Jlc3MgJiYgZGlzcGxheVNlbmRCdXR0b25cIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInNlbmQtYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fc2VuZC1idXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgKGF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlciQgfCBhc3luYykhID4gMCB8fFxuICAgICAgICAgIChhdHRhY2htZW50U2VydmljZS5hdHRhY2htZW50c0NvdW50ZXIkIHwgYXN5bmMpISA+XG4gICAgICAgICAgICBhdHRhY2htZW50U2VydmljZS5tYXhOdW1iZXJPZkF0dGFjaG1lbnRzIHx8XG4gICAgICAgICAgKCF0ZXh0YXJlYVZhbHVlICYmXG4gICAgICAgICAgICAoYXR0YWNobWVudFVwbG9hZHMkIHwgYXN5bmMpIS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIChjdXN0b21BdHRhY2htZW50cyQgfCBhc3luYykhLmxlbmd0aCA9PT0gMClcbiAgICAgICAgXCJcbiAgICAgICAgKGNsaWNrKT1cIm1lc3NhZ2VTZW50KClcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwibWVzc2FnZVNlbnQoKVwiXG4gICAgICA+XG4gICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlciBpY29uPVwic2VuZFwiPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJpc0Nvb2xkb3duSW5Qcm9ncmVzc1wiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtaW5wdXQtY29vbGRvd25cIlxuICAgICAgICBkYXRhLXRlc3RpZD1cImNvb2xkb3duLXRpbWVyXCJcbiAgICAgID5cbiAgICAgICAge3sgY29vbGRvd24kIHwgYXN5bmMgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImRpc3BsYXlWb2ljZVJlY29yZGluZ0J1dHRvblwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3N0YXJ0LXJlY29yZGluZy1hdWRpby1idXR0b25cIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInN0YXJ0LXZvaWNlLXJlY29yZGluZ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICB2b2ljZVJlY29yZGVyU2VydmljZS5pc1JlY29yZGVyVmlzaWJsZSQudmFsdWUgfHxcbiAgICAgICAgICBhdWRpb1JlY29yZGVyPy5pc1JlY29yZGluZyB8fFxuICAgICAgICAgIChhdHRhY2htZW50U2VydmljZS5hdHRhY2htZW50c0NvdW50ZXIkIHwgYXN5bmMpISA+PVxuICAgICAgICAgICAgYXR0YWNobWVudFNlcnZpY2UubWF4TnVtYmVyT2ZBdHRhY2htZW50c1xuICAgICAgICBcIlxuICAgICAgICAoY2xpY2spPVwic3RhcnRWb2ljZVJlY29yZGluZygpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cInN0YXJ0Vm9pY2VSZWNvcmRpbmcoKVwiXG4gICAgICA+XG4gICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlciBpY29uPVwibWljXCI+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21lc3NhZ2UtaW5wdXQtZW5kXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy10ZW1wbGF0ZSAjbm90QWxsb3dlZD5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWlucHV0LW5vdC1hbGxvd2VkXCJcbiAgICAgIGRhdGEtdGVzdGlkPVwiZGlzYWJsZWQtdGV4dGFyZWFcIlxuICAgID5cbiAgICAgIHt7IGRpc2FibGVkVGV4dGFyZWFUZXh0IHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZVxuICAqbmdJZj1cInZvaWNlUmVjb3JkZXJSZWZcIlxuICBbbmdUZW1wbGF0ZU91dGxldF09XCJ2b2ljZVJlY29yZGVyUmVmXCJcbiAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgc2VydmljZTogdm9pY2VSZWNvcmRlclNlcnZpY2UgfVwiXG4+PC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZVxuICAqbmdJZj1cIlxuICAgIGlzQ29tcG9zZXJPcGVuICYmIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnBvbGxDb21wb3NlclRlbXBsYXRlJCB8IGFzeW5jKVxuICBcIlxuICBbbmdUZW1wbGF0ZU91dGxldF09XCIoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5wb2xsQ29tcG9zZXJUZW1wbGF0ZSQgfCBhc3luYykhXCJcbiAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICBwb2xsQ29tcG9zZTogYWRkUG9sbCxcbiAgICBjYW5jZWw6IGNsb3NlUG9sbENvbXBvc2VyXG4gIH1cIlxuPjwvbmctdGVtcGxhdGU+XG4iXX0=
629
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS1pbnB1dC9tZXNzYWdlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWlucHV0L21lc3NhZ2UtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFHVCxZQUFZLEVBRVosWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBRU4sV0FBVyxFQUVYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFjLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVE3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVk3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdoRTs7R0FFRztBQU9ILE1BQU0sT0FBTyxxQkFBcUI7SUE0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cG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgQ29tcG9uZW50UmVmLFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpcnN0LCBtYXAsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnQsXG4gIENoYW5uZWwsXG4gIERyYWZ0TWVzc2FnZVBheWxvYWQsXG4gIERyYWZ0UmVzcG9uc2UsXG4gIFVzZXJSZXNwb25zZSxcbn0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQXR0YWNobWVudFNlcnZpY2UgfSBmcm9tICcuLi9hdHRhY2htZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGV4dGFyZWFJbmplY3Rpb25Ub2tlbiB9IGZyb20gJy4uL2luamVjdGlvbi10b2tlbnMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQcmV2aWV3TGlzdENvbnRleHQsXG4gIEF0dGFjaG1lbnRVcGxvYWQsXG4gIEF1ZGlvUmVjb3JkaW5nLFxuICBDdXN0b21BdHRhY2htZW50VXBsb2FkQ29udGV4dCxcbiAgRW1vamlQaWNrZXJDb250ZXh0LFxuICBNZXNzYWdlVGV4dENvbnRleHQsXG4gIFN0cmVhbU1lc3NhZ2UsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE1lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL21lc3NhZ2UtaW5wdXQtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dGFyZWFEaXJlY3RpdmUgfSBmcm9tICcuL3RleHRhcmVhLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUZXh0YXJlYUludGVyZmFjZSB9IGZyb20gJy4vdGV4dGFyZWEuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVtb2ppSW5wdXRTZXJ2aWNlIH0gZnJvbSAnLi9lbW9qaS1pbnB1dC5zZXJ2aWNlJztcbmltcG9ydCB7IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuLi9jdXN0b20tdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBNZXNzYWdlQWN0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9tZXNzYWdlLWFjdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBWb2ljZVJlY29yZGVyU2VydmljZSB9IGZyb20gJy4vdm9pY2UtcmVjb3JkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBdWRpb1JlY29yZGVyU2VydmljZSB9IGZyb20gJy4uL3ZvaWNlLXJlY29yZGVyL2F1ZGlvLXJlY29yZGVyLnNlcnZpY2UnO1xuXG4vKipcbiAqIFRoZSBgTWVzc2FnZUlucHV0YCBjb21wb25lbnQgZGlzcGxheXMgYW4gaW5wdXQgd2hlcmUgdXNlcnMgY2FuIHR5cGUgdGhlaXIgbWVzc2FnZXMgYW5kIHVwbG9hZCBmaWxlcywgYW5kIHNlbmRzIHRoZSBtZXNzYWdlIHRvIHRoZSBhY3RpdmUgY2hhbm5lbC4gVGhlIGNvbXBvbmVudCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIG5ldyBtZXNzYWdlcyBvciB1cGRhdGUgZXhpc3Rpbmcgb25lcy4gVG8gc2VuZCBtZXNzYWdlcywgdGhlIGNoYXQgdXNlciBuZWVkcyB0byBoYXZlIHRoZSBuZWNlc3NhcnkgW2NoYW5uZWwgY2FwYWJpbGl0eV0oL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2NoYW5uZWxfY2FwYWJpbGl0aWVzLykuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lc3NhZ2UtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxuICBwcm92aWRlcnM6IFtBdHRhY2htZW50U2VydmljZSwgRW1vamlJbnB1dFNlcnZpY2UsIFZvaWNlUmVjb3JkZXJTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUlucHV0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdFxue1xuICAvKipcbiAgICogSWYgZmlsZSB1cGxvYWQgaXMgZW5hYmxlZCwgdGhlIHVzZXIgY2FuIG9wZW4gYSBmaWxlIHNlbGVjdG9yIGZyb20gdGhlIGlucHV0LiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB1c2VyIGFsc28gbmVlZHMgdG8gaGF2ZSB0aGUgbmVjZXNzYXJ5IFtjaGFubmVsIGNhcGFiaWxpdHldKC9jaGF0L2RvY3MvamF2YXNjcmlwdC9jaGFubmVsX2NhcGFiaWxpdGllcy8pLiBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgaXQgaXMgc2V0IGZyb20gdGhlIFtgTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZS8pLlxuICAgKi9cbiAgQElucHV0KCkgaXNGaWxlVXBsb2FkRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIElmIHRydWUsIHVzZXJzIGNhbiBtZW50aW9uIG90aGVyIHVzZXJzIGluIG1lc3NhZ2VzLiBZb3UgYWxzbyBbbmVlZCB0byB1c2UgdGhlIGBBdXRvY29tcGxldGVUZXh0YXJlYWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29uY2VwdHMvb3B0LWluLWFyY2hpdGVjdHVyZS8pIGZvciB0aGlzIGZlYXR1cmUgdG8gd29yay4gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIGl0IGlzIHNldCBmcm9tIHRoZSBbYE1lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2VgXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL01lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2UvKS5cbiAgICovXG4gIEBJbnB1dCgpIGFyZU1lbnRpb25zRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBzY29wZSBmb3IgdXNlciBtZW50aW9ucywgZWl0aGVyIG1lbWJlcnMgb2YgdGhlIGN1cnJlbnQgY2hhbm5lbCBvZiBtZW1iZXJzIG9mIHRoZSBhcHBsaWNhdGlvbi4gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIGl0IGlzIHNldCBmcm9tIHRoZSBbYE1lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2VgXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL01lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2UvKS5cbiAgICovXG4gIEBJbnB1dCgpIG1lbnRpb25TY29wZTogJ2NoYW5uZWwnIHwgJ2FwcGxpY2F0aW9uJyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIG1lc3NhZ2UgaXMgYmVpbmcgZGlzcGFseWVkIGluIGEgY2hhbm5lbCBvciBpbiBhIFt0aHJlYWRdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC90aHJlYWRzLykuXG4gICAqL1xuICBASW5wdXQoKSBtb2RlOiAndGhyZWFkJyB8ICdtYWluJyA9ICdtYWluJztcbiAgLyoqXG4gICAqIElmIHRydWUsIHVzZXJzIGNhbiBzZWxlY3QgbXVsdGlwbGUgZmlsZXMgdG8gdXBsb2FkLiBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgaXQgaXMgc2V0IGZyb20gdGhlIFtgTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZWBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvc2VydmljZXMvTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZS8pLlxuICAgKi9cbiAgQElucHV0KCkgaXNNdWx0aXBsZUZpbGVVcGxvYWRFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgdG8gZWRpdFxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEFuIG9ic2VydmFibGUgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmlnZ2VyIG1lc3NhZ2Ugc2VuZGluZyBmcm9tIHRoZSBvdXRzaWRlXG4gICAqL1xuICBASW5wdXQoKSBzZW5kTWVzc2FnZSQ6IE9ic2VydmFibGU8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBJbiBgZGVza3RvcGAgbW9kZSB0aGUgYEVudGVyYCBrZXkgd2lsbCB0cmlnZ2VyIG1lc3NhZ2Ugc2VuZGluZywgaW4gYG1vYmlsZWAgbW9kZSB0aGUgYEVudGVyYCBrZXkgd2lsbCBpbnNlcnQgYSBuZXcgbGluZSB0byB0aGUgbWVzc2FnZSBpbnB1dC4gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIGl0IGlzIHNldCBmcm9tIHRoZSBbYE1lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2VgXSgvY2hhdC9kb2NzL3Nkay9hbmd1bGFyL3NlcnZpY2VzL01lc3NhZ2VJbnB1dENvbmZpZ1NlcnZpY2UvKS5cbiAgICovXG4gIEBJbnB1dCgpIGlucHV0TW9kZTogJ2Rlc2t0b3AnIHwgJ21vYmlsZSc7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGF1dG8gZm9jdXMgb24gdGhlIHRleHRhcmVhIGVsZW1lbnRcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IHRydWU7XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBpbnB1dCB3aWxsIHJlYWN0IHRvIGNoYW5nZXMgaW4gYG1lc3NhZ2VUb0VkaXQkYCBmcm9tIFtgTWVzc2FnZUFjdGlvbnNTZXJ2aWNlYF0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9NZXNzYWdlQWN0aW9uc1NlcnZpY2UvKSBhbmQgZGlzcGxheSB0aGUgbWVzc2FnZSB0byBiZSBlZGl0ZWQgKHRha2luZyBpbnRvIGFjY291bnQgdGhlIGN1cnJlbnQgYG1vZGVgKS5cbiAgICpcbiAgICogSWYgeW91IGRvbid0IG5lZWQgdGhhdCBiZWhhdmlvciwgeW91IGNhbiB0dXJuIHRoaXMgb2Ygd2l0aCB0aGlzIGZsYWcuIEluIHRoYXQgY2FzZSB5b3Ugc2hvdWxkIGNyZWF0ZSB5b3VyIG93biBlZGl0IG1lc3NhZ2UgVUkuXG4gICAqL1xuICBASW5wdXQoKSB3YXRjaEZvck1lc3NhZ2VUb0VkaXQgPSB0cnVlO1xuICAvKipcbiAgICogVXNlIHRoaXMgaW5wdXQgdG8gY29udHJvbCB3ZXRoZXIgYSBzZW5kIGJ1dHRvbiBpcyByZW5kZXJlZCBvciBub3QuIElmIHlvdSBkb24ndCByZW5kZXIgYSBzZW5kIGJ1dHRvbiwgeW91IGNhbiBzdGlsbCB0cmlnZ2VyIG1lc3NhZ2Ugc2VuZCB1c2luZyB0aGUgYHNlbmRNZXNzYWdlJGAgaW5wdXQuXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5U2VuZEJ1dHRvbiA9IHRydWU7XG4gIC8qKlxuICAgKiBZb3UgY2FuIGVuYWJsZS9kaXNhYmxlIHZvaWNlIHJlY29yZGluZ3Mgd2l0aCB0aGlzIGlucHV0XG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5Vm9pY2VSZWNvcmRpbmdCdXR0b24gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFlvdSBjYW4gZW5hYmxlL2Rpc2FibGUgcG9sbHMgd2l0aCB0aGlzIGlucHV0XG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5UG9sbENyZWF0ZUJ1dHRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogRW1pdHMgd2hlbiBhIG1lc3NhZ2Ugd2FzIHN1Y2Nlc3NmdWx5IHNlbnQgb3IgdXBkYXRlZFxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG1lc3NhZ2VVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlO1xuICB9PigpO1xuICAvKipcbiAgICogRW1pdHMgdGhlIG1lc3NzYWdlIGRyYWZ0IHdoZW5ldmVyIHRoZSBjb21wb3NlZCBtZXNzYWdlIGNoYW5nZXMuXG4gICAqICAgLSBJZiB0aGUgdXNlciBjbGVhcnMgdGhlIG1lc3NhZ2UgaW5wdXQsIG9yIHNlbmRzIHRoZSBtZXNzYWdlLCB1bmRlZmluZWQgaXMgZW1pdHRlZC5cbiAgICogICAtIElmIGFjdGl2ZSBjaGFubmVsIGNoYW5nZXMsIG5vdGhpbmcgaXMgZW1pdHRlZC5cbiAgICpcbiAgICogVG8gc2F2ZSBhbmQgZmV0Y2ggbWVzc2FnZSBkcmFmdHMsIHlvdSBjYW4gdXNlIHRoZSBbU3RyZWFtIG1lc3NhZ2UgZHJhZnRzIEFQSV0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvZHJhZnRzLykuXG4gICAqXG4gICAqIE1lc3NhZ2UgZHJhZnQgb25seSB3b3JrcyBmb3IgbmV3IG1lc3NhZ2VzLCBub3RoaW5nIGlzIGVtaXR0ZWQgd2hlbiBpbnB1dCBpcyBpbiBlZGl0IG1vZGUgKGlmIGBtZXNzYWdlYCBpbnB1dCBpcyBzZXQpLlxuICAgKlxuICAgKiBUbyBsb2FkIGEgbWVzc2FnZSBkcmFmdCBpbnRvIHRoZSBpbnB1dCwgdXNlIHRoZSBgbG9hZERyYWZ0YCBtZXRob2QuXG4gICAqICAgLSBJZiBjaGFubmVsIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIGFjdGl2ZSBjaGFubmVsIGlkLCB0aGUgZHJhZnQgaXMgaWdub3JlZC5cbiAgICogICAtIElmIGEgdGhyZWFkIG1lc3NhZ2UgaXMgbG9hZGVkLCBhbmQgdGhlIGlucHV0IGlzbid0IGluIHRocmVhZCBtb2RlIG9yIHBhcmVudCBpZHMgZG9uJ3QgbWF0Y2gsIHRoZSBkcmFmdCBpcyBpZ25vcmVkLlxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG1lc3NhZ2VEcmFmdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgRHJhZnRNZXNzYWdlUGF5bG9hZCB8IHVuZGVmaW5lZFxuICA+KCk7XG4gIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpIHZvaWNlUmVjb3JkZXJSZWY6XG4gICAgfCBUZW1wbGF0ZVJlZjx7IHNlcnZpY2U6IFZvaWNlUmVjb3JkZXJTZXJ2aWNlIH0+XG4gICAgfCB1bmRlZmluZWQ7XG4gIEBIb3N0QmluZGluZygpIGNsYXNzID0gJ3N0ci1jaGF0X19tZXNzYWdlLWlucHV0LWFuZ3VsYXItaG9zdCc7XG4gIGlzVm9pY2VSZWNvcmRpbmcgPSB0cnVlO1xuICBpc0ZpbGVVcGxvYWRBdXRob3JpemVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBjYW5TZW5kTGlua3M6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIGNhblNlbmRNZXNzYWdlczogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgY2FuU2VuZFBvbGxzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBhdHRhY2htZW50VXBsb2FkcyQ6IE9ic2VydmFibGU8QXR0YWNobWVudFVwbG9hZFtdPjtcbiAgY3VzdG9tQXR0YWNobWVudHMkOiBPYnNlcnZhYmxlPEF0dGFjaG1lbnRbXT47XG4gIGF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlciQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgdGV4dGFyZWFWYWx1ZSA9ICcnO1xuICB0ZXh0YXJlYVJlZjogQ29tcG9uZW50UmVmPFRleHRhcmVhSW50ZXJmYWNlICYgUGFydGlhbDxPbkNoYW5nZXM+PiB8IHVuZGVmaW5lZDtcbiAgbWVudGlvbmVkVXNlcnM6IFVzZXJSZXNwb25zZVtdID0gW107XG4gIHF1b3RlZE1lc3NhZ2U6IHVuZGVmaW5lZCB8IFN0cmVhbU1lc3NhZ2U7XG4gIHR5cGluZ1N0YXJ0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIGNvb2xkb3duJDogT2JzZXJ2YWJsZTxudW1iZXI+IHwgdW5kZWZpbmVkO1xuICBpc0Nvb2xkb3duSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICBlbW9qaVBpY2tlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxFbW9qaVBpY2tlckNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21BdHRhY2htZW50VXBsb2FkVGVtcGxhdGU6XG4gICAgfCBUZW1wbGF0ZVJlZjxDdXN0b21BdHRhY2htZW50VXBsb2FkQ29udGV4dD5cbiAgICB8IHVuZGVmaW5lZDtcbiAgYXR0YWNobWVudFByZXZpZXdMaXN0VGVtcGxhdGU6XG4gICAgfCBUZW1wbGF0ZVJlZjxBdHRhY2htZW50UHJldmlld0xpc3RDb250ZXh0PlxuICAgIHwgdW5kZWZpbmVkO1xuICB0ZXh0YXJlYVBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIGZpbGVJbnB1dElkID0gdXVpZHY0KCk7XG4gIGlzQ29tcG9zZXJPcGVuID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIHByaXZhdGUgZmlsZUlucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChUZXh0YXJlYURpcmVjdGl2ZSwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHByaXZhdGUgdGV4dGFyZWFBbmNob3IhOiBUZXh0YXJlYURpcmVjdGl2ZTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGhpZGVOb3RpZmljYXRpb246ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpc1ZpZXdJbml0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjaGFubmVsOiBDaGFubmVsIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNlbmRNZXNzYWdlU3ViY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0VGV4dGFyZWFQbGFjZWhvbGRlciA9ICdzdHJlYW1DaGF0LlR5cGUgeW91ciBtZXNzYWdlJztcbiAgcHJpdmF0ZSByZWFkb25seSBzbG93TW9kZVRleHRhcmVhUGxhY2Vob2xkZXIgPSAnc3RyZWFtQ2hhdC5TbG93IE1vZGUgT04nO1xuICBwcml2YXRlIG1lc3NhZ2VUb0VkaXQ/OiBTdHJlYW1NZXNzYWdlO1xuICBwcml2YXRlIHBvbGxJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlzQ2hhbm5lbENoYW5nZVJlc2V0SW5Qcm9ncmVzcyA9IGZhbHNlO1xuICBwcml2YXRlIGlzU2VuZGluZ01lc3NhZ2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0xvYWRpbmdEcmFmdCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXR0YWNobWVudFNlcnZpY2U6IEF0dGFjaG1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogTWVzc2FnZUlucHV0Q29uZmlnU2VydmljZSxcbiAgICBASW5qZWN0KHRleHRhcmVhSW5qZWN0aW9uVG9rZW4pXG4gICAgcHJpdmF0ZSB0ZXh0YXJlYVR5cGU6IFR5cGU8VGV4dGFyZWFJbnRlcmZhY2U+LFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBlbW9qaUlucHV0U2VydmljZTogRW1vamlJbnB1dFNlcnZpY2UsXG4gICAgcmVhZG9ubHkgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VBY3Rpb25zU2VydmljZTogTWVzc2FnZUFjdGlvbnNTZXJ2aWNlLFxuICAgIHB1YmxpYyByZWFkb25seSB2b2ljZVJlY29yZGVyU2VydmljZTogVm9pY2VSZWNvcmRlclNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIGF1ZGlvUmVjb3JkZXI/OiBBdWRpb1JlY29yZGVyU2VydmljZVxuICApIHtcbiAgICB0aGlzLnRleHRhcmVhUGxhY2Vob2xkZXIgPSB0aGlzLmRlZmF1bHRUZXh0YXJlYVBsYWNlaG9sZGVyO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5hdHRhY2htZW50U2VydmljZS5hdHRhY2htZW50VXBsb2FkSW5Qcm9ncmVzc0NvdW50ZXIkLnN1YnNjcmliZShcbiAgICAgICAgKGNvdW50ZXIpID0+IHtcbiAgICAgICAgICBpZiAoY291bnRlciA9PT0gMCAmJiB0aGlzLmhpZGVOb3RpZmljYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZU5vdGlmaWNhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5oaWRlTm90aWZpY2F0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmF0dGFjaG1lbnRVcGxvYWRzJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChcbiAgICAgICAgICAgIChwcmV2LCBjdXJyZW50KSA9PlxuICAgICAgICAgICAgICBwcmV2LmZpbHRlcigodikgPT4gdi5zdGF0ZSA9PT0gJ3N1Y2Nlc3MnKS5sZW5ndGggPT09XG4gICAgICAgICAgICAgIGN1cnJlbnQuZmlsdGVyKCh2KSA9PiB2LnN0YXRlID09PSAnc3VjY2VzcycpLmxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU1lc3NhZ2VEcmFmdCgpO1xuICAgICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmN1c3RvbUF0dGFjaG1lbnRzJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZU1lc3NhZ2VEcmFmdCgpO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsJC5zdWJzY3JpYmUoKGNoYW5uZWwpID0+IHtcbiAgICAgICAgaWYgKGNoYW5uZWwgJiYgdGhpcy5jaGFubmVsICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuY2hhbm5lbC5pZCkge1xuICAgICAgICAgIHRoaXMudGV4dGFyZWFWYWx1ZSA9ICcnO1xuICAgICAgICAgIHRoaXMuYXR0YWNobWVudFNlcnZpY2UucmVzZXRBdHRhY2htZW50VXBsb2FkcygpO1xuICAgICAgICAgIHRoaXMucG9sbElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMudm9pY2VSZWNvcmRlclNlcnZpY2UuaXNSZWNvcmRlclZpc2libGUkLm5leHQoZmFsc2UpO1xuICAgICAgICAgIC8vIFByZWVtcHRpdmVseSBkZXNlbGVjdCBxdW90ZWQgbWVzc2FnZSwgdG8gYXZvaWQgdW53YW50ZWQgZHJhZnQgZW1pc3Npb25cbiAgICAgICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLnNlbGVjdE1lc3NhZ2VUb1F1b3RlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gY2hhbm5lbD8uZGF0YT8ub3duX2NhcGFiaWxpdGllcyBhcyBzdHJpbmdbXTtcbiAgICAgICAgaWYgKGNhcGFiaWxpdGllcykge1xuICAgICAgICAgIHRoaXMuaXNGaWxlVXBsb2FkQXV0aG9yaXplZCA9XG4gICAgICAgICAgICBjYXBhYmlsaXRpZXMuaW5kZXhPZigndXBsb2FkLWZpbGUnKSAhPT0gLTE7XG4gICAgICAgICAgdGhpcy5jYW5TZW5kTGlua3MgPSBjYXBhYmlsaXRpZXMuaW5kZXhPZignc2VuZC1saW5rcycpICE9PSAtMTtcbiAgICAgICAgICB0aGlzLmNhblNlbmRQb2xscyA9IGNhcGFiaWxpdGllcy5pbmRleE9mKCdzZW5kLXBvbGwnKSAhPT0gLTE7XG4gICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcbiAgICAgICAgICB0aGlzLnNldENhblNlbmRNZXNzYWdlcygpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmNoYW5uZWxTd2l0Y2hTdGF0ZSQuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLmlzQ2hhbm5lbENoYW5nZVJlc2V0SW5Qcm9ncmVzcyA9IHN0YXRlID09PSAnc3RhcnQnO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5tZXNzYWdlVG9RdW90ZSQuc3Vic2NyaWJlKChtKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzVGhyZWFkUmVwbHkgPSBtICYmIG0ucGFyZW50X2lkO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRoaXMubW9kZSA9PT0gJ3RocmVhZCcgJiYgaXNUaHJlYWRSZXBseSkgfHxcbiAgICAgICAgICAodGhpcy5tb2RlID09PSAndGhyZWFkJyAmJiB0aGlzLnF1b3RlZE1lc3NhZ2UgJiYgIW0pIHx8XG4gICAgICAgICAgKHRoaXMubW9kZSA9PT0gJ21haW4nICYmICFpc1RocmVhZFJlcGx5KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnF1b3RlZE1lc3NhZ2UgPSBtO1xuICAgICAgICAgIHRoaXMudXBkYXRlTWVzc2FnZURyYWZ0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLm1lc3NhZ2VUb0VkaXQkLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2VUb0VkaXQgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLmNoZWNrSWZJbkVkaXRNb2RlKCk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5hdHRhY2htZW50VXBsb2FkcyQgPSB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmF0dGFjaG1lbnRVcGxvYWRzJDtcbiAgICB0aGlzLmN1c3RvbUF0dGFjaG1lbnRzJCA9IHRoaXMuYXR0YWNobWVudFNlcnZpY2UuY3VzdG9tQXR0YWNobWVudHMkO1xuICAgIHRoaXMuYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyJCA9XG4gICAgICB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlciQ7XG4gICAgdGhpcy5pc0ZpbGVVcGxvYWRFbmFibGVkID0gdGhpcy5jb25maWdTZXJ2aWNlLmlzRmlsZVVwbG9hZEVuYWJsZWQ7XG4gICAgdGhpcy5pc011bHRpcGxlRmlsZVVwbG9hZEVuYWJsZWQgPVxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmlzTXVsdGlwbGVGaWxlVXBsb2FkRW5hYmxlZDtcbiAgICB0aGlzLmFyZU1lbnRpb25zRW5hYmxlZCA9IHRoaXMuY29uZmlnU2VydmljZS5hcmVNZW50aW9uc0VuYWJsZWQ7XG4gICAgdGhpcy5tZW50aW9uU2NvcGUgPSB0aGlzLmNvbmZpZ1NlcnZpY2UubWVudGlvblNjb3BlO1xuICAgIHRoaXMuaW5wdXRNb2RlID0gdGhpcy5jb25maWdTZXJ2aWNlLmlucHV0TW9kZTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy50eXBpbmdTdGFydCQuc3Vic2NyaWJlKFxuICAgICAgICAoKSA9PiB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UudHlwaW5nU3RhcnRlZCh0aGlzLnBhcmVudE1lc3NhZ2VJZClcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy52b2ljZVJlY29yZGVyU2VydmljZS5pc1JlY29yZGVyVmlzaWJsZSQuc3Vic2NyaWJlKChpc1Zpc2libGUpID0+IHtcbiAgICAgICAgdGhpcy5pc1ZvaWNlUmVjb3JkaW5nID0gaXNWaXNpYmxlO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHMkLFxuICAgICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmFjdGl2ZUNoYW5uZWwkLFxuICAgICAgXSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKFxuICAgICAgICAgICAgKFtsYXRlc3RNZXNzYWdlcywgY2hhbm5lbF0pOiBbXG4gICAgICAgICAgICAgIERhdGUgfCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIENoYW5uZWwgfCB1bmRlZmluZWRcbiAgICAgICAgICAgIF0gPT4gW2xhdGVzdE1lc3NhZ2VzW2NoYW5uZWw/LmNpZCB8fCAnJ10sIGNoYW5uZWwhXVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChbbGF0ZXN0TWVzc2FnZURhdGUsIGNoYW5uZWxdKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29vbGRvd24gPVxuICAgICAgICAgICAgKGNoYW5uZWw/LmRhdGE/LmNvb2xkb3duIGFzIG51bWJlcikgJiZcbiAgICAgICAgICAgIGxhdGVzdE1lc3NhZ2VEYXRlICYmXG4gICAgICAgICAgICBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAoY2hhbm5lbD8uZGF0YT8uY29vbGRvd24gYXMgbnVtYmVyKSAtXG4gICAgICAgICAgICAgICAgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbGF0ZXN0TWVzc2FnZURhdGUuZ2V0VGltZSgpKSAvIDEwMDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29vbGRvd24gJiZcbiAgICAgICAgICAgIGNvb2xkb3duID4gMCAmJlxuICAgICAgICAgICAgKGNoYW5uZWw/LmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW10pLmluY2x1ZGVzKCdzbG93LW1vZGUnKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zdGFydENvb2xkb3duKGNvb2xkb3duKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb29sZG93bkluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcENvb2xkb3duKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlUmVjb3JkZXJTZXJ2aWNlLnJlY29yZGluZyQuc3Vic2NyaWJlKChyZWNvcmRpbmcpID0+IHtcbiAgICAgICAgaWYgKHJlY29yZGluZykge1xuICAgICAgICAgIHZvaWQgdGhpcy52b2ljZVJlY29yZGluZ1JlYWR5KHJlY29yZGluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmVtb2ppUGlja2VyVGVtcGxhdGUkLnN1YnNjcmliZSgodGVtcGxhdGUpID0+IHtcbiAgICAgICAgdGhpcy5lbW9qaVBpY2tlclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmF0dGFjaG1lbnRQcmV2aWV3TGlzdFRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuYXR0YWNobWVudFByZXZpZXdMaXN0VGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuY3VzdG9tQXR0YWNobWVudFVwbG9hZFRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuY3VzdG9tQXR0YWNobWVudFVwbG9hZFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3SW5pdGVkID0gdHJ1ZTtcbiAgICB0aGlzLmluaXRUZXh0YXJlYSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMubWVzc2FnZVRvVXBkYXRlQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5pc0ZpbGVVcGxvYWRFbmFibGVkKSB7XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuaXNGaWxlVXBsb2FkRW5hYmxlZCA9IHRoaXMuaXNGaWxlVXBsb2FkRW5hYmxlZDtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuaXNNdWx0aXBsZUZpbGVVcGxvYWRFbmFibGVkKSB7XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuaXNNdWx0aXBsZUZpbGVVcGxvYWRFbmFibGVkID1cbiAgICAgICAgdGhpcy5pc011bHRpcGxlRmlsZVVwbG9hZEVuYWJsZWQ7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmFyZU1lbnRpb25zRW5hYmxlZCkge1xuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmFyZU1lbnRpb25zRW5hYmxlZCA9IHRoaXMuYXJlTWVudGlvbnNFbmFibGVkO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5tZW50aW9uU2NvcGUpIHtcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5tZW50aW9uU2NvcGUgPSB0aGlzLm1lbnRpb25TY29wZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubW9kZSkge1xuICAgICAgdGhpcy5zZXRDYW5TZW5kTWVzc2FnZXMoKTtcbiAgICAgIHRoaXMuY2hlY2tJZkluRWRpdE1vZGUoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMud2F0Y2hGb3JNZXNzYWdlVG9FZGl0KSB7XG4gICAgICB0aGlzLmNoZWNrSWZJbkVkaXRNb2RlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmlucHV0TW9kZSkge1xuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmlucHV0TW9kZSA9IHRoaXMuaW5wdXRNb2RlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5zZW5kTWVzc2FnZSQpIHtcbiAgICAgIGlmICh0aGlzLnNlbmRNZXNzYWdlU3ViY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZVN1YmNyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZW5kTWVzc2FnZSQpIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZVN1YmNyaXB0aW9uID0gdGhpcy5zZW5kTWVzc2FnZSQuc3Vic2NyaWJlKFxuICAgICAgICAgICgpID0+IHZvaWQgdGhpcy5tZXNzYWdlU2VudCgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VuZE1lc3NhZ2VTdWJjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZW5kTWVzc2FnZVN1YmNyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgYXN5bmMgbWVzc2FnZVNlbnQoKSB7XG4gICAgaWYgKHRoaXMuaXNDb29sZG93bkluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc1NlbmRpbmdNZXNzYWdlID0gdHJ1ZTtcbiAgICBsZXQgYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyITogbnVtYmVyO1xuICAgIHRoaXMuYXR0YWNobWVudFNlcnZpY2UuYXR0YWNobWVudFVwbG9hZEluUHJvZ3Jlc3NDb3VudGVyJFxuICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNvdW50ZXIpID0+IChhdHRhY2htZW50VXBsb2FkSW5Qcm9ncmVzc0NvdW50ZXIgPSBjb3VudGVyKSk7XG4gICAgaWYgKGF0dGFjaG1lbnRVcGxvYWRJblByb2dyZXNzQ291bnRlciA+IDApIHtcbiAgICAgIGlmICghdGhpcy5oaWRlTm90aWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuaGlkZU5vdGlmaWNhdGlvbiA9XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZFBlcm1hbmVudE5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICdzdHJlYW1DaGF0LldhaXQgdW50aWwgYWxsIGF0dGFjaG1lbnRzIGhhdmUgdXBsb2FkZWQnXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXR0YWNobWVudHMgPSB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLm1hcFRvQXR0YWNobWVudHMoKTtcbiAgICBsZXQgdGV4dCA9IHRoaXMudGV4dGFyZWFWYWx1ZTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eXFxuKy9nLCAnJyk7IC8vIGxlYWRpbmcgZW1wdHkgbGluZXNcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXG4rJC9nLCAnJyk7IC8vIGVuZGluZyBlbXB0eSBsaW5lc1xuICAgIGNvbnN0IHRleHRDb250YWluc09ubHlTcGFjZUNoYXJzID0gIXRleHQucmVwbGFjZSgvIC9nLCAnJyk7IC8vc3BjYWVcbiAgICBpZiAoXG4gICAgICAoIXRleHQgfHwgdGV4dENvbnRhaW5zT25seVNwYWNlQ2hhcnMpICYmXG4gICAgICAoIWF0dGFjaG1lbnRzIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgICF0aGlzLnBvbGxJZFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGV4dENvbnRhaW5zT25seVNwYWNlQ2hhcnMpIHtcbiAgICAgIHRleHQgPSAnJztcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGFpbnNMaW5rcyAmJiAhdGhpcy5jYW5TZW5kTGlua3MpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oXG4gICAgICAgICdzdHJlYW1DaGF0LlNlbmRpbmcgbGlua3MgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb252ZXJzYXRpb24nXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwb2xsSWQgPSB0aGlzLnBvbGxJZDtcbiAgICBpZiAoIXRoaXMuaXNVcGRhdGUpIHtcbiAgICAgIHRoaXMudGV4dGFyZWFWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy5wb2xsSWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgKHRoaXMuaXNVcGRhdGVcbiAgICAgICAgPyB0aGlzLmNoYW5uZWxTZXJ2aWNlLnVwZGF0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4udGhpcy5tZXNzYWdlISxcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgICBhdHRhY2htZW50czogYXR0YWNobWVudHMsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiB0aGlzLmNoYW5uZWxTZXJ2aWNlLnNlbmRNZXNzYWdlKFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgICAgICAgdGhpcy5tZW50aW9uZWRVc2VycyxcbiAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgdGhpcy5xdW90ZWRNZXNzYWdlPy5pZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBvbGxJZFxuICAgICAgICAgICkpO1xuICAgICAgdGhpcy5tZXNzYWdlVXBkYXRlLmVtaXQoeyBtZXNzYWdlIH0pO1xuICAgICAgaWYgKHRoaXMuaXNVcGRhdGUpIHtcbiAgICAgICAgdGhpcy5kZXNlbGVjdE1lc3NhZ2VUb0VkaXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXR0YWNobWVudFNlcnZpY2UucmVzZXRBdHRhY2htZW50VXBsb2FkcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmlzU2VuZGluZ01lc3NhZ2UgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmlzVXBkYXRlKSB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGRUZW1wb3JhcnlOb3RpZmljYXRpb24oXG4gICAgICAgICAgJ3N0cmVhbUNoYXQuRWRpdCBtZXNzYWdlIHJlcXVlc3QgZmFpbGVkJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzU2VuZGluZ01lc3NhZ2UgPSBmYWxzZTtcbiAgICAgIHRoaXMudXBkYXRlTWVzc2FnZURyYWZ0KCk7XG4gICAgfVxuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS50eXBpbmdTdG9wcGVkKHRoaXMucGFyZW50TWVzc2FnZUlkKTtcbiAgICBpZiAodGhpcy5xdW90ZWRNZXNzYWdlKSB7XG4gICAgICB0aGlzLmRlc2VsZWN0TWVzc2FnZVRvUXVvdGUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY29udGFpbnNMaW5rcygpIHtcbiAgICByZXR1cm4gLyg/Oig/Omh0dHBzP3xmdHApOlxcL1xcLyk/W1xcdy9cXC0/PSUuXStcXC5bXFx3L1xcLSY/PSUuXSsvLnRlc3QoXG4gICAgICB0aGlzLnRleHRhcmVhVmFsdWVcbiAgICApO1xuICB9XG5cbiAgZ2V0IHF1b3RlZE1lc3NhZ2VBdHRhY2htZW50cygpIHtcbiAgICBjb25zdCBvcmlnaW5hbEF0dGFjaG1lbnRzID0gdGhpcy5xdW90ZWRNZXNzYWdlPy5hdHRhY2htZW50cztcbiAgICByZXR1cm4gb3JpZ2luYWxBdHRhY2htZW50cyAmJiBvcmlnaW5hbEF0dGFjaG1lbnRzLmxlbmd0aFxuICAgICAgPyBbb3JpZ2luYWxBdHRhY2htZW50c1swXV1cbiAgICAgIDogW107XG4gIH1cblxuICBnZXQgZGlzYWJsZWRUZXh0YXJlYVRleHQoKSB7XG4gICAgaWYgKCF0aGlzLmNhblNlbmRNZXNzYWdlcykge1xuICAgICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ3RocmVhZCdcbiAgICAgICAgPyBcInN0cmVhbUNoYXQuWW91IGNhbid0IHNlbmQgdGhyZWFkIHJlcGxpZXMgaW4gdGhpcyBjaGFubmVsXCJcbiAgICAgICAgOiBcInN0cmVhbUNoYXQuWW91IGNhbid0IHNlbmQgbWVzc2FnZXMgaW4gdGhpcyBjaGFubmVsXCI7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGl0ZW1zUGFzdGVkKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuY3VzdG9tUGFzdGVFdmVudEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jdXN0b21QYXN0ZUV2ZW50SGFuZGxlcihldmVudCwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChldmVudC5jbGlwYm9hcmREYXRhPy5maWxlcyAmJiBldmVudC5jbGlwYm9hcmREYXRhPy5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHZvaWQgdGhpcy5maWxlc1NlbGVjdGVkKGV2ZW50LmNsaXBib2FyZERhdGE/LmZpbGVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBmaWxlc1NlbGVjdGVkKGZpbGVMaXN0OiBGaWxlTGlzdCB8IG51bGwpIHtcbiAgICBhd2FpdCB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmZpbGVzU2VsZWN0ZWQoZmlsZUxpc3QpO1xuICAgIHRoaXMuY2xlYXJGaWxlSW5wdXQoKTtcbiAgfVxuXG4gIGRlc2VsZWN0TWVzc2FnZVRvUXVvdGUoKSB7XG4gICAgdGhpcy5jaGFubmVsU2VydmljZS5zZWxlY3RNZXNzYWdlVG9RdW90ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgZGVzZWxlY3RNZXNzYWdlVG9FZGl0KCkge1xuICAgIHRoaXMubWVzc2FnZUFjdGlvbnNTZXJ2aWNlLm1lc3NhZ2VUb0VkaXQkLm5leHQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIGdldEVtb2ppUGlja2VyQ29udGV4dCgpOiBFbW9qaVBpY2tlckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBlbW9qaUlucHV0JDogdGhpcy5lbW9qaUlucHV0U2VydmljZS5lbW9qaUlucHV0JCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0QXR0YWNobWVudFByZXZpZXdMaXN0Q29udGV4dCgpOiBBdHRhY2htZW50UHJldmlld0xpc3RDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0YWNobWVudFVwbG9hZHMkOiB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmF0dGFjaG1lbnRVcGxvYWRzJCxcbiAgICAgIGRlbGV0ZVVwbG9hZEhhbmRsZXI6IHRoaXMuZGVsZXRlVXBsb2FkLmJpbmQodGhpcyksXG4gICAgICByZXRyeVVwbG9hZEhhbmRsZXI6IHRoaXMucmV0cnlVcGxvYWQuYmluZCh0aGlzKSxcbiAgICAgIHNlcnZpY2U6IHRoaXMuYXR0YWNobWVudFNlcnZpY2UsXG4gICAgfTtcbiAgfVxuXG4gIGdldEF0dGFjaG1lbnRVcGxvYWRDb250ZXh0KCk6IEN1c3RvbUF0dGFjaG1lbnRVcGxvYWRDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNNdWx0aXBsZUZpbGVVcGxvYWRFbmFibGVkOiB0aGlzLmlzTXVsdGlwbGVGaWxlVXBsb2FkRW5hYmxlZCxcbiAgICAgIGF0dGFjaG1lbnRTZXJ2aWNlOiB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLFxuICAgIH07XG4gIH1cblxuICBnZXRRdW90ZWRNZXNzYWdlVGV4dENvbnRleHQoKTogTWVzc2FnZVRleHRDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5xdW90ZWRNZXNzYWdlLFxuICAgICAgaXNRdW90ZWQ6IHRydWUsXG4gICAgICBzaG91bGRUcmFuc2xhdGU6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0Vm9pY2VSZWNvcmRpbmcoKSB7XG4gICAgYXdhaXQgdGhpcy5hdWRpb1JlY29yZGVyPy5zdGFydCgpO1xuICAgIGlmICh0aGlzLmF1ZGlvUmVjb3JkZXI/LmlzUmVjb3JkaW5nKSB7XG4gICAgICB0aGlzLnZvaWNlUmVjb3JkZXJTZXJ2aWNlLmlzUmVjb3JkZXJWaXNpYmxlJC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5Qb2xsQ29tcG9zZXIoKSB7XG4gICAgdGhpcy5pc0NvbXBvc2VyT3BlbiA9IHRydWU7XG4gIH1cblxuICBjbG9zZVBvbGxDb21wb3NlciA9ICgpID0+IHtcbiAgICB0aGlzLmlzQ29tcG9zZXJPcGVuID0gZmFsc2U7XG4gIH07XG5cbiAgYWRkUG9sbCA9IChwb2xsSWQ6IHN0cmluZykgPT4ge1xuICAgIHRoaXMuaXNDb21wb3Nlck9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnBvbGxJZCA9IHBvbGxJZDtcbiAgICB0aGlzLnVwZGF0ZU1lc3NhZ2VEcmFmdCgpO1xuICAgIHZvaWQgdGhpcy5tZXNzYWdlU2VudCgpO1xuICB9O1xuXG4gIHVzZXJNZW50aW9uc0NoYW5nZWQodXNlck1lbnRpb25zOiBVc2VyUmVzcG9uc2VbXSkge1xuICAgIGlmIChcbiAgICAgIHVzZXJNZW50aW9ucy5tYXAoKHUpID0+IHUuaWQpLmpvaW4oJywnKSAhPT1cbiAgICAgIHRoaXMubWVudGlvbmVkVXNlcnMubWFwKCh1KSA9PiB1LmlkKS5qb2luKCcsJylcbiAgICApIHtcbiAgICAgIHRoaXMubWVudGlvbmVkVXNlcnMgPSB1c2VyTWVudGlvbnM7XG4gICAgICB0aGlzLnVwZGF0ZU1lc3NhZ2VEcmFmdCgpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU1lc3NhZ2VEcmFmdCgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTG9hZGluZ0RyYWZ0IHx8XG4gICAgICB0aGlzLmlzU2VuZGluZ01lc3NhZ2UgfHxcbiAgICAgIHRoaXMuaXNDaGFubmVsQ2hhbmdlUmVzZXRJblByb2dyZXNzIHx8XG4gICAgICB0aGlzLmlzVXBkYXRlXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gdGhpcy5hdHRhY2htZW50U2VydmljZS5tYXBUb0F0dGFjaG1lbnRzKCk7XG5cbiAgICBpZiAoXG4gICAgICAhdGhpcy50ZXh0YXJlYVZhbHVlICYmXG4gICAgICAhdGhpcy5tZW50aW9uZWRVc2Vycy5sZW5ndGggJiZcbiAgICAgICFhdHRhY2htZW50cz8ubGVuZ3RoICYmXG4gICAgICAhdGhpcy5wb2xsSWQgJiZcbiAgICAgICF0aGlzLnF1b3RlZE1lc3NhZ2U/LmlkXG4gICAgKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VEcmFmdENoYW5nZS5lbWl0KHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVzc2FnZURyYWZ0Q2hhbmdlLmVtaXQoe1xuICAgICAgICB0ZXh0OiB0aGlzLnRleHRhcmVhVmFsdWUsXG4gICAgICAgIGF0dGFjaG1lbnRzOiB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLm1hcFRvQXR0YWNobWVudHMoKSxcbiAgICAgICAgbWVudGlvbmVkX3VzZXJzOiB0aGlzLm1lbnRpb25lZFVzZXJzLm1hcCgodXNlcikgPT4gdXNlci5pZCksXG4gICAgICAgIHBvbGxfaWQ6IHRoaXMucG9sbElkLFxuICAgICAgICBwYXJlbnRfaWQ6IHRoaXMucGFyZW50TWVzc2FnZUlkLFxuICAgICAgICBxdW90ZWRfbWVzc2FnZV9pZDogdGhpcy5xdW90ZWRNZXNzYWdlPy5pZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHZvaWNlUmVjb3JkaW5nUmVhZHkocmVjb3JkaW5nOiBBdWRpb1JlY29yZGluZykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLnVwbG9hZFZvaWNlUmVjb3JkaW5nKHJlY29yZGluZyk7XG4gICAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLnNlbmRWb2ljZVJlY29yZGluZ0ltbWVkaWF0ZWx5KSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWVzc2FnZVNlbnQoKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy52b2ljZVJlY29yZGVyU2VydmljZS5pc1JlY29yZGVyVmlzaWJsZSQubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzVXBkYXRlKCkge1xuICAgIHJldHVybiAhIXRoaXMubWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZHJhZnQgRHJhZnRSZXNwb25zZSB0byBsb2FkIGludG8gdGhlIG1lc3NhZ2UgaW5wdXQuXG4gICAqIC0gRHJhZnQgbWVzc2FnZXMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciBuZXcgbWVzc2FnZXMsIGlucHV0IGlzIGlnbm9yZWQgaW4gZWRpdCBtb2RlIChpZiBgbWVzc2FnZWAgaW5wdXQgaXMgc2V0KS5cbiAgICogLSBJZiBjaGFubmVsIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIGFjdGl2ZSBjaGFubmVsIGlkLCB0aGUgZHJhZnQgaXMgaWdub3JlZC5cbiAgICogLSBJZiBhIHRocmVhZCBtZXNzYWdlIGlzIGxvYWRlZCwgYW5kIHRoZSBpbnB1dCBpc24ndCBpbiB0aHJlYWQgbW9kZSBvciBwYXJlbnQgaWRzIGRvbid0IG1hdGNoLCB0aGUgZHJhZnQgaXMgaWdub3JlZC5cbiAgICovXG4gIGxvYWREcmFmdChkcmFmdDogRHJhZnRSZXNwb25zZSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY2hhbm5lbD8uY2lkICE9PSBkcmFmdC5jaGFubmVsX2NpZCB8fFxuICAgICAgZHJhZnQ/Lm1lc3NhZ2U/LnBhcmVudF9pZCAhPT0gdGhpcy5wYXJlbnRNZXNzYWdlSWQgfHxcbiAgICAgIHRoaXMuaXNVcGRhdGVcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0xvYWRpbmdEcmFmdCA9IHRydWU7XG5cbiAgICB0aGlzLnRleHRhcmVhVmFsdWUgPSBkcmFmdC5tZXNzYWdlPy50ZXh0IHx8ICcnO1xuICAgIHRoaXMubWVudGlvbmVkVXNlcnMgPVxuICAgICAgZHJhZnQ/Lm1lc3NhZ2U/Lm1lbnRpb25lZF91c2Vycz8ubWFwKChpZCkgPT4gKHsgaWQgfSkpIHx8IFtdO1xuICAgIHRoaXMucG9sbElkID0gZHJhZnQ/Lm1lc3NhZ2U/LnBvbGxfaWQ7XG4gICAgdGhpcy5hdHRhY2htZW50U2VydmljZS5yZXNldEF0dGFjaG1lbnRVcGxvYWRzKCk7XG4gICAgdGhpcy5hdHRhY2htZW50U2VydmljZS5jcmVhdGVGcm9tQXR0YWNobWVudHMoXG4gICAgICBkcmFmdD8ubWVzc2FnZT8uYXR0YWNobWVudHMgfHwgW11cbiAgICApO1xuICAgIHRoaXMuY2hhbm5lbFNlcnZpY2Uuc2VsZWN0TWVzc2FnZVRvUXVvdGUoZHJhZnQucXVvdGVkX21lc3NhZ2UpO1xuICAgIHRoaXMuaXNMb2FkaW5nRHJhZnQgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlVXBsb2FkKHVwbG9hZDogQXR0YWNobWVudFVwbG9hZCkge1xuICAgIGlmICh0aGlzLmlzVXBkYXRlKSB7XG4gICAgICAvLyBEZWxheSBkZWxldGUgdG8gYXZvaWQgbW9kYWwgZGV0ZWN0aW5nIHRoaXMgY2xpY2sgYXMgb3V0c2lkZSBjbGlja1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHZvaWQgdGhpcy5hdHRhY2htZW50U2VydmljZS5kZWxldGVBdHRhY2htZW50KHVwbG9hZCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm9pZCB0aGlzLmF0dGFjaG1lbnRTZXJ2aWNlLmRlbGV0ZUF0dGFjaG1lbnQodXBsb2FkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJldHJ5VXBsb2FkKGZpbGU6IEZpbGUpIHtcbiAgICB2b2lkIHRoaXMuYXR0YWNobWVudFNlcnZpY2UucmV0cnlBdHRhY2htZW50VXBsb2FkKGZpbGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckZpbGVJbnB1dCgpIHtcbiAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGluaXRUZXh0YXJlYSgpIHtcbiAgICAvLyBjbGVhbnVwIHByZXZpb3VzbHkgYnVpbHQgdGV4dGFyZWFcbiAgICBpZiAoIXRoaXMuY2FuU2VuZE1lc3NhZ2VzKSB7XG4gICAgICB0aGlzLnRleHRhcmVhUmVmID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jYW5TZW5kTWVzc2FnZXMgfHwgdGhpcy50ZXh0YXJlYVJlZiB8fCAhdGhpcy50ZXh0YXJlYUFuY2hvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPVxuICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodGhpcy50ZXh0YXJlYVR5cGUpO1xuICAgIHRoaXMudGV4dGFyZWFSZWYgPVxuICAgICAgdGhpcy50ZXh0YXJlYUFuY2hvci52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudDxUZXh0YXJlYUludGVyZmFjZT4oXG4gICAgICAgIGNvbXBvbmVudEZhY3RvcnlcbiAgICAgICk7XG4gICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHNldENhblNlbmRNZXNzYWdlcygpIHtcbiAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSB0aGlzLmNoYW5uZWw/LmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW107XG4gICAgaWYgKCFjYXBhYmlsaXRpZXMpIHtcbiAgICAgIHRoaXMuY2FuU2VuZE1lc3NhZ2VzID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FuU2VuZE1lc3NhZ2VzID1cbiAgICAgICAgY2FwYWJpbGl0aWVzLmluZGV4T2YoXG4gICAgICAgICAgdGhpcy5tb2RlID09PSAnbWFpbicgPyAnc2VuZC1tZXNzYWdlJyA6ICdzZW5kLXJlcGx5J1xuICAgICAgICApICE9PSAtMSB8fCB0aGlzLmlzVXBkYXRlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5pbml0VGV4dGFyZWEoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBwYXJlbnRNZXNzYWdlSWQoKSB7XG4gICAgbGV0IHBhcmVudE1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICd0aHJlYWQnKSB7XG4gICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZCRcbiAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgLnN1YnNjcmliZSgoaWQpID0+IChwYXJlbnRNZXNzYWdlSWQgPSBpZCkpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnRNZXNzYWdlSWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q29vbGRvd24oY29vbGRvd246IG51bWJlcikge1xuICAgIHRoaXMudGV4dGFyZWFQbGFjZWhvbGRlciA9IHRoaXMuc2xvd01vZGVUZXh0YXJlYVBsYWNlaG9sZGVyO1xuICAgIHRoaXMuaXNDb29sZG93bkluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIHRoaXMuY29vbGRvd24kID0gdGltZXIoMCwgMTAwMCkucGlwZShcbiAgICAgIHRha2UoY29vbGRvd24gKyAxKSxcbiAgICAgIG1hcCgodikgPT4gY29vbGRvd24gLSB2KSxcbiAgICAgIHRhcCgodikgPT4ge1xuICAgICAgICBpZiAodiA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc3RvcENvb2xkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENvb2xkb3duKCkge1xuICAgIHRoaXMuY29vbGRvd24kID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNDb29sZG93bkluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLnRleHRhcmVhUGxhY2Vob2xkZXIgPSB0aGlzLmRlZmF1bHRUZXh0YXJlYVBsYWNlaG9sZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmSW5FZGl0TW9kZSgpIHtcbiAgICBpZiAoIXRoaXMud2F0Y2hGb3JNZXNzYWdlVG9FZGl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5tZXNzYWdlVG9FZGl0ICYmIHRoaXMubWVzc2FnZSkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5tZXNzYWdlVG9VcGRhdGVDaGFuZ2VkKCk7XG4gICAgICBpZiAodGhpcy5pc1ZpZXdJbml0ZWQpIHtcbiAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMubWVzc2FnZVRvRWRpdCAmJlxuICAgICAgKCh0aGlzLm1vZGUgPT09ICdtYWluJyAmJiAhdGhpcy5tZXNzYWdlVG9FZGl0LnBhcmVudF9pZCkgfHxcbiAgICAgICAgKHRoaXMubW9kZSA9PT0gJ3RocmVhZCcgJiYgdGhpcy5tZXNzYWdlVG9FZGl0LnBhcmVudF9pZCkpXG4gICAgKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VUb0VkaXQ7XG4gICAgICB0aGlzLm1lc3NhZ2VUb1VwZGF0ZUNoYW5nZWQoKTtcbiAgICAgIGlmICh0aGlzLmlzVmlld0luaXRlZCkge1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VUb1VwZGF0ZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5hdHRhY2htZW50U2VydmljZS5yZXNldEF0dGFjaG1lbnRVcGxvYWRzKCk7XG4gICAgdGhpcy5zZXRDYW5TZW5kTWVzc2FnZXMoKTtcbiAgICBpZiAodGhpcy5pc1VwZGF0ZSkge1xuICAgICAgdGhpcy5hdHRhY2htZW50U2VydmljZS5jcmVhdGVGcm9tQXR0YWNobWVudHMoXG4gICAgICAgIHRoaXMubWVzc2FnZSEuYXR0YWNobWVudHMgfHwgW11cbiAgICAgICk7XG4gICAgICB0aGlzLnRleHRhcmVhVmFsdWUgPSB0aGlzLm1lc3NhZ2UhLnRleHQgfHwgJyc7XG4gICAgICB0aGlzLnBvbGxJZCA9IHRoaXMubWVzc2FnZSEucG9sbF9pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXh0YXJlYVZhbHVlID0gJyc7XG4gICAgICB0aGlzLnBvbGxJZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1pbnB1dCBzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWlucHV0XCJcbiAgW3N0eWxlLmRpc3BsYXldPVwiaXNWb2ljZVJlY29yZGluZyA/ICdub25lJyA6ICdmbGV4J1wiXG4+XG4gIDxkaXYgKm5nSWY9XCJxdW90ZWRNZXNzYWdlXCIgY2xhc3M9XCJzdHItY2hhdF9fcXVvdGVkLW1lc3NhZ2UtcHJldmlldy1oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX3F1b3RlZC1tZXNzYWdlLXJlcGx5LXRvLW1lc3NhZ2VcIj5cbiAgICAgIHt7IFwic3RyZWFtQ2hhdC5SZXBseSB0byBNZXNzYWdlXCIgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS1yZW1vdmVcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJyZW1vdmUtcXVvdGVcIlxuICAgICAgKGNsaWNrKT1cImRlc2VsZWN0TWVzc2FnZVRvUXVvdGUoKVwiXG4gICAgICAoa2V5dXAuZW50ZXIpPVwiZGVzZWxlY3RNZXNzYWdlVG9RdW90ZSgpXCJcbiAgICA+XG4gICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cImNsb3NlXCIgLz5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJpc1VwZGF0ZVwiIGNsYXNzPVwic3RyLWNoYXRfX3F1b3RlZC1tZXNzYWdlLXByZXZpZXctaGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS1yZXBseS10by1tZXNzYWdlXCI+XG4gICAgICB7eyBcInN0cmVhbUNoYXQuRWRpdCBNZXNzYWdlXCIgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS1yZW1vdmVcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJyZW1vdmUtcXVvdGVcIlxuICAgICAgKGNsaWNrKT1cImRlc2VsZWN0TWVzc2FnZVRvRWRpdCgpXCJcbiAgICAgIChrZXl1cC5lbnRlcik9XCJkZXNlbGVjdE1lc3NhZ2VUb0VkaXQoKVwiXG4gICAgPlxuICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyIGljb249XCJjbG9zZVwiIC8+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FuU2VuZE1lc3NhZ2VzOyBlbHNlIG5vdEFsbG93ZWRcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWlucHV0LWlubmVyIHN0ci1jaGF0LWFuZ3VsYXJfX21lc3NhZ2UtaW5wdXQtaW5uZXJcIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttZXNzYWdlLWlucHV0LXN0YXJ0XVwiPjwvbmctY29udGVudD5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJpc0ZpbGVVcGxvYWRFbmFibGVkICYmIGlzRmlsZVVwbG9hZEF1dGhvcml6ZWQgJiYgY2FuU2VuZE1lc3NhZ2VzXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBjdXN0b21BdHRhY2htZW50VXBsb2FkVGVtcGxhdGUgfHwgZGVmYXVsdEF0dGFjaG1lbnRVcGxvYWQ7XG4gICAgICAgICAgICBjb250ZXh0OiBnZXRBdHRhY2htZW50VXBsb2FkQ29udGV4dCgpXG4gICAgICAgICAgXCJcbiAgICAgICAgLz5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0QXR0YWNobWVudFVwbG9hZD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19maWxlLWlucHV0LWNvbnRhaW5lclwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZpbGUtdXBsb2FkLWJ1dHRvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICNmaWxlSW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19maWxlLWlucHV0XCJcbiAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmaWxlLWlucHV0XCJcbiAgICAgICAgICAgICAgW211bHRpcGxlXT1cImlzTXVsdGlwbGVGaWxlVXBsb2FkRW5hYmxlZFwiXG4gICAgICAgICAgICAgIGlkPVwie3sgZmlsZUlucHV0SWQgfX1cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgKGF0dGFjaG1lbnRTZXJ2aWNlLmF0dGFjaG1lbnRzQ291bnRlciQgfCBhc3luYykhID49XG4gICAgICAgICAgICAgICAgYXR0YWNobWVudFNlcnZpY2UubWF4TnVtYmVyT2ZBdHRhY2htZW50c1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImZpbGVzU2VsZWN0ZWQoZmlsZUlucHV0LmZpbGVzKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3RyLWNoYXRfX2ZpbGUtaW5wdXQtbGFiZWxcIiBmb3I9XCJ7eyBmaWxlSW5wdXRJZCB9fVwiPlxuICAgICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cImF0dGFjaFwiIC8+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY2FuU2VuZFBvbGxzICYmIGRpc3BsYXlQb2xsQ3JlYXRlQnV0dG9uICYmIG1vZGUgIT09ICd0aHJlYWQnXCJcbiAgICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXQtYW5ndWxhcl9fY3JlYXRlLXBvbGxcIlxuICAgICAgICAgIChjbGljayk9XCJvcGVuUG9sbENvbXBvc2VyKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyIGljb249XCJwb2xsXCIgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS10ZXh0YXJlYS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwicXVvdGVkTWVzc2FnZVwiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJxdW90ZWQtbWVzc2FnZS1jb250YWluZXJcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3F1b3RlZC1tZXNzYWdlLXByZXZpZXdcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwicW91dGVkLW1lc3NhZ2UtYXZhdGFyXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXQtYW5ndWxhcl9fYXZhdGFyLWhvc3Qgc3RyLWNoYXRfX21lc3NhZ2Utc2VuZGVyLWF2YXRhclwiXG4gICAgICAgICAgICB0eXBlPVwidXNlclwiXG4gICAgICAgICAgICBsb2NhdGlvbj1cInF1b3RlZC1tZXNzYWdlLXNlbmRlclwiXG4gICAgICAgICAgICBbaW1hZ2VVcmxdPVwicXVvdGVkTWVzc2FnZS51c2VyPy5pbWFnZVwiXG4gICAgICAgICAgICBbbmFtZV09XCJxdW90ZWRNZXNzYWdlLnVzZXI/Lm5hbWUgfHwgcXVvdGVkTWVzc2FnZS51c2VyPy5pZFwiXG4gICAgICAgICAgICBbdXNlcl09XCJxdW90ZWRNZXNzYWdlLnVzZXIgfHwgdW5kZWZpbmVkXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwicXVvdGVkLW1lc3NhZ2UtcHJldmlldy1jb250ZW50LWlubmVyIHN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS1idWJibGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdHJlYW0tYXR0YWNobWVudC1saXN0XG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgcXVvdGVkTWVzc2FnZT8uYXR0YWNobWVudHMgJiYgcXVvdGVkTWVzc2FnZT8uYXR0YWNobWVudHM/Lmxlbmd0aFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbYXR0YWNobWVudHNdPVwicXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRzXCJcbiAgICAgICAgICAgICAgW21lc3NhZ2VJZF09XCJxdW90ZWRNZXNzYWdlLmlkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgcXVvdGVkTWVzc2FnZT8ucG9sbF9pZCAmJlxuICAgICAgICAgICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnBvbGxUZW1wbGF0ZSQgfCBhc3luYylcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5wb2xsVGVtcGxhdGUkIHwgYXN5bmMpITtcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgcG9sbElkOiBxdW90ZWRNZXNzYWdlPy5wb2xsX2lkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IHF1b3RlZE1lc3NhZ2U/LmlkLFxuICAgICAgICAgICAgICAgICAgICBpc1F1b3RlOiB0cnVlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS10ZXh0XCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UubWVzc2FnZVRleHRUZW1wbGF0ZSQgfCBhc3luYykgfHxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRleHQ7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiBnZXRRdW90ZWRNZXNzYWdlVGV4dENvbnRleHQoKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICNkZWZhdWx0VGV4dFxuICAgICAgICAgICAgICAgIGxldC1tZXNzYWdlPVwibWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgbGV0LWlzUXVvdGVkPVwiaXNRdW90ZWRcIlxuICAgICAgICAgICAgICAgIGxldC1zaG91bGRUcmFuc2xhdGU9XCJzaG91bGRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHN0cmVhbS1tZXNzYWdlLXRleHRcbiAgICAgICAgICAgICAgICAgIFttZXNzYWdlXT1cIm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgW2lzUXVvdGVkXT1cImlzUXVvdGVkXCJcbiAgICAgICAgICAgICAgICAgIFtzaG91bGRUcmFuc2xhdGVdPVwic2hvdWxkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwicXVvdGVkLW1lc3NhZ2UtdGV4dFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgI2RlZmF1bHRBdHRhY2htZW50c1ByZXZpZXdcbiAgICAgICAgICBsZXQtYXR0YWNobWVudFVwbG9hZHMkPVwiYXR0YWNobWVudFVwbG9hZHMkXCJcbiAgICAgICAgICBsZXQtcmV0cnlVcGxvYWRIYW5kbGVyPVwicmV0cnlVcGxvYWRIYW5kbGVyXCJcbiAgICAgICAgICBsZXQtZGVsZXRlVXBsb2FkSGFuZGxlcj1cImRlbGV0ZVVwbG9hZEhhbmRsZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN0cmVhbS1hdHRhY2htZW50LXByZXZpZXctbGlzdFxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fYXR0YWNobWVudC1wcmV2aWV3LWxpc3QtYW5ndWxhci1ob3N0XCJcbiAgICAgICAgICAgIFthdHRhY2htZW50VXBsb2FkcyRdPVwiYXR0YWNobWVudFVwbG9hZHMkXCJcbiAgICAgICAgICAgIChyZXRyeUF0dGFjaG1lbnRVcGxvYWQpPVwicmV0cnlVcGxvYWRIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgKGRlbGV0ZUF0dGFjaG1lbnQpPVwiZGVsZXRlVXBsb2FkSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIGF0dGFjaG1lbnRQcmV2aWV3TGlzdFRlbXBsYXRlIHx8IGRlZmF1bHRBdHRhY2htZW50c1ByZXZpZXc7XG4gICAgICAgICAgICBjb250ZXh0OiBnZXRBdHRhY2htZW50UHJldmlld0xpc3RDb250ZXh0KClcbiAgICAgICAgICBcIlxuICAgICAgICAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtdGV4dGFyZWEtd2l0aC1lbW9qaS1waWNrZXJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBzdHJlYW1UZXh0YXJlYVxuICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJ0ZXh0YXJlYVJlZlwiXG4gICAgICAgICAgICBbYXJlTWVudGlvbnNFbmFibGVkXT1cImFyZU1lbnRpb25zRW5hYmxlZFwiXG4gICAgICAgICAgICBbbWVudGlvblNjb3BlXT1cIm1lbnRpb25TY29wZVwiXG4gICAgICAgICAgICBbaW5wdXRNb2RlXT1cImlucHV0TW9kZVwiXG4gICAgICAgICAgICBbYXV0b0ZvY3VzXT1cImF1dG9Gb2N1c1wiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidGV4dGFyZWFQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbKHZhbHVlKV09XCJ0ZXh0YXJlYVZhbHVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ0eXBpbmdTdGFydCQubmV4dCgpOyB1cGRhdGVNZXNzYWdlRHJhZnQoKVwiXG4gICAgICAgICAgICAoc2VuZCk9XCJtZXNzYWdlU2VudCgpXCJcbiAgICAgICAgICAgICh1c2VyTWVudGlvbnMpPVwidXNlck1lbnRpb25zQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChwYXN0ZUZyb21DbGlwYm9hcmQpPVwiaXRlbXNQYXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW1vamlQaWNrZXJUZW1wbGF0ZVwiIGRhdGEtdGVzdGlkPVwiZW1vamktcGlja2VyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgZW1vamlQaWNrZXJUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBnZXRFbW9qaVBpY2tlckNvbnRleHQoKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJjYW5TZW5kTWVzc2FnZXMgJiYgIWlzQ29vbGRvd25JblByb2dyZXNzICYmIGRpc3BsYXlTZW5kQnV0dG9uXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJzZW5kLWJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3NlbmQtYnV0dG9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgIChhdHRhY2htZW50VXBsb2FkSW5Qcm9ncmVzc0NvdW50ZXIkIHwgYXN5bmMpISA+IDAgfHxcbiAgICAgICAgICAoYXR0YWNobWVudFNlcnZpY2UuYXR0YWNobWVudHNDb3VudGVyJCB8IGFzeW5jKSEgPlxuICAgICAgICAgICAgYXR0YWNobWVudFNlcnZpY2UubWF4TnVtYmVyT2ZBdHRhY2htZW50cyB8fFxuICAgICAgICAgICghdGV4dGFyZWFWYWx1ZSAmJlxuICAgICAgICAgICAgKGF0dGFjaG1lbnRVcGxvYWRzJCB8IGFzeW5jKSEubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAoY3VzdG9tQXR0YWNobWVudHMkIHwgYXN5bmMpIS5sZW5ndGggPT09IDApXG4gICAgICAgIFwiXG4gICAgICAgIChjbGljayk9XCJtZXNzYWdlU2VudCgpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cIm1lc3NhZ2VTZW50KClcIlxuICAgICAgPlxuICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cInNlbmRcIiAvPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiaXNDb29sZG93bkluUHJvZ3Jlc3NcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWlucHV0LWNvb2xkb3duXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJjb29sZG93bi10aW1lclwiXG4gICAgICA+XG4gICAgICAgIHt7IGNvb2xkb3duJCB8IGFzeW5jIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJkaXNwbGF5Vm9pY2VSZWNvcmRpbmdCdXR0b25cIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19zdGFydC1yZWNvcmRpbmctYXVkaW8tYnV0dG9uXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJzdGFydC12b2ljZS1yZWNvcmRpbmdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgdm9pY2VSZWNvcmRlclNlcnZpY2UuaXNSZWNvcmRlclZpc2libGUkLnZhbHVlIHx8XG4gICAgICAgICAgYXVkaW9SZWNvcmRlcj8uaXNSZWNvcmRpbmcgfHxcbiAgICAgICAgICAoYXR0YWNobWVudFNlcnZpY2UuYXR0YWNobWVudHNDb3VudGVyJCB8IGFzeW5jKSEgPj1cbiAgICAgICAgICAgIGF0dGFjaG1lbnRTZXJ2aWNlLm1heE51bWJlck9mQXR0YWNobWVudHNcbiAgICAgICAgXCJcbiAgICAgICAgKGNsaWNrKT1cInN0YXJ0Vm9pY2VSZWNvcmRpbmcoKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJzdGFydFZvaWNlUmVjb3JkaW5nKClcIlxuICAgICAgPlxuICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXIgaWNvbj1cIm1pY1wiIC8+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttZXNzYWdlLWlucHV0LWVuZF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctdGVtcGxhdGUgI25vdEFsbG93ZWQ+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1pbnB1dC1ub3QtYWxsb3dlZFwiXG4gICAgICBkYXRhLXRlc3RpZD1cImRpc2FibGVkLXRleHRhcmVhXCJcbiAgICA+XG4gICAgICB7eyBkaXNhYmxlZFRleHRhcmVhVGV4dCB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG48bmctdGVtcGxhdGVcbiAgKm5nSWY9XCJ2b2ljZVJlY29yZGVyUmVmXCJcbiAgW25nVGVtcGxhdGVPdXRsZXRdPVwidm9pY2VSZWNvcmRlclJlZlwiXG4gIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHNlcnZpY2U6IHZvaWNlUmVjb3JkZXJTZXJ2aWNlIH1cIlxuPjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGVcbiAgKm5nSWY9XCJcbiAgICBpc0NvbXBvc2VyT3BlbiAmJiAoY3VzdG9tVGVtcGxhdGVzU2VydmljZS5wb2xsQ29tcG9zZXJUZW1wbGF0ZSQgfCBhc3luYylcbiAgXCJcbiAgW25nVGVtcGxhdGVPdXRsZXRdPVwiKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UucG9sbENvbXBvc2VyVGVtcGxhdGUkIHwgYXN5bmMpIVwiXG4gIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgcG9sbENvbXBvc2U6IGFkZFBvbGwsXG4gICAgY2FuY2VsOiBjbG9zZVBvbGxDb21wb3NlclxuICB9XCJcbj48L25nLXRlbXBsYXRlPlxuIl19
@@ -84,13 +84,13 @@ export class TextareaComponent {
84
84
  this.messageInput.nativeElement.style.height = '';
85
85
  this.messageInput.nativeElement.style.height = `${this.messageInput.nativeElement.scrollHeight}px`;
86
86
  }
87
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextareaComponent, deps: [{ token: i1.EmojiInputService }], target: i0.ɵɵFactoryTarget.Component }); }
88
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TextareaComponent, selector: "stream-textarea", inputs: { value: "value", placeholder: "placeholder", inputMode: "inputMode", autoFocus: "autoFocus" }, outputs: { valueChange: "valueChange", send: "send", pasteFromClipboard: "pasteFromClipboard" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "messageInput", first: true, predicate: ["input"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<textarea\n #input\n data-testid=\"textarea\"\n class=\"rta__textarea str-chat__textarea__textarea str-chat__angular-textarea str-chat__message-textarea\"\n rows=\"1\"\n [value]=\"value || ''\"\n [autofocus]=\"autoFocus\"\n placeholder=\"{{ placeholder | translate }}\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"enterHit($event)\"\n (paste)=\"pasteFromClipboard.emit($event)\"\n></textarea>\n", dependencies: [{ kind: "pipe", type: i2.TranslatePipe, name: "translate" }] }); }
87
89
  }
88
- TextareaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: TextareaComponent, deps: [{ token: i1.EmojiInputService }], target: i0.ɵɵFactoryTarget.Component });
89
- TextareaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: TextareaComponent, selector: "stream-textarea", inputs: { value: "value", placeholder: "placeholder", inputMode: "inputMode", autoFocus: "autoFocus" }, outputs: { valueChange: "valueChange", send: "send", pasteFromClipboard: "pasteFromClipboard" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "messageInput", first: true, predicate: ["input"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<textarea\n #input\n data-testid=\"textarea\"\n class=\"rta__textarea str-chat__textarea__textarea str-chat__angular-textarea str-chat__message-textarea\"\n rows=\"1\"\n [value]=\"value || ''\"\n [autofocus]=\"autoFocus\"\n placeholder=\"{{ placeholder | translate }}\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"enterHit($event)\"\n (paste)=\"pasteFromClipboard.emit($event)\"\n></textarea>\n", dependencies: [{ kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
90
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: TextareaComponent, decorators: [{
90
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextareaComponent, decorators: [{
91
91
  type: Component,
92
92
  args: [{ selector: 'stream-textarea', template: "<textarea\n #input\n data-testid=\"textarea\"\n class=\"rta__textarea str-chat__textarea__textarea str-chat__angular-textarea str-chat__message-textarea\"\n rows=\"1\"\n [value]=\"value || ''\"\n [autofocus]=\"autoFocus\"\n placeholder=\"{{ placeholder | translate }}\"\n (input)=\"inputChanged()\"\n (keydown.enter)=\"enterHit($event)\"\n (paste)=\"pasteFromClipboard.emit($event)\"\n></textarea>\n" }]
93
- }], ctorParameters: function () { return [{ type: i1.EmojiInputService }]; }, propDecorators: { class: [{
93
+ }], ctorParameters: () => [{ type: i1.EmojiInputService }], propDecorators: { class: [{
94
94
  type: HostBinding
95
95
  }], value: [{
96
96
  type: Input
@@ -110,4 +110,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
110
110
  type: ViewChild,
111
111
  args: ['input']
112
112
  }] } });
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtaW5wdXQvdGV4dGFyZWEvdGV4dGFyZWEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtaW5wdXQvdGV4dGFyZWEvdGV4dGFyZWEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDOzs7O0FBTXZCOztHQUVHO0FBTUgsTUFBTSxPQUFPLGlCQUFpQjtJQXdDNUIsWUFBb0IsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFyQ3pDLFVBQUssR0FDbEIsNERBQTRELENBQUM7UUFDL0Q7O1dBRUc7UUFDTSxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3BCOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFLMUI7O1dBRUc7UUFDTSxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzFCOztXQUVHO1FBQ2dCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM1RDs7V0FFRztRQUNnQixTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNuRDs7V0FFRztRQUNnQix1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUtuRSxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFDbkMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFHM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxD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QVM7c0JBQWpCLEtBQUs7Z0JBSUcsU0FBUztzQkFBakIsS0FBSztnQkFJYSxXQUFXO3NCQUE3QixNQUFNO2dCQUlZLElBQUk7c0JBQXRCLE1BQU07Z0JBSVksa0JBQWtCO3NCQUFwQyxNQUFNO2dCQUNxQixZQUFZO3NCQUF2QyxTQUFTO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFbW9qaUlucHV0U2VydmljZSB9IGZyb20gJy4uL2Vtb2ppLWlucHV0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dGFyZWFJbnRlcmZhY2UgfSBmcm9tICcuLi90ZXh0YXJlYS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVXNlclJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuXG4vKipcbiAqIFRoZSBgVGV4dGFyZWFgIGNvbXBvbmVudCBpcyB1c2VkIGJ5IHRoZSBbYE1lc3NhZ2VJbnB1dGBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29tcG9uZW50cy9NZXNzYWdlSW5wdXRDb21wb25lbnQvKSBjb21wb25lbnQgdG8gZGlzcGxheSB0aGUgaW5wdXQgSFRNTCBlbGVtZW50IHdoZXJlIHVzZXJzIGNhbiB0eXBlIHRoZWlyIG1lc3NhZ2UuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS10ZXh0YXJlYScsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXh0YXJlYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIFRleHRhcmVhQ29tcG9uZW50XG4gIGltcGxlbWVudHMgVGV4dGFyZWFJbnRlcmZhY2UsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XG57XG4gIEBIb3N0QmluZGluZygpIGNsYXNzID1cbiAgICAnc3RyLWNoYXRfX3RleHRhcmVhIHN0ci1jaGF0X19tZXNzYWdlLXRleHRhcmVhLWFuZ3VsYXItaG9zdCc7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIGlucHV0IEhUTUwgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlID0gJyc7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciBvZiB0aGUgdGV4dGFyZWFcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG4gIC8qKlxuICAgKiBTZWUgW2BNZXNzYWdlSW5wdXRDb25maWdTZXJ2aWNlYF0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9NZXNzYWdlSW5wdXRDb25maWdTZXJ2aWNlKSBmb3IgbW9yZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgQElucHV0KCkgaW5wdXRNb2RlITogJ2Rlc2t0b3AnIHwgJ21vYmlsZSc7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGF1dG8gZm9jdXMgb24gdGhlIHRleHRhcmVhIGVsZW1lbnRcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IHRydWU7XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaW5wdXQgZWxlbWVudCB3aGVuIGEgdXNlciB0eXBlcy5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKipcbiAgICogRW1pdHMgd2hlbiBhIHVzZXIgdHJpZ2dlcnMgYSBtZXNzYWdlIHNlbmQgZXZlbnQgKHRoaXMgaGFwcGVucyB3aGVuIHRoZXkgaGl0IHRoZSBgRW50ZXJgIGtleSkuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIEVtaXRzIGFueSBwYXN0ZSBldmVudCB0aGF0IG9jY3VyZWQgaW5zaWRlIHRoZSB0ZXh0YXJlYVxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHBhc3RlRnJvbUNsaXBib2FyZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2xpcGJvYXJkRXZlbnQ+KCk7XG4gIEBWaWV3Q2hpbGQoJ2lucHV0JykgcHJpdmF0ZSBtZXNzYWdlSW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICB1c2VyTWVudGlvbnM/OiBFdmVudEVtaXR0ZXI8VXNlclJlc3BvbnNlW10+IHwgdW5kZWZpbmVkO1xuICBhcmVNZW50aW9uc0VuYWJsZWQ/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBtZW50aW9uU2NvcGU/OiAnY2hhbm5lbCcgfCAnYXBwbGljYXRpb24nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgaXNWaWV3SW5pdGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbW9qaUlucHV0U2VydmljZTogRW1vamlJbnB1dFNlcnZpY2UpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuZW1vamlJbnB1dFNlcnZpY2UuZW1vamlJbnB1dCQuc3Vic2NyaWJlKChlbW9qaSkgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQgfSA9IHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0UmFuZ2VUZXh0KGVtb2ppKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlSW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9XG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQhICsgZW1vamkubGVuZ3RoO1xuICAgICAgICB0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCA9XG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQhICsgZW1vamkubGVuZ3RoO1xuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlZCgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLnZhbHVlICYmICF0aGlzLnZhbHVlICYmIHRoaXMubWVzc2FnZUlucHV0KSB7XG4gICAgICB0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY2hhbmdlcy52YWx1ZSAmJlxuICAgICAgdGhpcy52YWx1ZSAmJlxuICAgICAgdGhpcy5tZXNzYWdlSW5wdXQgJiZcbiAgICAgIHRoaXMuaXNWaWV3SW5pdGVkXG4gICAgKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gMCkge1xuICAgICAgICAgIHRoaXMuYWRqdXN0VGV4dGFyZWFIZWlnaHQoKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3SW5pdGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5tZXNzYWdlSW5wdXQubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgPiAwICYmIHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMuYWRqdXN0VGV4dGFyZWFIZWlnaHQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIGlucHV0Q2hhbmdlZCgpIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5tZXNzYWdlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSk7XG4gICAgdGhpcy5hZGp1c3RUZXh0YXJlYUhlaWdodCgpO1xuICB9XG5cbiAgZW50ZXJIaXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaW5wdXRNb2RlID09PSAnZGVza3RvcCcgJiYgIShldmVudCBhcyBLZXlib2FyZEV2ZW50KS5pc0NvbXBvc2luZykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2VuZC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RUZXh0YXJlYUhlaWdodCgpIHtcbiAgICB0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgIHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5tZXNzYWdlSW5wdXQubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHR9cHhgO1xuICB9XG59XG4iLCI8dGV4dGFyZWFcbiAgI2lucHV0XG4gIGRhdGEtdGVzdGlkPVwidGV4dGFyZWFcIlxuICBjbGFzcz1cInJ0YV9fdGV4dGFyZWEgc3RyLWNoYXRfX3RleHRhcmVhX190ZXh0YXJlYSBzdHItY2hhdF9fYW5ndWxhci10ZXh0YXJlYSBzdHItY2hhdF9fbWVzc2FnZS10ZXh0YXJlYVwiXG4gIHJvd3M9XCIxXCJcbiAgW3ZhbHVlXT1cInZhbHVlIHx8ICcnXCJcbiAgW2F1dG9mb2N1c109XCJhdXRvRm9jdXNcIlxuICBwbGFjZWhvbGRlcj1cInt7IHBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlIH19XCJcbiAgKGlucHV0KT1cImlucHV0Q2hhbmdlZCgpXCJcbiAgKGtleWRvd24uZW50ZXIpPVwiZW50ZXJIaXQoJGV2ZW50KVwiXG4gIChwYXN0ZSk9XCJwYXN0ZUZyb21DbGlwYm9hcmQuZW1pdCgkZXZlbnQpXCJcbj48L3RleHRhcmVhPlxuIl19
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtaW5wdXQvdGV4dGFyZWEvdGV4dGFyZWEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL21lc3NhZ2UtaW5wdXQvdGV4dGFyZWEvdGV4dGFyZWEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDOzs7O0FBTXZCOztHQUVHO0FBTUgsTUFBTSxPQUFPLGlCQUFpQjtJQXdDNUIsWUFBb0IsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFyQ3pDLFVBQUssR0FDbEIsNERBQTRELENBQUM7UUFDL0Q7O1dBRUc7UUFDTSxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3BCOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFLMUI7O1dBRUc7UUFDTSxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzFCOztXQUVHO1FBQ2dCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM1RDs7V0FFRztRQUNnQixTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNuRDs7V0FFRztRQUNnQix1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUtuRSxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFDbkMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFHM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEMsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO1lBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxjQUFjO2dCQUM1QyxjQUFlLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZO2dCQUMxQyxjQUFlLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNqQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQ3ZEO2FBQU0sSUFDTCxPQUFPLENBQUMsS0FBSztZQUNiLElBQUksQ0FBQyxLQUFLO1lBQ1YsSUFBSSxDQUFDLFlBQVk7WUFDakIsSUFBSSxDQUFDLFlBQVksRUFDakI7WUFDQSxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLENBQUMsRUFBRTtvQkFDcEQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7aUJBQzdCO1lBQ0gsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ1A7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2xFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQVk7UUFDbkIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxDQUFFLEtBQXVCLENBQUMsV0FBVyxFQUFFO1lBQ3pFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxJQUFJLENBQUM7SUFDckcsQ0FBQzsrR0FsR1UsaUJBQWlCO21HQUFqQixpQkFBaUIsNmFDMUI5QiwyWkFZQTs7NEZEY2EsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGlCQUFpQjtzRkFPWixLQUFLO3NCQUFuQixXQUFXO2dCQUtILEtBQUs7c0JBQWIsS0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsU0FBUztzQkFBakIsS0FBSztnQkFJYSxXQUFXO3NCQUE3QixNQUFNO2dCQUlZLElBQUk7c0JBQXRCLE1BQU07Z0JBSVksa0JBQWtCO3NCQUFwQyxNQUFNO2dCQUNxQixZQUFZO3NCQUF2QyxTQUFTO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFbW9qaUlucHV0U2VydmljZSB9IGZyb20gJy4uL2Vtb2ppLWlucHV0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dGFyZWFJbnRlcmZhY2UgfSBmcm9tICcuLi90ZXh0YXJlYS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVXNlclJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuXG4vKipcbiAqIFRoZSBgVGV4dGFyZWFgIGNvbXBvbmVudCBpcyB1c2VkIGJ5IHRoZSBbYE1lc3NhZ2VJbnB1dGBdKC9jaGF0L2RvY3Mvc2RrL2FuZ3VsYXIvY29tcG9uZW50cy9NZXNzYWdlSW5wdXRDb21wb25lbnQvKSBjb21wb25lbnQgdG8gZGlzcGxheSB0aGUgaW5wdXQgSFRNTCBlbGVtZW50IHdoZXJlIHVzZXJzIGNhbiB0eXBlIHRoZWlyIG1lc3NhZ2UuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS10ZXh0YXJlYScsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXh0YXJlYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIFRleHRhcmVhQ29tcG9uZW50XG4gIGltcGxlbWVudHMgVGV4dGFyZWFJbnRlcmZhY2UsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XG57XG4gIEBIb3N0QmluZGluZygpIGNsYXNzID1cbiAgICAnc3RyLWNoYXRfX3RleHRhcmVhIHN0ci1jaGF0X19tZXNzYWdlLXRleHRhcmVhLWFuZ3VsYXItaG9zdCc7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIGlucHV0IEhUTUwgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlID0gJyc7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciBvZiB0aGUgdGV4dGFyZWFcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG4gIC8qKlxuICAgKiBTZWUgW2BNZXNzYWdlSW5wdXRDb25maWdTZXJ2aWNlYF0oL2NoYXQvZG9jcy9zZGsvYW5ndWxhci9zZXJ2aWNlcy9NZXNzYWdlSW5wdXRDb25maWdTZXJ2aWNlKSBmb3IgbW9yZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgQElucHV0KCkgaW5wdXRNb2RlITogJ2Rlc2t0b3AnIHwgJ21vYmlsZSc7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGF1dG8gZm9jdXMgb24gdGhlIHRleHRhcmVhIGVsZW1lbnRcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IHRydWU7XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaW5wdXQgZWxlbWVudCB3aGVuIGEgdXNlciB0eXBlcy5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKipcbiAgICogRW1pdHMgd2hlbiBhIHVzZXIgdHJpZ2dlcnMgYSBtZXNzYWdlIHNlbmQgZXZlbnQgKHRoaXMgaGFwcGVucyB3aGVuIHRoZXkgaGl0IHRoZSBgRW50ZXJgIGtleSkuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIEVtaXRzIGFueSBwYXN0ZSBldmVudCB0aGF0IG9jY3VyZWQgaW5zaWRlIHRoZSB0ZXh0YXJlYVxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHBhc3RlRnJvbUNsaXBib2FyZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2xpcGJvYXJkRXZlbnQ+KCk7XG4gIEBWaWV3Q2hpbGQoJ2lucHV0JykgcHJpdmF0ZSBtZXNzYWdlSW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICB1c2VyTWVudGlvbnM/OiBFdmVudEVtaXR0ZXI8VXNlclJlc3BvbnNlW10+IHwgdW5kZWZpbmVkO1xuICBhcmVNZW50aW9uc0VuYWJsZWQ/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBtZW50aW9uU2NvcGU/OiAnY2hhbm5lbCcgfCAnYXBwbGljYXRpb24nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgaXNWaWV3SW5pdGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbW9qaUlucHV0U2VydmljZTogRW1vamlJbnB1dFNlcnZpY2UpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuZW1vamlJbnB1dFNlcnZpY2UuZW1vamlJbnB1dCQuc3Vic2NyaWJlKChlbW9qaSkgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQgfSA9IHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0UmFuZ2VUZXh0KGVtb2ppKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlSW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9XG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQhICsgZW1vamkubGVuZ3RoO1xuICAgICAgICB0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCA9XG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQhICsgZW1vamkubGVuZ3RoO1xuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlZCgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLnZhbHVlICYmICF0aGlzLnZhbHVlICYmIHRoaXMubWVzc2FnZUlucHV0KSB7XG4gICAgICB0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY2hhbmdlcy52YWx1ZSAmJlxuICAgICAgdGhpcy52YWx1ZSAmJlxuICAgICAgdGhpcy5tZXNzYWdlSW5wdXQgJiZcbiAgICAgIHRoaXMuaXNWaWV3SW5pdGVkXG4gICAgKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gMCkge1xuICAgICAgICAgIHRoaXMuYWRqdXN0VGV4dGFyZWFIZWlnaHQoKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3SW5pdGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5tZXNzYWdlSW5wdXQubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgPiAwICYmIHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMuYWRqdXN0VGV4dGFyZWFIZWlnaHQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIGlucHV0Q2hhbmdlZCgpIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5tZXNzYWdlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSk7XG4gICAgdGhpcy5hZGp1c3RUZXh0YXJlYUhlaWdodCgpO1xuICB9XG5cbiAgZW50ZXJIaXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaW5wdXRNb2RlID09PSAnZGVza3RvcCcgJiYgIShldmVudCBhcyBLZXlib2FyZEV2ZW50KS5pc0NvbXBvc2luZykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2VuZC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RUZXh0YXJlYUhlaWdodCgpIHtcbiAgICB0aGlzLm1lc3NhZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgIHRoaXMubWVzc2FnZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5tZXNzYWdlSW5wdXQubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHR9cHhgO1xuICB9XG59XG4iLCI8dGV4dGFyZWFcbiAgI2lucHV0XG4gIGRhdGEtdGVzdGlkPVwidGV4dGFyZWFcIlxuICBjbGFzcz1cInJ0YV9fdGV4dGFyZWEgc3RyLWNoYXRfX3RleHRhcmVhX190ZXh0YXJlYSBzdHItY2hhdF9fYW5ndWxhci10ZXh0YXJlYSBzdHItY2hhdF9fbWVzc2FnZS10ZXh0YXJlYVwiXG4gIHJvd3M9XCIxXCJcbiAgW3ZhbHVlXT1cInZhbHVlIHx8ICcnXCJcbiAgW2F1dG9mb2N1c109XCJhdXRvRm9jdXNcIlxuICBwbGFjZWhvbGRlcj1cInt7IHBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlIH19XCJcbiAgKGlucHV0KT1cImlucHV0Q2hhbmdlZCgpXCJcbiAgKGtleWRvd24uZW50ZXIpPVwiZW50ZXJIaXQoJGV2ZW50KVwiXG4gIChwYXN0ZSk9XCJwYXN0ZUZyb21DbGlwYm9hcmQuZW1pdCgkZXZlbnQpXCJcbj48L3RleHRhcmVhPlxuIl19