@libs-ui/components-inputs-upload 0.2.175 → 0.2.177

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.
@@ -466,7 +466,7 @@ export class LibsUiComponentsInputsUploadComponent {
466
466
  this.onDestroy.complete();
467
467
  }
468
468
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
469
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsInputsUploadComponent, isStandalone: true, selector: "libs_ui-components-inputs-upload", inputs: { originFiles: { classPropertyName: "originFiles", publicName: "originFiles", isSignal: true, isRequired: false, transformFunction: null }, fileType: { classPropertyName: "fileType", publicName: "fileType", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, canUploadIfHasExistFile: { classPropertyName: "canUploadIfHasExistFile", publicName: "canUploadIfHasExistFile", isSignal: true, isRequired: false, transformFunction: null }, canSetAvatar: { classPropertyName: "canSetAvatar", publicName: "canSetAvatar", isSignal: true, isRequired: false, transformFunction: null }, limitFile: { classPropertyName: "limitFile", publicName: "limitFile", isSignal: true, isRequired: false, transformFunction: null }, maxTotalSize: { classPropertyName: "maxTotalSize", publicName: "maxTotalSize", isSignal: true, isRequired: false, transformFunction: null }, maxImageSize: { classPropertyName: "maxImageSize", publicName: "maxImageSize", isSignal: true, isRequired: false, transformFunction: null }, maxVideoSize: { classPropertyName: "maxVideoSize", publicName: "maxVideoSize", isSignal: true, isRequired: false, transformFunction: null }, maxDocumentSize: { classPropertyName: "maxDocumentSize", publicName: "maxDocumentSize", isSignal: true, isRequired: false, transformFunction: null }, maxAudioSize: { classPropertyName: "maxAudioSize", publicName: "maxAudioSize", isSignal: true, isRequired: false, transformFunction: null }, imageExtList: { classPropertyName: "imageExtList", publicName: "imageExtList", isSignal: true, isRequired: false, transformFunction: null }, videoExtList: { classPropertyName: "videoExtList", publicName: "videoExtList", isSignal: true, isRequired: false, transformFunction: null }, documentExtList: { classPropertyName: "documentExtList", publicName: "documentExtList", isSignal: true, isRequired: false, transformFunction: null }, audioExtList: { classPropertyName: "audioExtList", publicName: "audioExtList", isSignal: true, isRequired: false, transformFunction: null }, classIncludeListItem: { classPropertyName: "classIncludeListItem", publicName: "classIncludeListItem", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, aspectRatio: { classPropertyName: "aspectRatio", publicName: "aspectRatio", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowSizeFile: { classPropertyName: "ignoreShowSizeFile", publicName: "ignoreShowSizeFile", isSignal: true, isRequired: false, transformFunction: null }, allowShowPushMessageMaxSizeError: { classPropertyName: "allowShowPushMessageMaxSizeError", publicName: "allowShowPushMessageMaxSizeError", isSignal: true, isRequired: false, transformFunction: null }, messageTypeFileError: { classPropertyName: "messageTypeFileError", publicName: "messageTypeFileError", isSignal: true, isRequired: false, transformFunction: null }, messageMaxSizeError: { classPropertyName: "messageMaxSizeError", publicName: "messageMaxSizeError", isSignal: true, isRequired: false, transformFunction: null }, messageFileUploadError: { classPropertyName: "messageFileUploadError", publicName: "messageFileUploadError", isSignal: true, isRequired: false, transformFunction: null }, messageTotalFileExceedsError: { classPropertyName: "messageTotalFileExceedsError", publicName: "messageTotalFileExceedsError", isSignal: true, isRequired: false, transformFunction: null }, configDescriptionInputUpload: { classPropertyName: "configDescriptionInputUpload", publicName: "configDescriptionInputUpload", isSignal: true, isRequired: false, transformFunction: null }, modeDisplayFile: { classPropertyName: "modeDisplayFile", publicName: "modeDisplayFile", isSignal: true, isRequired: false, transformFunction: null }, descriptionFormatAndSizeFile: { classPropertyName: "descriptionFormatAndSizeFile", publicName: "descriptionFormatAndSizeFile", isSignal: true, isRequired: false, transformFunction: null }, showVideoDuration: { classPropertyName: "showVideoDuration", publicName: "showVideoDuration", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, showBlockUploadWhenHasFileAndModeSingle: { classPropertyName: "showBlockUploadWhenHasFileAndModeSingle", publicName: "showBlockUploadWhenHasFileAndModeSingle", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconRemove: { classPropertyName: "ignoreIconRemove", publicName: "ignoreIconRemove", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconEdit: { classPropertyName: "ignoreIconEdit", publicName: "ignoreIconEdit", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconPreview: { classPropertyName: "ignoreIconPreview", publicName: "ignoreIconPreview", isSignal: true, isRequired: false, transformFunction: null }, classIncludeFileContent: { classPropertyName: "classIncludeFileContent", publicName: "classIncludeFileContent", isSignal: true, isRequired: false, transformFunction: null }, showBorderErrorAllItemWhenError: { classPropertyName: "showBorderErrorAllItemWhenError", publicName: "showBorderErrorAllItemWhenError", isSignal: true, isRequired: false, transformFunction: null }, configDownloadSampleFile: { classPropertyName: "configDownloadSampleFile", publicName: "configDownloadSampleFile", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outClose: "outClose", outFileChanged: "outFileChanged", outFileRemoved: "outFileRemoved", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "uploadRef", first: true, predicate: ["upload"], descendants: true, isSignal: true }, { propertyName: "uploadInputRef", first: true, predicate: ["uploadInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n <div>\n @if (labelConfig();as labelConfig) {\n <libs_ui-components-label [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required \"\n [description]=\"labelConfig.description\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if ((!configDownloadSampleFile()?.position || configDownloadSampleFile()?.position === 'top') && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mb-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile?.title || ' '\"\n (outClick)=\"handlerDownloadSampleFile($event)\" />\n }\n @if (multiple() || showBlockUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple())) {\n <div #upload\n class=\"libs-ui-components-inputs-upload\"\n [class.libs-ui-components-inputs-upload-disable]=\"disable() || (!multiple() && fileList().length)\"\n [class.libs-ui-components-inputs-upload-error]=\"messageError()\">\n <div class=\"flex items-center\">\n <div class=\"mr-[16px]\">\n <i class=\"libs-ui-components-inputs-upload-icon libs-ui-icon-file-upload before:!text-[32px]\"></i>\n </div>\n <div class=\"libs-ui-components-inputs-upload-description\">\n <div class=\"mb-[4px] libs-ui-font-h6m\"\n [innerHTML]=\"(configDescriptionInputUpload().message || '') | translate:configDescriptionInputUpload().interpolateParams\">\n </div>\n @for (item of descriptionFormatAndSizeFileComputed(); track item; let last = $last) {\n <div class=\"libs-ui-font-h7r\"\n [class.mb-[4px]]=\"!last\"\n [innerHTML]=\"item.message | translate:item.interpolateParams\">\n </div>\n }\n </div>\n </div>\n @if (multiple()) {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n multiple\n [accept]=\"accessFiles()\" />\n } @else {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n [accept]=\"accessFiles()\" />\n }\n </div>\n }\n @if (messageError() && (multiple() || showBlockUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple()))) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n {{ (messageError() || '') | translate:{ value: limitFile() } }}\n </div>\n }\n @if (configDownloadSampleFile()?.position === 'bottom' && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mt-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile.title || ' '\"\n (moClick)=\"handlerDownloadSampleFile($event)\" />\n }\n </div>\n @if (fileList().length) {\n <div LibsUiComponentsScrollOverlayDirective\n class=\"relative w-full h-full px-[10px] libs-ui-components-inputs-upload-view-list {{ classIncludeFileContent() || '' }}\"\n [class.mt-[12px]]=\"multiple() || showBlockUploadWhenHasFileAndModeSingle()\">\n <ng-content select=\"[label-file]\"></ng-content>\n @for (item of fileList(); track item(); let first = $first) {\n <div class=\"libs-ui-components-inputs-upload-view-list-item {{ classIncludeListItem() || '' }}\"\n [class.libs-ui-components-inputs-upload-file-full]=\"modeDisplayFile() === 'full'\"\n [class.libs-ui-components-inputs-upload-file-short]=\"modeDisplayFile() === 'short'\"\n [class.libs-ui-border-error-general]=\"item().error || (messageError() && showBorderErrorAllItemWhenError())\"\n [class.mt-0]=\"first && !multiple() && !showBlockUploadWhenHasFileAndModeSingle()\">\n\n <div class=\"flex w-full\">\n <div class=\"flex items-center\">\n @if (canSetAvatar() && item().type === 'image') {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'!mr-0' + (item().isAvatar ? ' libs-ui-icon-check-circle-solid before:!text-[#00bc62]': ' libs-ui-icon-check-circle-outline') + ((disable() || item().isUploading || !!item().error) ? ' libs-ui-disable' : '')\"\n [popover]=\"{config:{ content: item().isAvatar ? 'i18n_avatar' : 'i18n_choose_as_your_avatar', zIndex: zIndex()}}\"\n [classInclude]=\"'!mr-[12px] !p-0'\"\n [disable]=\"disable() || item().isUploading || !!item().error\"\n (outClick)=\"handlerSetAvatar($event, item)\" />\n }\n </div>\n <div class=\"flex\"\n [class.w-[calc(100%-28px)]]=\"canSetAvatar()\"\n [class.w-full]=\"!canSetAvatar()\">\n @if (modeDisplayFile() === 'full') {\n <libs_ui-components-inputs-upload-avatar [disable]=\"disable()\"\n [(item)]=\"item\"\n [showVideoDuration]=\"showVideoDuration()\"\n (outOpenPreview)=\"handlerOpenPreviewFile($event)\" />\n }\n <div class=\"relative w-full\">\n <div class=\"flex absolute w-full h-full flex-col\"\n [class.flex-col]=\"modeDisplayFile() === 'full'\"\n [class.justify-center]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\">\n <libs_ui-components-label class=\"flex w-full\"\n [labelLeft]=\"item().name\"\n [zIndexPopover]=\"zIndex() + 1\"\n [labelLeftClass]=\"'libs-ui-font-h6m ' + ((disable() || item().isUploading || item().error) ? 'text-[#6a7383]' : 'text-[#071631]')\"\n [classInclude]=\"modeDisplayFile() === 'short' ? '!mb-0' : ''\" />\n\n @if (!ignoreShowSizeFile()) {\n <div class=\"text-[#9ca2ad] libs-ui-font-h7r shrink-0\"\n [class.flex]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\"\n [class.ml-[12px]]=\"modeDisplayFile() === 'short'\">\n {{ item().size }}\n </div>\n }\n </div>\n </div>\n @if (item().isUploading && item().percentUploading) {\n <div class=\"flex items-center ml-[16px]\"\n [class.mr-[26px]]=\"modeDisplayFile() === 'full'\">\n <div class=\"w-[120px] h-[4px] rounded-[4px] bg-[#f8f9fa] relative\">\n <div class=\"absolute top-0 left-0 h-[4px] rounded-[4px] bg-[#00bc62]\"\n [style.width.px]=\"(item().percentUploading ?? 0)*1.2\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex ml-[16px]\">\n @if (!ignoreIconPreview()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-eye-outline !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_preview', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() && !ignoreIconEdit() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerOpenPreviewFile(item())\" />\n }\n @if (item().type === 'image' && !item().error && !ignoreIconEdit()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-edit-line !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_edit', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerEditImage($event, item)\" />\n }\n @if (!ignoreIconRemove()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-close !mr-0'\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0'\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerRemoveFile($event, item)\" />\n }\n </div>\n </div>\n @if (item().error && (multiple() || !showBlockUploadWhenHasFileAndModeSingle())) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">{{ (item().error || ' ') | translate }}</div>\n }\n }\n </div>\n }\n</div>\n", styles: [":host ::ng-deep .libs-ui-components-inputs-upload{width:100%;padding:16px;display:flex;align-items:center;justify-content:center;border-radius:8px;cursor:pointer;background-color:#fff;border:1px dashed #e6e7ea}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-icon:before{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-color-default, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over{background-color:var(--libs-ui-color-light-3, #f4f8ff);border:1px dashed var(--libs-ui-color-light-1, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-icon:before,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description span,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable{cursor:default!important;text-decoration:none;pointer-events:none;background-color:#f8f9fa!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error{background-color:#fef5f6!important;border:1px dashed #ee2d41!important}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-file-full{background-color:#fff;padding:8px 12px}:host ::ng-deep .libs-ui-components-inputs-upload-file-short{background-color:#f4f8ff;padding:6px 12px}.libs-ui-components-inputs-upload-view-list{overflow-y:auto;max-height:100%;padding:0 10px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item{width:100%;display:flex;align-items:center;justify-content:center;border-radius:4px;margin-bottom:8px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item:hover{background-color:#f8f9fa}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsInputsUploadAvatarComponent, selector: "libs_ui-components-inputs-upload-avatar", inputs: ["item", "showVideoDuration", "disable", "size"], outputs: ["itemChange", "outOpenPreview"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
469
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsInputsUploadComponent, isStandalone: true, selector: "libs_ui-components-inputs-upload", inputs: { originFiles: { classPropertyName: "originFiles", publicName: "originFiles", isSignal: true, isRequired: false, transformFunction: null }, fileType: { classPropertyName: "fileType", publicName: "fileType", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, canUploadIfHasExistFile: { classPropertyName: "canUploadIfHasExistFile", publicName: "canUploadIfHasExistFile", isSignal: true, isRequired: false, transformFunction: null }, canSetAvatar: { classPropertyName: "canSetAvatar", publicName: "canSetAvatar", isSignal: true, isRequired: false, transformFunction: null }, limitFile: { classPropertyName: "limitFile", publicName: "limitFile", isSignal: true, isRequired: false, transformFunction: null }, maxTotalSize: { classPropertyName: "maxTotalSize", publicName: "maxTotalSize", isSignal: true, isRequired: false, transformFunction: null }, maxImageSize: { classPropertyName: "maxImageSize", publicName: "maxImageSize", isSignal: true, isRequired: false, transformFunction: null }, maxVideoSize: { classPropertyName: "maxVideoSize", publicName: "maxVideoSize", isSignal: true, isRequired: false, transformFunction: null }, maxDocumentSize: { classPropertyName: "maxDocumentSize", publicName: "maxDocumentSize", isSignal: true, isRequired: false, transformFunction: null }, maxAudioSize: { classPropertyName: "maxAudioSize", publicName: "maxAudioSize", isSignal: true, isRequired: false, transformFunction: null }, imageExtList: { classPropertyName: "imageExtList", publicName: "imageExtList", isSignal: true, isRequired: false, transformFunction: null }, videoExtList: { classPropertyName: "videoExtList", publicName: "videoExtList", isSignal: true, isRequired: false, transformFunction: null }, documentExtList: { classPropertyName: "documentExtList", publicName: "documentExtList", isSignal: true, isRequired: false, transformFunction: null }, audioExtList: { classPropertyName: "audioExtList", publicName: "audioExtList", isSignal: true, isRequired: false, transformFunction: null }, classIncludeListItem: { classPropertyName: "classIncludeListItem", publicName: "classIncludeListItem", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, aspectRatio: { classPropertyName: "aspectRatio", publicName: "aspectRatio", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowSizeFile: { classPropertyName: "ignoreShowSizeFile", publicName: "ignoreShowSizeFile", isSignal: true, isRequired: false, transformFunction: null }, allowShowPushMessageMaxSizeError: { classPropertyName: "allowShowPushMessageMaxSizeError", publicName: "allowShowPushMessageMaxSizeError", isSignal: true, isRequired: false, transformFunction: null }, messageTypeFileError: { classPropertyName: "messageTypeFileError", publicName: "messageTypeFileError", isSignal: true, isRequired: false, transformFunction: null }, messageMaxSizeError: { classPropertyName: "messageMaxSizeError", publicName: "messageMaxSizeError", isSignal: true, isRequired: false, transformFunction: null }, messageFileUploadError: { classPropertyName: "messageFileUploadError", publicName: "messageFileUploadError", isSignal: true, isRequired: false, transformFunction: null }, messageTotalFileExceedsError: { classPropertyName: "messageTotalFileExceedsError", publicName: "messageTotalFileExceedsError", isSignal: true, isRequired: false, transformFunction: null }, configDescriptionInputUpload: { classPropertyName: "configDescriptionInputUpload", publicName: "configDescriptionInputUpload", isSignal: true, isRequired: false, transformFunction: null }, modeDisplayFile: { classPropertyName: "modeDisplayFile", publicName: "modeDisplayFile", isSignal: true, isRequired: false, transformFunction: null }, descriptionFormatAndSizeFile: { classPropertyName: "descriptionFormatAndSizeFile", publicName: "descriptionFormatAndSizeFile", isSignal: true, isRequired: false, transformFunction: null }, showVideoDuration: { classPropertyName: "showVideoDuration", publicName: "showVideoDuration", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, showBlockUploadWhenHasFileAndModeSingle: { classPropertyName: "showBlockUploadWhenHasFileAndModeSingle", publicName: "showBlockUploadWhenHasFileAndModeSingle", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconRemove: { classPropertyName: "ignoreIconRemove", publicName: "ignoreIconRemove", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconEdit: { classPropertyName: "ignoreIconEdit", publicName: "ignoreIconEdit", isSignal: true, isRequired: false, transformFunction: null }, ignoreIconPreview: { classPropertyName: "ignoreIconPreview", publicName: "ignoreIconPreview", isSignal: true, isRequired: false, transformFunction: null }, classIncludeFileContent: { classPropertyName: "classIncludeFileContent", publicName: "classIncludeFileContent", isSignal: true, isRequired: false, transformFunction: null }, showBorderErrorAllItemWhenError: { classPropertyName: "showBorderErrorAllItemWhenError", publicName: "showBorderErrorAllItemWhenError", isSignal: true, isRequired: false, transformFunction: null }, configDownloadSampleFile: { classPropertyName: "configDownloadSampleFile", publicName: "configDownloadSampleFile", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outClose: "outClose", outFileChanged: "outFileChanged", outFileRemoved: "outFileRemoved", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "uploadRef", first: true, predicate: ["upload"], descendants: true, isSignal: true }, { propertyName: "uploadInputRef", first: true, predicate: ["uploadInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n <div>\n @if (labelConfig();as labelConfig) {\n <libs_ui-components-label [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required \"\n [description]=\"labelConfig.description\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if ((!configDownloadSampleFile()?.position || configDownloadSampleFile()?.position === 'top') && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mb-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile?.title || ' '\"\n (outClick)=\"handlerDownloadSampleFile($event)\" />\n }\n @if (multiple() || showBlockUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple())) {\n <div #upload\n class=\"libs-ui-components-inputs-upload\"\n [class.libs-ui-components-inputs-upload-disable]=\"disable() || (!multiple() && fileList().length && !canUploadIfHasExistFile())\"\n [class.libs-ui-components-inputs-upload-error]=\"messageError()\">\n <div class=\"flex items-center\">\n <div class=\"mr-[16px]\">\n <i class=\"libs-ui-components-inputs-upload-icon libs-ui-icon-file-upload before:!text-[32px]\"></i>\n </div>\n <div class=\"libs-ui-components-inputs-upload-description\">\n <div class=\"mb-[4px] libs-ui-font-h6m\"\n [innerHTML]=\"(configDescriptionInputUpload().message || '') | translate:configDescriptionInputUpload().interpolateParams\">\n </div>\n @for (item of descriptionFormatAndSizeFileComputed(); track item; let last = $last) {\n <div class=\"libs-ui-font-h7r\"\n [class.mb-[4px]]=\"!last\"\n [innerHTML]=\"item.message | translate:item.interpolateParams\">\n </div>\n }\n </div>\n </div>\n @if (multiple()) {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n multiple\n [accept]=\"accessFiles()\" />\n } @else {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n [accept]=\"accessFiles()\" />\n }\n </div>\n }\n @if (messageError() && (multiple() || showBlockUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple()))) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n {{ (messageError() || '') | translate:{ value: limitFile() } }}\n </div>\n }\n @if (configDownloadSampleFile()?.position === 'bottom' && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mt-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile.title || ' '\"\n (moClick)=\"handlerDownloadSampleFile($event)\" />\n }\n </div>\n @if (fileList().length) {\n <div LibsUiComponentsScrollOverlayDirective\n class=\"relative w-full h-full px-[10px] libs-ui-components-inputs-upload-view-list {{ classIncludeFileContent() || '' }}\"\n [class.mt-[12px]]=\"multiple() || showBlockUploadWhenHasFileAndModeSingle()\">\n <ng-content select=\"[label-file]\"></ng-content>\n @for (item of fileList(); track item(); let first = $first) {\n <div class=\"libs-ui-components-inputs-upload-view-list-item {{ classIncludeListItem() || '' }}\"\n [class.libs-ui-components-inputs-upload-file-full]=\"modeDisplayFile() === 'full'\"\n [class.libs-ui-components-inputs-upload-file-short]=\"modeDisplayFile() === 'short'\"\n [class.libs-ui-border-error-general]=\"item().error || (messageError() && showBorderErrorAllItemWhenError())\"\n [class.mt-0]=\"first && !multiple() && !showBlockUploadWhenHasFileAndModeSingle()\">\n\n <div class=\"flex w-full\">\n <div class=\"flex items-center\">\n @if (canSetAvatar() && item().type === 'image') {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'!mr-0' + (item().isAvatar ? ' libs-ui-icon-check-circle-solid before:!text-[#00bc62]': ' libs-ui-icon-check-circle-outline') + ((disable() || item().isUploading || !!item().error) ? ' libs-ui-disable' : '')\"\n [popover]=\"{config:{ content: item().isAvatar ? 'i18n_avatar' : 'i18n_choose_as_your_avatar', zIndex: zIndex()}}\"\n [classInclude]=\"'!mr-[12px] !p-0'\"\n [disable]=\"disable() || item().isUploading || !!item().error\"\n (outClick)=\"handlerSetAvatar($event, item)\" />\n }\n </div>\n <div class=\"flex\"\n [class.w-[calc(100%-28px)]]=\"canSetAvatar()\"\n [class.w-full]=\"!canSetAvatar()\">\n @if (modeDisplayFile() === 'full') {\n <libs_ui-components-inputs-upload-avatar [disable]=\"disable()\"\n [(item)]=\"item\"\n [showVideoDuration]=\"showVideoDuration()\"\n (outOpenPreview)=\"handlerOpenPreviewFile($event)\" />\n }\n <div class=\"relative w-full\">\n <div class=\"flex absolute w-full h-full flex-col\"\n [class.flex-col]=\"modeDisplayFile() === 'full'\"\n [class.justify-center]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\">\n <libs_ui-components-label class=\"flex w-full\"\n [labelLeft]=\"item().name\"\n [zIndexPopover]=\"zIndex() + 1\"\n [labelLeftClass]=\"'libs-ui-font-h6m ' + ((disable() || item().isUploading || item().error) ? 'text-[#6a7383]' : 'text-[#071631]')\"\n [classInclude]=\"modeDisplayFile() === 'short' ? '!mb-0' : ''\" />\n\n @if (!ignoreShowSizeFile()) {\n <div class=\"text-[#9ca2ad] libs-ui-font-h7r shrink-0\"\n [class.flex]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\"\n [class.ml-[12px]]=\"modeDisplayFile() === 'short'\">\n {{ item().size }}\n </div>\n }\n </div>\n </div>\n @if (item().isUploading && item().percentUploading) {\n <div class=\"flex items-center ml-[16px]\"\n [class.mr-[26px]]=\"modeDisplayFile() === 'full'\">\n <div class=\"w-[120px] h-[4px] rounded-[4px] bg-[#f8f9fa] relative\">\n <div class=\"absolute top-0 left-0 h-[4px] rounded-[4px] bg-[#00bc62]\"\n [style.width.px]=\"(item().percentUploading ?? 0)*1.2\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex ml-[16px]\">\n @if (!ignoreIconPreview()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-eye-outline !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_preview', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() && !ignoreIconEdit() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerOpenPreviewFile(item())\" />\n }\n @if (item().type === 'image' && !item().error && !ignoreIconEdit()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-edit-line !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_edit', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerEditImage($event, item)\" />\n }\n @if (!ignoreIconRemove()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-close !mr-0'\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0'\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerRemoveFile($event, item)\" />\n }\n </div>\n </div>\n @if (item().error && (multiple() || !showBlockUploadWhenHasFileAndModeSingle())) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">{{ (item().error || ' ') | translate }}</div>\n }\n }\n </div>\n }\n</div>\n", styles: [":host ::ng-deep .libs-ui-components-inputs-upload{width:100%;padding:16px;display:flex;align-items:center;justify-content:center;border-radius:8px;cursor:pointer;background-color:#fff;border:1px dashed #e6e7ea}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-icon:before{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-color-default, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over{background-color:var(--libs-ui-color-light-3, #f4f8ff);border:1px dashed var(--libs-ui-color-light-1, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-icon:before,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description span,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable{cursor:default!important;text-decoration:none;pointer-events:none;background-color:#f8f9fa!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error{background-color:#fef5f6!important;border:1px dashed #ee2d41!important}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-file-full{background-color:#fff;padding:8px 12px}:host ::ng-deep .libs-ui-components-inputs-upload-file-short{background-color:#f4f8ff;padding:6px 12px}.libs-ui-components-inputs-upload-view-list{overflow-y:auto;max-height:100%;padding:0 10px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item{width:100%;display:flex;align-items:center;justify-content:center;border-radius:4px;margin-bottom:8px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item:hover{background-color:#f8f9fa}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsInputsUploadAvatarComponent, selector: "libs_ui-components-inputs-upload-avatar", inputs: ["item", "showVideoDuration", "disable", "size"], outputs: ["itemChange", "outOpenPreview"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
470
470
  }
471
471
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsUploadComponent, decorators: [{
472
472
  type: Component,
@@ -475,6 +475,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
475
475
  LibsUiComponentsLabelComponent,
476
476
  LibsUiComponentsInputsUploadAvatarComponent,
477
477
  LibsUiComponentsScrollOverlayDirective
478
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col w-full h-full\">\n <div>\n @if (labelConfig();as labelConfig) {\n <libs_ui-components-label [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required \"\n [description]=\"labelConfig.description\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if ((!configDownloadSampleFile()?.position || configDownloadSampleFile()?.position === 'top') && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mb-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile?.title || ' '\"\n (outClick)=\"handlerDownloadSampleFile($event)\" />\n }\n @if (multiple() || showBlockUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple())) {\n <div #upload\n class=\"libs-ui-components-inputs-upload\"\n [class.libs-ui-components-inputs-upload-disable]=\"disable() || (!multiple() && fileList().length)\"\n [class.libs-ui-components-inputs-upload-error]=\"messageError()\">\n <div class=\"flex items-center\">\n <div class=\"mr-[16px]\">\n <i class=\"libs-ui-components-inputs-upload-icon libs-ui-icon-file-upload before:!text-[32px]\"></i>\n </div>\n <div class=\"libs-ui-components-inputs-upload-description\">\n <div class=\"mb-[4px] libs-ui-font-h6m\"\n [innerHTML]=\"(configDescriptionInputUpload().message || '') | translate:configDescriptionInputUpload().interpolateParams\">\n </div>\n @for (item of descriptionFormatAndSizeFileComputed(); track item; let last = $last) {\n <div class=\"libs-ui-font-h7r\"\n [class.mb-[4px]]=\"!last\"\n [innerHTML]=\"item.message | translate:item.interpolateParams\">\n </div>\n }\n </div>\n </div>\n @if (multiple()) {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n multiple\n [accept]=\"accessFiles()\" />\n } @else {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n [accept]=\"accessFiles()\" />\n }\n </div>\n }\n @if (messageError() && (multiple() || showBlockUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple()))) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n {{ (messageError() || '') | translate:{ value: limitFile() } }}\n </div>\n }\n @if (configDownloadSampleFile()?.position === 'bottom' && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mt-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile.title || ' '\"\n (moClick)=\"handlerDownloadSampleFile($event)\" />\n }\n </div>\n @if (fileList().length) {\n <div LibsUiComponentsScrollOverlayDirective\n class=\"relative w-full h-full px-[10px] libs-ui-components-inputs-upload-view-list {{ classIncludeFileContent() || '' }}\"\n [class.mt-[12px]]=\"multiple() || showBlockUploadWhenHasFileAndModeSingle()\">\n <ng-content select=\"[label-file]\"></ng-content>\n @for (item of fileList(); track item(); let first = $first) {\n <div class=\"libs-ui-components-inputs-upload-view-list-item {{ classIncludeListItem() || '' }}\"\n [class.libs-ui-components-inputs-upload-file-full]=\"modeDisplayFile() === 'full'\"\n [class.libs-ui-components-inputs-upload-file-short]=\"modeDisplayFile() === 'short'\"\n [class.libs-ui-border-error-general]=\"item().error || (messageError() && showBorderErrorAllItemWhenError())\"\n [class.mt-0]=\"first && !multiple() && !showBlockUploadWhenHasFileAndModeSingle()\">\n\n <div class=\"flex w-full\">\n <div class=\"flex items-center\">\n @if (canSetAvatar() && item().type === 'image') {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'!mr-0' + (item().isAvatar ? ' libs-ui-icon-check-circle-solid before:!text-[#00bc62]': ' libs-ui-icon-check-circle-outline') + ((disable() || item().isUploading || !!item().error) ? ' libs-ui-disable' : '')\"\n [popover]=\"{config:{ content: item().isAvatar ? 'i18n_avatar' : 'i18n_choose_as_your_avatar', zIndex: zIndex()}}\"\n [classInclude]=\"'!mr-[12px] !p-0'\"\n [disable]=\"disable() || item().isUploading || !!item().error\"\n (outClick)=\"handlerSetAvatar($event, item)\" />\n }\n </div>\n <div class=\"flex\"\n [class.w-[calc(100%-28px)]]=\"canSetAvatar()\"\n [class.w-full]=\"!canSetAvatar()\">\n @if (modeDisplayFile() === 'full') {\n <libs_ui-components-inputs-upload-avatar [disable]=\"disable()\"\n [(item)]=\"item\"\n [showVideoDuration]=\"showVideoDuration()\"\n (outOpenPreview)=\"handlerOpenPreviewFile($event)\" />\n }\n <div class=\"relative w-full\">\n <div class=\"flex absolute w-full h-full flex-col\"\n [class.flex-col]=\"modeDisplayFile() === 'full'\"\n [class.justify-center]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\">\n <libs_ui-components-label class=\"flex w-full\"\n [labelLeft]=\"item().name\"\n [zIndexPopover]=\"zIndex() + 1\"\n [labelLeftClass]=\"'libs-ui-font-h6m ' + ((disable() || item().isUploading || item().error) ? 'text-[#6a7383]' : 'text-[#071631]')\"\n [classInclude]=\"modeDisplayFile() === 'short' ? '!mb-0' : ''\" />\n\n @if (!ignoreShowSizeFile()) {\n <div class=\"text-[#9ca2ad] libs-ui-font-h7r shrink-0\"\n [class.flex]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\"\n [class.ml-[12px]]=\"modeDisplayFile() === 'short'\">\n {{ item().size }}\n </div>\n }\n </div>\n </div>\n @if (item().isUploading && item().percentUploading) {\n <div class=\"flex items-center ml-[16px]\"\n [class.mr-[26px]]=\"modeDisplayFile() === 'full'\">\n <div class=\"w-[120px] h-[4px] rounded-[4px] bg-[#f8f9fa] relative\">\n <div class=\"absolute top-0 left-0 h-[4px] rounded-[4px] bg-[#00bc62]\"\n [style.width.px]=\"(item().percentUploading ?? 0)*1.2\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex ml-[16px]\">\n @if (!ignoreIconPreview()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-eye-outline !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_preview', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() && !ignoreIconEdit() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerOpenPreviewFile(item())\" />\n }\n @if (item().type === 'image' && !item().error && !ignoreIconEdit()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-edit-line !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_edit', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerEditImage($event, item)\" />\n }\n @if (!ignoreIconRemove()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-close !mr-0'\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0'\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerRemoveFile($event, item)\" />\n }\n </div>\n </div>\n @if (item().error && (multiple() || !showBlockUploadWhenHasFileAndModeSingle())) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">{{ (item().error || ' ') | translate }}</div>\n }\n }\n </div>\n }\n</div>\n", styles: [":host ::ng-deep .libs-ui-components-inputs-upload{width:100%;padding:16px;display:flex;align-items:center;justify-content:center;border-radius:8px;cursor:pointer;background-color:#fff;border:1px dashed #e6e7ea}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-icon:before{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-color-default, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over{background-color:var(--libs-ui-color-light-3, #f4f8ff);border:1px dashed var(--libs-ui-color-light-1, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-icon:before,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description span,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable{cursor:default!important;text-decoration:none;pointer-events:none;background-color:#f8f9fa!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error{background-color:#fef5f6!important;border:1px dashed #ee2d41!important}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-file-full{background-color:#fff;padding:8px 12px}:host ::ng-deep .libs-ui-components-inputs-upload-file-short{background-color:#f4f8ff;padding:6px 12px}.libs-ui-components-inputs-upload-view-list{overflow-y:auto;max-height:100%;padding:0 10px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item{width:100%;display:flex;align-items:center;justify-content:center;border-radius:4px;margin-bottom:8px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item:hover{background-color:#f8f9fa}\n"] }]
478
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col w-full h-full\">\n <div>\n @if (labelConfig();as labelConfig) {\n <libs_ui-components-label [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required \"\n [description]=\"labelConfig.description\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if ((!configDownloadSampleFile()?.position || configDownloadSampleFile()?.position === 'top') && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mb-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile?.title || ' '\"\n (outClick)=\"handlerDownloadSampleFile($event)\" />\n }\n @if (multiple() || showBlockUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple())) {\n <div #upload\n class=\"libs-ui-components-inputs-upload\"\n [class.libs-ui-components-inputs-upload-disable]=\"disable() || (!multiple() && fileList().length && !canUploadIfHasExistFile())\"\n [class.libs-ui-components-inputs-upload-error]=\"messageError()\">\n <div class=\"flex items-center\">\n <div class=\"mr-[16px]\">\n <i class=\"libs-ui-components-inputs-upload-icon libs-ui-icon-file-upload before:!text-[32px]\"></i>\n </div>\n <div class=\"libs-ui-components-inputs-upload-description\">\n <div class=\"mb-[4px] libs-ui-font-h6m\"\n [innerHTML]=\"(configDescriptionInputUpload().message || '') | translate:configDescriptionInputUpload().interpolateParams\">\n </div>\n @for (item of descriptionFormatAndSizeFileComputed(); track item; let last = $last) {\n <div class=\"libs-ui-font-h7r\"\n [class.mb-[4px]]=\"!last\"\n [innerHTML]=\"item.message | translate:item.interpolateParams\">\n </div>\n }\n </div>\n </div>\n @if (multiple()) {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n multiple\n [accept]=\"accessFiles()\" />\n } @else {\n <input #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n [accept]=\"accessFiles()\" />\n }\n </div>\n }\n @if (messageError() && (multiple() || showBlockUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple()))) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n {{ (messageError() || '') | translate:{ value: limitFile() } }}\n </div>\n }\n @if (configDownloadSampleFile()?.position === 'bottom' && configDownloadSampleFile();as configDownloadSampleFile) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mt-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile.title || ' '\"\n (moClick)=\"handlerDownloadSampleFile($event)\" />\n }\n </div>\n @if (fileList().length) {\n <div LibsUiComponentsScrollOverlayDirective\n class=\"relative w-full h-full px-[10px] libs-ui-components-inputs-upload-view-list {{ classIncludeFileContent() || '' }}\"\n [class.mt-[12px]]=\"multiple() || showBlockUploadWhenHasFileAndModeSingle()\">\n <ng-content select=\"[label-file]\"></ng-content>\n @for (item of fileList(); track item(); let first = $first) {\n <div class=\"libs-ui-components-inputs-upload-view-list-item {{ classIncludeListItem() || '' }}\"\n [class.libs-ui-components-inputs-upload-file-full]=\"modeDisplayFile() === 'full'\"\n [class.libs-ui-components-inputs-upload-file-short]=\"modeDisplayFile() === 'short'\"\n [class.libs-ui-border-error-general]=\"item().error || (messageError() && showBorderErrorAllItemWhenError())\"\n [class.mt-0]=\"first && !multiple() && !showBlockUploadWhenHasFileAndModeSingle()\">\n\n <div class=\"flex w-full\">\n <div class=\"flex items-center\">\n @if (canSetAvatar() && item().type === 'image') {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'!mr-0' + (item().isAvatar ? ' libs-ui-icon-check-circle-solid before:!text-[#00bc62]': ' libs-ui-icon-check-circle-outline') + ((disable() || item().isUploading || !!item().error) ? ' libs-ui-disable' : '')\"\n [popover]=\"{config:{ content: item().isAvatar ? 'i18n_avatar' : 'i18n_choose_as_your_avatar', zIndex: zIndex()}}\"\n [classInclude]=\"'!mr-[12px] !p-0'\"\n [disable]=\"disable() || item().isUploading || !!item().error\"\n (outClick)=\"handlerSetAvatar($event, item)\" />\n }\n </div>\n <div class=\"flex\"\n [class.w-[calc(100%-28px)]]=\"canSetAvatar()\"\n [class.w-full]=\"!canSetAvatar()\">\n @if (modeDisplayFile() === 'full') {\n <libs_ui-components-inputs-upload-avatar [disable]=\"disable()\"\n [(item)]=\"item\"\n [showVideoDuration]=\"showVideoDuration()\"\n (outOpenPreview)=\"handlerOpenPreviewFile($event)\" />\n }\n <div class=\"relative w-full\">\n <div class=\"flex absolute w-full h-full flex-col\"\n [class.flex-col]=\"modeDisplayFile() === 'full'\"\n [class.justify-center]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\">\n <libs_ui-components-label class=\"flex w-full\"\n [labelLeft]=\"item().name\"\n [zIndexPopover]=\"zIndex() + 1\"\n [labelLeftClass]=\"'libs-ui-font-h6m ' + ((disable() || item().isUploading || item().error) ? 'text-[#6a7383]' : 'text-[#071631]')\"\n [classInclude]=\"modeDisplayFile() === 'short' ? '!mb-0' : ''\" />\n\n @if (!ignoreShowSizeFile()) {\n <div class=\"text-[#9ca2ad] libs-ui-font-h7r shrink-0\"\n [class.flex]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\"\n [class.ml-[12px]]=\"modeDisplayFile() === 'short'\">\n {{ item().size }}\n </div>\n }\n </div>\n </div>\n @if (item().isUploading && item().percentUploading) {\n <div class=\"flex items-center ml-[16px]\"\n [class.mr-[26px]]=\"modeDisplayFile() === 'full'\">\n <div class=\"w-[120px] h-[4px] rounded-[4px] bg-[#f8f9fa] relative\">\n <div class=\"absolute top-0 left-0 h-[4px] rounded-[4px] bg-[#00bc62]\"\n [style.width.px]=\"(item().percentUploading ?? 0)*1.2\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex ml-[16px]\">\n @if (!ignoreIconPreview()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-eye-outline !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_preview', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() && !ignoreIconEdit() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerOpenPreviewFile(item())\" />\n }\n @if (item().type === 'image' && !item().error && !ignoreIconEdit()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-edit-line !mr-0'\"\n [popover]=\"{config:{ content: 'i18n_edit', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerEditImage($event, item)\" />\n }\n @if (!ignoreIconRemove()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-close !mr-0'\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: zIndex()+1}}\"\n [classInclude]=\"'!p-0'\"\n [disable]=\"item().isUploading || disable()\"\n (outClick)=\"handlerRemoveFile($event, item)\" />\n }\n </div>\n </div>\n @if (item().error && (multiple() || !showBlockUploadWhenHasFileAndModeSingle())) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">{{ (item().error || ' ') | translate }}</div>\n }\n }\n </div>\n }\n</div>\n", styles: [":host ::ng-deep .libs-ui-components-inputs-upload{width:100%;padding:16px;display:flex;align-items:center;justify-content:center;border-radius:8px;cursor:pointer;background-color:#fff;border:1px dashed #e6e7ea}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-icon:before{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description{color:#9ca2ad}:host ::ng-deep .libs-ui-components-inputs-upload .libs-ui-components-inputs-upload-description span{color:var(--libs-ui-color-default, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over{background-color:var(--libs-ui-color-light-3, #f4f8ff);border:1px dashed var(--libs-ui-color-light-1, #226ff5)}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-icon:before,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload:hover .libs-ui-components-inputs-upload-description span,:host ::ng-deep .libs-ui-components-inputs-upload.libs-ui-components-inputs-upload-drag-over .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable{cursor:default!important;text-decoration:none;pointer-events:none;background-color:#f8f9fa!important;border:1px dashed #e6e7ea!important}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-disable .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error{background-color:#fef5f6!important;border:1px dashed #ee2d41!important}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-icon:before{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-error .libs-ui-components-inputs-upload-description span{color:#cdd0d6}:host ::ng-deep .libs-ui-components-inputs-upload-file-full{background-color:#fff;padding:8px 12px}:host ::ng-deep .libs-ui-components-inputs-upload-file-short{background-color:#f4f8ff;padding:6px 12px}.libs-ui-components-inputs-upload-view-list{overflow-y:auto;max-height:100%;padding:0 10px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item{width:100%;display:flex;align-items:center;justify-content:center;border-radius:4px;margin-bottom:8px}.libs-ui-components-inputs-upload-view-list .libs-ui-components-inputs-upload-view-list-item:hover{background-color:#f8f9fa}\n"] }]
479
479
  }], ctorParameters: () => [] });
480
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvdXBsb2FkL3NyYy91cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy91cGxvYWQvc3JjL3VwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBZ0IsUUFBUSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3ROLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JGLE9BQU8sRUFBYSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25HLE9BQU8sRUFBVSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsNkJBQTZCLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSxxQkFBcUIsRUFBRSxx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cUNBQXFDO2tCQWRqRCxTQUFTOytCQUVFLGtDQUFrQyxjQUdoQyxJQUFJLFdBQ1AsQ0FBQyxlQUFlO3dCQUN2QixzQ0FBc0M7d0JBQ3RDLDhCQUE4Qjt3QkFDOUIsMkNBQTJDO3dCQUMzQyxzQ0FBc0M7cUJBQ3ZDLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBjb21wdXRlZCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNHYWxsZXJ5Vmlld2VyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1nYWxsZXJ5JztcbmltcG9ydCB7IElTYXZlRmlsZSwgTGlic1VpQ29tcG9uZW50c0ltYWdlRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbWFnZS1lZGl0b3InO1xuaW1wb3J0IHsgSUxhYmVsLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQcmV2aWV3RmlsZUNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcHJldmlldy1maWxlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBJQXNwZWN0UmF0aW8sIElFdmVudCwgSUZpbGUsIElJc1ZhbGlkUmVxdWlyZWQsIElNZXNzYWdlVHJhbnNsYXRlIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBMaWJzVWlEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWR5bmFtaWMtY29tcG9uZW50JztcbmltcG9ydCB7IExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgQXVkaW9FeHRMaXN0LCBjb252ZXJ0QmxvYlRvRmlsZSwgY29udmVydEZpbGVUb0Jhc2U2NF9PYmplY3RVcmwsIERvY3VtZW50RXh0TGlzdCwgZG93bmxvYWRGaWxlQnlVcmwsIEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsIGdldEZpbGVFeHRlbnNpb24sIGdldExhYmVsQnlTaXplRmlsZSwgSW1hZ2VFeHRMaXN0LCBpc0luY2x1ZGVBdWRpb0V4dExpc3QsIGlzSW5jbHVkZURvY3VtZW50RXh0TGlzdCwgaXNJbmNsdWRlSW1hZ2VFeHRMaXN0LCBpc0luY2x1ZGVWaWRlb0V4dExpc3QsIGlzVHlwZUF1ZGlvLCBpc1R5cGVJbWFnZSwgaXNUeXBlVmlkZW8sIHV1aWQsIFZpZGVvRXh0TGlzdCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNVcGxvYWRBdmF0YXJDb21wb25lbnQgfSBmcm9tICcuL2F2YXRhci9hdmF0YXIuY29tcG9uZW50JztcbmltcG9ydCB7IGdldERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGVEZWZhdWx0IH0gZnJvbSAnLi9kZWZpbmVzL2hlbHBlci5kZWZpbmUnO1xuaW1wb3J0IHsgSVVwbG9hZENvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSwgSVVwbG9hZERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGUsIElVcGxvYWRGdW5jdGlvbkNvbnRyb2xFdmVudCwgVFlQRV9GSUxFX1VQTE9BRCwgVFlQRV9NT0RFX0ZJTEVfRElTUExBWSB9IGZyb20gJy4vaW50ZXJmYWNlcy91cGxvYWQuaW50ZXJmYWNlJztcbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VwbG9hZC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVXBsb2FkQXZhdGFyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNJbnB1dHNVcGxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVElFU1xuICBwcml2YXRlIGltYWdlRWRpdG9yQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPExpYnNVaUNvbXBvbmVudHNJbWFnZUVkaXRvckNvbXBvbmVudD47XG4gIHByaXZhdGUgcHJldmlld0ZpbGVDb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8TGlic1VpQ29tcG9uZW50c1ByZXZpZXdGaWxlQ29tcG9uZW50PjtcbiAgcHJpdmF0ZSBwcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPExpYnNVaUNvbXBvbmVudHNHYWxsZXJ5Vmlld2VyQ29tcG9uZW50PjtcbiAgcHJvdGVjdGVkIGlzRHJhZ092ZXIgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgZmlsZUxpc3QgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8SUZpbGU+Pj4oW10pO1xuICBwcm90ZWN0ZWQgYWNjZXNzRmlsZXMgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCBtZXNzYWdlRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgZGVzY3JpcHRpb25Gb3JtYXRBbmRTaXplRmlsZUNvbXB1dGVkID0gY29tcHV0ZWQ8QXJyYXk8SVVwbG9hZERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGU+PigoKSA9PiB7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb25Gb3JtYXRBbmRTaXplRmlsZSgpPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGUoKSBhcyB1bmtub3duIGFzIEFycmF5PElVcGxvYWREZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlPjtcbiAgICB9XG4gICAgcmV0dXJuIGdldERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGVEZWZhdWx0KHRoaXMuZmlsZVR5cGUoKSwgdGhpcy5tYXhJbWFnZVNpemUoKSwgdGhpcy5tYXhWaWRlb1NpemUoKSwgdGhpcy5tYXhEb2N1bWVudFNpemUoKSwgdGhpcy5tYXhBdWRpb1NpemUoKSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gSU5QVVRTXG4gIHJlYWRvbmx5IG9yaWdpbkZpbGVzID0gaW5wdXQ8QXJyYXk8V3JpdGFibGVTaWduYWw8SUZpbGU+PiwgQXJyYXk8V3JpdGFibGVTaWduYWw8SUZpbGU+PiB8IHVuZGVmaW5lZD4oW10sIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IFtdIH0pO1xuICByZWFkb25seSBmaWxlVHlwZSA9IGlucHV0PFRZUEVfRklMRV9VUExPQUQsIFRZUEVfRklMRV9VUExPQUQgfCB1bmRlZmluZWQ+KCdpbWFnZV92aWRlb19kb2N1bWVudCcsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICdpbWFnZV92aWRlb19kb2N1bWVudCcgfSk7XG4gIHJlYWRvbmx5IG11bHRpcGxlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2FuVXBsb2FkSWZIYXNFeGlzdEZpbGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGNhblNldEF2YXRhciA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbGltaXRGaWxlID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAxMCB9KTtcbiAgcmVhZG9ubHkgbWF4VG90YWxTaXplID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwICogMTAyNCAqIDEwMjQsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEwICogMTAyNCAqIDEwMjQgfSk7XG4gIHJlYWRvbmx5IG1heEltYWdlU2l6ZSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPig1ICogMTAyNCAqIDEwMjQsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDUgKiAxMDI0ICogMTAyNCB9KTtcbiAgcmVhZG9ubHkgbWF4VmlkZW9TaXplID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwICogMTAyNCAqIDEwMjQsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEwICogMTAyNCAqIDEwMjQgfSk7XG4gIHJlYWRvbmx5IG1heERvY3VtZW50U2l6ZSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMCAqIDEwMjQgKiAxMDI0LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAxMCAqIDEwMjQgKiAxMDI0IH0pO1xuICByZWFkb25seSBtYXhBdWRpb1NpemUgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMTAgKiAxMDI0ICogMTAyNCwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gMTAgKiAxMDI0ICogMTAyNCB9KTtcbiAgcmVhZG9ubHkgaW1hZ2VFeHRMaXN0ID0gaW5wdXQ8c3RyaW5nW10sIHN0cmluZ1tdIHwgdW5kZWZpbmVkPihJbWFnZUV4dExpc3QsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IEltYWdlRXh0TGlzdCB9KTtcbiAgcmVhZG9ubHkgdmlkZW9FeHRMaXN0ID0gaW5wdXQ8c3RyaW5nW10sIHN0cmluZ1tdIHwgdW5kZWZpbmVkPihWaWRlb0V4dExpc3QsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IFZpZGVvRXh0TGlzdCB9KTtcbiAgcmVhZG9ubHkgZG9jdW1lbnRFeHRMaXN0ID0gaW5wdXQ8c3RyaW5nW10sIHN0cmluZ1tdIHwgdW5kZWZpbmVkPihEb2N1bWVudEV4dExpc3QsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IERvY3VtZW50RXh0TGlzdCB9KTtcbiAgcmVhZG9ubHkgYXVkaW9FeHRMaXN0ID0gaW5wdXQ8c3RyaW5nW10sIHN0cmluZ1tdIHwgdW5kZWZpbmVkPihBdWRpb0V4dExpc3QsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IEF1ZGlvRXh0TGlzdCB9KTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlTGlzdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHZhbGlkUmVxdWlyZWQgPSBpbnB1dDxJSXNWYWxpZFJlcXVpcmVkPigpO1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBhc3BlY3RSYXRpbyA9IGlucHV0PElBc3BlY3RSYXRpbz4oKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEyMDAsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEyMDAgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZVNob3dTaXplRmlsZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgYWxsb3dTaG93UHVzaE1lc3NhZ2VNYXhTaXplRXJyb3IgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IG1lc3NhZ2VUeXBlRmlsZUVycm9yID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX3RoZV9maWxlX3N1cHBvcnRfZm9ybWF0X2lzX25vdF9jb3JyZWN0JywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgfHwgJ2kxOG5fdGhlX2ZpbGVfc3VwcG9ydF9mb3JtYXRfaXNfbm90X2NvcnJlY3QnIH0pO1xuICByZWFkb25seSBtZXNzYWdlTWF4U2l6ZUVycm9yID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX2ZpbGVfc2l6ZV9leGNlZWRzX3RoZV9hbGxvd2VkX2xpbWl0JywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgfHwgJ2kxOG5fZmlsZV9zaXplX2V4Y2VlZHNfdGhlX2FsbG93ZWRfbGltaXQnIH0pO1xuICByZWFkb25seSBtZXNzYWdlRmlsZVVwbG9hZEVycm9yID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX2ludmFsaWRfZmlsZV91cGxvYWQnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaTE4bl9pbnZhbGlkX2ZpbGVfdXBsb2FkJyB9KTtcbiAgcmVhZG9ubHkgbWVzc2FnZVRvdGFsRmlsZUV4Y2VlZHNFcnJvciA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaTE4bl9maWxlX251bWJlcl9leGNlZWRzX3RoZV9hbGxvd2VkX2xpbWl0X3BsZWFzZV9kZWxldGVfdGhlX2ZpbGUnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaTE4bl9maWxlX251bWJlcl9leGNlZWRzX3RoZV9hbGxvd2VkX2xpbWl0X3BsZWFzZV9kZWxldGVfdGhlX2ZpbGUnIH0pXG4gIHJlYWRvbmx5IGNvbmZpZ0Rlc2NyaXB0aW9uSW5wdXRVcGxvYWQgPSBpbnB1dDxJTWVzc2FnZVRyYW5zbGF0ZSwgSU1lc3NhZ2VUcmFuc2xhdGUgfCB1bmRlZmluZWQ+KHsgbWVzc2FnZTogJ2kxOG5fZHJhZ19maWxlX2hlcmVfdG9fdXBsb2FkX29yX3NlbGVjdF9maWxlJyB9LCB7XG4gICAgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IHsgbWVzc2FnZTogJ2kxOG5fZHJhZ19maWxlX2hlcmVfdG9fdXBsb2FkX29yX3NlbGVjdF9maWxlJyB9XG4gIH0pO1xuXG4gIHJlYWRvbmx5IG1vZGVEaXNwbGF5RmlsZSA9IGlucHV0PFRZUEVfTU9ERV9GSUxFX0RJU1BMQVksIFRZUEVfTU9ERV9GSUxFX0RJU1BMQVkgfCB1bmRlZmluZWQ+KCdmdWxsJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgfHwgJ2Z1bGwnIH0pO1xuICByZWFkb25seSBkZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlID0gaW5wdXQ8V3JpdGFibGVTaWduYWw8QXJyYXk8SVVwbG9hZERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGU+Pj4oKTtcbiAgcmVhZG9ubHkgc2hvd1ZpZGVvRHVyYXRpb24gPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGxhYmVsQ29uZmlnID0gaW5wdXQ8SUxhYmVsPigpO1xuICByZWFkb25seSBzaG93QmxvY2tVcGxvYWRXaGVuSGFzRmlsZUFuZE1vZGVTaW5nbGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyB0cnVlIH0pO1xuICByZWFkb25seSBpZ25vcmVJY29uUmVtb3ZlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBpZ25vcmVJY29uRWRpdCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlSWNvblByZXZpZXcgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyB0cnVlIH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVGaWxlQ29udGVudCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgc2hvd0JvcmRlckVycm9yQWxsSXRlbVdoZW5FcnJvciA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlID0gaW5wdXQ8SVVwbG9hZENvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZT4oKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gT1VUUFVUU1xuICByZWFkb25seSBvdXRDbG9zZSA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRGaWxlQ2hhbmdlZCA9IG91dHB1dDxBcnJheTxXcml0YWJsZVNpZ25hbDxJRmlsZT4+PigpO1xuICByZWFkb25seSBvdXRGaWxlUmVtb3ZlZCA9IG91dHB1dDxXcml0YWJsZVNpZ25hbDxJRmlsZT4+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SVVwbG9hZEZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBWSUVXIENISUxEUkVOXG4gIHJlYWRvbmx5IHVwbG9hZFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPigndXBsb2FkJyk7XG4gIHJlYWRvbmx5IHVwbG9hZElucHV0UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCd1cGxvYWRJbnB1dCcpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBJTkpFQ1RJT05TXG4gIHByaXZhdGUgZHluYW1pY0NvbXBvbmVudFNlcnZpY2UgPSBpbmplY3QoTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UpO1xuICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcmlnaW5GaWxlcygpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5maWxlTGlzdC5zZXQoWy4uLnRoaXMub3JpZ2luRmlsZXMoKV0pO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBMSUZFQ1lDTEUgSE9PS1NcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVBbGw6IHRoaXMucmVtb3ZlQWxsRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgdXBsb2FkaW5nOiBhc3luYyAocHJvY2VzcywgaWQpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVVwbG9hZGluZyA9IHRoaXMuZmlsZUxpc3QoKS5maW5kKGZpbGUgPT4gZmlsZSgpLmlkID09PSBpZCk7XG5cbiAgICAgICAgaWYgKGZpbGVVcGxvYWRpbmcpIHtcbiAgICAgICAgICBmaWxlVXBsb2FkaW5nLnVwZGF0ZShmaWxlID0+ICh7IC4uLmZpbGUsIHBlcmNlbnRVcGxvYWRpbmc6IHByb2Nlc3MucGVyY2VudCwgaXNVcGxvYWRpbmc6IHByb2Nlc3MucGVyY2VudCAhPT0gMTAwIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldE1lc3NhZ2VFcnJvcjogYXN5bmMgKG1lc3NhZ2UsIGlkKSA9PiB7XG4gICAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldChtZXNzYWdlKTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgY29uc3QgZmlsZUVycm9yID0gdGhpcy5maWxlTGlzdCgpLmZpbmQoZmlsZSA9PiBmaWxlKCkuaWQgPT09IGlkKTtcblxuICAgICAgICAgIGlmIChmaWxlRXJyb3IpIHtcbiAgICAgICAgICAgIGZpbGVFcnJvci51cGRhdGUoZmlsZSA9PiAoeyAuLi5maWxlLCBlcnJvcjogbWVzc2FnZSB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlclVwbG9hZEZpbGU6IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy51cGxvYWRJbnB1dFJlZigpPy5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgIHRoaXMudXBsb2FkSW5wdXRSZWYoKT8ubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FjY2VwdCcsIHRoaXMuYWNjZXNzRmlsZXMoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmluaXRBY2Nlc3NGaWxlcygpO1xuICAgICAgaWYgKHRoaXMudXBsb2FkUmVmKCkpIHtcbiAgICAgICAgdGhpcy5pbml0VXBsb2FkRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBJTklUSUFMSVpBVElPTlxuICBwcm90ZWN0ZWQgYXN5bmMgaW5pdEFjY2Vzc0ZpbGVzKCkge1xuICAgIGNvbnN0IGFjY2Vzc0V4dHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgdHlwZVNwbGl0ID0gdGhpcy5maWxlVHlwZSgpLnNwbGl0KCdfJyk7XG5cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdpbWFnZScpKSB7XG4gICAgICBhY2Nlc3NFeHRzLnB1c2goLi4udGhpcy5pbWFnZUV4dExpc3QoKSk7XG4gICAgfVxuICAgIGlmICh0eXBlU3BsaXQuaW5jbHVkZXMoJ2RvY3VtZW50JykpIHtcbiAgICAgIGFjY2Vzc0V4dHMucHVzaCguLi50aGlzLmRvY3VtZW50RXh0TGlzdCgpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVTcGxpdC5pbmNsdWRlcygndmlkZW8nKSkge1xuICAgICAgYWNjZXNzRXh0cy5wdXNoKC4uLnRoaXMudmlkZW9FeHRMaXN0KCkpO1xuICAgIH1cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdhdWRpbycpKSB7XG4gICAgICBhY2Nlc3NFeHRzLnB1c2goLi4udGhpcy5hdWRpb0V4dExpc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuYWNjZXNzRmlsZXMuc2V0KGFjY2Vzc0V4dHMubWFwKGV4dCA9PiBgLiR7ZXh0fWApLmpvaW4oJywnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaW5pdFVwbG9hZEV2ZW50KCkge1xuICAgIGNvbnN0IHVwbG9hZFJlZiA9IHRoaXMudXBsb2FkUmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaW5wdXRVcGxvYWRSZWYgPSB0aGlzLnVwbG9hZElucHV0UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICB0aGlzLmluaXRFdmVudChpbnB1dFVwbG9hZFJlZiwgJ2NoYW5nZScsIHRoaXMuaGFuZGxlclVwbG9hZEZpbGUuYmluZCh0aGlzKSkuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbml0RXZlbnQodXBsb2FkUmVmLCAnY2xpY2snLCB0aGlzLmhhbmRsZXJVcGxvYWRGaWxlQ2xpY2suYmluZCh0aGlzKSkuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbml0RXZlbnQodXBsb2FkUmVmLCAnZHJhZ292ZXInLCB0aGlzLmhhbmRsZXJEcmFnT3Zlci5iaW5kKHRoaXMpKS5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmluaXRFdmVudCh1cGxvYWRSZWYsICdkcmFnbGVhdmUnLCB0aGlzLmhhbmRsZXJEcmFnRW5kLmJpbmQodGhpcykpLnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaW5pdEV2ZW50KHVwbG9hZFJlZiwgJ2Ryb3AnLCB0aGlzLmhhbmRsZXJEcmFnRHJvcC5iaW5kKHRoaXMpKS5zdWJzY3JpYmUoKTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBFVkVOVCBIQU5ETElOR1xuICBwcm90ZWN0ZWQgaW5pdEV2ZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgY2FsbEJhY2s6IChldmVudDogSUV2ZW50KSA9PiB2b2lkKTogT2JzZXJ2YWJsZTxJRXZlbnQ+IHtcbiAgICByZXR1cm4gZnJvbUV2ZW50PElFdmVudD4oZWxlbWVudCwgZXZlbnROYW1lKS5waXBlKFxuICAgICAgdGFwKGUgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjYWxsQmFjayhlKTtcbiAgICAgIH0pLFxuICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclVwbG9hZEZpbGVDbGljayhldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmZpbGVMaXN0KCkubGVuZ3RoICYmICF0aGlzLmNhblVwbG9hZElmSGFzRXhpc3RGaWxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGxvYWRJbnB1dFJlZigpPy5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgdGhpcy51cGxvYWRJbnB1dFJlZigpPy5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYWNjZXB0JywgdGhpcy5hY2Nlc3NGaWxlcygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyVXBsb2FkRmlsZShldmVudDogSUV2ZW50KSB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVVcGxvYWRGaWxlcyhldmVudCk7XG4gICAgY29uc3QgaW5wdXRVcGxvYWRSZWYgPSB0aGlzLnVwbG9hZElucHV0UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGlucHV0VXBsb2FkUmVmKSB7XG4gICAgICBpbnB1dFVwbG9hZFJlZi52YWx1ZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJEcmFnT3ZlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMudXBsb2FkUmVmKCk/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnbGlicy11aS1jb21wb25lbnRzLWlucHV0cy11cGxvYWQtZHJhZy1vdmVyJywgdHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckRyYWdFbmQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnVwbG9hZFJlZigpPy5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2xpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWRyYWctb3ZlcicsIGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRHJhZ0Ryb3AoZXZlbnQ6IElFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy51cGxvYWRSZWYoKT8ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdsaWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1kcmFnLW92ZXInLCBmYWxzZSk7XG5cbiAgICBhd2FpdCB0aGlzLmhhbmRsZVVwbG9hZEZpbGVzKGV2ZW50KTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBGSUxFIE9QRVJBVElPTlNcbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZVVwbG9hZEZpbGVzKGV2ZW50OiBJRXZlbnQpIHtcbiAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXMgfHwgZXZlbnQudGFyZ2V0Py5maWxlcztcbiAgICBpZiAodGhpcy5tYXhUb3RhbFNpemUoKSkge1xuICAgICAgbGV0IHRvdGFsID0gMDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbCArPSBmaWxlc1tpXS5zaXplO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXhUb3RhbFNpemUoKSA8IHRvdGFsKSB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93Q29tcFR5cGVUZXh0RXJyb3IodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2kxOG5fc2l6ZV9ub3RfbnVtYmVyX21iJywgeyBudW1iZXI6IHRoaXMubWF4VG90YWxTaXplKCkgLyAxMDI0IC8gMTAyNCB9KSwgeyB0aW1lUmVtb3ZlOiAzMDAwIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZXJyb3JFeGNlZWRzTWF4RmlsZSA9IGZhbHNlO1xuICAgIGlmICghZmlsZXMgfHwgIWZpbGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmZpbGVMaXN0KCkubGVuZ3RoICYmICF0aGlzLmNhblVwbG9hZElmSGFzRXhpc3RGaWxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZW1haW5GaWxlVG90YWwgPSB0aGlzLmxpbWl0RmlsZSgpIC0gdGhpcy5maWxlTGlzdCgpLmxlbmd0aDtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gcmVtYWluRmlsZVRvdGFsKSB7XG4gICAgICBlcnJvckV4Y2VlZHNNYXhGaWxlID0gdHJ1ZTtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh0aGlzLm1lc3NhZ2VUb3RhbEZpbGVFeGNlZWRzRXJyb3IoKSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc1tpXTtcbiAgICAgIGNvbnN0IGlzSW1hZ2UgPSBpc1R5cGVJbWFnZShmaWxlKTtcbiAgICAgIGNvbnN0IGlzVmlkZW8gPSBpc1R5cGVWaWRlbyhmaWxlKTtcbiAgICAgIGNvbnN0IGlzQXVkaW8gPSBpc1R5cGVBdWRpbyhmaWxlKTtcbiAgICAgIGNvbnN0IG5ld0ZpbGU6IElGaWxlID0ge1xuICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgIHNpemU6IGdldExhYmVsQnlTaXplRmlsZShmaWxlLnNpemUpLFxuICAgICAgICB0eXBlOiBpc0ltYWdlID8gJ2ltYWdlJyA6IGlzVmlkZW8gPyAndmlkZW8nIDogaXNBdWRpbyA/ICdhdWRpbycgOiAnZG9jdW1lbnQnLFxuICAgICAgICBpZDogdXVpZCgpXG4gICAgICB9O1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkRmlsZUV4dGVuc2lvbihmaWxlKSkpIHtcbiAgICAgICAgaWYgKCFlcnJvckV4Y2VlZHNNYXhGaWxlKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHRoaXMubXVsdGlwbGUoKSA/IHRoaXMubWVzc2FnZUZpbGVVcGxvYWRFcnJvcigpIDogdGhpcy5tZXNzYWdlVHlwZUZpbGVFcnJvcigpKTtcbiAgICAgICAgfVxuICAgICAgICBuZXdGaWxlLmVycm9yID0gdGhpcy5tZXNzYWdlVHlwZUZpbGVFcnJvcigpO1xuICAgICAgICBhd2FpdCB0aGlzLnB1c2hGaWxlSW5MaXN0KGZpbGUsIG5ld0ZpbGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZEZpbGVTaXplKGZpbGUpKSkge1xuICAgICAgICBpZiAoIWVycm9yRXhjZWVkc01heEZpbGUpIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodGhpcy5tdWx0aXBsZSgpID8gdGhpcy5tZXNzYWdlRmlsZVVwbG9hZEVycm9yKCkgOiB0aGlzLm1lc3NhZ2VNYXhTaXplRXJyb3IoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3RmlsZS5lcnJvciA9IHRoaXMubWVzc2FnZU1heFNpemVFcnJvcigpO1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmFsbG93U2hvd1B1c2hNZXNzYWdlTWF4U2l6ZUVycm9yKCkpIHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dEVycm9yKHRoaXMubWVzc2FnZU1heFNpemVFcnJvcigpKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnB1c2hGaWxlSW5MaXN0KGZpbGUsIG5ld0ZpbGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMucHVzaEZpbGVJbkxpc3QoZmlsZSwgbmV3RmlsZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhblNldEF2YXRhcigpICYmIHRoaXMuZmlsZUxpc3QoKS5sZW5ndGggJiYgIXRoaXMuZmlsZUxpc3QoKS5maW5kKGZpbGUgPT4gZmlsZSgpLmlzQXZhdGFyKSkge1xuICAgICAgdGhpcy5maWxlTGlzdC51cGRhdGUoZmlsZUxpc3QgPT4ge1xuICAgICAgICBjb25zdCBpdGVtSW1hZ2UgPSBmaWxlTGlzdC5maW5kKGZpbGUgPT4gZmlsZSgpLnR5cGUgPT09ICdpbWFnZScpO1xuICAgICAgICBpZiAoaXRlbUltYWdlKSB7XG4gICAgICAgICAgaXRlbUltYWdlLnVwZGF0ZShmaWxlID0+ICh7IC4uLmZpbGUsIGlzQXZhdGFyOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWy4uLmZpbGVMaXN0XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLm91dEZpbGVDaGFuZ2VkLmVtaXQodGhpcy5maWxlTGlzdCgpKTtcbiAgICB0aGlzLnZhbGlkYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1c2hGaWxlSW5MaXN0KGZpbGU6IEZpbGUsIG5ld0ZpbGU6IElGaWxlKSB7XG4gICAgbmV3RmlsZS51cmwgPSBhd2FpdCBjb252ZXJ0RmlsZVRvQmFzZTY0X09iamVjdFVybChmaWxlKTtcblxuICAgIHRoaXMuZmlsZUxpc3QudXBkYXRlKGZpbGVMaXN0ID0+IHtcbiAgICAgIGZpbGVMaXN0LnNwbGljZSgwLCB0aGlzLmNhblVwbG9hZElmSGFzRXhpc3RGaWxlKCkgPyAxIDogMCwgc2lnbmFsKG5ld0ZpbGUpKTtcbiAgICAgIHJldHVybiBbLi4uZmlsZUxpc3RdO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJPcGVuUHJldmlld0ZpbGUoaXRlbTogSUZpbGUpIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICB0aGlzLnByZXZpZXdGaWxlRG9jdW1lbnQoaXRlbSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJldmlld0ZpbGVJbWFnZShpdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJldmlld0ZpbGVEb2N1bWVudChpdGVtOiBJRmlsZSkge1xuICAgIGlmICh0aGlzLnByZXZpZXdGaWxlQ29tcG9uZW50UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJldmlld0ZpbGVDb21wb25lbnRSZWYgPSB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KExpYnNVaUNvbXBvbmVudHNQcmV2aWV3RmlsZUNvbXBvbmVudCk7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUNvbXBvbmVudFJlZi5zZXRJbnB1dCgnZGF0YScsIGl0ZW0pO1xuICAgIHRoaXMucHJldmlld0ZpbGVDb21wb25lbnRSZWYuc2V0SW5wdXQoJ3pJbmRleCcsIHRoaXMuekluZGV4KCkgKyAxKTtcbiAgICB0aGlzLnByZXZpZXdGaWxlQ29tcG9uZW50UmVmLmluc3RhbmNlLm91dENsb3NlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlbW92ZSh0aGlzLnByZXZpZXdGaWxlQ29tcG9uZW50UmVmKTtcbiAgICAgIHRoaXMucHJldmlld0ZpbGVDb21wb25lbnRSZWYgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5hZGRUb0JvZHkodGhpcy5wcmV2aWV3RmlsZUNvbXBvbmVudFJlZik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXZpZXdGaWxlSW1hZ2UoaXRlbTogSUZpbGUpIHtcbiAgICBpZiAodGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZiA9IHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTGlic1VpQ29tcG9uZW50c0dhbGxlcnlWaWV3ZXJDb21wb25lbnQpO1xuICAgIGNvbnN0IHVybCA9IGl0ZW0udXJsIHx8IGl0ZW0ub3JpZ2luX3VybDtcbiAgICB0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYuc2V0SW5wdXQoJ2ltYWdlcycsIFt7IHVybCB9XSk7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmLnNldElucHV0KCdpbWFnZVNlbGVjdGVkJywgeyB1cmwgfSk7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmLnNldElucHV0KCdmaWVsZERpc3BsYXlTcmNJbWFnZScsICd1cmwnKTtcbiAgICB0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYuc2V0SW5wdXQoJ3NpbmdsZUltYWdlJywgdHJ1ZSk7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmLmluc3RhbmNlLm91dENsb3NlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlbW92ZSh0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYpO1xuICAgICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuYWRkVG9Cb2R5KHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckVkaXRJbWFnZShldmVudDogRXZlbnQsIGl0ZW06IFdyaXRhYmxlU2lnbmFsPElGaWxlPikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc2hvd0VkaXRNb2RhbChpdGVtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUmVtb3ZlRmlsZShldmVudDogRXZlbnQsIGl0ZW06IFdyaXRhYmxlU2lnbmFsPElGaWxlPikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVtb3ZlRmlsZShpdGVtKTtcbiAgICBpZiAodGhpcy5vcmlnaW5GaWxlcygpLmZpbmQoZmlsZSA9PiBmaWxlKCkudXJsID09PSBpdGVtKCkudXJsKSkge1xuICAgICAgdGhpcy5vdXRGaWxlUmVtb3ZlZC5lbWl0KGl0ZW0pO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKCkgJiYgIXRoaXMuc2hvd0Jsb2NrVXBsb2FkV2hlbkhhc0ZpbGVBbmRNb2RlU2luZ2xlKCkpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRVcGxvYWRFdmVudCgpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbW92ZUZpbGUoZmlsZUl0ZW06IFdyaXRhYmxlU2lnbmFsPElGaWxlPikge1xuICAgIHRoaXMuZmlsZUxpc3QudXBkYXRlKGZpbGVMaXN0ID0+IGZpbGVMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0oKS5pZCAhPT0gZmlsZUl0ZW0oKS5pZCkpO1xuICAgIGlmICh0aGlzLmNhblNldEF2YXRhcigpICYmIGZpbGVJdGVtKCkuaXNBdmF0YXIgJiYgdGhpcy5maWxlTGlzdCgpLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWxlTGlzdC51cGRhdGUoZmlsZUxpc3QgPT4ge1xuICAgICAgICBmaWxlTGlzdFswXS51cGRhdGUoZmlsZSA9PiAoeyAuLi5maWxlLCBpc0F2YXRhcjogdHJ1ZSB9KSk7XG5cbiAgICAgICAgcmV0dXJuIFsuLi5maWxlTGlzdF07XG4gICAgICB9KTtcblxuICAgIH1cbiAgICB0aGlzLm91dEZpbGVDaGFuZ2VkLmVtaXQodGhpcy5maWxlTGlzdCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzaG93RWRpdE1vZGFsKGZpbGVJdGVtOiBXcml0YWJsZVNpZ25hbDxJRmlsZT4pIHtcbiAgICBpZiAodGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWxlRGF0YVVybCA9IGZpbGVJdGVtKCkudXJsIHx8IGZpbGVJdGVtKCkub3JpZ2luX3VybCB8fCAnJztcbiAgICB0aGlzLmltYWdlRWRpdG9yQ29tcG9uZW50UmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMaWJzVWlDb21wb25lbnRzSW1hZ2VFZGl0b3JDb21wb25lbnQpO1xuXG4gICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnaW1nU3JjJywgZmlsZURhdGFVcmwpO1xuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuc2V0SW5wdXQoJ3pJbmRleCcsIHRoaXMuekluZGV4KCkgKyAxKTtcbiAgICB0aGlzLmltYWdlRWRpdG9yQ29tcG9uZW50UmVmLnNldElucHV0KCduYW1lRmlsZScsIGZpbGVJdGVtKCkubmFtZSk7XG4gICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnYXNwZWN0UmF0aW8nLCB0aGlzLmFzcGVjdFJhdGlvKCkpO1xuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuaW5zdGFuY2Uub3V0Q2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYpO1xuICAgICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZiA9IHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuaW5zdGFuY2Uub3V0U2F2ZUZpbGUuc3Vic2NyaWJlKGFzeW5jIChyZXN1bHQ6IElTYXZlRmlsZSkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZUVycm9yID0gIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRGaWxlU2l6ZShyZXN1bHQuZmlsZSkpID8gdGhpcy5tZXNzYWdlTWF4U2l6ZUVycm9yKCkgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBuYW1lRmlsZSA9IGZpbGVJdGVtKCkuZmlsZT8ubmFtZSB8fCBmaWxlSXRlbSgpLm5hbWU7XG4gICAgICBmaWxlSXRlbS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBmaWxlOiBjb252ZXJ0QmxvYlRvRmlsZShyZXN1bHQuZmlsZSwgbmFtZUZpbGUpLCBuYW1lOiBuYW1lRmlsZSwgb3JpZ2luX3VybDogdW5kZWZpbmVkLCBzaXplOiBnZXRMYWJlbEJ5U2l6ZUZpbGUocmVzdWx0LmZpbGUuc2l6ZSksIGVycm9yOiBtZXNzYWdlRXJyb3IsIHVybDogcmVzdWx0LnVybCwgaXNVcGRhdGU6IHRydWUgfSkpO1xuICAgICAgdGhpcy5vdXRGaWxlQ2hhbmdlZC5lbWl0KHRoaXMuZmlsZUxpc3QoKSk7XG4gICAgICB0aGlzLmltYWdlRWRpdG9yQ29tcG9uZW50UmVmPy5pbnN0YW5jZS5vdXRDbG9zZS5lbWl0KHsgaXNDbGlja0J1dHRvbkNsb3NlOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuYWRkVG9Cb2R5KHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNoZWNrVmFsaWRGaWxlRXh0ZW5zaW9uKGZpbGU6IEZpbGUpIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBnZXRGaWxlRXh0ZW5zaW9uKGZpbGUpO1xuXG4gICAgaWYgKCFleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaXNJbWFnZSA9IGlzVHlwZUltYWdlKGZpbGUpO1xuICAgIGNvbnN0IGlzVmlkZW8gPSBpc1R5cGVWaWRlbyhmaWxlKTtcbiAgICBjb25zdCBpc0F1ZGlvID0gaXNUeXBlQXVkaW8oZmlsZSk7XG4gICAgY29uc3QgdmFsaWRJbWFnZSA9IGlzSW5jbHVkZUltYWdlRXh0TGlzdChleHRlbnNpb24sIHRoaXMuaW1hZ2VFeHRMaXN0KCkpO1xuICAgIGNvbnN0IHZhbGlkVmlkZW8gPSBpc0luY2x1ZGVWaWRlb0V4dExpc3QoZXh0ZW5zaW9uLCB0aGlzLnZpZGVvRXh0TGlzdCgpKTtcbiAgICBjb25zdCB2YWxpZEF1ZGlvID0gaXNJbmNsdWRlQXVkaW9FeHRMaXN0KGV4dGVuc2lvbiwgdGhpcy5hdWRpb0V4dExpc3QoKSk7XG4gICAgY29uc3QgdmFsaWREb2N1bWVudCA9IGlzSW5jbHVkZURvY3VtZW50RXh0TGlzdChleHRlbnNpb24sIHRoaXMuZG9jdW1lbnRFeHRMaXN0KCkpO1xuXG4gICAgY29uc3QgdHlwZVNwbGl0ID0gdGhpcy5maWxlVHlwZSgpLnNwbGl0KCdfJyk7XG5cbiAgICBpZiAoaXNJbWFnZSAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2ltYWdlJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEltYWdlO1xuICAgIH1cbiAgICBpZiAoaXNWaWRlbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ3ZpZGVvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZFZpZGVvO1xuICAgIH1cbiAgICBpZiAoaXNBdWRpbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2F1ZGlvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEF1ZGlvO1xuICAgIH1cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdkb2N1bWVudCcpKSB7XG4gICAgICByZXR1cm4gdmFsaWREb2N1bWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tWYWxpZEZpbGVTaXplKGZpbGU6IEZpbGUgfCBCbG9iKSB7XG4gICAgY29uc3QgaXNJbWFnZSA9IGlzVHlwZUltYWdlKGZpbGUpO1xuICAgIGNvbnN0IGlzVmlkZW8gPSBpc1R5cGVWaWRlbyhmaWxlKTtcbiAgICBjb25zdCBpc0F1ZGlvID0gaXNUeXBlQXVkaW8oZmlsZSk7XG4gICAgY29uc3QgdmFsaWRJbWFnZSA9IGZpbGUuc2l6ZSA8PSB0aGlzLm1heEltYWdlU2l6ZSgpO1xuICAgIGNvbnN0IHZhbGlkVmlkZW8gPSBmaWxlLnNpemUgPD0gdGhpcy5tYXhWaWRlb1NpemUoKTtcbiAgICBjb25zdCB2YWxpZEF1ZGlvID0gZmlsZS5zaXplIDw9IHRoaXMubWF4QXVkaW9TaXplKCk7XG4gICAgY29uc3QgdmFsaWREb2N1bWVudCA9IGZpbGUuc2l6ZSA8PSB0aGlzLm1heERvY3VtZW50U2l6ZSgpO1xuXG4gICAgY29uc3QgdHlwZVNwbGl0ID0gdGhpcy5maWxlVHlwZSgpLnNwbGl0KCdfJyk7XG5cbiAgICBpZiAoaXNJbWFnZSAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2ltYWdlJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEltYWdlO1xuICAgIH1cbiAgICBpZiAoaXNWaWRlbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ3ZpZGVvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZFZpZGVvO1xuICAgIH1cbiAgICBpZiAoaXNBdWRpbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2F1ZGlvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEF1ZGlvO1xuICAgIH1cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdkb2N1bWVudCcpKSB7XG4gICAgICByZXR1cm4gdmFsaWREb2N1bWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdmFsaWRhdGUoKSB7XG4gICAgaWYgKHRoaXMudmFsaWRSZXF1aXJlZCgpPy5pc1JlcXVpcmVkICYmICF0aGlzLmZpbGVMaXN0KCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodGhpcy52YWxpZFJlcXVpcmVkKCk/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmZpbGVMaXN0KCkubGVuZ3RoID4gdGhpcy5saW1pdEZpbGUoKSkge1xuICAgICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHRoaXMubWVzc2FnZVRvdGFsRmlsZUV4Y2VlZHNFcnJvcigpKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBmaWxlRXJyb3IgPSB0aGlzLmZpbGVMaXN0KCkuZmluZChpdGVtID0+IGl0ZW0oKS5lcnJvcik7XG5cbiAgICBpZiAoZmlsZUVycm9yKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodGhpcy5tdWx0aXBsZSgpID8gdGhpcy5tZXNzYWdlRmlsZVVwbG9hZEVycm9yKCkgOiBmaWxlRXJyb3IoKS5lcnJvcik7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHVuZGVmaW5lZCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2V0QXZhdGFyKGV2ZW50OiBFdmVudCwgZmlsZTogV3JpdGFibGVTaWduYWw8SUZpbGU+KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmZpbGVMaXN0KCkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtKCkuaWQgPT09IGZpbGUoKS5pZCkge1xuICAgICAgICBpdGVtLnVwZGF0ZShmaWxlID0+ICh7IC4uLmZpbGUsIGlzQXZhdGFyOiB0cnVlIH0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXRlbS51cGRhdGUoZmlsZSA9PiAoeyAuLi5maWxlLCBpc0F2YXRhcjogZmFsc2UgfSkpO1xuICAgIH0pO1xuICAgIHRoaXMub3V0RmlsZUNoYW5nZWQuZW1pdCh0aGlzLmZpbGVMaXN0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVBbGxGaWxlKCkge1xuICAgIHRoaXMuZmlsZUxpc3Quc2V0KFtdKTtcbiAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRG93bmxvYWRTYW1wbGVGaWxlKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKCk7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbmZpZz8uY2FsbEJhY2spIHtcbiAgICAgIGNvbmZpZy5jYWxsQmFjaygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb25maWc/LnVybCkge1xuICAgICAgZG93bmxvYWRGaWxlQnlVcmwoY29uZmlnLnVybCwgY29uZmlnLnRpdGxlKTtcbiAgICB9XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGxcIj5cbiAgPGRpdj5cbiAgICBAaWYgKGxhYmVsQ29uZmlnKCk7YXMgbGFiZWxDb25maWcpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWwgW2NsYXNzSW5jbHVkZV09XCJsYWJlbENvbmZpZy5jbGFzc0luY2x1ZGVcIlxuICAgICAgICBbbGFiZWxMZWZ0XT1cImxhYmVsQ29uZmlnLmxhYmVsTGVmdFwiXG4gICAgICAgIFtsYWJlbExlZnRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICAgIFtyZXF1aXJlZF09XCJsYWJlbENvbmZpZy5yZXF1aXJlZCBcIlxuICAgICAgICBbZGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgICBbbGFiZWxSaWdodF09XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0XCJcbiAgICAgICAgW2xhYmVsUmlnaHRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0Q2xhc3NcIlxuICAgICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgICAgW2J1dHRvbnNMZWZ0XT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNMZWZ0XCJcbiAgICAgICAgW2J1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5idXR0b25zUmlnaHRcIlxuICAgICAgICBbZGlzYWJsZUJ1dHRvbnNMZWZ0XT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zTGVmdCB8fCBkaXNhYmxlKClcIlxuICAgICAgICBbZGlzYWJsZUJ1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc1JpZ2h0IHx8IGRpc2FibGUoKVwiXG4gICAgICAgIFtoYXNUb2dnbGVdPVwibGFiZWxDb25maWcuaGFzVG9nZ2xlXCJcbiAgICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJsYWJlbENvbmZpZy50b2dnbGVBY3RpdmVcIlxuICAgICAgICBbdG9nZ2xlRGlzYWJsZV09XCJsYWJlbENvbmZpZy50b2dnbGVEaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgIFtwb3BvdmVyXT1cImxhYmVsQ29uZmlnLnBvcG92ZXJcIlxuICAgICAgICBbaWNvblBvcG92ZXJDbGFzc109XCJsYWJlbENvbmZpZy5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICAgIFtsaW1pdExlbmd0aF09XCJsYWJlbENvbmZpZy5saW1pdExlbmd0aFwiXG4gICAgICAgIFtidXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgICAgW2Rpc2FibGVCdXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbiB8fCBkaXNhYmxlKClcIlxuICAgICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NdPVwibGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NcIlxuICAgICAgICBbY291bnRdPVwibGFiZWxDb25maWcuY291bnRcIiAvPlxuICAgIH1cbiAgICBAaWYgKCghY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKCk/LnBvc2l0aW9uIHx8IGNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSgpPy5wb3NpdGlvbiA9PT0gJ3RvcCcpICYmIGNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSgpO2FzIGNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSkge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICBbY2xhc3NMYWJlbF09XCInbGlicy11aS1mb250LWg3bSdcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichbWItWzhweF0gIXAtMCdcIlxuICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWF0dGFjaG1lbnQgYmVmb3JlOiF0ZXh0LVsxMnB4XSdcIlxuICAgICAgICBbbGFiZWxdPVwiY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlPy50aXRsZSB8fCAnICdcIlxuICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckRvd25sb2FkU2FtcGxlRmlsZSgkZXZlbnQpXCIgLz5cbiAgICB9XG4gICAgQGlmIChtdWx0aXBsZSgpIHx8IHNob3dCbG9ja1VwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSgpIHx8ICghZmlsZUxpc3QoKS5sZW5ndGggJiYgIW11bHRpcGxlKCkpKSB7XG4gICAgICA8ZGl2ICN1cGxvYWRcbiAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZFwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1kaXNhYmxlXT1cImRpc2FibGUoKSB8fCAoIW11bHRpcGxlKCkgJiYgZmlsZUxpc3QoKS5sZW5ndGgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWVycm9yXT1cIm1lc3NhZ2VFcnJvcigpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1bMTZweF1cIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1jb21wb25lbnRzLWlucHV0cy11cGxvYWQtaWNvbiBsaWJzLXVpLWljb24tZmlsZS11cGxvYWQgYmVmb3JlOiF0ZXh0LVszMnB4XVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnRzLWlucHV0cy11cGxvYWQtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1bNHB4XSBsaWJzLXVpLWZvbnQtaDZtXCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCIoY29uZmlnRGVzY3JpcHRpb25JbnB1dFVwbG9hZCgpLm1lc3NhZ2UgfHwgJycpIHwgdHJhbnNsYXRlOmNvbmZpZ0Rlc2NyaXB0aW9uSW5wdXRVcGxvYWQoKS5pbnRlcnBvbGF0ZVBhcmFtc1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGRlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGVDb21wdXRlZCgpOyB0cmFjayBpdGVtOyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDdyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubWItWzRweF1dPVwiIWxhc3RcIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiaXRlbS5tZXNzYWdlIHwgdHJhbnNsYXRlOml0ZW0uaW50ZXJwb2xhdGVQYXJhbXNcIj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKG11bHRpcGxlKCkpIHtcbiAgICAgICAgICA8aW5wdXQgI3VwbG9hZElucHV0XG4gICAgICAgICAgICBjbGFzcz1cInVwbG9hZC1pbnB1dCBoaWRkZW5cIlxuICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgbmFtZT1cImZpbGVzW11cIlxuICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgIFthY2NlcHRdPVwiYWNjZXNzRmlsZXMoKVwiIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxpbnB1dCAjdXBsb2FkSW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwidXBsb2FkLWlucHV0IGhpZGRlblwiXG4gICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICBuYW1lPVwiZmlsZXNbXVwiXG4gICAgICAgICAgICBbYWNjZXB0XT1cImFjY2Vzc0ZpbGVzKClcIiAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChtZXNzYWdlRXJyb3IoKSAmJiAobXVsdGlwbGUoKSB8fCBzaG93QmxvY2tVcGxvYWRXaGVuSGFzRmlsZUFuZE1vZGVTaW5nbGUoKSB8fCAoIWZpbGVMaXN0KCkubGVuZ3RoICYmICFtdWx0aXBsZSgpKSkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtdC1bOHB4XSB0ZXh0LVsjZWUyZDQxXSBsaWJzLXVpLWZvbnQtaDdyXCI+XG4gICAgICAgIHt7IChtZXNzYWdlRXJyb3IoKSB8fCAnJykgfCB0cmFuc2xhdGU6eyB2YWx1ZTogbGltaXRGaWxlKCkgfSB9fVxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIEBpZiAoY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKCk/LnBvc2l0aW9uID09PSAnYm90dG9tJyAmJiAgY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKCk7YXMgY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKSB7XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDdtJ1wiXG4gICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFtdC1bOHB4XSAhcC0wJ1wiXG4gICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tYXR0YWNobWVudCBiZWZvcmU6IXRleHQtWzEycHhdJ1wiXG4gICAgICAgIFtsYWJlbF09XCJjb25maWdEb3dubG9hZFNhbXBsZUZpbGUudGl0bGUgfHwgJyAnXCJcbiAgICAgICAgKG1vQ2xpY2spPVwiaGFuZGxlckRvd25sb2FkU2FtcGxlRmlsZSgkZXZlbnQpXCIgLz5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKGZpbGVMaXN0KCkubGVuZ3RoKSB7XG4gICAgPGRpdiBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGwgaC1mdWxsIHB4LVsxMHB4XSBsaWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC12aWV3LWxpc3Qge3sgY2xhc3NJbmNsdWRlRmlsZUNvbnRlbnQoKSB8fCAnJyB9fVwiXG4gICAgICBbY2xhc3MubXQtWzEycHhdXT1cIm11bHRpcGxlKCkgfHwgc2hvd0Jsb2NrVXBsb2FkV2hlbkhhc0ZpbGVBbmRNb2RlU2luZ2xlKClcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltsYWJlbC1maWxlXVwiPjwvbmctY29udGVudD5cbiAgICAgIEBmb3IgKGl0ZW0gb2YgZmlsZUxpc3QoKTsgdHJhY2sgaXRlbSgpOyBsZXQgZmlyc3QgPSAkZmlyc3QpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLXZpZXctbGlzdC1pdGVtIHt7IGNsYXNzSW5jbHVkZUxpc3RJdGVtKCkgfHwgJycgfX1cIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1maWxlLWZ1bGxdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgW2NsYXNzLmxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWZpbGUtc2hvcnRdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdzaG9ydCdcIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1lcnJvci1nZW5lcmFsXT1cIml0ZW0oKS5lcnJvciB8fCAobWVzc2FnZUVycm9yKCkgJiYgc2hvd0JvcmRlckVycm9yQWxsSXRlbVdoZW5FcnJvcigpKVwiXG4gICAgICAgICAgW2NsYXNzLm10LTBdPVwiZmlyc3QgJiYgIW11bHRpcGxlKCkgJiYgIXNob3dCbG9ja1VwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSgpXCI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICBAaWYgKGNhblNldEF2YXRhcigpICYmIGl0ZW0oKS50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIichbXItMCcgKyAoaXRlbSgpLmlzQXZhdGFyID8gJyBsaWJzLXVpLWljb24tY2hlY2stY2lyY2xlLXNvbGlkIGJlZm9yZTohdGV4dC1bIzAwYmM2Ml0nOiAnIGxpYnMtdWktaWNvbi1jaGVjay1jaXJjbGUtb3V0bGluZScpICsgKChkaXNhYmxlKCkgfHwgaXRlbSgpLmlzVXBsb2FkaW5nIHx8ICEhaXRlbSgpLmVycm9yKSA/ICcgbGlicy11aS1kaXNhYmxlJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7Y29uZmlnOnsgY29udGVudDogaXRlbSgpLmlzQXZhdGFyID8gJ2kxOG5fYXZhdGFyJyA6ICdpMThuX2Nob29zZV9hc195b3VyX2F2YXRhcicsIHpJbmRleDogekluZGV4KCl9fVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichbXItWzEycHhdICFwLTAnXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCBpdGVtKCkuaXNVcGxvYWRpbmcgfHwgISFpdGVtKCkuZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJTZXRBdmF0YXIoJGV2ZW50LCBpdGVtKVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICBbY2xhc3Mudy1bY2FsYygxMDAlLTI4cHgpXV09XCJjYW5TZXRBdmF0YXIoKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiIWNhblNldEF2YXRhcigpXCI+XG4gICAgICAgICAgICAgIEBpZiAobW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJykge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1hdmF0YXIgW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgICAgIFsoaXRlbSldPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICBbc2hvd1ZpZGVvRHVyYXRpb25dPVwic2hvd1ZpZGVvRHVyYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAob3V0T3BlblByZXZpZXcpPVwiaGFuZGxlck9wZW5QcmV2aWV3RmlsZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWJzb2x1dGUgdy1mdWxsIGgtZnVsbCBmbGV4LWNvbFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZmxleC1jb2xdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuanVzdGlmeS1jZW50ZXJdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cIm1vZGVEaXNwbGF5RmlsZSgpID09PSAnc2hvcnQnXCI+XG4gICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsIGNsYXNzPVwiZmxleCB3LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxMZWZ0XT1cIml0ZW0oKS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW3pJbmRleFBvcG92ZXJdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsTGVmdENsYXNzXT1cIidsaWJzLXVpLWZvbnQtaDZtICcgKyAoKGRpc2FibGUoKSB8fCBpdGVtKCkuaXNVcGxvYWRpbmcgfHwgaXRlbSgpLmVycm9yKSA/ICd0ZXh0LVsjNmE3MzgzXScgOiAndGV4dC1bIzA3MTYzMV0nKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdzaG9ydCcgPyAnIW1iLTAnIDogJydcIiAvPlxuXG4gICAgICAgICAgICAgICAgICBAaWYgKCFpZ25vcmVTaG93U2l6ZUZpbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1bIzljYTJhZF0gbGlicy11aS1mb250LWg3ciBzaHJpbmstMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZsZXhdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJtb2RlRGlzcGxheUZpbGUoKSA9PT0gJ3Nob3J0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVsxMnB4XV09XCJtb2RlRGlzcGxheUZpbGUoKSA9PT0gJ3Nob3J0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0oKS5zaXplIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChpdGVtKCkuaXNVcGxvYWRpbmcgJiYgaXRlbSgpLnBlcmNlbnRVcGxvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbWwtWzE2cHhdXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5tci1bMjZweF1dPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctWzEyMHB4XSBoLVs0cHhdIHJvdW5kZWQtWzRweF0gYmctWyNmOGY5ZmFdIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCBsZWZ0LTAgaC1bNHB4XSByb3VuZGVkLVs0cHhdIGJnLVsjMDBiYzYyXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIihpdGVtKCkucGVyY2VudFVwbG9hZGluZyA/PyAwKSoxLjJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1sLVsxNnB4XVwiPlxuICAgICAgICAgICAgQGlmICghaWdub3JlSWNvblByZXZpZXcoKSkge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZXllLW91dGxpbmUgIW1yLTAnXCJcbiAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7Y29uZmlnOnsgY29udGVudDogJ2kxOG5fcHJldmlldycsIHpJbmRleDogekluZGV4KCkrMX19XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJyArIChpZ25vcmVJY29uUmVtb3ZlKCkgJiYgIWlnbm9yZUljb25FZGl0KCkgPyAnJyA6ICcgIW1yLVsxMnB4XScpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJpdGVtKCkuaXNVcGxvYWRpbmcgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlck9wZW5QcmV2aWV3RmlsZShpdGVtKCkpXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoaXRlbSgpLnR5cGUgPT09ICdpbWFnZScgJiYgIWl0ZW0oKS5lcnJvciAmJiAhaWdub3JlSWNvbkVkaXQoKSkge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZWRpdC1saW5lICFtci0wJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwie2NvbmZpZzp7IGNvbnRlbnQ6ICdpMThuX2VkaXQnLCB6SW5kZXg6IHpJbmRleCgpKzF9fVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCcgKyAoaWdub3JlSWNvblJlbW92ZSgpID8gJycgOiAnICFtci1bMTJweF0nKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiaXRlbSgpLmlzVXBsb2FkaW5nIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJFZGl0SW1hZ2UoJGV2ZW50LCBpdGVtKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKCFpZ25vcmVJY29uUmVtb3ZlKCkpIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWNsb3NlICFtci0wJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwie2NvbmZpZzoge2NvbnRlbnQ6ICdpMThuX2RlbGV0ZScsIHpJbmRleDogekluZGV4KCkrMX19XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiaXRlbSgpLmlzVXBsb2FkaW5nIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJSZW1vdmVGaWxlKCRldmVudCwgaXRlbSlcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChpdGVtKCkuZXJyb3IgJiYgKG11bHRpcGxlKCkgfHwgIXNob3dCbG9ja1VwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSgpKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC1bOHB4XSB0ZXh0LVsjZWUyZDQxXSBsaWJzLXVpLWZvbnQtaDdyXCI+e3sgKGl0ZW0oKS5lcnJvciB8fCAnICcpIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=
480
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvdXBsb2FkL3NyYy91cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy91cGxvYWQvc3JjL3VwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBZ0IsUUFBUSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3ROLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JGLE9BQU8sRUFBYSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25HLE9BQU8sRUFBVSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsNkJBQTZCLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN1csT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLDJDQUEyQyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEYsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0seUJBQXlCLENBQUM7OztBQWdCakYsTUFBTSxPQUFPLHFDQUFxQztJQUNoRCxxQkFBcUI7SUFDYix1QkFBdUIsQ0FBc0Q7SUFDN0UsdUJBQXVCLENBQXNEO0lBQzdFLDRCQUE0QixDQUF3RDtJQUNsRixVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLFFBQVEsR0FBRyxNQUFNLENBQStCLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELFdBQVcsR0FBRyxNQUFNLENBQVMsRUFBRSxDQUFDLENBQUM7SUFDakMsWUFBWSxHQUFHLE1BQU0sQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFDckQsb0NBQW9DLEdBQUcsUUFBUSxDQUE2QyxHQUFHLEVBQUU7UUFDekcsSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQyw0QkFBNEIsRUFBMkQsQ0FBQztRQUN0RyxDQUFDO1FBQ0QsT0FBTyxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDeEosQ0FBQyxDQUFDLENBQUM7SUFFSyxTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUN4QyxhQUFhO0lBRWIsaUJBQWlCO0lBQ1IsV0FBVyxHQUFHLEtBQUssQ0FBeUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakksUUFBUSxHQUFHLEtBQUssQ0FBaUQsc0JBQXNCLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO0lBQzlJLFFBQVEsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUM1Qix1QkFBdUIsR0FBRyxLQUFLLENBQStCLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pHLFlBQVksR0FBRyxLQUFLLENBQXNCLEtBQUssQ0FBQyxDQUFDO0lBQ2pELFNBQVMsR0FBRyxLQUFLLENBQTZCLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLFlBQVksR0FBRyxLQUFLLENBQTZCLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsSCxZQUFZLEdBQUcsS0FBSyxDQUE2QixDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEgsWUFBWSxHQUFHLEtBQUssQ0FBNkIsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2xILGVBQWUsR0FBRyxLQUFLLENBQTZCLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNySCxZQUFZLEdBQUcsS0FBSyxDQUE2QixFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEgsWUFBWSxHQUFHLEtBQUssQ0FBaUMsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDOUcsWUFBWSxHQUFHLEtBQUssQ0FBaUMsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDOUcsZUFBZSxHQUFHLEtBQUssQ0FBaUMsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDdkgsWUFBWSxHQUFHLEtBQUssQ0FBaUMsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDOUcsb0JBQW9CLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDdkMsYUFBYSxHQUFHLEtBQUssRUFBb0IsQ0FBQztJQUMxQyxPQUFPLEdBQUcsS0FBSyxDQUErQixLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN6RixXQUFXLEdBQUcsS0FBSyxFQUFnQixDQUFDO0lBQ3BDLE1BQU0sR0FBRyxLQUFLLENBQTZCLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLGtCQUFrQixHQUFHLEtBQUssQ0FBK0IsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEcsZ0NBQWdDLEdBQUcsS0FBSyxDQUErQixLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsSCxvQkFBb0IsR0FBRyxLQUFLLENBQTZCLDZDQUE2QyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLDZDQUE2QyxFQUFFLENBQUMsQ0FBQztJQUNwTCxtQkFBbUIsR0FBRyxLQUFLLENBQTZCLDBDQUEwQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLDBDQUEwQyxFQUFFLENBQUMsQ0FBQztJQUM3SyxzQkFBc0IsR0FBRyxLQUFLLENBQTZCLDBCQUEwQixFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLDBCQUEwQixFQUFFLENBQUMsQ0FBQztJQUNoSiw0QkFBNEIsR0FBRyxLQUFLLENBQTZCLG1FQUFtRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLG1FQUFtRSxFQUFFLENBQUMsQ0FBQTtJQUN2Tyw0QkFBNEIsR0FBRyxLQUFLLENBQW1ELEVBQUUsT0FBTyxFQUFFLDhDQUE4QyxFQUFFLEVBQUU7UUFDM0osU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLDhDQUE4QyxFQUFFO0tBQ3JGLENBQUMsQ0FBQztJQUVNLGVBQWUsR0FBRyxLQUFLLENBQTZELE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pJLDRCQUE0QixHQUFHLEtBQUssRUFBOEQsQ0FBQztJQUNuRyxpQkFBaUIsR0FBRyxLQUFLLENBQStCLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ25HLFdBQVcsR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUM5Qix1Q0FBdUMsR0FBRyxLQUFLLENBQStCLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZILGdCQUFnQixHQUFHLEtBQUssQ0FBK0IsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbEcsY0FBYyxHQUFHLEtBQUssQ0FBK0IsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEcsaUJBQWlCLEdBQUcsS0FBSyxDQUErQixJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqRyx1QkFBdUIsR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUMxQywrQkFBK0IsR0FBRyxLQUFLLENBQStCLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2pILHdCQUF3QixHQUFHLEtBQUssRUFBbUMsQ0FBQztJQUM3RSxhQUFhO0lBRWIsa0JBQWtCO0lBQ1QsUUFBUSxHQUFHLE1BQU0sRUFBVyxDQUFDO0lBQzdCLGNBQWMsR0FBRyxNQUFNLEVBQWdDLENBQUM7SUFDeEQsY0FBYyxHQUFHLE1BQU0sRUFBeUIsQ0FBQztJQUNqRCxtQkFBbUIsR0FBRyxNQUFNLEVBQStCLENBQUM7SUFDckUsYUFBYTtJQUViLHdCQUF3QjtJQUNmLFNBQVMsR0FBRyxTQUFTLENBQWEsUUFBUSxDQUFDLENBQUM7SUFDNUMsY0FBYyxHQUFHLFNBQVMsQ0FBYSxhQUFhLENBQUMsQ0FBQztJQUMvRCxhQUFhO0lBRWIscUJBQXFCO0lBQ2IsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDaEUsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDNUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDaEUsYUFBYTtJQUViO1FBQ0UsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixRQUFRO1FBQ04sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQztZQUM1QixZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3RDLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDeEMsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQy9CLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBRXJFLElBQUksYUFBYSxFQUFFLENBQUM7b0JBQ2xCLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZILENBQUM7WUFDSCxDQUFDO1lBQ0QsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQixJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNQLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7b0JBRWpFLElBQUksU0FBUyxFQUFFLENBQUM7d0JBQ2QsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMxRCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsaUJBQWlCLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxhQUFhLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNsRixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWU7UUFDYixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUNELGFBQWE7SUFFYix5QkFBeUI7SUFDZixLQUFLLENBQUMsZUFBZTtRQUM3QixNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUM7UUFDaEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU3QyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ25DLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDaEMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVTLEtBQUssQ0FBQyxlQUFlO1FBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxhQUFhLENBQUM7UUFDbEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLGFBQWEsQ0FBQztRQUU1RCxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hGLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakYsQ0FBQztJQUNELGFBQWE7SUFFYix5QkFBeUI7SUFDZixTQUFTLENBQUMsT0FBb0IsRUFBRSxTQUFpQixFQUFFLFFBQWlDO1FBQzVGLE9BQU8sU0FBUyxDQUFTLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNOLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNwQixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVTLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxLQUFZO1FBQ2pELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxDQUFDO1lBQ2xGLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsYUFBYSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVTLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFhO1FBQzdDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxhQUFhLENBQUM7UUFDNUQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixjQUFjLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVTLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBWTtRQUMxQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyw0Q0FBNEMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBRVMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFZO1FBQ3pDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFUyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQWE7UUFDM0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsNENBQTRDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFdEcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELGFBQWE7SUFFYiwwQkFBMEI7SUFDaEIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEtBQWE7UUFDN0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7UUFDL0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztZQUN4QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7WUFFZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0QyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN6QixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLHlCQUF5QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUU5SyxPQUFPO1lBQ1QsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQztZQUNsRixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2xFLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxlQUFlLEVBQUUsQ0FBQztZQUNuQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsTUFBTSxPQUFPLEdBQVU7Z0JBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDbkMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVU7Z0JBQzVFLEVBQUUsRUFBRSxJQUFJLEVBQUU7YUFDWCxDQUFDO1lBQ0YsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztnQkFDdkcsQ0FBQztnQkFDRCxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QyxTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7Z0JBQ3RHLENBQUM7Z0JBQ0QsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsRUFBRSxDQUFDO29CQUNoRSxJQUFJLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztvQkFFM0UsT0FBTztnQkFDVCxDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3BHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM5QixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNkLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztnQkFDRCxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBVSxFQUFFLE9BQWM7UUFDckQsT0FBTyxDQUFDLEdBQUcsR0FBRyxNQUFNLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzlCLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM1RSxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBVztRQUNoRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBVztRQUMzQyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ2pDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQzFILElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzVELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFXO1FBQ3hDLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDdEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHVCQUF1QixDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDakksTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3hDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNqRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxTQUFTLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFUyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBWSxFQUFFLElBQTJCO1FBQ3hFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFUyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBWSxFQUFFLElBQTJCO1FBQ3pFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsRUFBRSxFQUFFLENBQUM7WUFDeEUsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQztJQUNILENBQUM7SUFFUyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQStCO1FBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLFFBQVEsRUFBRSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzlCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFMUQsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFFTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVTLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBK0I7UUFDM0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqQyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBQ2xFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsdUJBQXVCLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUUxSCxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUM1RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQWlCLEVBQUUsRUFBRTtZQUN0RixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDNUcsTUFBTSxRQUFRLEdBQUcsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDMUQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckYsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFUyxLQUFLLENBQUMsdUJBQXVCLENBQUMsSUFBVTtRQUNoRCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDekUsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN6RSxNQUFNLGFBQWEsR0FBRyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFFbEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU3QyxJQUFJLE9BQU8sSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRVMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQWlCO1FBQ2xELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTFELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0MsSUFBSSxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVTLEtBQUssQ0FBQyxRQUFRO1FBQ3RCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxJQUFJLHlCQUF5QixDQUFDLENBQUM7WUFFbEYsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDO1lBRTNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3RCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFM0YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRVMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQVksRUFBRSxJQUEyQjtRQUN4RSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM3QixJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYTtRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRVMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLEtBQVk7UUFDcEQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDckIsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRWxCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDaEIsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhO0lBR2IsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO3dHQXJnQlUscUNBQXFDOzRGQUFyQyxxQ0FBcUMsa3dNQy9CbEQsc3JVQXlMQSxtdkdEbEtZLGVBQWUsNEZBQ3ZCLHNDQUFzQyxpaEJBQ3RDLDhCQUE4Qiw0cUJBQzlCLDJDQUEyQyx5TEFDM0Msc0NBQXNDOzs0RkFJN0IscUNBQXFDO2tCQWRqRCxTQUFTOytCQUVFLGtDQUFrQyxjQUdoQyxJQUFJLFdBQ1AsQ0FBQyxlQUFlO3dCQUN2QixzQ0FBc0M7d0JBQ3RDLDhCQUE4Qjt3QkFDOUIsMkNBQTJDO3dCQUMzQyxzQ0FBc0M7cUJBQ3ZDLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBjb21wdXRlZCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNHYWxsZXJ5Vmlld2VyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1nYWxsZXJ5JztcbmltcG9ydCB7IElTYXZlRmlsZSwgTGlic1VpQ29tcG9uZW50c0ltYWdlRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbWFnZS1lZGl0b3InO1xuaW1wb3J0IHsgSUxhYmVsLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQcmV2aWV3RmlsZUNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcHJldmlldy1maWxlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBJQXNwZWN0UmF0aW8sIElFdmVudCwgSUZpbGUsIElJc1ZhbGlkUmVxdWlyZWQsIElNZXNzYWdlVHJhbnNsYXRlIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBMaWJzVWlEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWR5bmFtaWMtY29tcG9uZW50JztcbmltcG9ydCB7IExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgQXVkaW9FeHRMaXN0LCBjb252ZXJ0QmxvYlRvRmlsZSwgY29udmVydEZpbGVUb0Jhc2U2NF9PYmplY3RVcmwsIERvY3VtZW50RXh0TGlzdCwgZG93bmxvYWRGaWxlQnlVcmwsIEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsIGdldEZpbGVFeHRlbnNpb24sIGdldExhYmVsQnlTaXplRmlsZSwgSW1hZ2VFeHRMaXN0LCBpc0luY2x1ZGVBdWRpb0V4dExpc3QsIGlzSW5jbHVkZURvY3VtZW50RXh0TGlzdCwgaXNJbmNsdWRlSW1hZ2VFeHRMaXN0LCBpc0luY2x1ZGVWaWRlb0V4dExpc3QsIGlzVHlwZUF1ZGlvLCBpc1R5cGVJbWFnZSwgaXNUeXBlVmlkZW8sIHV1aWQsIFZpZGVvRXh0TGlzdCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNVcGxvYWRBdmF0YXJDb21wb25lbnQgfSBmcm9tICcuL2F2YXRhci9hdmF0YXIuY29tcG9uZW50JztcbmltcG9ydCB7IGdldERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGVEZWZhdWx0IH0gZnJvbSAnLi9kZWZpbmVzL2hlbHBlci5kZWZpbmUnO1xuaW1wb3J0IHsgSVVwbG9hZENvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSwgSVVwbG9hZERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGUsIElVcGxvYWRGdW5jdGlvbkNvbnRyb2xFdmVudCwgVFlQRV9GSUxFX1VQTE9BRCwgVFlQRV9NT0RFX0ZJTEVfRElTUExBWSB9IGZyb20gJy4vaW50ZXJmYWNlcy91cGxvYWQuaW50ZXJmYWNlJztcbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VwbG9hZC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVXBsb2FkQXZhdGFyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNJbnB1dHNVcGxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVElFU1xuICBwcml2YXRlIGltYWdlRWRpdG9yQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPExpYnNVaUNvbXBvbmVudHNJbWFnZUVkaXRvckNvbXBvbmVudD47XG4gIHByaXZhdGUgcHJldmlld0ZpbGVDb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8TGlic1VpQ29tcG9uZW50c1ByZXZpZXdGaWxlQ29tcG9uZW50PjtcbiAgcHJpdmF0ZSBwcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPExpYnNVaUNvbXBvbmVudHNHYWxsZXJ5Vmlld2VyQ29tcG9uZW50PjtcbiAgcHJvdGVjdGVkIGlzRHJhZ092ZXIgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgZmlsZUxpc3QgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8SUZpbGU+Pj4oW10pO1xuICBwcm90ZWN0ZWQgYWNjZXNzRmlsZXMgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCBtZXNzYWdlRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgZGVzY3JpcHRpb25Gb3JtYXRBbmRTaXplRmlsZUNvbXB1dGVkID0gY29tcHV0ZWQ8QXJyYXk8SVVwbG9hZERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGU+PigoKSA9PiB7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb25Gb3JtYXRBbmRTaXplRmlsZSgpPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGUoKSBhcyB1bmtub3duIGFzIEFycmF5PElVcGxvYWREZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlPjtcbiAgICB9XG4gICAgcmV0dXJuIGdldERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGVEZWZhdWx0KHRoaXMuZmlsZVR5cGUoKSwgdGhpcy5tYXhJbWFnZVNpemUoKSwgdGhpcy5tYXhWaWRlb1NpemUoKSwgdGhpcy5tYXhEb2N1bWVudFNpemUoKSwgdGhpcy5tYXhBdWRpb1NpemUoKSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gSU5QVVRTXG4gIHJlYWRvbmx5IG9yaWdpbkZpbGVzID0gaW5wdXQ8QXJyYXk8V3JpdGFibGVTaWduYWw8SUZpbGU+PiwgQXJyYXk8V3JpdGFibGVTaWduYWw8SUZpbGU+PiB8IHVuZGVmaW5lZD4oW10sIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IFtdIH0pO1xuICByZWFkb25seSBmaWxlVHlwZSA9IGlucHV0PFRZUEVfRklMRV9VUExPQUQsIFRZUEVfRklMRV9VUExPQUQgfCB1bmRlZmluZWQ+KCdpbWFnZV92aWRlb19kb2N1bWVudCcsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICdpbWFnZV92aWRlb19kb2N1bWVudCcgfSk7XG4gIHJlYWRvbmx5IG11bHRpcGxlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2FuVXBsb2FkSWZIYXNFeGlzdEZpbGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGNhblNldEF2YXRhciA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbGltaXRGaWxlID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAxMCB9KTtcbiAgcmVhZG9ubHkgbWF4VG90YWxTaXplID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwICogMTAyNCAqIDEwMjQsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEwICogMTAyNCAqIDEwMjQgfSk7XG4gIHJlYWRvbmx5IG1heEltYWdlU2l6ZSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPig1ICogMTAyNCAqIDEwMjQsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDUgKiAxMDI0ICogMTAyNCB9KTtcbiAgcmVhZG9ubHkgbWF4VmlkZW9TaXplID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwICogMTAyNCAqIDEwMjQsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEwICogMTAyNCAqIDEwMjQgfSk7XG4gIHJlYWRvbmx5IG1heERvY3VtZW50U2l6ZSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMCAqIDEwMjQgKiAxMDI0LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAxMCAqIDEwMjQgKiAxMDI0IH0pO1xuICByZWFkb25seSBtYXhBdWRpb1NpemUgPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMTAgKiAxMDI0ICogMTAyNCwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gMTAgKiAxMDI0ICogMTAyNCB9KTtcbiAgcmVhZG9ubHkgaW1hZ2VFeHRMaXN0ID0gaW5wdXQ8c3RyaW5nW10sIHN0cmluZ1tdIHwgdW5kZWZpbmVkPihJbWFnZUV4dExpc3QsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IEltYWdlRXh0TGlzdCB9KTtcbiAgcmVhZG9ubHkgdmlkZW9FeHRMaXN0ID0gaW5wdXQ8c3RyaW5nW10sIHN0cmluZ1tdIHwgdW5kZWZpbmVkPihWaWRlb0V4dExpc3QsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IFZpZGVvRXh0TGlzdCB9KTtcbiAgcmVhZG9ubHkgZG9jdW1lbnRFeHRMaXN0ID0gaW5wdXQ8c3RyaW5nW10sIHN0cmluZ1tdIHwgdW5kZWZpbmVkPihEb2N1bWVudEV4dExpc3QsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IERvY3VtZW50RXh0TGlzdCB9KTtcbiAgcmVhZG9ubHkgYXVkaW9FeHRMaXN0ID0gaW5wdXQ8c3RyaW5nW10sIHN0cmluZ1tdIHwgdW5kZWZpbmVkPihBdWRpb0V4dExpc3QsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IEF1ZGlvRXh0TGlzdCB9KTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlTGlzdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHZhbGlkUmVxdWlyZWQgPSBpbnB1dDxJSXNWYWxpZFJlcXVpcmVkPigpO1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBhc3BlY3RSYXRpbyA9IGlucHV0PElBc3BlY3RSYXRpbz4oKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEyMDAsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEyMDAgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZVNob3dTaXplRmlsZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgYWxsb3dTaG93UHVzaE1lc3NhZ2VNYXhTaXplRXJyb3IgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IG1lc3NhZ2VUeXBlRmlsZUVycm9yID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX3RoZV9maWxlX3N1cHBvcnRfZm9ybWF0X2lzX25vdF9jb3JyZWN0JywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgfHwgJ2kxOG5fdGhlX2ZpbGVfc3VwcG9ydF9mb3JtYXRfaXNfbm90X2NvcnJlY3QnIH0pO1xuICByZWFkb25seSBtZXNzYWdlTWF4U2l6ZUVycm9yID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX2ZpbGVfc2l6ZV9leGNlZWRzX3RoZV9hbGxvd2VkX2xpbWl0JywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgfHwgJ2kxOG5fZmlsZV9zaXplX2V4Y2VlZHNfdGhlX2FsbG93ZWRfbGltaXQnIH0pO1xuICByZWFkb25seSBtZXNzYWdlRmlsZVVwbG9hZEVycm9yID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX2ludmFsaWRfZmlsZV91cGxvYWQnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaTE4bl9pbnZhbGlkX2ZpbGVfdXBsb2FkJyB9KTtcbiAgcmVhZG9ubHkgbWVzc2FnZVRvdGFsRmlsZUV4Y2VlZHNFcnJvciA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaTE4bl9maWxlX251bWJlcl9leGNlZWRzX3RoZV9hbGxvd2VkX2xpbWl0X3BsZWFzZV9kZWxldGVfdGhlX2ZpbGUnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaTE4bl9maWxlX251bWJlcl9leGNlZWRzX3RoZV9hbGxvd2VkX2xpbWl0X3BsZWFzZV9kZWxldGVfdGhlX2ZpbGUnIH0pXG4gIHJlYWRvbmx5IGNvbmZpZ0Rlc2NyaXB0aW9uSW5wdXRVcGxvYWQgPSBpbnB1dDxJTWVzc2FnZVRyYW5zbGF0ZSwgSU1lc3NhZ2VUcmFuc2xhdGUgfCB1bmRlZmluZWQ+KHsgbWVzc2FnZTogJ2kxOG5fZHJhZ19maWxlX2hlcmVfdG9fdXBsb2FkX29yX3NlbGVjdF9maWxlJyB9LCB7XG4gICAgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IHsgbWVzc2FnZTogJ2kxOG5fZHJhZ19maWxlX2hlcmVfdG9fdXBsb2FkX29yX3NlbGVjdF9maWxlJyB9XG4gIH0pO1xuXG4gIHJlYWRvbmx5IG1vZGVEaXNwbGF5RmlsZSA9IGlucHV0PFRZUEVfTU9ERV9GSUxFX0RJU1BMQVksIFRZUEVfTU9ERV9GSUxFX0RJU1BMQVkgfCB1bmRlZmluZWQ+KCdmdWxsJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgfHwgJ2Z1bGwnIH0pO1xuICByZWFkb25seSBkZXNjcmlwdGlvbkZvcm1hdEFuZFNpemVGaWxlID0gaW5wdXQ8V3JpdGFibGVTaWduYWw8QXJyYXk8SVVwbG9hZERlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGU+Pj4oKTtcbiAgcmVhZG9ubHkgc2hvd1ZpZGVvRHVyYXRpb24gPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGxhYmVsQ29uZmlnID0gaW5wdXQ8SUxhYmVsPigpO1xuICByZWFkb25seSBzaG93QmxvY2tVcGxvYWRXaGVuSGFzRmlsZUFuZE1vZGVTaW5nbGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyB0cnVlIH0pO1xuICByZWFkb25seSBpZ25vcmVJY29uUmVtb3ZlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBpZ25vcmVJY29uRWRpdCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlSWNvblByZXZpZXcgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyB0cnVlIH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVGaWxlQ29udGVudCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgc2hvd0JvcmRlckVycm9yQWxsSXRlbVdoZW5FcnJvciA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlID0gaW5wdXQ8SVVwbG9hZENvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZT4oKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gT1VUUFVUU1xuICByZWFkb25seSBvdXRDbG9zZSA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRGaWxlQ2hhbmdlZCA9IG91dHB1dDxBcnJheTxXcml0YWJsZVNpZ25hbDxJRmlsZT4+PigpO1xuICByZWFkb25seSBvdXRGaWxlUmVtb3ZlZCA9IG91dHB1dDxXcml0YWJsZVNpZ25hbDxJRmlsZT4+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SVVwbG9hZEZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBWSUVXIENISUxEUkVOXG4gIHJlYWRvbmx5IHVwbG9hZFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPigndXBsb2FkJyk7XG4gIHJlYWRvbmx5IHVwbG9hZElucHV0UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCd1cGxvYWRJbnB1dCcpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBJTkpFQ1RJT05TXG4gIHByaXZhdGUgZHluYW1pY0NvbXBvbmVudFNlcnZpY2UgPSBpbmplY3QoTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UpO1xuICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcmlnaW5GaWxlcygpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5maWxlTGlzdC5zZXQoWy4uLnRoaXMub3JpZ2luRmlsZXMoKV0pO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBMSUZFQ1lDTEUgSE9PS1NcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVBbGw6IHRoaXMucmVtb3ZlQWxsRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgdXBsb2FkaW5nOiBhc3luYyAocHJvY2VzcywgaWQpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVVwbG9hZGluZyA9IHRoaXMuZmlsZUxpc3QoKS5maW5kKGZpbGUgPT4gZmlsZSgpLmlkID09PSBpZCk7XG5cbiAgICAgICAgaWYgKGZpbGVVcGxvYWRpbmcpIHtcbiAgICAgICAgICBmaWxlVXBsb2FkaW5nLnVwZGF0ZShmaWxlID0+ICh7IC4uLmZpbGUsIHBlcmNlbnRVcGxvYWRpbmc6IHByb2Nlc3MucGVyY2VudCwgaXNVcGxvYWRpbmc6IHByb2Nlc3MucGVyY2VudCAhPT0gMTAwIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldE1lc3NhZ2VFcnJvcjogYXN5bmMgKG1lc3NhZ2UsIGlkKSA9PiB7XG4gICAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldChtZXNzYWdlKTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgY29uc3QgZmlsZUVycm9yID0gdGhpcy5maWxlTGlzdCgpLmZpbmQoZmlsZSA9PiBmaWxlKCkuaWQgPT09IGlkKTtcblxuICAgICAgICAgIGlmIChmaWxlRXJyb3IpIHtcbiAgICAgICAgICAgIGZpbGVFcnJvci51cGRhdGUoZmlsZSA9PiAoeyAuLi5maWxlLCBlcnJvcjogbWVzc2FnZSB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlclVwbG9hZEZpbGU6IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy51cGxvYWRJbnB1dFJlZigpPy5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgIHRoaXMudXBsb2FkSW5wdXRSZWYoKT8ubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FjY2VwdCcsIHRoaXMuYWNjZXNzRmlsZXMoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmluaXRBY2Nlc3NGaWxlcygpO1xuICAgICAgaWYgKHRoaXMudXBsb2FkUmVmKCkpIHtcbiAgICAgICAgdGhpcy5pbml0VXBsb2FkRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBJTklUSUFMSVpBVElPTlxuICBwcm90ZWN0ZWQgYXN5bmMgaW5pdEFjY2Vzc0ZpbGVzKCkge1xuICAgIGNvbnN0IGFjY2Vzc0V4dHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgdHlwZVNwbGl0ID0gdGhpcy5maWxlVHlwZSgpLnNwbGl0KCdfJyk7XG5cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdpbWFnZScpKSB7XG4gICAgICBhY2Nlc3NFeHRzLnB1c2goLi4udGhpcy5pbWFnZUV4dExpc3QoKSk7XG4gICAgfVxuICAgIGlmICh0eXBlU3BsaXQuaW5jbHVkZXMoJ2RvY3VtZW50JykpIHtcbiAgICAgIGFjY2Vzc0V4dHMucHVzaCguLi50aGlzLmRvY3VtZW50RXh0TGlzdCgpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVTcGxpdC5pbmNsdWRlcygndmlkZW8nKSkge1xuICAgICAgYWNjZXNzRXh0cy5wdXNoKC4uLnRoaXMudmlkZW9FeHRMaXN0KCkpO1xuICAgIH1cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdhdWRpbycpKSB7XG4gICAgICBhY2Nlc3NFeHRzLnB1c2goLi4udGhpcy5hdWRpb0V4dExpc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuYWNjZXNzRmlsZXMuc2V0KGFjY2Vzc0V4dHMubWFwKGV4dCA9PiBgLiR7ZXh0fWApLmpvaW4oJywnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaW5pdFVwbG9hZEV2ZW50KCkge1xuICAgIGNvbnN0IHVwbG9hZFJlZiA9IHRoaXMudXBsb2FkUmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaW5wdXRVcGxvYWRSZWYgPSB0aGlzLnVwbG9hZElucHV0UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICB0aGlzLmluaXRFdmVudChpbnB1dFVwbG9hZFJlZiwgJ2NoYW5nZScsIHRoaXMuaGFuZGxlclVwbG9hZEZpbGUuYmluZCh0aGlzKSkuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbml0RXZlbnQodXBsb2FkUmVmLCAnY2xpY2snLCB0aGlzLmhhbmRsZXJVcGxvYWRGaWxlQ2xpY2suYmluZCh0aGlzKSkuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbml0RXZlbnQodXBsb2FkUmVmLCAnZHJhZ292ZXInLCB0aGlzLmhhbmRsZXJEcmFnT3Zlci5iaW5kKHRoaXMpKS5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmluaXRFdmVudCh1cGxvYWRSZWYsICdkcmFnbGVhdmUnLCB0aGlzLmhhbmRsZXJEcmFnRW5kLmJpbmQodGhpcykpLnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaW5pdEV2ZW50KHVwbG9hZFJlZiwgJ2Ryb3AnLCB0aGlzLmhhbmRsZXJEcmFnRHJvcC5iaW5kKHRoaXMpKS5zdWJzY3JpYmUoKTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBFVkVOVCBIQU5ETElOR1xuICBwcm90ZWN0ZWQgaW5pdEV2ZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgY2FsbEJhY2s6IChldmVudDogSUV2ZW50KSA9PiB2b2lkKTogT2JzZXJ2YWJsZTxJRXZlbnQ+IHtcbiAgICByZXR1cm4gZnJvbUV2ZW50PElFdmVudD4oZWxlbWVudCwgZXZlbnROYW1lKS5waXBlKFxuICAgICAgdGFwKGUgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjYWxsQmFjayhlKTtcbiAgICAgIH0pLFxuICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclVwbG9hZEZpbGVDbGljayhldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmZpbGVMaXN0KCkubGVuZ3RoICYmICF0aGlzLmNhblVwbG9hZElmSGFzRXhpc3RGaWxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGxvYWRJbnB1dFJlZigpPy5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgdGhpcy51cGxvYWRJbnB1dFJlZigpPy5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYWNjZXB0JywgdGhpcy5hY2Nlc3NGaWxlcygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyVXBsb2FkRmlsZShldmVudDogSUV2ZW50KSB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVVcGxvYWRGaWxlcyhldmVudCk7XG4gICAgY29uc3QgaW5wdXRVcGxvYWRSZWYgPSB0aGlzLnVwbG9hZElucHV0UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGlucHV0VXBsb2FkUmVmKSB7XG4gICAgICBpbnB1dFVwbG9hZFJlZi52YWx1ZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJEcmFnT3ZlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMudXBsb2FkUmVmKCk/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnbGlicy11aS1jb21wb25lbnRzLWlucHV0cy11cGxvYWQtZHJhZy1vdmVyJywgdHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckRyYWdFbmQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnVwbG9hZFJlZigpPy5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2xpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWRyYWctb3ZlcicsIGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRHJhZ0Ryb3AoZXZlbnQ6IElFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy51cGxvYWRSZWYoKT8ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdsaWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1kcmFnLW92ZXInLCBmYWxzZSk7XG5cbiAgICBhd2FpdCB0aGlzLmhhbmRsZVVwbG9hZEZpbGVzKGV2ZW50KTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBGSUxFIE9QRVJBVElPTlNcbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZVVwbG9hZEZpbGVzKGV2ZW50OiBJRXZlbnQpIHtcbiAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXMgfHwgZXZlbnQudGFyZ2V0Py5maWxlcztcbiAgICBpZiAodGhpcy5tYXhUb3RhbFNpemUoKSkge1xuICAgICAgbGV0IHRvdGFsID0gMDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbCArPSBmaWxlc1tpXS5zaXplO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXhUb3RhbFNpemUoKSA8IHRvdGFsKSB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93Q29tcFR5cGVUZXh0RXJyb3IodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2kxOG5fc2l6ZV9ub3RfbnVtYmVyX21iJywgeyBudW1iZXI6IHRoaXMubWF4VG90YWxTaXplKCkgLyAxMDI0IC8gMTAyNCB9KSwgeyB0aW1lUmVtb3ZlOiAzMDAwIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZXJyb3JFeGNlZWRzTWF4RmlsZSA9IGZhbHNlO1xuICAgIGlmICghZmlsZXMgfHwgIWZpbGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmZpbGVMaXN0KCkubGVuZ3RoICYmICF0aGlzLmNhblVwbG9hZElmSGFzRXhpc3RGaWxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZW1haW5GaWxlVG90YWwgPSB0aGlzLmxpbWl0RmlsZSgpIC0gdGhpcy5maWxlTGlzdCgpLmxlbmd0aDtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gcmVtYWluRmlsZVRvdGFsKSB7XG4gICAgICBlcnJvckV4Y2VlZHNNYXhGaWxlID0gdHJ1ZTtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh0aGlzLm1lc3NhZ2VUb3RhbEZpbGVFeGNlZWRzRXJyb3IoKSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc1tpXTtcbiAgICAgIGNvbnN0IGlzSW1hZ2UgPSBpc1R5cGVJbWFnZShmaWxlKTtcbiAgICAgIGNvbnN0IGlzVmlkZW8gPSBpc1R5cGVWaWRlbyhmaWxlKTtcbiAgICAgIGNvbnN0IGlzQXVkaW8gPSBpc1R5cGVBdWRpbyhmaWxlKTtcbiAgICAgIGNvbnN0IG5ld0ZpbGU6IElGaWxlID0ge1xuICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgIHNpemU6IGdldExhYmVsQnlTaXplRmlsZShmaWxlLnNpemUpLFxuICAgICAgICB0eXBlOiBpc0ltYWdlID8gJ2ltYWdlJyA6IGlzVmlkZW8gPyAndmlkZW8nIDogaXNBdWRpbyA/ICdhdWRpbycgOiAnZG9jdW1lbnQnLFxuICAgICAgICBpZDogdXVpZCgpXG4gICAgICB9O1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkRmlsZUV4dGVuc2lvbihmaWxlKSkpIHtcbiAgICAgICAgaWYgKCFlcnJvckV4Y2VlZHNNYXhGaWxlKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHRoaXMubXVsdGlwbGUoKSA/IHRoaXMubWVzc2FnZUZpbGVVcGxvYWRFcnJvcigpIDogdGhpcy5tZXNzYWdlVHlwZUZpbGVFcnJvcigpKTtcbiAgICAgICAgfVxuICAgICAgICBuZXdGaWxlLmVycm9yID0gdGhpcy5tZXNzYWdlVHlwZUZpbGVFcnJvcigpO1xuICAgICAgICBhd2FpdCB0aGlzLnB1c2hGaWxlSW5MaXN0KGZpbGUsIG5ld0ZpbGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZEZpbGVTaXplKGZpbGUpKSkge1xuICAgICAgICBpZiAoIWVycm9yRXhjZWVkc01heEZpbGUpIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodGhpcy5tdWx0aXBsZSgpID8gdGhpcy5tZXNzYWdlRmlsZVVwbG9hZEVycm9yKCkgOiB0aGlzLm1lc3NhZ2VNYXhTaXplRXJyb3IoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3RmlsZS5lcnJvciA9IHRoaXMubWVzc2FnZU1heFNpemVFcnJvcigpO1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmFsbG93U2hvd1B1c2hNZXNzYWdlTWF4U2l6ZUVycm9yKCkpIHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dEVycm9yKHRoaXMubWVzc2FnZU1heFNpemVFcnJvcigpKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnB1c2hGaWxlSW5MaXN0KGZpbGUsIG5ld0ZpbGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMucHVzaEZpbGVJbkxpc3QoZmlsZSwgbmV3RmlsZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhblNldEF2YXRhcigpICYmIHRoaXMuZmlsZUxpc3QoKS5sZW5ndGggJiYgIXRoaXMuZmlsZUxpc3QoKS5maW5kKGZpbGUgPT4gZmlsZSgpLmlzQXZhdGFyKSkge1xuICAgICAgdGhpcy5maWxlTGlzdC51cGRhdGUoZmlsZUxpc3QgPT4ge1xuICAgICAgICBjb25zdCBpdGVtSW1hZ2UgPSBmaWxlTGlzdC5maW5kKGZpbGUgPT4gZmlsZSgpLnR5cGUgPT09ICdpbWFnZScpO1xuICAgICAgICBpZiAoaXRlbUltYWdlKSB7XG4gICAgICAgICAgaXRlbUltYWdlLnVwZGF0ZShmaWxlID0+ICh7IC4uLmZpbGUsIGlzQXZhdGFyOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWy4uLmZpbGVMaXN0XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLm91dEZpbGVDaGFuZ2VkLmVtaXQodGhpcy5maWxlTGlzdCgpKTtcbiAgICB0aGlzLnZhbGlkYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1c2hGaWxlSW5MaXN0KGZpbGU6IEZpbGUsIG5ld0ZpbGU6IElGaWxlKSB7XG4gICAgbmV3RmlsZS51cmwgPSBhd2FpdCBjb252ZXJ0RmlsZVRvQmFzZTY0X09iamVjdFVybChmaWxlKTtcblxuICAgIHRoaXMuZmlsZUxpc3QudXBkYXRlKGZpbGVMaXN0ID0+IHtcbiAgICAgIGZpbGVMaXN0LnNwbGljZSgwLCB0aGlzLmNhblVwbG9hZElmSGFzRXhpc3RGaWxlKCkgPyAxIDogMCwgc2lnbmFsKG5ld0ZpbGUpKTtcbiAgICAgIHJldHVybiBbLi4uZmlsZUxpc3RdO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJPcGVuUHJldmlld0ZpbGUoaXRlbTogSUZpbGUpIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICB0aGlzLnByZXZpZXdGaWxlRG9jdW1lbnQoaXRlbSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJldmlld0ZpbGVJbWFnZShpdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJldmlld0ZpbGVEb2N1bWVudChpdGVtOiBJRmlsZSkge1xuICAgIGlmICh0aGlzLnByZXZpZXdGaWxlQ29tcG9uZW50UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJldmlld0ZpbGVDb21wb25lbnRSZWYgPSB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KExpYnNVaUNvbXBvbmVudHNQcmV2aWV3RmlsZUNvbXBvbmVudCk7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUNvbXBvbmVudFJlZi5zZXRJbnB1dCgnZGF0YScsIGl0ZW0pO1xuICAgIHRoaXMucHJldmlld0ZpbGVDb21wb25lbnRSZWYuc2V0SW5wdXQoJ3pJbmRleCcsIHRoaXMuekluZGV4KCkgKyAxKTtcbiAgICB0aGlzLnByZXZpZXdGaWxlQ29tcG9uZW50UmVmLmluc3RhbmNlLm91dENsb3NlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlbW92ZSh0aGlzLnByZXZpZXdGaWxlQ29tcG9uZW50UmVmKTtcbiAgICAgIHRoaXMucHJldmlld0ZpbGVDb21wb25lbnRSZWYgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5hZGRUb0JvZHkodGhpcy5wcmV2aWV3RmlsZUNvbXBvbmVudFJlZik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXZpZXdGaWxlSW1hZ2UoaXRlbTogSUZpbGUpIHtcbiAgICBpZiAodGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZiA9IHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTGlic1VpQ29tcG9uZW50c0dhbGxlcnlWaWV3ZXJDb21wb25lbnQpO1xuICAgIGNvbnN0IHVybCA9IGl0ZW0udXJsIHx8IGl0ZW0ub3JpZ2luX3VybDtcbiAgICB0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYuc2V0SW5wdXQoJ2ltYWdlcycsIFt7IHVybCB9XSk7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmLnNldElucHV0KCdpbWFnZVNlbGVjdGVkJywgeyB1cmwgfSk7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmLnNldElucHV0KCdmaWVsZERpc3BsYXlTcmNJbWFnZScsICd1cmwnKTtcbiAgICB0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYuc2V0SW5wdXQoJ3NpbmdsZUltYWdlJywgdHJ1ZSk7XG4gICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmLmluc3RhbmNlLm91dENsb3NlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlbW92ZSh0aGlzLnByZXZpZXdGaWxlSW1hZ2VDb21wb25lbnRSZWYpO1xuICAgICAgdGhpcy5wcmV2aWV3RmlsZUltYWdlQ29tcG9uZW50UmVmID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuYWRkVG9Cb2R5KHRoaXMucHJldmlld0ZpbGVJbWFnZUNvbXBvbmVudFJlZik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckVkaXRJbWFnZShldmVudDogRXZlbnQsIGl0ZW06IFdyaXRhYmxlU2lnbmFsPElGaWxlPikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc2hvd0VkaXRNb2RhbChpdGVtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUmVtb3ZlRmlsZShldmVudDogRXZlbnQsIGl0ZW06IFdyaXRhYmxlU2lnbmFsPElGaWxlPikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVtb3ZlRmlsZShpdGVtKTtcbiAgICBpZiAodGhpcy5vcmlnaW5GaWxlcygpLmZpbmQoZmlsZSA9PiBmaWxlKCkudXJsID09PSBpdGVtKCkudXJsKSkge1xuICAgICAgdGhpcy5vdXRGaWxlUmVtb3ZlZC5lbWl0KGl0ZW0pO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKCkgJiYgIXRoaXMuc2hvd0Jsb2NrVXBsb2FkV2hlbkhhc0ZpbGVBbmRNb2RlU2luZ2xlKCkpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRVcGxvYWRFdmVudCgpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbW92ZUZpbGUoZmlsZUl0ZW06IFdyaXRhYmxlU2lnbmFsPElGaWxlPikge1xuICAgIHRoaXMuZmlsZUxpc3QudXBkYXRlKGZpbGVMaXN0ID0+IGZpbGVMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0oKS5pZCAhPT0gZmlsZUl0ZW0oKS5pZCkpO1xuICAgIGlmICh0aGlzLmNhblNldEF2YXRhcigpICYmIGZpbGVJdGVtKCkuaXNBdmF0YXIgJiYgdGhpcy5maWxlTGlzdCgpLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWxlTGlzdC51cGRhdGUoZmlsZUxpc3QgPT4ge1xuICAgICAgICBmaWxlTGlzdFswXS51cGRhdGUoZmlsZSA9PiAoeyAuLi5maWxlLCBpc0F2YXRhcjogdHJ1ZSB9KSk7XG5cbiAgICAgICAgcmV0dXJuIFsuLi5maWxlTGlzdF07XG4gICAgICB9KTtcblxuICAgIH1cbiAgICB0aGlzLm91dEZpbGVDaGFuZ2VkLmVtaXQodGhpcy5maWxlTGlzdCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzaG93RWRpdE1vZGFsKGZpbGVJdGVtOiBXcml0YWJsZVNpZ25hbDxJRmlsZT4pIHtcbiAgICBpZiAodGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWxlRGF0YVVybCA9IGZpbGVJdGVtKCkudXJsIHx8IGZpbGVJdGVtKCkub3JpZ2luX3VybCB8fCAnJztcbiAgICB0aGlzLmltYWdlRWRpdG9yQ29tcG9uZW50UmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMaWJzVWlDb21wb25lbnRzSW1hZ2VFZGl0b3JDb21wb25lbnQpO1xuXG4gICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnaW1nU3JjJywgZmlsZURhdGFVcmwpO1xuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuc2V0SW5wdXQoJ3pJbmRleCcsIHRoaXMuekluZGV4KCkgKyAxKTtcbiAgICB0aGlzLmltYWdlRWRpdG9yQ29tcG9uZW50UmVmLnNldElucHV0KCduYW1lRmlsZScsIGZpbGVJdGVtKCkubmFtZSk7XG4gICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnYXNwZWN0UmF0aW8nLCB0aGlzLmFzcGVjdFJhdGlvKCkpO1xuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuaW5zdGFuY2Uub3V0Q2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYpO1xuICAgICAgdGhpcy5pbWFnZUVkaXRvckNvbXBvbmVudFJlZiA9IHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICAgIHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYuaW5zdGFuY2Uub3V0U2F2ZUZpbGUuc3Vic2NyaWJlKGFzeW5jIChyZXN1bHQ6IElTYXZlRmlsZSkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZUVycm9yID0gIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRGaWxlU2l6ZShyZXN1bHQuZmlsZSkpID8gdGhpcy5tZXNzYWdlTWF4U2l6ZUVycm9yKCkgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBuYW1lRmlsZSA9IGZpbGVJdGVtKCkuZmlsZT8ubmFtZSB8fCBmaWxlSXRlbSgpLm5hbWU7XG4gICAgICBmaWxlSXRlbS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBmaWxlOiBjb252ZXJ0QmxvYlRvRmlsZShyZXN1bHQuZmlsZSwgbmFtZUZpbGUpLCBuYW1lOiBuYW1lRmlsZSwgb3JpZ2luX3VybDogdW5kZWZpbmVkLCBzaXplOiBnZXRMYWJlbEJ5U2l6ZUZpbGUocmVzdWx0LmZpbGUuc2l6ZSksIGVycm9yOiBtZXNzYWdlRXJyb3IsIHVybDogcmVzdWx0LnVybCwgaXNVcGRhdGU6IHRydWUgfSkpO1xuICAgICAgdGhpcy5vdXRGaWxlQ2hhbmdlZC5lbWl0KHRoaXMuZmlsZUxpc3QoKSk7XG4gICAgICB0aGlzLmltYWdlRWRpdG9yQ29tcG9uZW50UmVmPy5pbnN0YW5jZS5vdXRDbG9zZS5lbWl0KHsgaXNDbGlja0J1dHRvbkNsb3NlOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuYWRkVG9Cb2R5KHRoaXMuaW1hZ2VFZGl0b3JDb21wb25lbnRSZWYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNoZWNrVmFsaWRGaWxlRXh0ZW5zaW9uKGZpbGU6IEZpbGUpIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBnZXRGaWxlRXh0ZW5zaW9uKGZpbGUpO1xuXG4gICAgaWYgKCFleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaXNJbWFnZSA9IGlzVHlwZUltYWdlKGZpbGUpO1xuICAgIGNvbnN0IGlzVmlkZW8gPSBpc1R5cGVWaWRlbyhmaWxlKTtcbiAgICBjb25zdCBpc0F1ZGlvID0gaXNUeXBlQXVkaW8oZmlsZSk7XG4gICAgY29uc3QgdmFsaWRJbWFnZSA9IGlzSW5jbHVkZUltYWdlRXh0TGlzdChleHRlbnNpb24sIHRoaXMuaW1hZ2VFeHRMaXN0KCkpO1xuICAgIGNvbnN0IHZhbGlkVmlkZW8gPSBpc0luY2x1ZGVWaWRlb0V4dExpc3QoZXh0ZW5zaW9uLCB0aGlzLnZpZGVvRXh0TGlzdCgpKTtcbiAgICBjb25zdCB2YWxpZEF1ZGlvID0gaXNJbmNsdWRlQXVkaW9FeHRMaXN0KGV4dGVuc2lvbiwgdGhpcy5hdWRpb0V4dExpc3QoKSk7XG4gICAgY29uc3QgdmFsaWREb2N1bWVudCA9IGlzSW5jbHVkZURvY3VtZW50RXh0TGlzdChleHRlbnNpb24sIHRoaXMuZG9jdW1lbnRFeHRMaXN0KCkpO1xuXG4gICAgY29uc3QgdHlwZVNwbGl0ID0gdGhpcy5maWxlVHlwZSgpLnNwbGl0KCdfJyk7XG5cbiAgICBpZiAoaXNJbWFnZSAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2ltYWdlJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEltYWdlO1xuICAgIH1cbiAgICBpZiAoaXNWaWRlbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ3ZpZGVvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZFZpZGVvO1xuICAgIH1cbiAgICBpZiAoaXNBdWRpbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2F1ZGlvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEF1ZGlvO1xuICAgIH1cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdkb2N1bWVudCcpKSB7XG4gICAgICByZXR1cm4gdmFsaWREb2N1bWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tWYWxpZEZpbGVTaXplKGZpbGU6IEZpbGUgfCBCbG9iKSB7XG4gICAgY29uc3QgaXNJbWFnZSA9IGlzVHlwZUltYWdlKGZpbGUpO1xuICAgIGNvbnN0IGlzVmlkZW8gPSBpc1R5cGVWaWRlbyhmaWxlKTtcbiAgICBjb25zdCBpc0F1ZGlvID0gaXNUeXBlQXVkaW8oZmlsZSk7XG4gICAgY29uc3QgdmFsaWRJbWFnZSA9IGZpbGUuc2l6ZSA8PSB0aGlzLm1heEltYWdlU2l6ZSgpO1xuICAgIGNvbnN0IHZhbGlkVmlkZW8gPSBmaWxlLnNpemUgPD0gdGhpcy5tYXhWaWRlb1NpemUoKTtcbiAgICBjb25zdCB2YWxpZEF1ZGlvID0gZmlsZS5zaXplIDw9IHRoaXMubWF4QXVkaW9TaXplKCk7XG4gICAgY29uc3QgdmFsaWREb2N1bWVudCA9IGZpbGUuc2l6ZSA8PSB0aGlzLm1heERvY3VtZW50U2l6ZSgpO1xuXG4gICAgY29uc3QgdHlwZVNwbGl0ID0gdGhpcy5maWxlVHlwZSgpLnNwbGl0KCdfJyk7XG5cbiAgICBpZiAoaXNJbWFnZSAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2ltYWdlJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEltYWdlO1xuICAgIH1cbiAgICBpZiAoaXNWaWRlbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ3ZpZGVvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZFZpZGVvO1xuICAgIH1cbiAgICBpZiAoaXNBdWRpbyAmJiB0eXBlU3BsaXQuaW5jbHVkZXMoJ2F1ZGlvJykpIHtcbiAgICAgIHJldHVybiB2YWxpZEF1ZGlvO1xuICAgIH1cbiAgICBpZiAodHlwZVNwbGl0LmluY2x1ZGVzKCdkb2N1bWVudCcpKSB7XG4gICAgICByZXR1cm4gdmFsaWREb2N1bWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdmFsaWRhdGUoKSB7XG4gICAgaWYgKHRoaXMudmFsaWRSZXF1aXJlZCgpPy5pc1JlcXVpcmVkICYmICF0aGlzLmZpbGVMaXN0KCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodGhpcy52YWxpZFJlcXVpcmVkKCk/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubXVsdGlwbGUoKSAmJiB0aGlzLmZpbGVMaXN0KCkubGVuZ3RoID4gdGhpcy5saW1pdEZpbGUoKSkge1xuICAgICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHRoaXMubWVzc2FnZVRvdGFsRmlsZUV4Y2VlZHNFcnJvcigpKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBmaWxlRXJyb3IgPSB0aGlzLmZpbGVMaXN0KCkuZmluZChpdGVtID0+IGl0ZW0oKS5lcnJvcik7XG5cbiAgICBpZiAoZmlsZUVycm9yKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodGhpcy5tdWx0aXBsZSgpID8gdGhpcy5tZXNzYWdlRmlsZVVwbG9hZEVycm9yKCkgOiBmaWxlRXJyb3IoKS5lcnJvcik7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHVuZGVmaW5lZCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2V0QXZhdGFyKGV2ZW50OiBFdmVudCwgZmlsZTogV3JpdGFibGVTaWduYWw8SUZpbGU+KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmZpbGVMaXN0KCkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtKCkuaWQgPT09IGZpbGUoKS5pZCkge1xuICAgICAgICBpdGVtLnVwZGF0ZShmaWxlID0+ICh7IC4uLmZpbGUsIGlzQXZhdGFyOiB0cnVlIH0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXRlbS51cGRhdGUoZmlsZSA9PiAoeyAuLi5maWxlLCBpc0F2YXRhcjogZmFsc2UgfSkpO1xuICAgIH0pO1xuICAgIHRoaXMub3V0RmlsZUNoYW5nZWQuZW1pdCh0aGlzLmZpbGVMaXN0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVBbGxGaWxlKCkge1xuICAgIHRoaXMuZmlsZUxpc3Quc2V0KFtdKTtcbiAgICB0aGlzLm1lc3NhZ2VFcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRG93bmxvYWRTYW1wbGVGaWxlKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKCk7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbmZpZz8uY2FsbEJhY2spIHtcbiAgICAgIGNvbmZpZy5jYWxsQmFjaygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb25maWc/LnVybCkge1xuICAgICAgZG93bmxvYWRGaWxlQnlVcmwoY29uZmlnLnVybCwgY29uZmlnLnRpdGxlKTtcbiAgICB9XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGxcIj5cbiAgPGRpdj5cbiAgICBAaWYgKGxhYmVsQ29uZmlnKCk7YXMgbGFiZWxDb25maWcpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWwgW2NsYXNzSW5jbHVkZV09XCJsYWJlbENvbmZpZy5jbGFzc0luY2x1ZGVcIlxuICAgICAgICBbbGFiZWxMZWZ0XT1cImxhYmVsQ29uZmlnLmxhYmVsTGVmdFwiXG4gICAgICAgIFtsYWJlbExlZnRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICAgIFtyZXF1aXJlZF09XCJsYWJlbENvbmZpZy5yZXF1aXJlZCBcIlxuICAgICAgICBbZGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgICBbbGFiZWxSaWdodF09XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0XCJcbiAgICAgICAgW2xhYmVsUmlnaHRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0Q2xhc3NcIlxuICAgICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgICAgW2J1dHRvbnNMZWZ0XT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNMZWZ0XCJcbiAgICAgICAgW2J1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5idXR0b25zUmlnaHRcIlxuICAgICAgICBbZGlzYWJsZUJ1dHRvbnNMZWZ0XT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zTGVmdCB8fCBkaXNhYmxlKClcIlxuICAgICAgICBbZGlzYWJsZUJ1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc1JpZ2h0IHx8IGRpc2FibGUoKVwiXG4gICAgICAgIFtoYXNUb2dnbGVdPVwibGFiZWxDb25maWcuaGFzVG9nZ2xlXCJcbiAgICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJsYWJlbENvbmZpZy50b2dnbGVBY3RpdmVcIlxuICAgICAgICBbdG9nZ2xlRGlzYWJsZV09XCJsYWJlbENvbmZpZy50b2dnbGVEaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgIFtwb3BvdmVyXT1cImxhYmVsQ29uZmlnLnBvcG92ZXJcIlxuICAgICAgICBbaWNvblBvcG92ZXJDbGFzc109XCJsYWJlbENvbmZpZy5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICAgIFtsaW1pdExlbmd0aF09XCJsYWJlbENvbmZpZy5saW1pdExlbmd0aFwiXG4gICAgICAgIFtidXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgICAgW2Rpc2FibGVCdXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbiB8fCBkaXNhYmxlKClcIlxuICAgICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NdPVwibGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NcIlxuICAgICAgICBbY291bnRdPVwibGFiZWxDb25maWcuY291bnRcIiAvPlxuICAgIH1cbiAgICBAaWYgKCghY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKCk/LnBvc2l0aW9uIHx8IGNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSgpPy5wb3NpdGlvbiA9PT0gJ3RvcCcpICYmIGNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSgpO2FzIGNvbmZpZ0Rvd25sb2FkU2FtcGxlRmlsZSkge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICBbY2xhc3NMYWJlbF09XCInbGlicy11aS1mb250LWg3bSdcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichbWItWzhweF0gIXAtMCdcIlxuICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWF0dGFjaG1lbnQgYmVmb3JlOiF0ZXh0LVsxMnB4XSdcIlxuICAgICAgICBbbGFiZWxdPVwiY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlPy50aXRsZSB8fCAnICdcIlxuICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckRvd25sb2FkU2FtcGxlRmlsZSgkZXZlbnQpXCIgLz5cbiAgICB9XG4gICAgQGlmIChtdWx0aXBsZSgpIHx8IHNob3dCbG9ja1VwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSgpIHx8ICghZmlsZUxpc3QoKS5sZW5ndGggJiYgIW11bHRpcGxlKCkpKSB7XG4gICAgICA8ZGl2ICN1cGxvYWRcbiAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZFwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1kaXNhYmxlXT1cImRpc2FibGUoKSB8fCAoIW11bHRpcGxlKCkgJiYgZmlsZUxpc3QoKS5sZW5ndGggJiYgIWNhblVwbG9hZElmSGFzRXhpc3RGaWxlKCkpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWVycm9yXT1cIm1lc3NhZ2VFcnJvcigpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1bMTZweF1cIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1jb21wb25lbnRzLWlucHV0cy11cGxvYWQtaWNvbiBsaWJzLXVpLWljb24tZmlsZS11cGxvYWQgYmVmb3JlOiF0ZXh0LVszMnB4XVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnRzLWlucHV0cy11cGxvYWQtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1bNHB4XSBsaWJzLXVpLWZvbnQtaDZtXCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCIoY29uZmlnRGVzY3JpcHRpb25JbnB1dFVwbG9hZCgpLm1lc3NhZ2UgfHwgJycpIHwgdHJhbnNsYXRlOmNvbmZpZ0Rlc2NyaXB0aW9uSW5wdXRVcGxvYWQoKS5pbnRlcnBvbGF0ZVBhcmFtc1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGRlc2NyaXB0aW9uRm9ybWF0QW5kU2l6ZUZpbGVDb21wdXRlZCgpOyB0cmFjayBpdGVtOyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDdyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubWItWzRweF1dPVwiIWxhc3RcIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiaXRlbS5tZXNzYWdlIHwgdHJhbnNsYXRlOml0ZW0uaW50ZXJwb2xhdGVQYXJhbXNcIj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKG11bHRpcGxlKCkpIHtcbiAgICAgICAgICA8aW5wdXQgI3VwbG9hZElucHV0XG4gICAgICAgICAgICBjbGFzcz1cInVwbG9hZC1pbnB1dCBoaWRkZW5cIlxuICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgbmFtZT1cImZpbGVzW11cIlxuICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgIFthY2NlcHRdPVwiYWNjZXNzRmlsZXMoKVwiIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxpbnB1dCAjdXBsb2FkSW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwidXBsb2FkLWlucHV0IGhpZGRlblwiXG4gICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICBuYW1lPVwiZmlsZXNbXVwiXG4gICAgICAgICAgICBbYWNjZXB0XT1cImFjY2Vzc0ZpbGVzKClcIiAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChtZXNzYWdlRXJyb3IoKSAmJiAobXVsdGlwbGUoKSB8fCBzaG93QmxvY2tVcGxvYWRXaGVuSGFzRmlsZUFuZE1vZGVTaW5nbGUoKSB8fCAoIWZpbGVMaXN0KCkubGVuZ3RoICYmICFtdWx0aXBsZSgpKSkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtdC1bOHB4XSB0ZXh0LVsjZWUyZDQxXSBsaWJzLXVpLWZvbnQtaDdyXCI+XG4gICAgICAgIHt7IChtZXNzYWdlRXJyb3IoKSB8fCAnJykgfCB0cmFuc2xhdGU6eyB2YWx1ZTogbGltaXRGaWxlKCkgfSB9fVxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIEBpZiAoY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKCk/LnBvc2l0aW9uID09PSAnYm90dG9tJyAmJiAgY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKCk7YXMgY29uZmlnRG93bmxvYWRTYW1wbGVGaWxlKSB7XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDdtJ1wiXG4gICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFtdC1bOHB4XSAhcC0wJ1wiXG4gICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tYXR0YWNobWVudCBiZWZvcmU6IXRleHQtWzEycHhdJ1wiXG4gICAgICAgIFtsYWJlbF09XCJjb25maWdEb3dubG9hZFNhbXBsZUZpbGUudGl0bGUgfHwgJyAnXCJcbiAgICAgICAgKG1vQ2xpY2spPVwiaGFuZGxlckRvd25sb2FkU2FtcGxlRmlsZSgkZXZlbnQpXCIgLz5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKGZpbGVMaXN0KCkubGVuZ3RoKSB7XG4gICAgPGRpdiBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGwgaC1mdWxsIHB4LVsxMHB4XSBsaWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC12aWV3LWxpc3Qge3sgY2xhc3NJbmNsdWRlRmlsZUNvbnRlbnQoKSB8fCAnJyB9fVwiXG4gICAgICBbY2xhc3MubXQtWzEycHhdXT1cIm11bHRpcGxlKCkgfHwgc2hvd0Jsb2NrVXBsb2FkV2hlbkhhc0ZpbGVBbmRNb2RlU2luZ2xlKClcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltsYWJlbC1maWxlXVwiPjwvbmctY29udGVudD5cbiAgICAgIEBmb3IgKGl0ZW0gb2YgZmlsZUxpc3QoKTsgdHJhY2sgaXRlbSgpOyBsZXQgZmlyc3QgPSAkZmlyc3QpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLXZpZXctbGlzdC1pdGVtIHt7IGNsYXNzSW5jbHVkZUxpc3RJdGVtKCkgfHwgJycgfX1cIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1maWxlLWZ1bGxdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgW2NsYXNzLmxpYnMtdWktY29tcG9uZW50cy1pbnB1dHMtdXBsb2FkLWZpbGUtc2hvcnRdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdzaG9ydCdcIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1lcnJvci1nZW5lcmFsXT1cIml0ZW0oKS5lcnJvciB8fCAobWVzc2FnZUVycm9yKCkgJiYgc2hvd0JvcmRlckVycm9yQWxsSXRlbVdoZW5FcnJvcigpKVwiXG4gICAgICAgICAgW2NsYXNzLm10LTBdPVwiZmlyc3QgJiYgIW11bHRpcGxlKCkgJiYgIXNob3dCbG9ja1VwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSgpXCI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICBAaWYgKGNhblNldEF2YXRhcigpICYmIGl0ZW0oKS50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIichbXItMCcgKyAoaXRlbSgpLmlzQXZhdGFyID8gJyBsaWJzLXVpLWljb24tY2hlY2stY2lyY2xlLXNvbGlkIGJlZm9yZTohdGV4dC1bIzAwYmM2Ml0nOiAnIGxpYnMtdWktaWNvbi1jaGVjay1jaXJjbGUtb3V0bGluZScpICsgKChkaXNhYmxlKCkgfHwgaXRlbSgpLmlzVXBsb2FkaW5nIHx8ICEhaXRlbSgpLmVycm9yKSA/ICcgbGlicy11aS1kaXNhYmxlJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7Y29uZmlnOnsgY29udGVudDogaXRlbSgpLmlzQXZhdGFyID8gJ2kxOG5fYXZhdGFyJyA6ICdpMThuX2Nob29zZV9hc195b3VyX2F2YXRhcicsIHpJbmRleDogekluZGV4KCl9fVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichbXItWzEycHhdICFwLTAnXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCBpdGVtKCkuaXNVcGxvYWRpbmcgfHwgISFpdGVtKCkuZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJTZXRBdmF0YXIoJGV2ZW50LCBpdGVtKVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICBbY2xhc3Mudy1bY2FsYygxMDAlLTI4cHgpXV09XCJjYW5TZXRBdmF0YXIoKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiIWNhblNldEF2YXRhcigpXCI+XG4gICAgICAgICAgICAgIEBpZiAobW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJykge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXVwbG9hZC1hdmF0YXIgW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgICAgIFsoaXRlbSldPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICBbc2hvd1ZpZGVvRHVyYXRpb25dPVwic2hvd1ZpZGVvRHVyYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAob3V0T3BlblByZXZpZXcpPVwiaGFuZGxlck9wZW5QcmV2aWV3RmlsZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWJzb2x1dGUgdy1mdWxsIGgtZnVsbCBmbGV4LWNvbFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZmxleC1jb2xdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuanVzdGlmeS1jZW50ZXJdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cIm1vZGVEaXNwbGF5RmlsZSgpID09PSAnc2hvcnQnXCI+XG4gICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsIGNsYXNzPVwiZmxleCB3LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxMZWZ0XT1cIml0ZW0oKS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW3pJbmRleFBvcG92ZXJdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsTGVmdENsYXNzXT1cIidsaWJzLXVpLWZvbnQtaDZtICcgKyAoKGRpc2FibGUoKSB8fCBpdGVtKCkuaXNVcGxvYWRpbmcgfHwgaXRlbSgpLmVycm9yKSA/ICd0ZXh0LVsjNmE3MzgzXScgOiAndGV4dC1bIzA3MTYzMV0nKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdzaG9ydCcgPyAnIW1iLTAnIDogJydcIiAvPlxuXG4gICAgICAgICAgICAgICAgICBAaWYgKCFpZ25vcmVTaG93U2l6ZUZpbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1bIzljYTJhZF0gbGlicy11aS1mb250LWg3ciBzaHJpbmstMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZsZXhdPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJtb2RlRGlzcGxheUZpbGUoKSA9PT0gJ3Nob3J0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVsxMnB4XV09XCJtb2RlRGlzcGxheUZpbGUoKSA9PT0gJ3Nob3J0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0oKS5zaXplIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChpdGVtKCkuaXNVcGxvYWRpbmcgJiYgaXRlbSgpLnBlcmNlbnRVcGxvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbWwtWzE2cHhdXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5tci1bMjZweF1dPVwibW9kZURpc3BsYXlGaWxlKCkgPT09ICdmdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctWzEyMHB4XSBoLVs0cHhdIHJvdW5kZWQtWzRweF0gYmctWyNmOGY5ZmFdIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCBsZWZ0LTAgaC1bNHB4XSByb3VuZGVkLVs0cHhdIGJnLVsjMDBiYzYyXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIihpdGVtKCkucGVyY2VudFVwbG9hZGluZyA/PyAwKSoxLjJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1sLVsxNnB4XVwiPlxuICAgICAgICAgICAgQGlmICghaWdub3JlSWNvblByZXZpZXcoKSkge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZXllLW91dGxpbmUgIW1yLTAnXCJcbiAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7Y29uZmlnOnsgY29udGVudDogJ2kxOG5fcHJldmlldycsIHpJbmRleDogekluZGV4KCkrMX19XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJyArIChpZ25vcmVJY29uUmVtb3ZlKCkgJiYgIWlnbm9yZUljb25FZGl0KCkgPyAnJyA6ICcgIW1yLVsxMnB4XScpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJpdGVtKCkuaXNVcGxvYWRpbmcgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlck9wZW5QcmV2aWV3RmlsZShpdGVtKCkpXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoaXRlbSgpLnR5cGUgPT09ICdpbWFnZScgJiYgIWl0ZW0oKS5lcnJvciAmJiAhaWdub3JlSWNvbkVkaXQoKSkge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZWRpdC1saW5lICFtci0wJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwie2NvbmZpZzp7IGNvbnRlbnQ6ICdpMThuX2VkaXQnLCB6SW5kZXg6IHpJbmRleCgpKzF9fVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCcgKyAoaWdub3JlSWNvblJlbW92ZSgpID8gJycgOiAnICFtci1bMTJweF0nKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiaXRlbSgpLmlzVXBsb2FkaW5nIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJFZGl0SW1hZ2UoJGV2ZW50LCBpdGVtKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKCFpZ25vcmVJY29uUmVtb3ZlKCkpIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWNsb3NlICFtci0wJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwie2NvbmZpZzoge2NvbnRlbnQ6ICdpMThuX2RlbGV0ZScsIHpJbmRleDogekluZGV4KCkrMX19XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiaXRlbSgpLmlzVXBsb2FkaW5nIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJSZW1vdmVGaWxlKCRldmVudCwgaXRlbSlcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChpdGVtKCkuZXJyb3IgJiYgKG11bHRpcGxlKCkgfHwgIXNob3dCbG9ja1VwbG9hZFdoZW5IYXNGaWxlQW5kTW9kZVNpbmdsZSgpKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC1bOHB4XSB0ZXh0LVsjZWUyZDQxXSBsaWJzLXVpLWZvbnQtaDdyXCI+e3sgKGl0ZW0oKS5lcnJvciB8fCAnICcpIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=