@deeksha2309/sunbird-collection-editor 8.0.7
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.
- package/README.md +24 -0
- package/esm2022/lib/collection-editor-cursor.service.mjs +3 -0
- package/esm2022/lib/collection-editor-library.component.mjs +16 -0
- package/esm2022/lib/collection-editor-library.module.mjs +137 -0
- package/esm2022/lib/components/answer/answer.component.mjs +43 -0
- package/esm2022/lib/components/asset-browser/asset-browser.component.mjs +325 -0
- package/esm2022/lib/components/asset-browser/asset-browser.data.mjs +53 -0
- package/esm2022/lib/components/assign-page-number/assign-page-number.component.mjs +191 -0
- package/esm2022/lib/components/ckeditor-tool/ckeditor-tool.component.mjs +895 -0
- package/esm2022/lib/components/collection-icon/collection-icon.component.mjs +43 -0
- package/esm2022/lib/components/contentplayer-page/contentplayer-page.component.mjs +351 -0
- package/esm2022/lib/components/csv-upload/csv-upload.component.mjs +178 -0
- package/esm2022/lib/components/dialcode/dialcode.component.mjs +182 -0
- package/esm2022/lib/components/editor/editor.component.mjs +1125 -0
- package/esm2022/lib/components/fancy-tree/fancy-tree.component.mjs +529 -0
- package/esm2022/lib/components/header/header.component.mjs +123 -0
- package/esm2022/lib/components/library/library.component.mjs +242 -0
- package/esm2022/lib/components/library-filter/library-filter.component.mjs +149 -0
- package/esm2022/lib/components/library-list/library-list.component.mjs +92 -0
- package/esm2022/lib/components/library-player/library-player.component.mjs +62 -0
- package/esm2022/lib/components/manage-collaborator/manage-collaborator.component.mjs +256 -0
- package/esm2022/lib/components/meta-form/meta-form.component.mjs +377 -0
- package/esm2022/lib/components/options/options.component.mjs +144 -0
- package/esm2022/lib/components/plain-tree/plain-tree.component.mjs +125 -0
- package/esm2022/lib/components/progress-status/progress-status.component.mjs +46 -0
- package/esm2022/lib/components/publish-checklist/publish-checklist.component.mjs +67 -0
- package/esm2022/lib/components/quality-params-modal/quality-params-modal.component.mjs +52 -0
- package/esm2022/lib/components/question/question.component.mjs +1360 -0
- package/esm2022/lib/components/quml-player/quml-player.component.mjs +73 -0
- package/esm2022/lib/components/qumlplayer-page/qumlplayer-page.component.mjs +84 -0
- package/esm2022/lib/components/resource-reorder/resource-reorder.component.mjs +143 -0
- package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +26 -0
- package/esm2022/lib/components/template/template.component.mjs +42 -0
- package/esm2022/lib/components/term-and-condition/term-and-condition.component.mjs +68 -0
- package/esm2022/lib/directives/telemetry-interact/telemetry-interact.directive.mjs +33 -0
- package/esm2022/lib/interfaces/McqForm.mjs +29 -0
- package/esm2022/lib/interfaces/editor.mjs +2 -0
- package/esm2022/lib/interfaces/framework.mjs +2 -0
- package/esm2022/lib/interfaces/httpOptions.mjs +2 -0
- package/esm2022/lib/interfaces/requestParam.mjs +2 -0
- package/esm2022/lib/interfaces/serverResponse.mjs +2 -0
- package/esm2022/lib/pipes/sanitize-html.pipe.mjs +20 -0
- package/esm2022/lib/services/config/category.config.json +8 -0
- package/esm2022/lib/services/config/config.service.mjs +27 -0
- package/esm2022/lib/services/config/editor.config.json +31 -0
- package/esm2022/lib/services/config/label.config.json +314 -0
- package/esm2022/lib/services/config/player.config.json +96 -0
- package/esm2022/lib/services/config/url.config.json +69 -0
- package/esm2022/lib/services/data/data.service.mjs +192 -0
- package/esm2022/lib/services/dialcode/dialcode.service.mjs +309 -0
- package/esm2022/lib/services/editor/editor.service.mjs +682 -0
- package/esm2022/lib/services/framework/framework.service.mjs +106 -0
- package/esm2022/lib/services/helper/helper.service.mjs +160 -0
- package/esm2022/lib/services/player/player.service.mjs +99 -0
- package/esm2022/lib/services/public-data/public-data.service.mjs +21 -0
- package/esm2022/lib/services/question/question.service.mjs +167 -0
- package/esm2022/lib/services/telemetry/telemetry.service.mjs +120 -0
- package/esm2022/lib/services/toaster/toaster.service.mjs +105 -0
- package/esm2022/lib/services/tree/tree.service.mjs +284 -0
- package/esm2022/project-sunbird-sunbird-collection-editor.mjs +5 -0
- package/esm2022/public-api.mjs +4 -0
- package/fesm2022/project-sunbird-sunbird-collection-editor.mjs +10138 -0
- package/fesm2022/project-sunbird-sunbird-collection-editor.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/assets/.gitkeep +0 -0
- package/lib/assets/images/MCQ.png +0 -0
- package/lib/assets/images/Spin.gif +0 -0
- package/lib/assets/images/bulkuploadfile.png +0 -0
- package/lib/assets/images/cancel-sign copy.png +0 -0
- package/lib/assets/images/cancel-sign.png +0 -0
- package/lib/assets/images/emptyResult.svg +1 -0
- package/lib/assets/images/icons-rtl.gif +0 -0
- package/lib/assets/images/icons.gif +0 -0
- package/lib/assets/images/imageicon.svg +16 -0
- package/lib/assets/images/imageicon_blue.svg +16 -0
- package/lib/assets/images/layoutoneicon.svg +16 -0
- package/lib/assets/images/layoutoneicon_blue.svg +16 -0
- package/lib/assets/images/layoutthreeicon.svg +18 -0
- package/lib/assets/images/layoutthreeicon_blue.svg +18 -0
- package/lib/assets/images/layouttwoicon.svg +18 -0
- package/lib/assets/images/layouttwoicon_blue.svg +18 -0
- package/lib/assets/images/leftalignicon.svg +17 -0
- package/lib/assets/images/leftalignicon_blue.svg +17 -0
- package/lib/assets/images/loader.gif +0 -0
- package/lib/assets/images/loader.svg +1 -0
- package/lib/assets/images/loading.gif +0 -0
- package/lib/assets/images/middlealignicon.svg +17 -0
- package/lib/assets/images/middlealignicon_blue.svg +17 -0
- package/lib/assets/images/question_collection.svg +18 -0
- package/lib/assets/images/rightalignicon.svg +17 -0
- package/lib/assets/images/rightalignicon_blue.svg +17 -0
- package/lib/assets/images/vline-rtl.gif +0 -0
- package/lib/assets/images/vline.gif +0 -0
- package/lib/assets/images/writing.png +0 -0
- package/lib/collection-editor-cursor.service.d.ts +5 -0
- package/lib/collection-editor-cursor.service.d.ts.map +1 -0
- package/lib/collection-editor-library.component.d.ts +9 -0
- package/lib/collection-editor-library.component.d.ts.map +1 -0
- package/lib/collection-editor-library.module.d.ts +50 -0
- package/lib/collection-editor-library.module.d.ts.map +1 -0
- package/lib/components/answer/answer.component.d.ts +24 -0
- package/lib/components/answer/answer.component.d.ts.map +1 -0
- package/lib/components/asset-browser/asset-browser.component.d.ts +81 -0
- package/lib/components/asset-browser/asset-browser.component.d.ts.map +1 -0
- package/lib/components/asset-browser/asset-browser.data.d.ts +52 -0
- package/lib/components/asset-browser/asset-browser.data.d.ts.map +1 -0
- package/lib/components/assign-page-number/assign-page-number.component.d.ts +38 -0
- package/lib/components/assign-page-number/assign-page-number.component.d.ts.map +1 -0
- package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts +161 -0
- package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts.map +1 -0
- package/lib/components/collection-icon/collection-icon.component.d.ts +18 -0
- package/lib/components/collection-icon/collection-icon.component.d.ts.map +1 -0
- package/lib/components/contentplayer-page/contentplayer-page.component.d.ts +54 -0
- package/lib/components/contentplayer-page/contentplayer-page.component.d.ts.map +1 -0
- package/lib/components/csv-upload/csv-upload.component.d.ts +42 -0
- package/lib/components/csv-upload/csv-upload.component.d.ts.map +1 -0
- package/lib/components/dialcode/dialcode.component.d.ts +48 -0
- package/lib/components/dialcode/dialcode.component.d.ts.map +1 -0
- package/lib/components/editor/editor.component.d.ts +146 -0
- package/lib/components/editor/editor.component.d.ts.map +1 -0
- package/lib/components/fancy-tree/fancy-tree.component.d.ts +77 -0
- package/lib/components/fancy-tree/fancy-tree.component.d.ts.map +1 -0
- package/lib/components/header/header.component.d.ts +46 -0
- package/lib/components/header/header.component.d.ts.map +1 -0
- package/lib/components/library/library.component.d.ts +69 -0
- package/lib/components/library/library.component.d.ts.map +1 -0
- package/lib/components/library-filter/library-filter.component.d.ts +47 -0
- package/lib/components/library-filter/library-filter.component.d.ts.map +1 -0
- package/lib/components/library-list/library-list.component.d.ts +32 -0
- package/lib/components/library-list/library-list.component.d.ts.map +1 -0
- package/lib/components/library-player/library-player.component.d.ts +24 -0
- package/lib/components/library-player/library-player.component.d.ts.map +1 -0
- package/lib/components/manage-collaborator/manage-collaborator.component.d.ts +75 -0
- package/lib/components/manage-collaborator/manage-collaborator.component.d.ts.map +1 -0
- package/lib/components/meta-form/meta-form.component.d.ts +51 -0
- package/lib/components/meta-form/meta-form.component.d.ts.map +1 -0
- package/lib/components/options/options.component.d.ts +53 -0
- package/lib/components/options/options.component.d.ts.map +1 -0
- package/lib/components/plain-tree/plain-tree.component.d.ts +20 -0
- package/lib/components/plain-tree/plain-tree.component.d.ts.map +1 -0
- package/lib/components/progress-status/progress-status.component.d.ts +25 -0
- package/lib/components/progress-status/progress-status.component.d.ts.map +1 -0
- package/lib/components/publish-checklist/publish-checklist.component.d.ts +23 -0
- package/lib/components/publish-checklist/publish-checklist.component.d.ts.map +1 -0
- package/lib/components/quality-params-modal/quality-params-modal.component.d.ts +24 -0
- package/lib/components/quality-params-modal/quality-params-modal.component.d.ts.map +1 -0
- package/lib/components/question/question.component.d.ts +215 -0
- package/lib/components/question/question.component.d.ts.map +1 -0
- package/lib/components/quml-player/quml-player.component.d.ts +26 -0
- package/lib/components/quml-player/quml-player.component.d.ts.map +1 -0
- package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts +31 -0
- package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts.map +1 -0
- package/lib/components/resource-reorder/resource-reorder.component.d.ts +45 -0
- package/lib/components/resource-reorder/resource-reorder.component.d.ts.map +1 -0
- package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +13 -0
- package/lib/components/skeleton-loader/skeleton-loader.component.d.ts.map +1 -0
- package/lib/components/template/template.component.d.ts +21 -0
- package/lib/components/template/template.component.d.ts.map +1 -0
- package/lib/components/term-and-condition/term-and-condition.component.d.ts +26 -0
- package/lib/components/term-and-condition/term-and-condition.component.d.ts.map +1 -0
- package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts +27 -0
- package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts.map +1 -0
- package/lib/interfaces/McqForm.d.ts +32 -0
- package/lib/interfaces/McqForm.d.ts.map +1 -0
- package/lib/interfaces/editor.d.ts +78 -0
- package/lib/interfaces/editor.d.ts.map +1 -0
- package/lib/interfaces/framework.d.ts +46 -0
- package/lib/interfaces/framework.d.ts.map +1 -0
- package/lib/interfaces/httpOptions.d.ts +35 -0
- package/lib/interfaces/httpOptions.d.ts.map +1 -0
- package/lib/interfaces/requestParam.d.ts +24 -0
- package/lib/interfaces/requestParam.d.ts.map +1 -0
- package/lib/interfaces/serverResponse.d.ts +38 -0
- package/lib/interfaces/serverResponse.d.ts.map +1 -0
- package/lib/pipes/sanitize-html.pipe.d.ts +11 -0
- package/lib/pipes/sanitize-html.pipe.d.ts.map +1 -0
- package/lib/services/config/config.service.d.ts +13 -0
- package/lib/services/config/config.service.d.ts.map +1 -0
- package/lib/services/data/data.service.d.ts +85 -0
- package/lib/services/data/data.service.d.ts.map +1 -0
- package/lib/services/dialcode/dialcode.service.d.ts +36 -0
- package/lib/services/dialcode/dialcode.service.d.ts.map +1 -0
- package/lib/services/editor/editor.service.d.ts +150 -0
- package/lib/services/editor/editor.service.d.ts.map +1 -0
- package/lib/services/framework/framework.service.d.ts +35 -0
- package/lib/services/framework/framework.service.d.ts.map +1 -0
- package/lib/services/helper/helper.service.d.ts +41 -0
- package/lib/services/helper/helper.service.d.ts.map +1 -0
- package/lib/services/player/player.service.d.ts +33 -0
- package/lib/services/player/player.service.d.ts.map +1 -0
- package/lib/services/public-data/public-data.service.d.ts +15 -0
- package/lib/services/public-data/public-data.service.d.ts.map +1 -0
- package/lib/services/question/question.service.d.ts +30 -0
- package/lib/services/question/question.service.d.ts.map +1 -0
- package/lib/services/telemetry/telemetry.service.d.ts +45 -0
- package/lib/services/telemetry/telemetry.service.d.ts.map +1 -0
- package/lib/services/toaster/toaster.service.d.ts +50 -0
- package/lib/services/toaster/toaster.service.d.ts.map +1 -0
- package/lib/services/tree/tree.service.d.ts +51 -0
- package/lib/services/tree/tree.service.d.ts.map +1 -0
- package/package.json +32 -0
- package/project-sunbird-sunbird-collection-editor.d.ts.map +1 -0
- package/public-api.d.ts +4 -0
- package/public-api.d.ts.map +1 -0
|
@@ -0,0 +1,895 @@
|
|
|
1
|
+
import { Component, Output, Input, EventEmitter, ViewChild } from '@angular/core';
|
|
2
|
+
import ClassicEditor from '@project-sunbird/ckeditor-build-classic';
|
|
3
|
+
import * as _ from 'lodash-es';
|
|
4
|
+
import { catchError, map } from 'rxjs/operators';
|
|
5
|
+
import { throwError, Observable } from 'rxjs';
|
|
6
|
+
import { config } from '../asset-browser/asset-browser.data';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../../services/question/question.service";
|
|
9
|
+
import * as i2 from "../../services/editor/editor.service";
|
|
10
|
+
import * as i3 from "../../services/toaster/toaster.service";
|
|
11
|
+
import * as i4 from "../../services/config/config.service";
|
|
12
|
+
import * as i5 from "@angular/common";
|
|
13
|
+
import * as i6 from "@angular/forms";
|
|
14
|
+
import * as i7 from "@project-sunbird/ng2-semantic-ui";
|
|
15
|
+
import * as i8 from "@project-sunbird/common-form-elements-full";
|
|
16
|
+
import * as i9 from "ngx-infinite-scroll";
|
|
17
|
+
export class CkeditorToolComponent {
|
|
18
|
+
constructor(questionService, editorService, toasterService, configService) {
|
|
19
|
+
this.questionService = questionService;
|
|
20
|
+
this.editorService = editorService;
|
|
21
|
+
this.toasterService = toasterService;
|
|
22
|
+
this.configService = configService;
|
|
23
|
+
this.editorDataOutput = new EventEmitter();
|
|
24
|
+
this.hasError = new EventEmitter();
|
|
25
|
+
this.videoDataOutput = new EventEmitter();
|
|
26
|
+
this.imageUploadLoader = false;
|
|
27
|
+
this.isAssetBrowserReadOnly = false;
|
|
28
|
+
this.initialized = false;
|
|
29
|
+
this.assetConfig = {};
|
|
30
|
+
this.myAssets = [];
|
|
31
|
+
this.allImages = [];
|
|
32
|
+
this.allVideos = [];
|
|
33
|
+
this.selectedVideo = {};
|
|
34
|
+
this.loading = false;
|
|
35
|
+
this.isClosable = true;
|
|
36
|
+
this.showVideoPicker = false;
|
|
37
|
+
this.searchMyInput = '';
|
|
38
|
+
this.assestData = {};
|
|
39
|
+
this.imageFormValid = false;
|
|
40
|
+
}
|
|
41
|
+
ngOnInit() {
|
|
42
|
+
this.assetProxyUrl = _.get(this.configService.urlConFig, 'URLS.assetProxyUrl');
|
|
43
|
+
this.initialFormConfig = _.get(config, 'uploadIconFormConfig');
|
|
44
|
+
this.formConfig = _.get(config, 'uploadIconFormConfig');
|
|
45
|
+
this.emptyImageSearchMessage = _.get(this.configService.labelConfig, 'messages.error.016');
|
|
46
|
+
this.emptyVideoSearchMessage = _.get(this.configService.labelConfig, 'messages.error.017');
|
|
47
|
+
this.termsAndCondition = _.get(this.configService.labelConfig, 'termsAndConditions.001');
|
|
48
|
+
this.assetConfig = this.editorService.editorConfig.config.assetConfig;
|
|
49
|
+
this.initialized = true;
|
|
50
|
+
this.editorConfig = {
|
|
51
|
+
toolbar: ['heading', '|', 'bold', '|', 'italic', '|', 'underline', '|', 'BulletedList', '|', 'alignment',
|
|
52
|
+
'|', 'insertTable', '|', 'numberedList', '|', 'fontSize', '|', 'subscript', '|', 'superscript', '|',
|
|
53
|
+
'MathText', '|', 'specialCharacters', '|'
|
|
54
|
+
],
|
|
55
|
+
fontSize: {
|
|
56
|
+
options: [
|
|
57
|
+
'eight',
|
|
58
|
+
'ten',
|
|
59
|
+
'twelve',
|
|
60
|
+
'fourteen',
|
|
61
|
+
'sixteen',
|
|
62
|
+
'eighteen',
|
|
63
|
+
'twenty',
|
|
64
|
+
'twentytwo',
|
|
65
|
+
'twentyfour',
|
|
66
|
+
'twentysix',
|
|
67
|
+
'twentyeight',
|
|
68
|
+
'thirty',
|
|
69
|
+
'thirtysix'
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
image: {
|
|
73
|
+
resizeUnit: '%',
|
|
74
|
+
resizeOptions: [{
|
|
75
|
+
name: 'resizeImage:25',
|
|
76
|
+
value: '25',
|
|
77
|
+
icon: 'small',
|
|
78
|
+
className: 'resize-25'
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'resizeImage:50',
|
|
82
|
+
value: '50',
|
|
83
|
+
icon: 'medium',
|
|
84
|
+
className: 'resize-50'
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: 'resizeImage:75',
|
|
88
|
+
value: '75',
|
|
89
|
+
icon: 'large',
|
|
90
|
+
className: 'resize-75'
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: 'resizeImage:100',
|
|
94
|
+
value: '100',
|
|
95
|
+
icon: 'full',
|
|
96
|
+
className: 'resize-100'
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'resizeImage:original',
|
|
100
|
+
value: null,
|
|
101
|
+
icon: 'original',
|
|
102
|
+
className: 'resize-original'
|
|
103
|
+
}],
|
|
104
|
+
toolbar: ['imageStyle:alignLeft', 'imageStyle:alignCenter', 'imageStyle:alignRight', '|',
|
|
105
|
+
'resizeImage:25', 'resizeImage:50', 'resizeImage:75', 'resizeImage:100', 'resizeImage:original'],
|
|
106
|
+
styles: ['full', 'alignLeft', 'alignRight', 'alignCenter']
|
|
107
|
+
},
|
|
108
|
+
isReadOnly: false,
|
|
109
|
+
removePlugins: ['ImageCaption', 'mathtype', 'ChemType', 'ImageResizeHandles']
|
|
110
|
+
};
|
|
111
|
+
this.acceptVideoType = this.getAcceptType(this.assetConfig.video.accepted, 'video');
|
|
112
|
+
this.acceptImageType = this.getAcceptType(this.assetConfig.image.accepted, 'image');
|
|
113
|
+
}
|
|
114
|
+
ngOnChanges() {
|
|
115
|
+
if (this.videoShow) {
|
|
116
|
+
this.showVideoPicker = true;
|
|
117
|
+
this.selectVideo(undefined);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
ngAfterViewInit() {
|
|
121
|
+
this.initializeEditors();
|
|
122
|
+
}
|
|
123
|
+
initializeImagePicker(editorType) {
|
|
124
|
+
this.showImagePicker = true;
|
|
125
|
+
}
|
|
126
|
+
initializeVideoPicker(editorType) {
|
|
127
|
+
this.showVideoPicker = true;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* function to hide image picker
|
|
131
|
+
*/
|
|
132
|
+
dismissImagePicker() {
|
|
133
|
+
this.showImagePicker = false;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* function to hide video picker
|
|
137
|
+
*/
|
|
138
|
+
dismissVideoPicker() {
|
|
139
|
+
this.showVideoPicker = false;
|
|
140
|
+
this.videoShow = false;
|
|
141
|
+
this.videoDataOutput.emit(false);
|
|
142
|
+
}
|
|
143
|
+
dismissImageUploadModal() {
|
|
144
|
+
this.showImageUploadModal = false;
|
|
145
|
+
}
|
|
146
|
+
initiateImageUploadModal() {
|
|
147
|
+
this.showImagePicker = false;
|
|
148
|
+
this.showImageUploadModal = true;
|
|
149
|
+
}
|
|
150
|
+
dismissVideoUploadModal() {
|
|
151
|
+
if (this.isClosable) {
|
|
152
|
+
this.showVideoUploadModal = false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
initiateVideoUploadModal() {
|
|
156
|
+
this.showVideoPicker = false;
|
|
157
|
+
this.showImageUploadModal = true;
|
|
158
|
+
this.loading = false;
|
|
159
|
+
this.isClosable = true;
|
|
160
|
+
}
|
|
161
|
+
isEditorReadOnly(state) {
|
|
162
|
+
this.editorInstance.isReadOnly = state;
|
|
163
|
+
this.isAssetBrowserReadOnly = state;
|
|
164
|
+
}
|
|
165
|
+
getAcceptType(typeList, type) {
|
|
166
|
+
const acceptTypeList = typeList.split(', ');
|
|
167
|
+
const result = [];
|
|
168
|
+
_.forEach(acceptTypeList, (content) => {
|
|
169
|
+
result.push(`${type}/${content}`);
|
|
170
|
+
});
|
|
171
|
+
return result.toString();
|
|
172
|
+
}
|
|
173
|
+
customImageResizer(editor) {
|
|
174
|
+
// Both the data and the editing pipelines are affected by this conversion.
|
|
175
|
+
editor.conversion.for('downcast').add(dispatcher => {
|
|
176
|
+
// Links are represented in the model as a "linkHref" attribute.
|
|
177
|
+
// Use the "low" listener priority to apply the changes after the link feature.
|
|
178
|
+
dispatcher.on('attribute:width:image', (evt, data, conversionApi) => {
|
|
179
|
+
if (!conversionApi.consumable.consume(data.item, evt.name)) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const options = editor.config.get('image.resizeOptions');
|
|
183
|
+
const isEnabled = editor.config.get('image.resizeEnabled');
|
|
184
|
+
const sizeLables = options.map((item) => {
|
|
185
|
+
return item.label;
|
|
186
|
+
});
|
|
187
|
+
const newImgWidthValue = data.attributeNewValue === null ? 'Original' : data.attributeNewValue;
|
|
188
|
+
if (sizeLables.includes(newImgWidthValue)) {
|
|
189
|
+
this.lastImgResizeWidth = newImgWidthValue;
|
|
190
|
+
}
|
|
191
|
+
if (!isEnabled && sizeLables.length > 0 && !sizeLables.includes(newImgWidthValue)) {
|
|
192
|
+
editor.execute('imageResize', { width: this.lastImgResizeWidth });
|
|
193
|
+
return evt.stop();
|
|
194
|
+
}
|
|
195
|
+
const viewWriter = conversionApi.writer;
|
|
196
|
+
const figure = conversionApi.mapper.toViewElement(data.item);
|
|
197
|
+
if (data.attributeNewValue !== null) {
|
|
198
|
+
viewWriter.setStyle('width', data.attributeNewValue, figure);
|
|
199
|
+
viewWriter.addClass('image_resized', figure);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
viewWriter.removeStyle('width', figure);
|
|
203
|
+
viewWriter.removeClass('image_resized', figure);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
initializeEditors() {
|
|
209
|
+
ClassicEditor.create(this.editorRef.nativeElement, {
|
|
210
|
+
alignment: {
|
|
211
|
+
options: [
|
|
212
|
+
{ name: 'left', className: 'text-left' },
|
|
213
|
+
{ name: 'center', className: 'text-center' },
|
|
214
|
+
{ name: 'right', className: 'text-right' }
|
|
215
|
+
]
|
|
216
|
+
},
|
|
217
|
+
heading: {
|
|
218
|
+
options: [
|
|
219
|
+
{ model: 'paragraph', title: 'Paragraph' },
|
|
220
|
+
{ model: 'heading1', view: 'h1', title: 'Heading 1' },
|
|
221
|
+
{ model: 'heading2', view: 'h2', title: 'Heading 2' },
|
|
222
|
+
{ model: 'heading3', view: 'h3', title: 'Heading 3' },
|
|
223
|
+
{ model: 'heading4', view: 'h4', title: 'Heading 4' },
|
|
224
|
+
{ model: 'heading5', view: 'h5', title: 'Heading 5' },
|
|
225
|
+
{ model: 'heading6', view: 'h6', title: 'Heading 6' }
|
|
226
|
+
]
|
|
227
|
+
},
|
|
228
|
+
extraPlugins: ['Table', 'Heading'],
|
|
229
|
+
toolbar: this.editorConfig.toolbar,
|
|
230
|
+
fontSize: this.editorConfig.fontSize,
|
|
231
|
+
image: this.editorConfig.image,
|
|
232
|
+
isReadOnly: this.editorConfig.isReadOnly,
|
|
233
|
+
removePlugins: this.editorConfig.removePlugins
|
|
234
|
+
})
|
|
235
|
+
.then(editor => {
|
|
236
|
+
this.editorInstance = editor;
|
|
237
|
+
this.isAssetBrowserReadOnly = this.editorConfig.isReadOnly;
|
|
238
|
+
if (this.editorDataInput) {
|
|
239
|
+
this.editorDataInput = this.editorDataInput
|
|
240
|
+
.replace(/(<img("[^"]*"|[^\/">])*)>/gi, '$1/>')
|
|
241
|
+
.replace(/(<br("[^"]*"|[^\/">])*)>/gi, '$1/>');
|
|
242
|
+
this.editorInstance.setData(this.editorDataInput);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
this.editorInstance.setData('');
|
|
246
|
+
}
|
|
247
|
+
console.log('Editor was initialized');
|
|
248
|
+
this.changeTracker(this.editorInstance);
|
|
249
|
+
this.attachEvent(this.editorInstance);
|
|
250
|
+
// this.pasteTracker(this.editorInstance);
|
|
251
|
+
this.characterCount = this.countCharacters(this.editorInstance.model.document);
|
|
252
|
+
this.charactersLeft = this.getCharactersLeft();
|
|
253
|
+
})
|
|
254
|
+
.catch(error => {
|
|
255
|
+
console.error(error.stack);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
changeTracker(editor) {
|
|
259
|
+
editor.model.document.on('change', (eventInfo, batch) => {
|
|
260
|
+
if (this.setCharacterLimit && this.setCharacterLimit > 0) {
|
|
261
|
+
this.checkCharacterLimit();
|
|
262
|
+
}
|
|
263
|
+
const selectedElement = eventInfo.source.selection.getSelectedElement();
|
|
264
|
+
this.isEditorFocused = (selectedElement && selectedElement.name === 'image') ? true : false;
|
|
265
|
+
if (this.setImageLimit && this.setImageLimit > 0) {
|
|
266
|
+
this.checkImageLimit();
|
|
267
|
+
}
|
|
268
|
+
this.editorDataOutput.emit({
|
|
269
|
+
body: editor.getData(),
|
|
270
|
+
length: this.characterCount,
|
|
271
|
+
mediaobj: this.mediaobj
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
pasteTracker(editor) {
|
|
276
|
+
editor.editing.view.document.on('clipboardInput', (evt, data) => {
|
|
277
|
+
const dataTransfer = data.dataTransfer;
|
|
278
|
+
const urlMatch =
|
|
279
|
+
// tslint:disable-next-line:max-line-length
|
|
280
|
+
/(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,}|file:\/\/\/+[^\s]{0,})/gi;
|
|
281
|
+
const regex = new RegExp(urlMatch);
|
|
282
|
+
const getUrl = dataTransfer.getData('text/html').match(regex);
|
|
283
|
+
if (getUrl && getUrl.length > 0) {
|
|
284
|
+
this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.010'));
|
|
285
|
+
evt.stop();
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
checkImageLimit() {
|
|
290
|
+
const childNodes = this.editorInstance.model.document.getRoot()._children._nodes;
|
|
291
|
+
this.isAssetBrowserReadOnly = _.keys(_.pickBy(childNodes, { name: 'image' })).length === this.setImageLimit ? true : false;
|
|
292
|
+
}
|
|
293
|
+
checkCharacterLimit() {
|
|
294
|
+
this.characterCount = this.countCharacters(this.editorInstance.model.document);
|
|
295
|
+
this.charactersLeft = this.getCharactersLeft();
|
|
296
|
+
this.limitExceeded = (this.characterCount <= this.setCharacterLimit) ? false : true;
|
|
297
|
+
this.hasError.emit(this.limitExceeded);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* function to get images
|
|
301
|
+
* @param offset page no
|
|
302
|
+
*/
|
|
303
|
+
getMyImages(offset, query, search) {
|
|
304
|
+
this.assetsCount = 0;
|
|
305
|
+
if (!search) {
|
|
306
|
+
this.searchMyInput = '';
|
|
307
|
+
}
|
|
308
|
+
if (offset === 0) {
|
|
309
|
+
this.myAssets.length = 0;
|
|
310
|
+
}
|
|
311
|
+
const req = {
|
|
312
|
+
filters: {
|
|
313
|
+
mediaType: ['image'],
|
|
314
|
+
createdBy: _.get(this.editorService.editorConfig, 'context.user.id')
|
|
315
|
+
},
|
|
316
|
+
offset
|
|
317
|
+
};
|
|
318
|
+
if (query) {
|
|
319
|
+
req['query'] = query;
|
|
320
|
+
}
|
|
321
|
+
this.questionService.getAssetMedia(req).pipe(catchError(err => {
|
|
322
|
+
const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.022') };
|
|
323
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
324
|
+
})).subscribe((res) => {
|
|
325
|
+
this.assetsCount = res.result.count;
|
|
326
|
+
_.map(res.result.content, (item) => {
|
|
327
|
+
if (item.downloadUrl) {
|
|
328
|
+
this.myAssets.push(item);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
addImageInEditor(imageUrl, imageId, imageName) {
|
|
334
|
+
const src = this.getMediaOriginURL(imageUrl);
|
|
335
|
+
const baseUrl = _.get(this.editorService.editorConfig, 'context.host') || document.location.origin;
|
|
336
|
+
this.mediaobj = {
|
|
337
|
+
id: imageId,
|
|
338
|
+
type: 'image',
|
|
339
|
+
src,
|
|
340
|
+
baseUrl
|
|
341
|
+
};
|
|
342
|
+
this.editorInstance.model.change(writer => {
|
|
343
|
+
const imageElement = writer.createElement('image', {
|
|
344
|
+
src,
|
|
345
|
+
alt: imageId,
|
|
346
|
+
'data-asset-variable': imageId
|
|
347
|
+
});
|
|
348
|
+
this.editorInstance.model.insertContent(imageElement, this.editorInstance.model.document.selection);
|
|
349
|
+
});
|
|
350
|
+
this.showImagePicker = false;
|
|
351
|
+
this.showImageUploadModal = false;
|
|
352
|
+
}
|
|
353
|
+
addVideoInEditor(videoModal) {
|
|
354
|
+
const videoData = _.cloneDeep(this.selectedVideo);
|
|
355
|
+
videoData.src = this.getMediaOriginURL(videoData.downloadUrl);
|
|
356
|
+
videoData.thumbnail = (videoData.thumbnail) && this.getMediaOriginURL(videoData.thumbnail);
|
|
357
|
+
this.showVideoPicker = false;
|
|
358
|
+
this.videoDataOutput.emit(videoData);
|
|
359
|
+
if (videoModal) {
|
|
360
|
+
videoModal.deny();
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
getAllImages(offset, query, search) {
|
|
364
|
+
this.assetsCount = 0;
|
|
365
|
+
if (!search) {
|
|
366
|
+
this.searchAllInput = '';
|
|
367
|
+
}
|
|
368
|
+
if (offset === 0) {
|
|
369
|
+
this.allImages.length = 0;
|
|
370
|
+
}
|
|
371
|
+
const req = {
|
|
372
|
+
filters: {
|
|
373
|
+
mediaType: ['image']
|
|
374
|
+
},
|
|
375
|
+
offset
|
|
376
|
+
};
|
|
377
|
+
if (query) {
|
|
378
|
+
req['query'] = query;
|
|
379
|
+
}
|
|
380
|
+
this.questionService.getAssetMedia(req).pipe(catchError(err => {
|
|
381
|
+
const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.022') };
|
|
382
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
383
|
+
}))
|
|
384
|
+
.subscribe((res) => {
|
|
385
|
+
this.assetsCount = res.result.count;
|
|
386
|
+
_.map(res.result.content, (item) => {
|
|
387
|
+
if (item.downloadUrl) {
|
|
388
|
+
this.allImages.push(item);
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* function to get videos
|
|
395
|
+
* @param offset page no
|
|
396
|
+
*/
|
|
397
|
+
getMyVideos(offset, query, search) {
|
|
398
|
+
this.assetsCount = 0;
|
|
399
|
+
if (!search) {
|
|
400
|
+
this.searchMyInput = '';
|
|
401
|
+
this.selectVideo(undefined);
|
|
402
|
+
}
|
|
403
|
+
if (offset === 0) {
|
|
404
|
+
this.myAssets.length = 0;
|
|
405
|
+
}
|
|
406
|
+
const req = {
|
|
407
|
+
filters: {
|
|
408
|
+
mediaType: ['video'],
|
|
409
|
+
createdBy: _.get(this.editorService.editorConfig, 'context.user.id')
|
|
410
|
+
},
|
|
411
|
+
offset
|
|
412
|
+
};
|
|
413
|
+
if (query) {
|
|
414
|
+
req.query = query;
|
|
415
|
+
}
|
|
416
|
+
this.questionService.getAssetMedia(req).pipe(catchError(err => {
|
|
417
|
+
const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.023') };
|
|
418
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
419
|
+
})).subscribe((res) => {
|
|
420
|
+
this.assetsCount = res.result.count;
|
|
421
|
+
_.map(res.result.content, (item) => {
|
|
422
|
+
if (item.downloadUrl) {
|
|
423
|
+
this.myAssets.push(item);
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
getAllVideos(offset, query, search) {
|
|
429
|
+
this.assetsCount = 0;
|
|
430
|
+
if (!search) {
|
|
431
|
+
this.searchAllInput = '';
|
|
432
|
+
this.selectVideo(undefined);
|
|
433
|
+
}
|
|
434
|
+
if (offset === 0) {
|
|
435
|
+
this.allVideos.length = 0;
|
|
436
|
+
}
|
|
437
|
+
const req = {
|
|
438
|
+
filters: {
|
|
439
|
+
mediaType: ['video'],
|
|
440
|
+
},
|
|
441
|
+
offset
|
|
442
|
+
};
|
|
443
|
+
if (query) {
|
|
444
|
+
req.query = query;
|
|
445
|
+
}
|
|
446
|
+
this.questionService.getAssetMedia(req).pipe(catchError(err => {
|
|
447
|
+
const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.023') };
|
|
448
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
449
|
+
})).subscribe((res) => {
|
|
450
|
+
this.assetsCount = res.result.count;
|
|
451
|
+
_.map(res.result.content, (item) => {
|
|
452
|
+
if (item.downloadUrl) {
|
|
453
|
+
this.allVideos.push(item);
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* function to lazy load my images
|
|
460
|
+
*/
|
|
461
|
+
lazyloadMyImages() {
|
|
462
|
+
const offset = this.myAssets.length;
|
|
463
|
+
this.getMyImages(offset, this.query, true);
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* function to lazy load all images
|
|
467
|
+
*/
|
|
468
|
+
lazyloadAllImages() {
|
|
469
|
+
const offset = this.allImages.length;
|
|
470
|
+
this.getAllImages(offset, this.query, true);
|
|
471
|
+
}
|
|
472
|
+
lazyloadMyVideos() {
|
|
473
|
+
const offset = this.myAssets.length;
|
|
474
|
+
this.getMyVideos(offset, this.query, true);
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* function to lazy load all videos
|
|
478
|
+
*/
|
|
479
|
+
lazyloadAllVideos() {
|
|
480
|
+
const offset = this.allVideos.length;
|
|
481
|
+
this.getAllVideos(offset, this.query, true);
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* function to upload image
|
|
485
|
+
*/
|
|
486
|
+
uploadImage(event) {
|
|
487
|
+
const file = event.target.files[0];
|
|
488
|
+
this.assetName = file.name;
|
|
489
|
+
const reader = new FileReader();
|
|
490
|
+
this.formData = new FormData();
|
|
491
|
+
this.formData.append('file', file);
|
|
492
|
+
const fileType = file.type;
|
|
493
|
+
const fileName = file.name.split('.').slice(0, -1).join('.');
|
|
494
|
+
const fileSize = file.size / 1024 / 1024;
|
|
495
|
+
if (fileType.split('/')[0] === 'image') {
|
|
496
|
+
this.showErrorMsg = false;
|
|
497
|
+
if (fileSize > this.assetConfig.image.size) {
|
|
498
|
+
this.showErrorMsg = true;
|
|
499
|
+
this.errorMsg = _.get(this.configService.labelConfig, 'messages.error.021')
|
|
500
|
+
+ this.assetConfig.image.size + this.assetConfig.image.sizeType;
|
|
501
|
+
this.resetFormConfig();
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
this.errorMsg = '';
|
|
505
|
+
this.showErrorMsg = false;
|
|
506
|
+
reader.readAsDataURL(file);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
this.showErrorMsg = true;
|
|
511
|
+
this.errorMsg = _.get(this.configService.labelConfig, 'messages.error.020');
|
|
512
|
+
}
|
|
513
|
+
if (!this.showErrorMsg) {
|
|
514
|
+
this.imageFile = file;
|
|
515
|
+
this.imageUploadLoader = true;
|
|
516
|
+
this.imageFormValid = true;
|
|
517
|
+
this.assestData = this.generateAssetCreateRequest(fileName, fileType, 'image');
|
|
518
|
+
this.populateFormData(this.assestData);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
resetFormConfig() {
|
|
522
|
+
this.imageUploadLoader = false;
|
|
523
|
+
this.imageFormValid = false;
|
|
524
|
+
this.formConfig = this.initialFormConfig;
|
|
525
|
+
}
|
|
526
|
+
populateFormData(formData) {
|
|
527
|
+
const formvalue = _.cloneDeep(this.formConfig);
|
|
528
|
+
this.formConfig = null;
|
|
529
|
+
_.forEach(formvalue, (formFieldCategory) => {
|
|
530
|
+
formFieldCategory.default = formData[formFieldCategory.code];
|
|
531
|
+
formFieldCategory.editable = true;
|
|
532
|
+
});
|
|
533
|
+
this.formConfig = formvalue;
|
|
534
|
+
}
|
|
535
|
+
uploadAndUseImage(modal) {
|
|
536
|
+
this.questionService.createMediaAsset({ content: this.assestData }).pipe(catchError(err => {
|
|
537
|
+
const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.019') };
|
|
538
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
539
|
+
})).subscribe((res) => {
|
|
540
|
+
const imgId = res.result.node_id;
|
|
541
|
+
const request = {
|
|
542
|
+
data: this.formData
|
|
543
|
+
};
|
|
544
|
+
this.questionService.uploadMedia(request, imgId).pipe(catchError(err => {
|
|
545
|
+
const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.019') };
|
|
546
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
547
|
+
})).subscribe((response) => {
|
|
548
|
+
const signedURL = response.result.pre_signed_url;
|
|
549
|
+
let blobConfig = {
|
|
550
|
+
processData: false,
|
|
551
|
+
contentType: 'Asset'
|
|
552
|
+
};
|
|
553
|
+
blobConfig = this.editorService.appendCloudStorageHeaders(blobConfig);
|
|
554
|
+
this.uploadToBlob(signedURL, this.imageFile, blobConfig).subscribe(() => {
|
|
555
|
+
const fileURL = signedURL.split('?')[0];
|
|
556
|
+
const data = new FormData();
|
|
557
|
+
data.append('fileUrl', fileURL);
|
|
558
|
+
data.append('mimeType', this.imageFile.type);
|
|
559
|
+
const config1 = {
|
|
560
|
+
enctype: 'multipart/form-data',
|
|
561
|
+
processData: false,
|
|
562
|
+
contentType: false,
|
|
563
|
+
cache: false
|
|
564
|
+
};
|
|
565
|
+
const uploadMediaConfig = {
|
|
566
|
+
data,
|
|
567
|
+
param: config1
|
|
568
|
+
};
|
|
569
|
+
this.questionService.uploadMedia(uploadMediaConfig, imgId).pipe(catchError(err => {
|
|
570
|
+
const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.019') };
|
|
571
|
+
this.isClosable = true;
|
|
572
|
+
this.loading = false;
|
|
573
|
+
this.imageFormValid = true;
|
|
574
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
575
|
+
})).subscribe((response1) => {
|
|
576
|
+
this.addImageInEditor(response1.result.content_url, response1.result.node_id, this.assestData['name']);
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
});
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
openImageUploadModal() {
|
|
583
|
+
this.showImageUploadModal = true;
|
|
584
|
+
this.resetFormData();
|
|
585
|
+
}
|
|
586
|
+
dismissPops(modal) {
|
|
587
|
+
this.dismissImagePicker();
|
|
588
|
+
modal.deny();
|
|
589
|
+
}
|
|
590
|
+
onStatusChanges(event) {
|
|
591
|
+
if (event.isValid && this.imageUploadLoader) {
|
|
592
|
+
this.imageFormValid = true;
|
|
593
|
+
}
|
|
594
|
+
else {
|
|
595
|
+
this.imageFormValid = false;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
valueChanges(event) {
|
|
599
|
+
this.assestData = _.merge({}, this.assestData, event);
|
|
600
|
+
}
|
|
601
|
+
// search feature for images
|
|
602
|
+
searchImages(event, type) {
|
|
603
|
+
if (event === 'clearInput' && type === 'myImages') {
|
|
604
|
+
this.query = '';
|
|
605
|
+
this.searchMyInput = '';
|
|
606
|
+
}
|
|
607
|
+
else if (event === 'clearInput' && type === 'allImages') {
|
|
608
|
+
this.query = '';
|
|
609
|
+
this.searchAllInput = '';
|
|
610
|
+
}
|
|
611
|
+
else {
|
|
612
|
+
this.query = event.target.value;
|
|
613
|
+
}
|
|
614
|
+
if (type === 'myImages') {
|
|
615
|
+
this.getMyImages(0, this.query, true);
|
|
616
|
+
}
|
|
617
|
+
else {
|
|
618
|
+
this.getAllImages(0, this.query, true);
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
// general method
|
|
622
|
+
resetFormData() {
|
|
623
|
+
this.showErrorMsg = false;
|
|
624
|
+
this.formData = null;
|
|
625
|
+
this.formConfig = this.initialFormConfig;
|
|
626
|
+
this.imageUploadLoader = false;
|
|
627
|
+
this.imageFormValid = false;
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* function to upload video
|
|
631
|
+
*/
|
|
632
|
+
openVideoUploadModal() {
|
|
633
|
+
this.showVideoUploadModal = true;
|
|
634
|
+
this.resetFormData();
|
|
635
|
+
}
|
|
636
|
+
dismissVideoPops(modal) {
|
|
637
|
+
if (this.isClosable) {
|
|
638
|
+
this.dismissVideoPicker();
|
|
639
|
+
modal.deny();
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
uploadVideoFromLocal(event) {
|
|
643
|
+
this.videoFile = event.target.files[0];
|
|
644
|
+
const reader = new FileReader();
|
|
645
|
+
this.formData = new FormData();
|
|
646
|
+
this.formData.append('file', this.videoFile);
|
|
647
|
+
const fileType = this.videoFile.type;
|
|
648
|
+
const fileName = this.videoFile.name.split('.').slice(0, -1).join('.');
|
|
649
|
+
const fileSize = this.videoFile.size / 1024 / 1024;
|
|
650
|
+
if (_.includes(fileType.split('/'), 'video')) {
|
|
651
|
+
this.showErrorMsg = false;
|
|
652
|
+
if (fileSize > this.assetConfig.video.size) {
|
|
653
|
+
this.showErrorMsg = true;
|
|
654
|
+
this.errorMsg = _.get(this.configService.labelConfig, 'messages.error.021') +
|
|
655
|
+
this.assetConfig.video.size + this.assetConfig.video.sizeType;
|
|
656
|
+
this.resetFormConfig();
|
|
657
|
+
}
|
|
658
|
+
else {
|
|
659
|
+
this.errorMsg = '';
|
|
660
|
+
this.showErrorMsg = false;
|
|
661
|
+
reader.readAsDataURL(this.videoFile);
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
else {
|
|
665
|
+
this.showErrorMsg = true;
|
|
666
|
+
this.errorMsg = _.get(this.configService.labelConfig, 'messages.error.024');
|
|
667
|
+
}
|
|
668
|
+
if (!this.showErrorMsg) {
|
|
669
|
+
this.imageUploadLoader = true;
|
|
670
|
+
this.imageFormValid = true;
|
|
671
|
+
this.assestData = this.generateAssetCreateRequest(fileName, fileType, 'video');
|
|
672
|
+
this.populateFormData(this.assestData);
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
uploadVideo(videoModal) {
|
|
676
|
+
this.isClosable = false;
|
|
677
|
+
this.loading = true;
|
|
678
|
+
this.showErrorMsg = false;
|
|
679
|
+
this.imageFormValid = false;
|
|
680
|
+
if (!this.showErrorMsg) {
|
|
681
|
+
this.questionService.createMediaAsset({ content: this.assestData }).pipe(catchError(err => {
|
|
682
|
+
this.loading = false;
|
|
683
|
+
this.isClosable = true;
|
|
684
|
+
this.imageFormValid = true;
|
|
685
|
+
const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.025') };
|
|
686
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
687
|
+
})).subscribe((res) => {
|
|
688
|
+
const contentId = res.result.node_id;
|
|
689
|
+
const request = {
|
|
690
|
+
content: {
|
|
691
|
+
fileName: this.videoFile.name
|
|
692
|
+
}
|
|
693
|
+
};
|
|
694
|
+
this.questionService.generatePreSignedUrl(request, contentId).pipe(catchError(err => {
|
|
695
|
+
const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.026') };
|
|
696
|
+
this.loading = false;
|
|
697
|
+
this.isClosable = true;
|
|
698
|
+
this.imageFormValid = true;
|
|
699
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
700
|
+
})).subscribe((response) => {
|
|
701
|
+
const signedURL = response.result.pre_signed_url;
|
|
702
|
+
let blobConfig = {
|
|
703
|
+
processData: false,
|
|
704
|
+
contentType: 'Asset'
|
|
705
|
+
};
|
|
706
|
+
blobConfig = this.editorService.appendCloudStorageHeaders(blobConfig);
|
|
707
|
+
this.uploadToBlob(signedURL, this.videoFile, blobConfig).subscribe(() => {
|
|
708
|
+
const fileURL = signedURL.split('?')[0];
|
|
709
|
+
this.updateContentWithURL(fileURL, this.videoFile.type, contentId, videoModal);
|
|
710
|
+
});
|
|
711
|
+
});
|
|
712
|
+
});
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
generateAssetCreateRequest(fileName, fileType, mediaType) {
|
|
716
|
+
return {
|
|
717
|
+
name: fileName,
|
|
718
|
+
mediaType,
|
|
719
|
+
mimeType: fileType,
|
|
720
|
+
createdBy: _.get(this.editorService.editorConfig, 'context.user.id'),
|
|
721
|
+
creator: _.get(this.editorService.editorConfig, 'context.user.fullName'),
|
|
722
|
+
channel: _.get(this.editorService.editorConfig, 'context.channel')
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
uploadToBlob(signedURL, file, config) {
|
|
726
|
+
const csp = _.get(this.editorService.editorConfig, 'context.cloudStorage.provider', 'azure');
|
|
727
|
+
return new Observable((observer) => {
|
|
728
|
+
const uploaderLib = new SunbirdFileUploadLib.FileUploader();
|
|
729
|
+
uploaderLib.upload({ url: signedURL, file, csp })
|
|
730
|
+
.on("error", (error) => {
|
|
731
|
+
const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.018') };
|
|
732
|
+
this.isClosable = true;
|
|
733
|
+
this.loading = false;
|
|
734
|
+
this.imageFormValid = true;
|
|
735
|
+
observer.error(this.editorService.apiErrorHandling(error, errInfo));
|
|
736
|
+
}).on("completed", (completed) => {
|
|
737
|
+
observer.next(completed);
|
|
738
|
+
observer.complete();
|
|
739
|
+
});
|
|
740
|
+
});
|
|
741
|
+
}
|
|
742
|
+
updateContentWithURL(fileURL, mimeType, contentId, videoModal) {
|
|
743
|
+
const data = new FormData();
|
|
744
|
+
data.append('fileUrl', fileURL);
|
|
745
|
+
data.append('mimeType', mimeType);
|
|
746
|
+
const config = {
|
|
747
|
+
enctype: 'multipart/form-data',
|
|
748
|
+
processData: false,
|
|
749
|
+
contentType: false,
|
|
750
|
+
cache: false
|
|
751
|
+
};
|
|
752
|
+
const option = {
|
|
753
|
+
data,
|
|
754
|
+
param: config
|
|
755
|
+
};
|
|
756
|
+
this.questionService.uploadMedia(option, contentId).pipe(catchError(err => {
|
|
757
|
+
const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.027') };
|
|
758
|
+
this.isClosable = true;
|
|
759
|
+
this.loading = false;
|
|
760
|
+
this.imageFormValid = true;
|
|
761
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
762
|
+
})).subscribe(res => {
|
|
763
|
+
// Read upload video data
|
|
764
|
+
this.getUploadVideo(res.result.node_id, videoModal);
|
|
765
|
+
});
|
|
766
|
+
}
|
|
767
|
+
getUploadVideo(videoId, videoModal) {
|
|
768
|
+
this.questionService.getVideo(videoId).pipe(map((data) => data.result.content), catchError(err => {
|
|
769
|
+
const errInfo = { errorMsg: _.get(this.configService, 'labelConfig.messages.error.011') };
|
|
770
|
+
this.loading = false;
|
|
771
|
+
this.isClosable = true;
|
|
772
|
+
this.imageFormValid = true;
|
|
773
|
+
return throwError(this.editorService.apiErrorHandling(err, errInfo));
|
|
774
|
+
})).subscribe(res => {
|
|
775
|
+
this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.006'));
|
|
776
|
+
this.selectedVideo = res;
|
|
777
|
+
this.showAddButton = true;
|
|
778
|
+
this.loading = false;
|
|
779
|
+
this.isClosable = true;
|
|
780
|
+
this.imageFormValid = true;
|
|
781
|
+
this.addVideoInEditor(videoModal);
|
|
782
|
+
});
|
|
783
|
+
}
|
|
784
|
+
searchMyVideo(event) {
|
|
785
|
+
this.query = event.target.value;
|
|
786
|
+
this.getMyVideos(0, this.query);
|
|
787
|
+
}
|
|
788
|
+
searchAllVideo(event) {
|
|
789
|
+
this.query = event.target.value;
|
|
790
|
+
this.getAllVideos(0, this.query);
|
|
791
|
+
}
|
|
792
|
+
// searchVideo feature
|
|
793
|
+
searchVideo(event, type) {
|
|
794
|
+
if (event === 'clearInput' && type === 'myVideos') {
|
|
795
|
+
this.query = '';
|
|
796
|
+
this.searchMyInput = '';
|
|
797
|
+
}
|
|
798
|
+
else if (event === 'clearInput' && type === 'allVideos') {
|
|
799
|
+
this.query = '';
|
|
800
|
+
this.searchAllInput = '';
|
|
801
|
+
}
|
|
802
|
+
else {
|
|
803
|
+
this.query = event.target.value;
|
|
804
|
+
}
|
|
805
|
+
if (type === 'myVideos') {
|
|
806
|
+
this.getMyVideos(0, this.query, true);
|
|
807
|
+
}
|
|
808
|
+
else {
|
|
809
|
+
this.getAllVideos(0, this.query, true);
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
selectVideo(data) {
|
|
813
|
+
if (data) {
|
|
814
|
+
this.showAddButton = true;
|
|
815
|
+
this.selectedVideoId = data.identifier;
|
|
816
|
+
this.selectedVideo = data;
|
|
817
|
+
}
|
|
818
|
+
else {
|
|
819
|
+
this.showAddButton = false;
|
|
820
|
+
this.selectedVideoId = '';
|
|
821
|
+
this.selectedVideo = {};
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
countCharacters(document) {
|
|
825
|
+
const rootElement = document.getRoot();
|
|
826
|
+
return this.countCharactersInElement(rootElement);
|
|
827
|
+
}
|
|
828
|
+
countCharactersInElement(node) {
|
|
829
|
+
let chars = 0;
|
|
830
|
+
const forEach = Array.prototype.forEach;
|
|
831
|
+
const forE = node.getChildren();
|
|
832
|
+
let child;
|
|
833
|
+
while (!(child = forE.next()).done) {
|
|
834
|
+
if (child.value.is('text')) {
|
|
835
|
+
chars += child.value.data.length;
|
|
836
|
+
}
|
|
837
|
+
else if (child.value.is('element')) {
|
|
838
|
+
chars += this.countCharactersInElement(child.value);
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
return chars;
|
|
842
|
+
}
|
|
843
|
+
getMediaOriginURL(src) {
|
|
844
|
+
const replaceText = this.assetProxyUrl;
|
|
845
|
+
const cloudStorageUrls = _.compact(_.get(this.editorService.editorConfig, 'context.cloudStorageUrls') || []);
|
|
846
|
+
_.forEach(cloudStorageUrls, url => {
|
|
847
|
+
if (src.indexOf(url) !== -1) {
|
|
848
|
+
src = src.replace(url, replaceText);
|
|
849
|
+
}
|
|
850
|
+
});
|
|
851
|
+
return src;
|
|
852
|
+
}
|
|
853
|
+
// Here Event listener is attached to document to listen the click event from Wiris plugin ('OK'-> button)
|
|
854
|
+
attachEvent(editor) {
|
|
855
|
+
document.addEventListener('click', e => {
|
|
856
|
+
if (e.target && e.target.className === 'wrs_modal_button_accept') {
|
|
857
|
+
editor.model.change(writer => {
|
|
858
|
+
const insertPosition = editor.model.document.selection.getFirstPosition();
|
|
859
|
+
writer.insertText(' ', insertPosition);
|
|
860
|
+
});
|
|
861
|
+
}
|
|
862
|
+
});
|
|
863
|
+
}
|
|
864
|
+
getCharactersLeft() {
|
|
865
|
+
if (this.setCharacterLimit) {
|
|
866
|
+
let charRemaining = this.setCharacterLimit - this.characterCount;
|
|
867
|
+
return charRemaining > 0 ? charRemaining : 0;
|
|
868
|
+
}
|
|
869
|
+
return null;
|
|
870
|
+
}
|
|
871
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CkeditorToolComponent, deps: [{ token: i1.QuestionService }, { token: i2.EditorService }, { token: i3.ToasterService }, { token: i4.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
872
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CkeditorToolComponent, selector: "lib-ckeditor-tool", inputs: { editorDataInput: "editorDataInput", videoShow: "videoShow", setCharacterLimit: "setCharacterLimit", setImageLimit: "setImageLimit" }, outputs: { editorDataOutput: "editorDataOutput", hasError: "hasError", videoDataOutput: "videoDataOutput" }, viewQueries: [{ propertyName: "editorRef", first: true, predicate: ["editor"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"editorWrapper\" [ngClass]=\"{'hasError': limitExceeded}\">\n <button type=\"button\" data-tooltip=\"Add image\" data-position=\"bottom center\" data-variation=\"mini\" data-inverted=\"\"\n title=\"Add image\" [disabled]=\"isAssetBrowserReadOnly || isEditorFocused\" (click)=\"initializeImagePicker('question')\"\n class=\"ui icon button insert-image-btn\">\n <i class=\"image outline icon\" aria-hidden=\"true\"></i>\n </button>\n <textarea class=\"editor\" #editor name=\"question\" placeholder=\"\"></textarea>\n <div *ngIf=\"setCharacterLimit > 0\">\n <div class=\"characterCount\">\n {{configService.labelConfig?.lbl?.charactersLeft}} {{charactersLeft}}\n </div>\n </div>\n</div>\n\n<sui-modal [isClosable]=\"true\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\" (dismissed)=\"dismissImagePicker()\"\n *ngIf=\"showImagePicker\" [size]=\"'normal'\" [isFullScreen]=\"false\" [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectImage}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyImages(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myImages}}</a>\n <a class=\"sb-item\" (activate)=\"getAllImages(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allImage}}</a>\n </div>\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyImages()\" suiTabContent=\"1\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'myImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'myImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier)\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllImages()\" suiTabContent=\"2\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'allImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'allImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\">{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allImages?.length && searchAllInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allImages\">\n <div class=\"sb-image-section\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier)\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n </div>\n\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-end\">\n <button (click)=\"openImageUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n</sui-modal>\n\n<sui-modal [isClosable]=\"isClosable\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoPicker()\" *ngIf=\"showVideoPicker\" [size]=\"'normal'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectVideo}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyVideos(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myVideos}}</a>\n <a class=\"sb-item\" (activate)=\"getAllVideos(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allVideos}}</a>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyVideos()\" suiTabContent=\"1\">\n <div class=\"pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'myVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'myVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data)\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllVideos()\" suiTabContent=\"2\">\n <div class=\" pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'allVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'allVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allVideos?.length && searchAllInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allVideos\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data);\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\">\n </div>\n </div>\n </div>\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between pl-20\">\n <div>\n <button (click)=\"addVideoInEditor();\" class=\"sb-btn sb-btn-normal\"\n [ngClass]=\"{'sb-btn-primary': showAddButton, 'sb-btn-disabled': !showAddButton}\">{{configService.labelConfig?.button_labels?.add_btn_label}}</button>\n </div>\n <div>\n <button (click)=\"openVideoUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload image pop up code here -->\n\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"true\" [isInverted]=\"false\"\n (dismissed)=\"dismissImageUploadModal()\" *ngIf=\"showImageUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragImage}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadImage($event)\" type=\"file\" [accept]=\"acceptImageType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{assetName}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.image.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.image.size}}{{assetConfig.image.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.image.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.image.size}}{{assetConfig.image.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n\n <button (click)=\"uploadAndUseImage(modal);\" [disabled]=\"!imageFormValid\"\n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\"\n class=\"sb-btn sb-btn-normal text-left\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}} \n </button>\n </div>\n <div>\n <button (click)=\"dismissImageUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload video pop up code here -->\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"isClosable\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoUploadModal()\" *ngIf=\"showVideoUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragVideo}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadVideoFromLocal($event)\" type=\"file\" [accept]=\"acceptVideoType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{videoFile?.name}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.video.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.video.size}}{{assetConfig.video.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.video.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.video.size}}{{assetConfig.video.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissVideoPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n <button type=\"button\" class=\"sb-btn sb-btn-normal text-left sb-btn-loading-spinner sb-btn-primary\"\n [disabled]=\"!imageFormValid\" (click)=\"uploadVideo(modal);\" \n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\">\n <div class=\"sb-loading-spinner\" *ngIf=\"loading\" role=\"status\" aria-hidden=\"true\"></div>\n {{configService.labelConfig?.lbl?.uploadAndUse}}\n </button>\n </div>\n <div>\n <button (click)=\"dismissVideoUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>", styles: [".editorWrapper{border:0px solid white}.editorWrapper.hasError{border:1px solid red;border-radius:2px}.characterCount{text-align:right;border-top:0;padding-right:7px;font-size:11px;font-weight:700;margin-top:-16px;position:relative}.custom-image img{border:1px dotted;padding:7px;margin:6px;cursor:pointer}.resource-image{height:180px!important}.asset_container{overflow-y:auto;overflow-x:hidden;min-height:300px!important;max-height:300px!important;padding:5px}.insert-image-btn{position:absolute;z-index:1;left:653px;background-color:transparent;padding:12px 14px!important;margin-left:6px}.insert-image-btn>.icon{opacity:1}.insert-image-btn:active{background-color:transparent}.upload-file-description p{color:#999}.upload-file-description ul{margin:0;list-style:disc}.upload-file-description ul li{margin-bottom:8px}.upload-file-description ul li a{cursor:pointer;font-size:12px}.sb-grid-layout{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));grid-gap:16px}.sb-grid-layout.image{grid-template-columns:repeat(auto-fill,minmax(96px,1fr))}.sb-grid-layout.video{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}.sb-grid-layout .sb-video-content .sb-image-section{height:96px;overflow:hidden;border-radius:4px;box-shadow:inset 0 1px 3px #00000080}.sb-image-section .selected-video{display:none}.sb-image-section.active .selected-video{position:absolute;right:4px;top:4px;color:#07bc81;font-size:20px;display:block}.sb-grid-layout .sb-video-content .sb-image-section img{width:100%;height:100%;cursor:pointer}.overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer}.overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer}::ng-deep .ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar,::ng-deep .ck.ck-editor__top .ck-sticky-panel .ck-toolbar.ck-rounded-corners{border-left:none;border-right:none;border-bottom:1px solid #c4c4c4;border-radius:0}::ng-deep .ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,::ng-deep .ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border:none}::ng-deep .ck-dropdown.ck-font-size-dropdown .ck-dropdown__panel{height:150px;overflow-y:scroll}::ng-deep figure.image.ck-widget{width:auto;height:auto;overflow:visible}::ng-deep figure.image img{width:100%}::ng-deep figure.image.resize-25{width:25%;height:auto}::ng-deep figure.image.resize-50{width:50%;height:auto}::ng-deep figure.image.resize-75{width:75%;height:auto}::ng-deep figure.image.resize-100{width:100%;height:auto}::ng-deep figure.table{margin:2.2rem 0 1.5rem 1rem!important}::ng-deep .text-center{text-align:center}::ng-deep .text-left{text-align:left}::ng-deep .text-right{text-align:right}::ng-deep .fs-8{font-size:.5rem}::ng-deep .fs-10{font-size:.625rem}::ng-deep .fs-12{font-size:.75rem}::ng-deep .fs-14{font-size:.875rem}::ng-deep .fs-16{font-size:1rem}::ng-deep .fs-18{font-size:1.125rem}::ng-deep .fs-20{font-size:1.25rem}::ng-deep .fs-22{font-size:1.375rem}::ng-deep .fs-24{font-size:1.5rem}::ng-deep .fs-26{font-size:1.625rem}::ng-deep .fs-28{font-size:1.75rem}::ng-deep .fs-30{font-size:1.875rem}::ng-deep .fs-36{font-size:2.25rem}.upload-image-modal-section{border-radius:4px;width:100%;min-height:130px;background:#f5f9fc;border:1px dashed #024f9d}.upload-input-button input[type=file]{position:absolute;right:0;top:0;font-size:118px;margin:0;padding:0;cursor:pointer;opacity:0;height:100%}.upload-file-section{display:flex;height:240px;width:100%;max-width:800px;align-items:center;justify-content:center;flex-direction:column;margin:0 auto;background-color:#f5f9fc;border:1px dashed #80a7ce}.qq-uploader.qq-uploader-selector.custom-qq-uploader{background:inherit;border-color:none;border:none;max-height:inherit;min-height:inherit;overflow-y:inherit;width:688px;height:240px;display:flex;justify-content:center;align-items:center}.terms-and-condition{line-height:14px}.sb-info-bx{padding:.4rem!important}.sb-info-bx li{margin:0!important;padding:0!important}.sb-info-bx li:before{content:\"\"!important}.red{color:red}.b-bl{border-left:solid 1px #e4e1e1}.sb-form-fields .sb-field-group{margin:1rem 0}.sb-form-fields .sb-field{position:relative;margin-bottom:.5rem}.sb-form-fields .sb-field .sb-form-control{border:1px solid rgba(34,36,38,.15);width:100%;border-radius:.28571429rem;box-shadow:0 0 0 0 transparent inset;padding:.25rem .5rem!important}@keyframes spinner-border{to{transform:rotate(360deg)}}.sb-loading-spinner{width:1rem;height:1rem;margin-right:8px;border-width:.2em;display:inline-block;vertical-align:text-bottom;border:.15em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.sb-btn-loading:before{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.sb-btn-loading:after{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;animation:button-spin .6s linear;animation-iteration-count:infinite;border-radius:500rem;border-color:#fff transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}.sb-btn-outline-disabled{background-color:#fff;border:1px solid #cccccc;color:#999;cursor:default;font-weight:400}.sb-color-grey{color:#666}.flex-jc-space-end{justify-content:flex-end!important}.fs-0785{font-size:.785rem!important}.ui.info.message{color:#276f86!important}.sb-textbox[disabled=true]{opacity:.3!important;font-weight:500!important}.sb-tabset-segment{min-height:288px;max-height:288px;overflow-y:auto}input:focus-visible{border:none!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.SuiModal, selector: "sui-modal", inputs: ["isClosable", "closeResult", "size", "isCentered", "isFullScreen", "isBasic", "mustScroll", "isInverted", "transition", "transitionDuration"], outputs: ["approved", "denied", "dismissed"] }, { kind: "component", type: i7.SuiTabset, selector: "sui-tabset" }, { kind: "directive", type: i7.SuiTabHeader, selector: "[suiTabHeader]", inputs: ["suiTabHeader", "isActive", "isDisabled"], outputs: ["isActiveChange", "activate", "deactivate"] }, { kind: "directive", type: i7.SuiTabContent, selector: "[suiTabContent]", inputs: ["suiTabContent"] }, { kind: "component", type: i8.DynamicFormComponent, selector: "sb-dynamic-form", inputs: ["config", "dataLoadStatusDelegate"], outputs: ["initialize", "finalize", "valueChanges", "statusChanges"] }, { kind: "directive", type: i9.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }] }); }
|
|
873
|
+
}
|
|
874
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CkeditorToolComponent, decorators: [{
|
|
875
|
+
type: Component,
|
|
876
|
+
args: [{ selector: 'lib-ckeditor-tool', template: "<div class=\"editorWrapper\" [ngClass]=\"{'hasError': limitExceeded}\">\n <button type=\"button\" data-tooltip=\"Add image\" data-position=\"bottom center\" data-variation=\"mini\" data-inverted=\"\"\n title=\"Add image\" [disabled]=\"isAssetBrowserReadOnly || isEditorFocused\" (click)=\"initializeImagePicker('question')\"\n class=\"ui icon button insert-image-btn\">\n <i class=\"image outline icon\" aria-hidden=\"true\"></i>\n </button>\n <textarea class=\"editor\" #editor name=\"question\" placeholder=\"\"></textarea>\n <div *ngIf=\"setCharacterLimit > 0\">\n <div class=\"characterCount\">\n {{configService.labelConfig?.lbl?.charactersLeft}} {{charactersLeft}}\n </div>\n </div>\n</div>\n\n<sui-modal [isClosable]=\"true\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\" (dismissed)=\"dismissImagePicker()\"\n *ngIf=\"showImagePicker\" [size]=\"'normal'\" [isFullScreen]=\"false\" [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectImage}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyImages(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myImages}}</a>\n <a class=\"sb-item\" (activate)=\"getAllImages(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allImage}}</a>\n </div>\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyImages()\" suiTabContent=\"1\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'myImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'myImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier)\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllImages()\" suiTabContent=\"2\">\n <div class=\"ui pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchImages($event, 'allImages')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchImages('clearInput', 'allImages')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\">{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allImages?.length && searchAllInput\" class=\"fs-0785\"> {{emptyImageSearchMessage}} </div>\n <div class=\"sb-grid-layout image\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allImages\">\n <div class=\"sb-image-section\">\n <img (click)=\"addImageInEditor(data.downloadUrl, data.identifier)\" [src]=\"data.downloadUrl\">\n </div>\n </div>\n </div>\n\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-end\">\n <button (click)=\"openImageUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n</sui-modal>\n\n<sui-modal [isClosable]=\"isClosable\" class=\"sb-modal overflow-modal\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoPicker()\" *ngIf=\"showVideoPicker\" [size]=\"'normal'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.selectVideo}}</div>\n <div class=\"sb-modal-content p-0\">\n <sui-tabset>\n <div class=\"sb-tabset-menu\">\n <a class=\"sb-item\" (activate)=\"getMyVideos(0)\" suiTabHeader=\"1\">{{configService.labelConfig?.lbl?.myVideos}}</a>\n <a class=\"sb-item\" (activate)=\"getAllVideos(0)\" suiTabHeader=\"2\">{{configService.labelConfig?.lbl?.allVideos}}</a>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadMyVideos()\" suiTabContent=\"1\">\n <div class=\"pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'myVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchMyInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'myVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!myAssets?.length && searchMyInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of myAssets\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data)\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\">\n </div>\n </div>\n\n </div>\n </div>\n\n <div class=\"ui segment sb-tabset-segment m-0 pt-15\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"500\" [scrollWindow]=\"false\" (scrolled)=\"lazyloadAllVideos()\" suiTabContent=\"2\">\n <div class=\" pb-16 d-flex pl-0\">\n <div class=\"sb-search-box small no-btn\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (change)=\"searchVideo($event, 'allVideos')\" class=\"sb-search-input\" [(ngModel)]=\"searchAllInput\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" (click)=\"searchVideo('clearInput', 'allVideos')\" aria-hidden=\"true\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <p class=\"fs-0-986 ml-auto sb-color-grey\" >{{assetsCount}}</p>\n </div>\n <div *ngIf=\"!allVideos?.length && searchAllInput\" class=\"fs-0785\"> {{emptyVideoSearchMessage}} </div>\n <div class=\"sb-grid-layout video\">\n <div class=\"sb-video-content\" *ngFor=\"let data of allVideos\">\n <div class=\"sb-image-section relative position\" [ngClass]=\"{'active': selectedVideoId === data.identifier}\"\n (click)=\"selectVideo(data);\">\n <div class=\"overlay-image\"><i class=\"play circle icon\" aria-hidden=\"true\"></i></div>\n <i class=\"check circle icon selected-video\" aria-hidden=\"true\"></i>\n <img [src]=\"data.thumbnail\">\n </div>\n </div>\n </div>\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between pl-20\">\n <div>\n <button (click)=\"addVideoInEditor();\" class=\"sb-btn sb-btn-normal\"\n [ngClass]=\"{'sb-btn-primary': showAddButton, 'sb-btn-disabled': !showAddButton}\">{{configService.labelConfig?.button_labels?.add_btn_label}}</button>\n </div>\n <div>\n <button (click)=\"openVideoUploadModal();\" class=\"sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}}</button>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload image pop up code here -->\n\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"true\" [isInverted]=\"false\"\n (dismissed)=\"dismissImageUploadModal()\" *ngIf=\"showImageUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragImage}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadImage($event)\" type=\"file\" [accept]=\"acceptImageType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{assetName}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.image.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.image.size}}{{assetConfig.image.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.image.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.image.size}}{{assetConfig.image.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n\n <button (click)=\"uploadAndUseImage(modal);\" [disabled]=\"!imageFormValid\"\n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\"\n class=\"sb-btn sb-btn-normal text-left\">{{configService.labelConfig?.button_labels?.upload_use_btn_label}} \n </button>\n </div>\n <div>\n <button (click)=\"dismissImageUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>\n\n<!-- Upload video pop up code here -->\n<sui-modal class=\"sb-modal overflow-modal\" [isClosable]=\"isClosable\" [isInverted]=\"false\"\n (dismissed)=\"dismissVideoUploadModal()\" *ngIf=\"showVideoUploadModal\" [size]=\"'large'\" [isFullScreen]=\"false\"\n [mustScroll]=\"true\" appBodyScroll #modal>\n <div class=\"sb-modal-header\">{{configService.labelConfig?.lbl?.uploadAndUse}}</div>\n <div class=\"p-10 sb-bg-white\">\n <div class=\"d-flex\">\n <div class=\"w-50\">\n <div class=\"content\">\n <h6 class=\"mb-8 fs-normal\">{{configService.labelConfig?.lbl?.chooseOrDragVideo}}<span class=\"red\">*</span></h6>\n <div class=\"upload-image-modal-section d-flex flex-ai-center flex-jc-center flex-dc\">\n <ng-container>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\">\n {{configService.labelConfig?.button_labels?.upload_from_computer_btn_label}}\n <input (change)=\"uploadVideoFromLocal($event)\" type=\"file\" [accept]=\"acceptVideoType\" name=\"assetfile\">\n </button>\n <div class=\"py-10 fs-0-785 sb-color-primary\" *ngIf=\"imageUploadLoader\"> {{videoFile?.name}} </div>\n <span class=\"fsmall mt-8\">{{configService.labelConfig?.lbl?.upload}} {{assetConfig.video.accepted}} ({{configService.labelConfig?.lbl?.maxFileSize}}\n {{assetConfig.video.size}}{{assetConfig.video.sizeType}})</span>\n <div *ngIf=\"showErrorMsg\" class=\"sb-color-error fsmall mt-8\">\n <p>{{errorMsg}}</p>\n </div>\n </ng-container>\n </div>\n <div class=\"ui info message sb-info-bx\">\n <ul class=\"list\">\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.allowedFileTypes}} {{assetConfig.video.accepted}}</li>\n <li class=\"fs-0785\">{{configService.labelConfig?.lbl?.maximumAllowedFileSize}} {{assetConfig.video.size}}{{assetConfig.video.sizeType}}</li>\n </ul>\n </div>\n <h6 class=\"fs-0785\">{{configService.labelConfig?.lbl?.copyRightsAndLicense}}<span class=\"red\">*</span></h6>\n <p class=\"fsmall mt-8 terms-and-condition\">{{termsAndCondition}}</p>\n </div>\n </div>\n <div class=\"w-50 pl-10 ml-10 b-bl\">\n <div class=\"ui info message sb-info-bx mb-0\">\n <ul class=\"list\">\n <li class=\"fs-0785 font-weight-bold\">\n <i class=\"icon info circle\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.lbl?.dropChooseFile}}</li>\n </ul>\n </div>\n <div class=\"sb-form-fields\">\n <div class=\"form-container upload-form\">\n <sb-dynamic-form [config]=\"formConfig\" (statusChanges)=\"onStatusChanges($event)\"\n (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions flex-jc-space-between p-0\">\n <div>\n <button (click)=\"dismissVideoPops(modal);\" class=\"mr-10 sb-btn sb-btn-primary sb-btn-normal\">{{configService.labelConfig?.button_labels?.cancel_btn_label}}</button>\n <button type=\"button\" class=\"sb-btn sb-btn-normal text-left sb-btn-loading-spinner sb-btn-primary\"\n [disabled]=\"!imageFormValid\" (click)=\"uploadVideo(modal);\" \n [ngClass]=\"{'sb-btn-primary': imageFormValid, 'sb-btn-disabled': !imageFormValid}\">\n <div class=\"sb-loading-spinner\" *ngIf=\"loading\" role=\"status\" aria-hidden=\"true\"></div>\n {{configService.labelConfig?.lbl?.uploadAndUse}}\n </button>\n </div>\n <div>\n <button (click)=\"dismissVideoUploadModal();\" class=\" sb-btn sb-btn-primary sb-btn-normal\"> {{configService.labelConfig?.button_labels?.back_btn_label}}</button>\n </div>\n </div>\n </div>\n</sui-modal>", styles: [".editorWrapper{border:0px solid white}.editorWrapper.hasError{border:1px solid red;border-radius:2px}.characterCount{text-align:right;border-top:0;padding-right:7px;font-size:11px;font-weight:700;margin-top:-16px;position:relative}.custom-image img{border:1px dotted;padding:7px;margin:6px;cursor:pointer}.resource-image{height:180px!important}.asset_container{overflow-y:auto;overflow-x:hidden;min-height:300px!important;max-height:300px!important;padding:5px}.insert-image-btn{position:absolute;z-index:1;left:653px;background-color:transparent;padding:12px 14px!important;margin-left:6px}.insert-image-btn>.icon{opacity:1}.insert-image-btn:active{background-color:transparent}.upload-file-description p{color:#999}.upload-file-description ul{margin:0;list-style:disc}.upload-file-description ul li{margin-bottom:8px}.upload-file-description ul li a{cursor:pointer;font-size:12px}.sb-grid-layout{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));grid-gap:16px}.sb-grid-layout.image{grid-template-columns:repeat(auto-fill,minmax(96px,1fr))}.sb-grid-layout.video{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}.sb-grid-layout .sb-video-content .sb-image-section{height:96px;overflow:hidden;border-radius:4px;box-shadow:inset 0 1px 3px #00000080}.sb-image-section .selected-video{display:none}.sb-image-section.active .selected-video{position:absolute;right:4px;top:4px;color:#07bc81;font-size:20px;display:block}.sb-grid-layout .sb-video-content .sb-image-section img{width:100%;height:100%;cursor:pointer}.overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer}.overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer}::ng-deep .ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar,::ng-deep .ck.ck-editor__top .ck-sticky-panel .ck-toolbar.ck-rounded-corners{border-left:none;border-right:none;border-bottom:1px solid #c4c4c4;border-radius:0}::ng-deep .ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,::ng-deep .ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border:none}::ng-deep .ck-dropdown.ck-font-size-dropdown .ck-dropdown__panel{height:150px;overflow-y:scroll}::ng-deep figure.image.ck-widget{width:auto;height:auto;overflow:visible}::ng-deep figure.image img{width:100%}::ng-deep figure.image.resize-25{width:25%;height:auto}::ng-deep figure.image.resize-50{width:50%;height:auto}::ng-deep figure.image.resize-75{width:75%;height:auto}::ng-deep figure.image.resize-100{width:100%;height:auto}::ng-deep figure.table{margin:2.2rem 0 1.5rem 1rem!important}::ng-deep .text-center{text-align:center}::ng-deep .text-left{text-align:left}::ng-deep .text-right{text-align:right}::ng-deep .fs-8{font-size:.5rem}::ng-deep .fs-10{font-size:.625rem}::ng-deep .fs-12{font-size:.75rem}::ng-deep .fs-14{font-size:.875rem}::ng-deep .fs-16{font-size:1rem}::ng-deep .fs-18{font-size:1.125rem}::ng-deep .fs-20{font-size:1.25rem}::ng-deep .fs-22{font-size:1.375rem}::ng-deep .fs-24{font-size:1.5rem}::ng-deep .fs-26{font-size:1.625rem}::ng-deep .fs-28{font-size:1.75rem}::ng-deep .fs-30{font-size:1.875rem}::ng-deep .fs-36{font-size:2.25rem}.upload-image-modal-section{border-radius:4px;width:100%;min-height:130px;background:#f5f9fc;border:1px dashed #024f9d}.upload-input-button input[type=file]{position:absolute;right:0;top:0;font-size:118px;margin:0;padding:0;cursor:pointer;opacity:0;height:100%}.upload-file-section{display:flex;height:240px;width:100%;max-width:800px;align-items:center;justify-content:center;flex-direction:column;margin:0 auto;background-color:#f5f9fc;border:1px dashed #80a7ce}.qq-uploader.qq-uploader-selector.custom-qq-uploader{background:inherit;border-color:none;border:none;max-height:inherit;min-height:inherit;overflow-y:inherit;width:688px;height:240px;display:flex;justify-content:center;align-items:center}.terms-and-condition{line-height:14px}.sb-info-bx{padding:.4rem!important}.sb-info-bx li{margin:0!important;padding:0!important}.sb-info-bx li:before{content:\"\"!important}.red{color:red}.b-bl{border-left:solid 1px #e4e1e1}.sb-form-fields .sb-field-group{margin:1rem 0}.sb-form-fields .sb-field{position:relative;margin-bottom:.5rem}.sb-form-fields .sb-field .sb-form-control{border:1px solid rgba(34,36,38,.15);width:100%;border-radius:.28571429rem;box-shadow:0 0 0 0 transparent inset;padding:.25rem .5rem!important}@keyframes spinner-border{to{transform:rotate(360deg)}}.sb-loading-spinner{width:1rem;height:1rem;margin-right:8px;border-width:.2em;display:inline-block;vertical-align:text-bottom;border:.15em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.sb-btn-loading:before{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.sb-btn-loading:after{position:absolute;content:\"\";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;animation:button-spin .6s linear;animation-iteration-count:infinite;border-radius:500rem;border-color:#fff transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}.sb-btn-outline-disabled{background-color:#fff;border:1px solid #cccccc;color:#999;cursor:default;font-weight:400}.sb-color-grey{color:#666}.flex-jc-space-end{justify-content:flex-end!important}.fs-0785{font-size:.785rem!important}.ui.info.message{color:#276f86!important}.sb-textbox[disabled=true]{opacity:.3!important;font-weight:500!important}.sb-tabset-segment{min-height:288px;max-height:288px;overflow-y:auto}input:focus-visible{border:none!important}\n"] }]
|
|
877
|
+
}], ctorParameters: function () { return [{ type: i1.QuestionService }, { type: i2.EditorService }, { type: i3.ToasterService }, { type: i4.ConfigService }]; }, propDecorators: { editorRef: [{
|
|
878
|
+
type: ViewChild,
|
|
879
|
+
args: ['editor']
|
|
880
|
+
}], editorDataInput: [{
|
|
881
|
+
type: Input
|
|
882
|
+
}], editorDataOutput: [{
|
|
883
|
+
type: Output
|
|
884
|
+
}], hasError: [{
|
|
885
|
+
type: Output
|
|
886
|
+
}], videoDataOutput: [{
|
|
887
|
+
type: Output
|
|
888
|
+
}], videoShow: [{
|
|
889
|
+
type: Input
|
|
890
|
+
}], setCharacterLimit: [{
|
|
891
|
+
type: Input
|
|
892
|
+
}], setImageLimit: [{
|
|
893
|
+
type: Input
|
|
894
|
+
}] } });
|
|
895
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2tlZGl0b3ItdG9vbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xsZWN0aW9uLWVkaXRvci1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy9ja2VkaXRvci10b29sL2NrZWRpdG9yLXRvb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY2tlZGl0b3ItdG9vbC9ja2VkaXRvci10b29sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXlCLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFhLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNoSSxPQUFPLGFBQWEsTUFBTSx5Q0FBeUMsQ0FBQztBQUNwRSxPQUFPLEtBQUssQ0FBQyxNQUFNLFdBQVcsQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7Ozs7Ozs7QUFPN0QsTUFBTSxPQUFPLHFCQUFxQjtJQXFCaEMsWUFBb0IsZUFBZ0MsRUFBVSxhQUE0QixFQUNoRixjQUE4QixFQUFTLGFBQTRCO1FBRHpELG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ2hGLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFTLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBbkJuRSxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzNDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FB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LE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUMxRSxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDekMsQ0FBQyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ2pFLE9BQU8sYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7K0dBMTRCVSxxQkFBcUI7bUdBQXJCLHFCQUFxQixnYkNoQmxDLG80aEJBaVNZOzs0RkRqUkMscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjsyTEFLRCxTQUFTO3NCQUFwQyxTQUFTO3VCQUFDLFFBQVE7Z0JBQ1YsZUFBZTtzQkFBdkIsS0FBSztnQkFDSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNFLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT3V0cHV0LCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IENsYXNzaWNFZGl0b3IgZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9ja2VkaXRvci1idWlsZC1jbGFzc2ljJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHRocm93RXJyb3IsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFF1ZXN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3F1ZXN0aW9uL3F1ZXN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VkaXRvci9lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RvYXN0ZXIvdG9hc3Rlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vYXNzZXQtYnJvd3Nlci9hc3NldC1icm93c2VyLmRhdGEnO1xuZGVjbGFyZSBjb25zdCBTdW5iaXJkRmlsZVVwbG9hZExpYjogYW55O1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNrZWRpdG9yLXRvb2wnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2tlZGl0b3ItdG9vbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NrZWRpdG9yLXRvb2wuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDa2VkaXRvclRvb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcicpIHB1YmxpYyBlZGl0b3JSZWY6IEVsZW1lbnRSZWY7XG4gIEBJbnB1dCgpIGVkaXRvckRhdGFJbnB1dDogYW55O1xuICBAT3V0cHV0KCkgZWRpdG9yRGF0YU91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgaGFzRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHZpZGVvRGF0YU91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoKSB2aWRlb1Nob3c7XG4gIEBJbnB1dCgpIHNldENoYXJhY3RlckxpbWl0OiBudW1iZXI7XG4gIEBJbnB1dCgpIHNldEltYWdlTGltaXQ6IGFueTtcbiAgcHVibGljIGVkaXRvckNvbmZpZzogYW55O1xuICBwdWJsaWMgaW1hZ2VVcGxvYWRMb2FkZXIgPSBmYWxzZTtcbiAgcHVibGljIGVkaXRvckluc3RhbmNlOiBhbnk7XG4gIHB1YmxpYyBpc0VkaXRvckZvY3VzZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBsaW1pdEV4Y2VlZGVkOiBib29sZWFuO1xuICBwdWJsaWMgY2hhcmFjdGVyc0xlZnQ6IG51bWJlcjtcbiAgcHVibGljIGlzQXNzZXRCcm93c2VyUmVhZE9ubHkgPSBmYWxzZTtcbiAgcHVibGljIGNoYXJhY3RlckNvdW50O1xuICBwdWJsaWMgbWVkaWFvYmo7XG4gIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIHB1YmxpYyBhc3NldFByb3h5VXJsOiBhbnk7XG4gIHB1YmxpYyBsYXN0SW1nUmVzaXplV2lkdGg7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcXVlc3Rpb25TZXJ2aWNlOiBRdWVzdGlvblNlcnZpY2UsIHByaXZhdGUgZWRpdG9yU2VydmljZTogRWRpdG9yU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSwgcHVibGljIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UpIHsgfVxuICBhc3NldENvbmZpZzogYW55ID0ge307XG4gIG15QXNzZXRzID0gW107XG4gIGFsbEltYWdlcyA9IFtdO1xuICBhbGxWaWRlb3MgPSBbXTtcbiAgc2VsZWN0ZWRWaWRlbyA9IHt9O1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIGlzQ2xvc2FibGUgPSB0cnVlO1xuICBzZWxlY3RlZFZpZGVvSWQ6IHN0cmluZztcbiAgc2hvd0FkZEJ1dHRvbjogYm9vbGVhbjtcbiAgc2hvd0ltYWdlUGlja2VyOiBib29sZWFuO1xuICBzaG93VmlkZW9QaWNrZXIgPSBmYWxzZTtcbiAgc2hvd0ltYWdlVXBsb2FkTW9kYWw6IGJvb2xlYW47XG4gIHNob3dWaWRlb1VwbG9hZE1vZGFsOiBib29sZWFuO1xuICBhY2NlcHRWaWRlb1R5cGU6IGFueTtcbiAgYWNjZXB0SW1hZ2VUeXBlOiBhbnk7XG4gIHNob3dFcnJvck1zZzogYm9vbGVhbjtcbiAgZXJyb3JNc2c6IHN0cmluZztcbiAgcXVlcnk6IHN0cmluZztcbiAgcHVibGljIGFzc2V0c0NvdW50OiBhbnk7XG4gIHB1YmxpYyBzZWFyY2hNeUlucHV0ID0gJyc7XG4gIHB1YmxpYyBzZWFyY2hBbGxJbnB1dDogYW55O1xuICBwdWJsaWMgZm9ybURhdGE6IGFueTtcbiAgcHVibGljIGFzc2VzdERhdGEgPSB7fTtcbiAgcHVibGljIGZvcm1Db25maWc6IGFueTtcbiAgcHVibGljIGluaXRpYWxGb3JtQ29uZmlnOiBhbnk7XG4gIHB1YmxpYyBpbWFnZUZvcm1WYWxpZCA9IGZhbHNlO1xuICBwdWJsaWMgdmlkZW9GaWxlOiBhbnk7XG4gIHB1YmxpYyBpbWFnZUZpbGU6IGFueTtcbiAgcHVibGljIHRlcm1zQW5kQ29uZGl0aW9uOiBhbnk7XG4gIHB1YmxpYyBhc3NldE5hbWU6IGFueTtcbiAgcHVibGljIGVtcHR5SW1hZ2VTZWFyY2hNZXNzYWdlOiBhbnk7XG4gIHB1YmxpYyBlbXB0eVZpZGVvU2VhcmNoTWVzc2FnZTogYW55O1xuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmFzc2V0UHJveHlVcmwgPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UudXJsQ29uRmlnLCAnVVJMUy5hc3NldFByb3h5VXJsJyk7XG4gICAgdGhpcy5pbml0aWFsRm9ybUNvbmZpZyA9IF8uZ2V0KGNvbmZpZywgJ3VwbG9hZEljb25Gb3JtQ29uZmlnJyk7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gXy5nZXQoY29uZmlnLCAndXBsb2FkSWNvbkZvcm1Db25maWcnKTtcbiAgICB0aGlzLmVtcHR5SW1hZ2VTZWFyY2hNZXNzYWdlID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDE2Jyk7XG4gICAgdGhpcy5lbXB0eVZpZGVvU2VhcmNoTWVzc2FnZSA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAxNycpO1xuICAgIHRoaXMudGVybXNBbmRDb25kaXRpb24gPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICd0ZXJtc0FuZENvbmRpdGlvbnMuMDAxJyk7XG4gICAgdGhpcy5hc3NldENvbmZpZyA9IHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcuY29uZmlnLmFzc2V0Q29uZmlnO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuZWRpdG9yQ29uZmlnID0ge1xuICAgICAgdG9vbGJhcjogWydoZWFkaW5nJywgJ3wnLCAnYm9sZCcsICd8JywgJ2l0YWxpYycsICd8JywgJ3VuZGVybGluZScsICd8JywgJ0J1bGxldGVkTGlzdCcsICd8JywgJ2FsaWdubWVudCcsXG4gICAgICAgICd8JywgJ2luc2VydFRhYmxlJywgJ3wnLCAnbnVtYmVyZWRMaXN0JywgJ3wnLCAnZm9udFNpemUnLCAnfCcsICdzdWJzY3JpcHQnLCAnfCcsICdzdXBlcnNjcmlwdCcsICd8JyxcbiAgICAgICAgJ01hdGhUZXh0JywgJ3wnLCAnc3BlY2lhbENoYXJhY3RlcnMnLCAnfCdcbiAgICAgIF0sXG4gICAgICBmb250U2l6ZToge1xuICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgJ2VpZ2h0JyxcbiAgICAgICAgICAndGVuJyxcbiAgICAgICAgICAndHdlbHZlJyxcbiAgICAgICAgICAnZm91cnRlZW4nLFxuICAgICAgICAgICdzaXh0ZWVuJyxcbiAgICAgICAgICAnZWlnaHRlZW4nLFxuICAgICAgICAgICd0d2VudHknLFxuICAgICAgICAgICd0d2VudHl0d28nLFxuICAgICAgICAgICd0d2VudHlmb3VyJyxcbiAgICAgICAgICAndHdlbnR5c2l4JyxcbiAgICAgICAgICAndHdlbnR5ZWlnaHQnLFxuICAgICAgICAgICd0aGlydHknLFxuICAgICAgICAgICd0aGlydHlzaXgnXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBpbWFnZToge1xuICAgICAgICByZXNpemVVbml0OiAnJScsXG4gICAgICAgIHJlc2l6ZU9wdGlvbnM6IFt7XG4gICAgICAgICAgbmFtZTogJ3Jlc2l6ZUltYWdlOjI1JyxcbiAgICAgICAgICB2YWx1ZTogJzI1JyxcbiAgICAgICAgICBpY29uOiAnc21hbGwnLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ3Jlc2l6ZS0yNSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyZXNpemVJbWFnZTo1MCcsXG4gICAgICAgICAgdmFsdWU6ICc1MCcsXG4gICAgICAgICAgaWNvbjogJ21lZGl1bScsXG4gICAgICAgICAgY2xhc3NOYW1lOiAncmVzaXplLTUwJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3Jlc2l6ZUltYWdlOjc1JyxcbiAgICAgICAgICB2YWx1ZTogJzc1JyxcbiAgICAgICAgICBpY29uOiAnbGFyZ2UnLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ3Jlc2l6ZS03NSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyZXNpemVJbWFnZToxMDAnLFxuICAgICAgICAgIHZhbHVlOiAnMTAwJyxcbiAgICAgICAgICBpY29uOiAnZnVsbCcsXG4gICAgICAgICAgY2xhc3NOYW1lOiAncmVzaXplLTEwMCdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyZXNpemVJbWFnZTpvcmlnaW5hbCcsXG4gICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgaWNvbjogJ29yaWdpbmFsJyxcbiAgICAgICAgICBjbGFzc05hbWU6ICdyZXNpemUtb3JpZ2luYWwnXG4gICAgICAgIH1dLFxuICAgICAgICB0b29sYmFyOiBbJ2ltYWdlU3R5bGU6YWxpZ25MZWZ0JywgJ2ltYWdlU3R5bGU6YWxpZ25DZW50ZXInLCAnaW1hZ2VTdHlsZTphbGlnblJpZ2h0JywgJ3wnLFxuICAgICAgICAgICdyZXNpemVJbWFnZToyNScsICdyZXNpemVJbWFnZTo1MCcsICdyZXNpemVJbWFnZTo3NScsICdyZXNpemVJbWFnZToxMDAnLCAncmVzaXplSW1hZ2U6b3JpZ2luYWwnXSxcbiAgICAgICAgc3R5bGVzOiBbJ2Z1bGwnLCAnYWxpZ25MZWZ0JywgJ2FsaWduUmlnaHQnLCAnYWxpZ25DZW50ZXInXVxuICAgICAgfSxcbiAgICAgIGlzUmVhZE9ubHk6IGZhbHNlLFxuICAgICAgcmVtb3ZlUGx1Z2luczogWydJbWFnZUNhcHRpb24nLCAnbWF0aHR5cGUnLCAnQ2hlbVR5cGUnLCAnSW1hZ2VSZXNpemVIYW5kbGVzJ11cbiAgICB9O1xuXG4gICAgdGhpcy5hY2NlcHRWaWRlb1R5cGUgPSB0aGlzLmdldEFjY2VwdFR5cGUodGhpcy5hc3NldENvbmZpZy52aWRlby5hY2NlcHRlZCwgJ3ZpZGVvJyk7XG4gICAgdGhpcy5hY2NlcHRJbWFnZVR5cGUgPSB0aGlzLmdldEFjY2VwdFR5cGUodGhpcy5hc3NldENvbmZpZy5pbWFnZS5hY2NlcHRlZCwgJ2ltYWdlJyk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKHRoaXMudmlkZW9TaG93KSB7XG4gICAgICB0aGlzLnNob3dWaWRlb1BpY2tlciA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdFZpZGVvKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUVkaXRvcnMoKTtcbiAgfVxuXG5cbiAgaW5pdGlhbGl6ZUltYWdlUGlja2VyKGVkaXRvclR5cGUpIHtcbiAgICB0aGlzLnNob3dJbWFnZVBpY2tlciA9IHRydWU7XG4gIH1cblxuICBpbml0aWFsaXplVmlkZW9QaWNrZXIoZWRpdG9yVHlwZSkge1xuICAgIHRoaXMuc2hvd1ZpZGVvUGlja2VyID0gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogZnVuY3Rpb24gdG8gaGlkZSBpbWFnZSBwaWNrZXJcbiAgICovXG4gIGRpc21pc3NJbWFnZVBpY2tlcigpIHtcbiAgICB0aGlzLnNob3dJbWFnZVBpY2tlciA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIGZ1bmN0aW9uIHRvIGhpZGUgdmlkZW8gcGlja2VyXG4gICAqL1xuICBkaXNtaXNzVmlkZW9QaWNrZXIoKSB7XG4gICAgdGhpcy5zaG93VmlkZW9QaWNrZXIgPSBmYWxzZTtcbiAgICB0aGlzLnZpZGVvU2hvdyA9IGZhbHNlO1xuICAgIHRoaXMudmlkZW9EYXRhT3V0cHV0LmVtaXQoZmFsc2UpO1xuICB9XG4gIGRpc21pc3NJbWFnZVVwbG9hZE1vZGFsKCkge1xuICAgIHRoaXMuc2hvd0ltYWdlVXBsb2FkTW9kYWwgPSBmYWxzZTtcbiAgfVxuICBpbml0aWF0ZUltYWdlVXBsb2FkTW9kYWwoKSB7XG4gICAgdGhpcy5zaG93SW1hZ2VQaWNrZXIgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dJbWFnZVVwbG9hZE1vZGFsID0gdHJ1ZTtcbiAgfVxuXG4gIGRpc21pc3NWaWRlb1VwbG9hZE1vZGFsKCkge1xuICAgIGlmICh0aGlzLmlzQ2xvc2FibGUpIHtcbiAgICAgIHRoaXMuc2hvd1ZpZGVvVXBsb2FkTW9kYWwgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaW5pdGlhdGVWaWRlb1VwbG9hZE1vZGFsKCkge1xuICAgIHRoaXMuc2hvd1ZpZGVvUGlja2VyID0gZmFsc2U7XG4gICAgdGhpcy5zaG93SW1hZ2VVcGxvYWRNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgaXNFZGl0b3JSZWFkT25seShzdGF0ZSkge1xuICAgIHRoaXMuZWRpdG9ySW5zdGFuY2UuaXNSZWFkT25seSA9IHN0YXRlO1xuICAgIHRoaXMuaXNBc3NldEJyb3dzZXJSZWFkT25seSA9IHN0YXRlO1xuICB9XG4gIGdldEFjY2VwdFR5cGUodHlwZUxpc3QsIHR5cGUpIHtcbiAgICBjb25zdCBhY2NlcHRUeXBlTGlzdCA9IHR5cGVMaXN0LnNwbGl0KCcsICcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIF8uZm9yRWFjaChhY2NlcHRUeXBlTGlzdCwgKGNvbnRlbnQpID0+IHtcbiAgICAgIHJlc3VsdC5wdXNoKGAke3R5cGV9LyR7Y29udGVudH1gKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7XG4gIH1cblxuICBjdXN0b21JbWFnZVJlc2l6ZXIoZWRpdG9yKSB7XG4gICAgLy8gQm90aCB0aGUgZGF0YSBhbmQgdGhlIGVkaXRpbmcgcGlwZWxpbmVzIGFyZSBhZmZlY3RlZCBieSB0aGlzIGNvbnZlcnNpb24uXG4gICAgZWRpdG9yLmNvbnZlcnNpb24uZm9yKCdkb3duY2FzdCcpLmFkZChkaXNwYXRjaGVyID0+IHtcbiAgICAgIC8vIExpbmtzIGFyZSByZXByZXNlbnRlZCBpbiB0aGUgbW9kZWwgYXMgYSBcImxpbmtIcmVmXCIgYXR0cmlidXRlLlxuICAgICAgLy8gVXNlIHRoZSBcImxvd1wiIGxpc3RlbmVyIHByaW9yaXR5IHRvIGFwcGx5IHRoZSBjaGFuZ2VzIGFmdGVyIHRoZSBsaW5rIGZlYXR1cmUuXG4gICAgICBkaXNwYXRjaGVyLm9uKCdhdHRyaWJ1dGU6d2lkdGg6aW1hZ2UnLCAoZXZ0LCBkYXRhLCBjb252ZXJzaW9uQXBpKSA9PiB7XG4gICAgICAgIGlmICghY29udmVyc2lvbkFwaS5jb25zdW1hYmxlLmNvbnN1bWUoZGF0YS5pdGVtLCBldnQubmFtZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGVkaXRvci5jb25maWcuZ2V0KCdpbWFnZS5yZXNpemVPcHRpb25zJyk7XG4gICAgICAgIGNvbnN0IGlzRW5hYmxlZCA9IGVkaXRvci5jb25maWcuZ2V0KCdpbWFnZS5yZXNpemVFbmFibGVkJyk7XG4gICAgICAgIGNvbnN0IHNpemVMYWJsZXMgPSBvcHRpb25zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLmxhYmVsO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbmV3SW1nV2lkdGhWYWx1ZSA9IGRhdGEuYXR0cmlidXRlTmV3VmFsdWUgPT09IG51bGwgPyAnT3JpZ2luYWwnIDogZGF0YS5hdHRyaWJ1dGVOZXdWYWx1ZTtcbiAgICAgICAgaWYgKHNpemVMYWJsZXMuaW5jbHVkZXMobmV3SW1nV2lkdGhWYWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLmxhc3RJbWdSZXNpemVXaWR0aCA9IG5ld0ltZ1dpZHRoVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRW5hYmxlZCAmJiBzaXplTGFibGVzLmxlbmd0aCA+IDAgJiYgIXNpemVMYWJsZXMuaW5jbHVkZXMobmV3SW1nV2lkdGhWYWx1ZSkpIHtcbiAgICAgICAgICBlZGl0b3IuZXhlY3V0ZSgnaW1hZ2VSZXNpemUnLCB7IHdpZHRoOiB0aGlzLmxhc3RJbWdSZXNpemVXaWR0aCB9KTtcbiAgICAgICAgICByZXR1cm4gZXZ0LnN0b3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpZXdXcml0ZXIgPSBjb252ZXJzaW9uQXBpLndyaXRlcjtcbiAgICAgICAgY29uc3QgZmlndXJlID0gY29udmVyc2lvbkFwaS5tYXBwZXIudG9WaWV3RWxlbWVudChkYXRhLml0ZW0pO1xuXG4gICAgICAgIGlmIChkYXRhLmF0dHJpYnV0ZU5ld1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmlld1dyaXRlci5zZXRTdHlsZSgnd2lkdGgnLCBkYXRhLmF0dHJpYnV0ZU5ld1ZhbHVlLCBmaWd1cmUpO1xuICAgICAgICAgIHZpZXdXcml0ZXIuYWRkQ2xhc3MoJ2ltYWdlX3Jlc2l6ZWQnLCBmaWd1cmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpZXdXcml0ZXIucmVtb3ZlU3R5bGUoJ3dpZHRoJywgZmlndXJlKTtcbiAgICAgICAgICB2aWV3V3JpdGVyLnJlbW92ZUNsYXNzKCdpbWFnZV9yZXNpemVkJywgZmlndXJlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpbml0aWFsaXplRWRpdG9ycygpIHtcbiAgICBDbGFzc2ljRWRpdG9yLmNyZWF0ZSh0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50LCB7XG4gICAgICBhbGlnbm1lbnQ6IHtcbiAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgIHsgbmFtZTogJ2xlZnQnLCBjbGFzc05hbWU6ICd0ZXh0LWxlZnQnIH0sXG4gICAgICAgICAgeyBuYW1lOiAnY2VudGVyJywgY2xhc3NOYW1lOiAndGV4dC1jZW50ZXInIH0sXG4gICAgICAgICAgeyBuYW1lOiAncmlnaHQnLCBjbGFzc05hbWU6ICd0ZXh0LXJpZ2h0JyB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBoZWFkaW5nOiB7XG4gICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICB7IG1vZGVsOiAncGFyYWdyYXBoJywgdGl0bGU6ICdQYXJhZ3JhcGgnIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmcxJywgdmlldzogJ2gxJywgdGl0bGU6ICdIZWFkaW5nIDEnIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmcyJywgdmlldzogJ2gyJywgdGl0bGU6ICdIZWFkaW5nIDInIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmczJywgdmlldzogJ2gzJywgdGl0bGU6ICdIZWFkaW5nIDMnIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc0JywgdmlldzogJ2g0JywgdGl0bGU6ICdIZWFkaW5nIDQnIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc1JywgdmlldzogJ2g1JywgdGl0bGU6ICdIZWFkaW5nIDUnIH0sXG4gICAgICAgICAgeyBtb2RlbDogJ2hlYWRpbmc2JywgdmlldzogJ2g2JywgdGl0bGU6ICdIZWFkaW5nIDYnIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIGV4dHJhUGx1Z2luczogWydUYWJsZScsICdIZWFkaW5nJ10sXG4gICAgICB0b29sYmFyOiB0aGlzLmVkaXRvckNvbmZpZy50b29sYmFyLFxuICAgICAgZm9udFNpemU6IHRoaXMuZWRpdG9yQ29uZmlnLmZvbnRTaXplLFxuICAgICAgaW1hZ2U6IHRoaXMuZWRpdG9yQ29uZmlnLmltYWdlLFxuICAgICAgaXNSZWFkT25seTogdGhpcy5lZGl0b3JDb25maWcuaXNSZWFkT25seSxcbiAgICAgIHJlbW92ZVBsdWdpbnM6IHRoaXMuZWRpdG9yQ29uZmlnLnJlbW92ZVBsdWdpbnNcbiAgICB9KVxuICAgICAgLnRoZW4oZWRpdG9yID0+IHtcbiAgICAgICAgdGhpcy5lZGl0b3JJbnN0YW5jZSA9IGVkaXRvcjtcbiAgICAgICAgdGhpcy5pc0Fzc2V0QnJvd3NlclJlYWRPbmx5ID0gdGhpcy5lZGl0b3JDb25maWcuaXNSZWFkT25seTtcbiAgICAgICAgaWYgKHRoaXMuZWRpdG9yRGF0YUlucHV0KSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JEYXRhSW5wdXQgPSB0aGlzLmVkaXRvckRhdGFJbnB1dFxuICAgICAgICAgICAgLnJlcGxhY2UoLyg8aW1nKFwiW15cIl0qXCJ8W15cXC9cIj5dKSopPi9naSwgJyQxLz4nKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyg8YnIoXCJbXlwiXSpcInxbXlxcL1wiPl0pKik+L2dpLCAnJDEvPicpO1xuICAgICAgICAgIHRoaXMuZWRpdG9ySW5zdGFuY2Uuc2V0RGF0YSh0aGlzLmVkaXRvckRhdGFJbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JJbnN0YW5jZS5zZXREYXRhKCcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnRWRpdG9yIHdhcyBpbml0aWFsaXplZCcpO1xuICAgICAgICB0aGlzLmNoYW5nZVRyYWNrZXIodGhpcy5lZGl0b3JJbnN0YW5jZSk7XG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnQodGhpcy5lZGl0b3JJbnN0YW5jZSk7XG4gICAgICAgIC8vIHRoaXMucGFzdGVUcmFja2VyKHRoaXMuZWRpdG9ySW5zdGFuY2UpO1xuICAgICAgICB0aGlzLmNoYXJhY3RlckNvdW50ID0gdGhpcy5jb3VudENoYXJhY3RlcnModGhpcy5lZGl0b3JJbnN0YW5jZS5tb2RlbC5kb2N1bWVudCk7XG4gICAgICAgIHRoaXMuY2hhcmFjdGVyc0xlZnQgPSB0aGlzLmdldENoYXJhY3RlcnNMZWZ0KCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gICAgICB9KTtcbiAgfVxuICBjaGFuZ2VUcmFja2VyKGVkaXRvcikge1xuICAgIGVkaXRvci5tb2RlbC5kb2N1bWVudC5vbignY2hhbmdlJywgKGV2ZW50SW5mbywgYmF0Y2gpID0+IHtcbiAgICAgIGlmICh0aGlzLnNldENoYXJhY3RlckxpbWl0ICYmIHRoaXMuc2V0Q2hhcmFjdGVyTGltaXQgPiAwKSB7XG4gICAgICAgIHRoaXMuY2hlY2tDaGFyYWN0ZXJMaW1pdCgpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gZXZlbnRJbmZvLnNvdXJjZS5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWRFbGVtZW50KCk7XG4gICAgICB0aGlzLmlzRWRpdG9yRm9jdXNlZCA9IChzZWxlY3RlZEVsZW1lbnQgJiYgc2VsZWN0ZWRFbGVtZW50Lm5hbWUgPT09ICdpbWFnZScpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuc2V0SW1hZ2VMaW1pdCAmJiB0aGlzLnNldEltYWdlTGltaXQgPiAwKSB7XG4gICAgICAgIHRoaXMuY2hlY2tJbWFnZUxpbWl0KCk7XG4gICAgICB9XG4gICAgICB0aGlzLmVkaXRvckRhdGFPdXRwdXQuZW1pdCh7XG4gICAgICAgIGJvZHk6IGVkaXRvci5nZXREYXRhKCksXG4gICAgICAgIGxlbmd0aDogdGhpcy5jaGFyYWN0ZXJDb3VudCxcbiAgICAgICAgbWVkaWFvYmo6IHRoaXMubWVkaWFvYmpcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHBhc3RlVHJhY2tlcihlZGl0b3IpIHtcbiAgICBlZGl0b3IuZWRpdGluZy52aWV3LmRvY3VtZW50Lm9uKCdjbGlwYm9hcmRJbnB1dCcsIChldnQsIGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFUcmFuc2ZlciA9IGRhdGEuZGF0YVRyYW5zZmVyO1xuICAgICAgY29uc3QgdXJsTWF0Y2ggPVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIC8oaHR0cHM/OlxcL1xcLyg/Ond3d1xcLnwoPyF3d3cpKVthLXpBLVowLTldW2EtekEtWjAtOS1dK1thLXpBLVowLTldXFwuW15cXHNdezIsfXx3d3dcXC5bYS16QS1aMC05XVthLXpBLVowLTktXStbYS16QS1aMC05XVxcLlteXFxzXXsyLH18aHR0cHM/OlxcL1xcLyg/Ond3d1xcLnwoPyF3d3cpKVthLXpBLVowLTldK1xcLlteXFxzXXsyLH18d3d3XFwuW2EtekEtWjAtOV0rXFwuW15cXHNdezIsfXxmaWxlOlxcL1xcL1xcLytbXlxcc117MCx9KS9naTtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh1cmxNYXRjaCk7XG4gICAgICBjb25zdCBnZXRVcmwgPSBkYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dC9odG1sJykubWF0Y2gocmVnZXgpO1xuICAgICAgaWYgKGdldFVybCAmJiBnZXRVcmwubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAxMCcpKTtcbiAgICAgICAgZXZ0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBjaGVja0ltYWdlTGltaXQoKSB7XG4gICAgY29uc3QgY2hpbGROb2RlcyA9IHRoaXMuZWRpdG9ySW5zdGFuY2UubW9kZWwuZG9jdW1lbnQuZ2V0Um9vdCgpLl9jaGlsZHJlbi5fbm9kZXM7XG4gICAgdGhpcy5pc0Fzc2V0QnJvd3NlclJlYWRPbmx5ID0gXy5rZXlzKF8ucGlja0J5KGNoaWxkTm9kZXMsIHsgbmFtZTogJ2ltYWdlJyB9KSkubGVuZ3RoID09PSB0aGlzLnNldEltYWdlTGltaXQgPyB0cnVlIDogZmFsc2U7XG4gIH1cbiAgY2hlY2tDaGFyYWN0ZXJMaW1pdCgpIHtcbiAgICB0aGlzLmNoYXJhY3RlckNvdW50ID0gdGhpcy5jb3VudENoYXJhY3RlcnModGhpcy5lZGl0b3JJbnN0YW5jZS5tb2RlbC5kb2N1bWVudCk7XG4gICAgdGhpcy5jaGFyYWN0ZXJzTGVmdCA9IHRoaXMuZ2V0Q2hhcmFjdGVyc0xlZnQoKTtcbiAgICB0aGlzLmxpbWl0RXhjZWVkZWQgPSAodGhpcy5jaGFyYWN0ZXJDb3VudCA8PSB0aGlzLnNldENoYXJhY3RlckxpbWl0KSA/IGZhbHNlIDogdHJ1ZTtcbiAgICB0aGlzLmhhc0Vycm9yLmVtaXQodGhpcy5saW1pdEV4Y2VlZGVkKTtcbiAgfVxuICAvKipcbiAgICogZnVuY3Rpb24gdG8gZ2V0IGltYWdlc1xuICAgKiBAcGFyYW0gb2Zmc2V0IHBhZ2Ugbm9cbiAgICovXG4gIGdldE15SW1hZ2VzKG9mZnNldCwgcXVlcnk/LCBzZWFyY2g/KSB7XG4gICAgdGhpcy5hc3NldHNDb3VudCA9IDA7XG4gICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgIHRoaXMuc2VhcmNoTXlJbnB1dCA9ICcnO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgICB0aGlzLm15QXNzZXRzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgbWVkaWFUeXBlOiBbJ2ltYWdlJ10sXG4gICAgICAgIGNyZWF0ZWRCeTogXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQudXNlci5pZCcpXG4gICAgICB9LFxuICAgICAgb2Zmc2V0XG4gICAgfTtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIHJlcVsncXVlcnknXSA9IHF1ZXJ5O1xuICAgIH1cbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS5nZXRBc3NldE1lZGlhKHJlcSkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDIyJykgfTtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgIH0pKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgdGhpcy5hc3NldHNDb3VudCA9IHJlcy5yZXN1bHQuY291bnQ7XG4gICAgICBfLm1hcChyZXMucmVzdWx0LmNvbnRlbnQsIChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmRvd25sb2FkVXJsKSB7XG4gICAgICAgICAgdGhpcy5teUFzc2V0cy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEltYWdlSW5FZGl0b3IoaW1hZ2VVcmwsIGltYWdlSWQsIGltYWdlTmFtZT8pIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLmdldE1lZGlhT3JpZ2luVVJMKGltYWdlVXJsKTtcbiAgICBjb25zdCBiYXNlVXJsID0gXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQuaG9zdCcpIHx8IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbjtcbiAgICB0aGlzLm1lZGlhb2JqID0ge1xuICAgICAgaWQ6IGltYWdlSWQsXG4gICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAgc3JjLFxuICAgICAgYmFzZVVybFxuICAgIH07XG4gICAgdGhpcy5lZGl0b3JJbnN0YW5jZS5tb2RlbC5jaGFuZ2Uod3JpdGVyID0+IHtcbiAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IHdyaXRlci5jcmVhdGVFbGVtZW50KCdpbWFnZScsIHtcbiAgICAgICAgc3JjLFxuICAgICAgICBhbHQ6IGltYWdlSWQsXG4gICAgICAgICdkYXRhLWFzc2V0LXZhcmlhYmxlJzogaW1hZ2VJZFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVkaXRvckluc3RhbmNlLm1vZGVsLmluc2VydENvbnRlbnQoaW1hZ2VFbGVtZW50LCB0aGlzLmVkaXRvckluc3RhbmNlLm1vZGVsLmRvY3VtZW50LnNlbGVjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5zaG93SW1hZ2VQaWNrZXIgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dJbWFnZVVwbG9hZE1vZGFsID0gZmFsc2U7XG4gIH1cblxuICBhZGRWaWRlb0luRWRpdG9yKHZpZGVvTW9kYWw/KSB7XG4gICAgY29uc3QgdmlkZW9EYXRhOiBhbnkgPSBfLmNsb25lRGVlcCh0aGlzLnNlbGVjdGVkVmlkZW8pO1xuICAgIHZpZGVvRGF0YS5zcmMgPSB0aGlzLmdldE1lZGlhT3JpZ2luVVJMKHZpZGVvRGF0YS5kb3dubG9hZFVybCk7XG4gICAgdmlkZW9EYXRhLnRodW1ibmFpbCA9ICh2aWRlb0RhdGEudGh1bWJuYWlsKSAmJiB0aGlzLmdldE1lZGlhT3JpZ2luVVJMKHZpZGVvRGF0YS50aHVtYm5haWwpO1xuICAgIHRoaXMuc2hvd1ZpZGVvUGlja2VyID0gZmFsc2U7XG4gICAgdGhpcy52aWRlb0RhdGFPdXRwdXQuZW1pdCh2aWRlb0RhdGEpO1xuICAgIGlmICh2aWRlb01vZGFsKSB7XG4gICAgICB2aWRlb01vZGFsLmRlbnkoKTtcbiAgICB9XG4gIH1cblxuXG4gIGdldEFsbEltYWdlcyhvZmZzZXQsIHF1ZXJ5Pywgc2VhcmNoPykge1xuICAgIHRoaXMuYXNzZXRzQ291bnQgPSAwO1xuICAgIGlmICghc2VhcmNoKSB7XG4gICAgICB0aGlzLnNlYXJjaEFsbElucHV0ID0gJyc7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPT09IDApIHtcbiAgICAgIHRoaXMuYWxsSW1hZ2VzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgbWVkaWFUeXBlOiBbJ2ltYWdlJ11cbiAgICAgIH0sXG4gICAgICBvZmZzZXRcbiAgICB9O1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgcmVxWydxdWVyeSddID0gcXVlcnk7XG4gICAgfVxuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmdldEFzc2V0TWVkaWEocmVxKS5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgIGNvbnN0IGVyckluZm8gPSB7IGVycm9yTXNnOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMjInKSB9O1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgfSkpXG4gICAgICAuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5hc3NldHNDb3VudCA9IHJlcy5yZXN1bHQuY291bnQ7XG4gICAgICAgIF8ubWFwKHJlcy5yZXN1bHQuY29udGVudCwgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5kb3dubG9hZFVybCkge1xuICAgICAgICAgICAgdGhpcy5hbGxJbWFnZXMucHVzaChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogZnVuY3Rpb24gdG8gZ2V0IHZpZGVvc1xuICAgKiBAcGFyYW0gb2Zmc2V0IHBhZ2Ugbm9cbiAgICovXG4gIGdldE15VmlkZW9zKG9mZnNldCwgcXVlcnk/LCBzZWFyY2g/KSB7XG4gICAgdGhpcy5hc3NldHNDb3VudCA9IDA7XG4gICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgIHRoaXMuc2VhcmNoTXlJbnB1dCA9ICcnO1xuICAgICAgdGhpcy5zZWxlY3RWaWRlbyh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgICB0aGlzLm15QXNzZXRzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IHJlcTogYW55ID0ge1xuICAgICAgZmlsdGVyczoge1xuICAgICAgICBtZWRpYVR5cGU6IFsndmlkZW8nXSxcbiAgICAgICAgY3JlYXRlZEJ5OiBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLCAnY29udGV4dC51c2VyLmlkJylcbiAgICAgIH0sXG4gICAgICBvZmZzZXRcbiAgICB9O1xuXG4gICAgaWYgKHF1ZXJ5KSB7XG4gICAgICByZXEucXVlcnkgPSBxdWVyeTtcbiAgICB9XG5cbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS5nZXRBc3NldE1lZGlhKHJlcSkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDIzJykgfTtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgIH0pKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgdGhpcy5hc3NldHNDb3VudCA9IHJlcy5yZXN1bHQuY291bnQ7XG4gICAgICBfLm1hcChyZXMucmVzdWx0LmNvbnRlbnQsIChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmRvd25sb2FkVXJsKSB7XG4gICAgICAgICAgdGhpcy5teUFzc2V0cy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFsbFZpZGVvcyhvZmZzZXQsIHF1ZXJ5Pywgc2VhcmNoPykge1xuICAgIHRoaXMuYXNzZXRzQ291bnQgPSAwO1xuICAgIGlmICghc2VhcmNoKSB7XG4gICAgICB0aGlzLnNlYXJjaEFsbElucHV0ID0gJyc7XG4gICAgICB0aGlzLnNlbGVjdFZpZGVvKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPT09IDApIHtcbiAgICAgIHRoaXMuYWxsVmlkZW9zLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IHJlcTogYW55ID0ge1xuICAgICAgZmlsdGVyczoge1xuICAgICAgICBtZWRpYVR5cGU6IFsndmlkZW8nXSxcbiAgICAgIH0sXG4gICAgICBvZmZzZXRcbiAgICB9O1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgcmVxLnF1ZXJ5ID0gcXVlcnk7XG4gICAgfVxuXG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UuZ2V0QXNzZXRNZWRpYShyZXEpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyMycpIH07XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICB9KSkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIHRoaXMuYXNzZXRzQ291bnQgPSByZXMucmVzdWx0LmNvdW50O1xuICAgICAgXy5tYXAocmVzLnJlc3VsdC5jb250ZW50LCAoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5kb3dubG9hZFVybCkge1xuICAgICAgICAgIHRoaXMuYWxsVmlkZW9zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGZ1bmN0aW9uIHRvIGxhenkgbG9hZCBteSBpbWFnZXNcbiAgICovXG4gIGxhenlsb2FkTXlJbWFnZXMoKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5teUFzc2V0cy5sZW5ndGg7XG4gICAgdGhpcy5nZXRNeUltYWdlcyhvZmZzZXQsIHRoaXMucXVlcnksIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGZ1bmN0aW9uIHRvIGxhenkgbG9hZCBhbGwgaW1hZ2VzXG4gICAqL1xuICBsYXp5bG9hZEFsbEltYWdlcygpIHtcbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmFsbEltYWdlcy5sZW5ndGg7XG4gICAgdGhpcy5nZXRBbGxJbWFnZXMob2Zmc2V0LCB0aGlzLnF1ZXJ5LCB0cnVlKTtcbiAgfVxuXG5cbiAgbGF6eWxvYWRNeVZpZGVvcygpIHtcbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm15QXNzZXRzLmxlbmd0aDtcbiAgICB0aGlzLmdldE15VmlkZW9zKG9mZnNldCwgdGhpcy5xdWVyeSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogZnVuY3Rpb24gdG8gbGF6eSBsb2FkIGFsbCB2aWRlb3NcbiAgICovXG4gIGxhenlsb2FkQWxsVmlkZW9zKCkge1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYWxsVmlkZW9zLmxlbmd0aDtcbiAgICB0aGlzLmdldEFsbFZpZGVvcyhvZmZzZXQsIHRoaXMucXVlcnksIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGZ1bmN0aW9uIHRvIHVwbG9hZCBpbWFnZVxuICAgKi9cbiAgdXBsb2FkSW1hZ2UoZXZlbnQpIHtcbiAgICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAgIHRoaXMuYXNzZXROYW1lID0gZmlsZS5uYW1lO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgdGhpcy5mb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIHRoaXMuZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZSk7XG4gICAgY29uc3QgZmlsZVR5cGUgPSBmaWxlLnR5cGU7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlLm5hbWUuc3BsaXQoJy4nKS5zbGljZSgwLCAtMSkuam9pbignLicpO1xuICAgIGNvbnN0IGZpbGVTaXplID0gZmlsZS5zaXplIC8gMTAyNCAvIDEwMjQ7XG4gICAgaWYgKGZpbGVUeXBlLnNwbGl0KCcvJylbMF0gPT09ICdpbWFnZScpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gZmFsc2U7XG4gICAgICBpZiAoZmlsZVNpemUgPiB0aGlzLmFzc2V0Q29uZmlnLmltYWdlLnNpemUpIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3JNc2cgPSB0cnVlO1xuICAgICAgICB0aGlzLmVycm9yTXNnID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDIxJylcbiAgICAgICAgICArIHRoaXMuYXNzZXRDb25maWcuaW1hZ2Uuc2l6ZSArIHRoaXMuYXNzZXRDb25maWcuaW1hZ2Uuc2l6ZVR5cGU7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtQ29uZmlnKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVycm9yTXNnID0gJyc7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gZmFsc2U7XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dFcnJvck1zZyA9IHRydWU7XG4gICAgICB0aGlzLmVycm9yTXNnID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDIwJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zaG93RXJyb3JNc2cpIHtcbiAgICAgIHRoaXMuaW1hZ2VGaWxlID0gZmlsZTtcbiAgICAgIHRoaXMuaW1hZ2VVcGxvYWRMb2FkZXIgPSB0cnVlO1xuICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IHRydWU7XG4gICAgICB0aGlzLmFzc2VzdERhdGEgPSB0aGlzLmdlbmVyYXRlQXNzZXRDcmVhdGVSZXF1ZXN0KGZpbGVOYW1lLCBmaWxlVHlwZSwgJ2ltYWdlJyk7XG4gICAgICB0aGlzLnBvcHVsYXRlRm9ybURhdGEodGhpcy5hc3Nlc3REYXRhKTtcbiAgICB9XG4gIH1cbiAgcmVzZXRGb3JtQ29uZmlnKCkge1xuICAgIHRoaXMuaW1hZ2VVcGxvYWRMb2FkZXIgPSBmYWxzZTtcbiAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gZmFsc2U7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gdGhpcy5pbml0aWFsRm9ybUNvbmZpZztcbiAgfVxuICBwb3B1bGF0ZUZvcm1EYXRhKGZvcm1EYXRhKSB7XG4gICAgY29uc3QgZm9ybXZhbHVlID0gXy5jbG9uZURlZXAodGhpcy5mb3JtQ29uZmlnKTtcbiAgICB0aGlzLmZvcm1Db25maWcgPSBudWxsO1xuICAgIF8uZm9yRWFjaChmb3JtdmFsdWUsIChmb3JtRmllbGRDYXRlZ29yeSkgPT4ge1xuICAgICAgZm9ybUZpZWxkQ2F0ZWdvcnkuZGVmYXVsdCA9IGZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdO1xuICAgICAgZm9ybUZpZWxkQ2F0ZWdvcnkuZWRpdGFibGUgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybUNvbmZpZyA9IGZvcm12YWx1ZTtcbiAgfVxuICB1cGxvYWRBbmRVc2VJbWFnZShtb2RhbCkge1xuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmNyZWF0ZU1lZGlhQXNzZXQoeyBjb250ZW50OiB0aGlzLmFzc2VzdERhdGEgfSkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDE5JykgfTtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgIH0pKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgY29uc3QgaW1nSWQgPSByZXMucmVzdWx0Lm5vZGVfaWQ7XG4gICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICBkYXRhOiB0aGlzLmZvcm1EYXRhXG4gICAgICB9O1xuICAgICAgdGhpcy5xdWVzdGlvblNlcnZpY2UudXBsb2FkTWVkaWEocmVxdWVzdCwgaW1nSWQpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDE5JykgfTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgICB9KSkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBzaWduZWRVUkwgPSByZXNwb25zZS5yZXN1bHQucHJlX3NpZ25lZF91cmw7XG4gICAgICAgIGxldCBibG9iQ29uZmlnID0ge1xuICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgICAgICBjb250ZW50VHlwZTogJ0Fzc2V0J1xuICAgICAgICB9O1xuICAgICAgICBibG9iQ29uZmlnID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmFwcGVuZENsb3VkU3RvcmFnZUhlYWRlcnMoYmxvYkNvbmZpZyk7XG4gICAgICAgIHRoaXMudXBsb2FkVG9CbG9iKHNpZ25lZFVSTCwgdGhpcy5pbWFnZUZpbGUsIGJsb2JDb25maWcpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZVVSTCA9IHNpZ25lZFVSTC5zcGxpdCgnPycpWzBdO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICBkYXRhLmFwcGVuZCgnZmlsZVVybCcsIGZpbGVVUkwpO1xuICAgICAgICAgIGRhdGEuYXBwZW5kKCdtaW1lVHlwZScsIHRoaXMuaW1hZ2VGaWxlLnR5cGUpO1xuICAgICAgICAgIGNvbnN0IGNvbmZpZzEgPSB7XG4gICAgICAgICAgICBlbmN0eXBlOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXG4gICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXG4gICAgICAgICAgICBjYWNoZTogZmFsc2VcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHVwbG9hZE1lZGlhQ29uZmlnID0ge1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhcmFtOiBjb25maWcxXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGxvYWRNZWRpYSh1cGxvYWRNZWRpYUNvbmZpZywgaW1nSWQpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAxOScpIH07XG4gICAgICAgICAgICB0aGlzLmlzQ2xvc2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgICAgICAgIH0pKS5zdWJzY3JpYmUoKHJlc3BvbnNlMSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRJbWFnZUluRWRpdG9yKHJlc3BvbnNlMS5yZXN1bHQuY29udGVudF91cmwsIHJlc3BvbnNlMS5yZXN1bHQubm9kZV9pZCwgdGhpcy5hc3Nlc3REYXRhWyduYW1lJ10pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIG9wZW5JbWFnZVVwbG9hZE1vZGFsKCkge1xuICAgIHRoaXMuc2hvd0ltYWdlVXBsb2FkTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMucmVzZXRGb3JtRGF0YSgpO1xuICB9XG4gIGRpc21pc3NQb3BzKG1vZGFsKSB7XG4gICAgdGhpcy5kaXNtaXNzSW1hZ2VQaWNrZXIoKTtcbiAgICBtb2RhbC5kZW55KCk7XG4gIH1cbiAgb25TdGF0dXNDaGFuZ2VzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmlzVmFsaWQgJiYgdGhpcy5pbWFnZVVwbG9hZExvYWRlcikge1xuICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgdmFsdWVDaGFuZ2VzKGV2ZW50KSB7XG4gICAgdGhpcy5hc3Nlc3REYXRhID0gXy5tZXJnZSh7fSwgdGhpcy5hc3Nlc3REYXRhLCBldmVudCk7XG4gIH1cbiAgLy8gc2VhcmNoIGZlYXR1cmUgZm9yIGltYWdlc1xuICBzZWFyY2hJbWFnZXMoZXZlbnQsIHR5cGUpIHtcbiAgICBpZiAoZXZlbnQgPT09ICdjbGVhcklucHV0JyAmJiB0eXBlID09PSAnbXlJbWFnZXMnKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgICB0aGlzLnNlYXJjaE15SW5wdXQgPSAnJztcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAnY2xlYXJJbnB1dCcgJiYgdHlwZSA9PT0gJ2FsbEltYWdlcycpIHtcbiAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgIHRoaXMuc2VhcmNoQWxsSW5wdXQgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVyeSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdteUltYWdlcycpIHtcbiAgICAgIHRoaXMuZ2V0TXlJbWFnZXMoMCwgdGhpcy5xdWVyeSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2V0QWxsSW1hZ2VzKDAsIHRoaXMucXVlcnksIHRydWUpO1xuICAgIH1cbiAgfVxuICAvLyBnZW5lcmFsIG1ldGhvZFxuICByZXNldEZvcm1EYXRhKCkge1xuICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gZmFsc2U7XG4gICAgdGhpcy5mb3JtRGF0YSA9IG51bGw7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gdGhpcy5pbml0aWFsRm9ybUNvbmZpZztcbiAgICB0aGlzLmltYWdlVXBsb2FkTG9hZGVyID0gZmFsc2U7XG4gICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBmdW5jdGlvbiB0byB1cGxvYWQgdmlkZW9cbiAgICovXG4gIG9wZW5WaWRlb1VwbG9hZE1vZGFsKCkge1xuICAgIHRoaXMuc2hvd1ZpZGVvVXBsb2FkTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMucmVzZXRGb3JtRGF0YSgpO1xuICB9XG4gIGRpc21pc3NWaWRlb1BvcHMobW9kYWwpIHtcbiAgICBpZiAodGhpcy5pc0Nsb3NhYmxlKSB7XG4gICAgICB0aGlzLmRpc21pc3NWaWRlb1BpY2tlcigpO1xuICAgICAgbW9kYWwuZGVueSgpO1xuICAgIH1cbiAgfVxuICB1cGxvYWRWaWRlb0Zyb21Mb2NhbChldmVudCkge1xuICAgIHRoaXMudmlkZW9GaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgdGhpcy5mb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIHRoaXMuZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgdGhpcy52aWRlb0ZpbGUpO1xuICAgIGNvbnN0IGZpbGVUeXBlID0gdGhpcy52aWRlb0ZpbGUudHlwZTtcbiAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMudmlkZW9GaWxlLm5hbWUuc3BsaXQoJy4nKS5zbGljZSgwLCAtMSkuam9pbignLicpO1xuICAgIGNvbnN0IGZpbGVTaXplID0gdGhpcy52aWRlb0ZpbGUuc2l6ZSAvIDEwMjQgLyAxMDI0O1xuICAgIGlmIChfLmluY2x1ZGVzKGZpbGVUeXBlLnNwbGl0KCcvJyksICd2aWRlbycpKSB7XG4gICAgICB0aGlzLnNob3dFcnJvck1zZyA9IGZhbHNlO1xuICAgICAgaWYgKGZpbGVTaXplID4gdGhpcy5hc3NldENvbmZpZy52aWRlby5zaXplKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lcnJvck1zZyA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyMScpICtcbiAgICAgICAgICB0aGlzLmFzc2V0Q29uZmlnLnZpZGVvLnNpemUgKyB0aGlzLmFzc2V0Q29uZmlnLnZpZGVvLnNpemVUeXBlO1xuICAgICAgICB0aGlzLnJlc2V0Rm9ybUNvbmZpZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lcnJvck1zZyA9ICcnO1xuICAgICAgICB0aGlzLnNob3dFcnJvck1zZyA9IGZhbHNlO1xuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTCh0aGlzLnZpZGVvRmlsZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yTXNnID0gdHJ1ZTtcbiAgICAgIHRoaXMuZXJyb3JNc2cgPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMjQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNob3dFcnJvck1zZykge1xuICAgICAgdGhpcy5pbWFnZVVwbG9hZExvYWRlciA9IHRydWU7XG4gICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXNzZXN0RGF0YSA9IHRoaXMuZ2VuZXJhdGVBc3NldENyZWF0ZVJlcXVlc3QoZmlsZU5hbWUsIGZpbGVUeXBlLCAndmlkZW8nKTtcbiAgICAgIHRoaXMucG9wdWxhdGVGb3JtRGF0YSh0aGlzLmFzc2VzdERhdGEpO1xuICAgIH1cbiAgfVxuICB1cGxvYWRWaWRlbyh2aWRlb01vZGFsKSB7XG4gICAgdGhpcy5pc0Nsb3NhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNob3dFcnJvck1zZyA9IGZhbHNlO1xuICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuc2hvd0Vycm9yTXNnKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS5jcmVhdGVNZWRpYUFzc2V0KHsgY29udGVudDogdGhpcy5hc3Nlc3REYXRhIH0pLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7IGVycm9yTXNnOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMjUnKSB9O1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICAgIH0pKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50SWQgPSByZXMucmVzdWx0Lm5vZGVfaWQ7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgZmlsZU5hbWU6IHRoaXMudmlkZW9GaWxlLm5hbWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmdlbmVyYXRlUHJlU2lnbmVkVXJsKHJlcXVlc3QsIGNvbnRlbnRJZCkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyNicpIH07XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmltYWdlRm9ybVZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICAgICAgfSkpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCBzaWduZWRVUkwgPSByZXNwb25zZS5yZXN1bHQucHJlX3NpZ25lZF91cmw7XG4gICAgICAgICAgbGV0IGJsb2JDb25maWcgPSB7XG4gICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ0Fzc2V0J1xuICAgICAgICAgIH07XG4gICAgICAgICAgYmxvYkNvbmZpZyA9IHRoaXMuZWRpdG9yU2VydmljZS5hcHBlbmRDbG91ZFN0b3JhZ2VIZWFkZXJzKGJsb2JDb25maWcpO1xuICAgICAgICAgIHRoaXMudXBsb2FkVG9CbG9iKHNpZ25lZFVSTCwgdGhpcy52aWRlb0ZpbGUsIGJsb2JDb25maWcpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlVVJMID0gc2lnbmVkVVJMLnNwbGl0KCc/JylbMF07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRXaXRoVVJMKGZpbGVVUkwsIHRoaXMudmlkZW9GaWxlLnR5cGUsIGNvbnRlbnRJZCwgdmlkZW9Nb2RhbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVBc3NldENyZWF0ZVJlcXVlc3QoZmlsZU5hbWUsIGZpbGVUeXBlLCBtZWRpYVR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZmlsZU5hbWUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBtaW1lVHlwZTogZmlsZVR5cGUsXG4gICAgICBjcmVhdGVkQnk6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuaWQnKSxcbiAgICAgIGNyZWF0b3I6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuZnVsbE5hbWUnKSxcbiAgICAgIGNoYW5uZWw6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LmNoYW5uZWwnKVxuICAgIH07XG4gIH1cblxuICB1cGxvYWRUb0Jsb2Ioc2lnbmVkVVJMLCBmaWxlLCBjb25maWcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGNzcCA9IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LmNsb3VkU3RvcmFnZS5wcm92aWRlcicsICdhenVyZScpO1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IHVwbG9hZGVyTGliID0gbmV3IFN1bmJpcmRGaWxlVXBsb2FkTGliLkZpbGVVcGxvYWRlcigpO1xuICAgICAgdXBsb2FkZXJMaWIudXBsb2FkKHsgdXJsOiBzaWduZWRVUkwsIGZpbGUsIGNzcCB9KVxuICAgICAgICAub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLCAnbWVzc2FnZXMuZXJyb3IuMDE4JykgfTtcbiAgICAgICAgICB0aGlzLmlzQ2xvc2FibGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVycm9yLCBlcnJJbmZvKSk7XG4gICAgICAgIH0pLm9uKFwiY29tcGxldGVkXCIsIChjb21wbGV0ZWQpID0+IHtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KGNvbXBsZXRlZCk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUNvbnRlbnRXaXRoVVJMKGZpbGVVUkwsIG1pbWVUeXBlLCBjb250ZW50SWQsIHZpZGVvTW9kYWw/KSB7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGRhdGEuYXBwZW5kKCdmaWxlVXJsJywgZmlsZVVSTCk7XG4gICAgZGF0YS5hcHBlbmQoJ21pbWVUeXBlJywgbWltZVR5cGUpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGVuY3R5cGU6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcbiAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcbiAgICAgIGNhY2hlOiBmYWxzZVxuICAgIH07XG4gICAgY29uc3Qgb3B0aW9uID0ge1xuICAgICAgZGF0YSxcbiAgICAgIHBhcmFtOiBjb25maWdcbiAgICB9O1xuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLnVwbG9hZE1lZGlhKG9wdGlvbiwgY29udGVudElkKS5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgIGNvbnN0IGVyckluZm8gPSB7IGVycm9yTXNnOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMjcnKSB9O1xuICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5pbWFnZUZvcm1WYWxpZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pKTtcbiAgICB9KSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAvLyBSZWFkIHVwbG9hZCB2aWRlbyBkYXRhXG4gICAgICB0aGlzLmdldFVwbG9hZFZpZGVvKHJlcy5yZXN1bHQubm9kZV9pZCwgdmlkZW9Nb2RhbCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRVcGxvYWRWaWRlbyh2aWRlb0lkLCB2aWRlb01vZGFsPykge1xuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLmdldFZpZGVvKHZpZGVvSWQpLnBpcGUobWFwKChkYXRhOiBhbnkpID0+IGRhdGEucmVzdWx0LmNvbnRlbnQpLCBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0geyBlcnJvck1zZzogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDExJykgfTtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgfSkpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDA2JykpO1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZGVvID0gcmVzO1xuICAgICAgdGhpcy5zaG93QWRkQnV0dG9uID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW1hZ2VGb3JtVmFsaWQgPSB0cnVlO1xuICAgICAgdGhpcy5hZGRWaWRlb0luRWRpdG9yKHZpZGVvTW9kYWwpO1xuICAgIH0pO1xuICB9XG5cbiAgc2VhcmNoTXlWaWRlbyhldmVudCkge1xuICAgIHRoaXMucXVlcnkgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5nZXRNeVZpZGVvcygwLCB0aGlzLnF1ZXJ5KTtcbiAgfVxuICBzZWFyY2hBbGxWaWRlbyhldmVudCkge1xuICAgIHRoaXMucXVlcnkgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5nZXRBbGxWaWRlb3MoMCwgdGhpcy5xdWVyeSk7XG4gIH1cbiAgLy8gc2VhcmNoVmlkZW8gZmVhdHVyZVxuICBzZWFyY2hWaWRlbyhldmVudCwgdHlwZSkge1xuICAgIGlmIChldmVudCA9PT0gJ2NsZWFySW5wdXQnICYmIHR5cGUgPT09ICdteVZpZGVvcycpIHtcbiAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgIHRoaXMuc2VhcmNoTXlJbnB1dCA9ICcnO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdjbGVhcklucHV0JyAmJiB0eXBlID09PSAnYWxsVmlkZW9zJykge1xuICAgICAgdGhpcy5xdWVyeSA9ICcnO1xuICAgICAgdGhpcy5zZWFyY2hBbGxJbnB1dCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ215VmlkZW9zJykge1xuICAgICAgdGhpcy5nZXRNeVZpZGVvcygwLCB0aGlzLnF1ZXJ5LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXRBbGxWaWRlb3MoMCwgdGhpcy5xdWVyeSwgdHJ1ZSk7XG4gICAgfVxuICB9XG4gIHNlbGVjdFZpZGVvKGRhdGEpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy5zaG93QWRkQnV0dG9uID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWRlb0lkID0gZGF0YS5pZGVudGlmaWVyO1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZGVvID0gZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93QWRkQnV0dG9uID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlkZW9JZCA9ICcnO1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZGVvID0ge307XG4gICAgfVxuXG4gIH1cblxuICBjb3VudENoYXJhY3RlcnMoZG9jdW1lbnQpIHtcbiAgICBjb25zdCByb290RWxlbWVudCA9IGRvY3VtZW50LmdldFJvb3QoKTtcbiAgICByZXR1cm4gdGhpcy5jb3VudENoYXJhY3RlcnNJbkVsZW1lbnQocm9vdEVsZW1lbnQpO1xuICB9XG4gIGNvdW50Q2hhcmFjdGVyc0luRWxlbWVudChub2RlKSB7XG4gICAgbGV0IGNoYXJzID0gMDtcbiAgICBjb25zdCBmb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2g7XG4gICAgY29uc3QgZm9yRSA9IG5vZGUuZ2V0Q2hpbGRyZW4oKTtcbiAgICBsZXQgY2hpbGQ7XG5cbiAgICB3aGlsZSAoIShjaGlsZCA9IGZvckUubmV4dCgpKS5kb25lKSB7XG4gICAgICBpZiAoY2hpbGQudmFsdWUuaXMoJ3RleHQnKSkge1xuICAgICAgICBjaGFycyArPSBjaGlsZC52YWx1ZS5kYXRhLmxlbmd0aDtcbiAgICAgIH0gZWxzZSBpZiAoY2hpbGQudmFsdWUuaXMoJ2VsZW1lbnQnKSkge1xuICAgICAgICBjaGFycyArPSB0aGlzLmNvdW50Q2hhcmFjdGVyc0luRWxlbWVudChjaGlsZC52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGFycztcbiAgfVxuXG4gIGdldE1lZGlhT3JpZ2luVVJMKHNyYykge1xuICAgIGNvbnN0IHJlcGxhY2VUZXh0ID0gdGhpcy5hc3NldFByb3h5VXJsO1xuICAgIGNvbnN0IGNsb3VkU3RvcmFnZVVybHMgPSBfLmNvbXBhY3QoXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQuY2xvdWRTdG9yYWdlVXJscycpIHx8IFtdKTtcbiAgICBfLmZvckVhY2goY2xvdWRTdG9yYWdlVXJscywgdXJsID0+IHtcbiAgICAgIGlmIChzcmMuaW5kZXhPZih1cmwpICE9PSAtMSkge1xuICAgICAgICBzcmMgPSBzcmMucmVwbGFjZSh1cmwsIHJlcGxhY2VUZXh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3JjO1xuICB9XG4gIC8vIEhlcmUgRXZlbnQgbGlzdGVuZXIgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgdG8gbGlzdGVuIHRoZSBjbGljayBldmVudCBmcm9tIFdpcmlzIHBsdWdpbiAoJ09LJy0+IGJ1dHRvbilcbiAgYXR0YWNoRXZlbnQoZWRpdG9yKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCAmJiAoZS50YXJnZXQgYXMgRWxlbWVudCkuY2xhc3NOYW1lID09PSAnd3JzX21vZGFsX2J1dHRvbl9hY2NlcHQnKSB7XG4gICAgICAgIGVkaXRvci5tb2RlbC5jaGFuZ2Uod3JpdGVyID0+IHtcbiAgICAgICAgICBjb25zdCBpbnNlcnRQb3NpdGlvbiA9IGVkaXRvci5tb2RlbC5kb2N1bWVudC5zZWxlY3Rpb24uZ2V0Rmlyc3RQb3NpdGlvbigpO1xuICAgICAgICAgIHdyaXRlci5pbnNlcnRUZXh0KCcgJywgaW5zZXJ0UG9zaXRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldENoYXJhY3RlcnNMZWZ0KCkge1xuICAgIGlmICh0aGlzLnNldENoYXJhY3RlckxpbWl0KSB7XG4gICAgICBsZXQgY2hhclJlbWFpbmluZyA9IHRoaXMuc2V0Q2hhcmFjdGVyTGltaXQgLSB0aGlzLmNoYXJhY3RlckNvdW50O1xuICAgICAgcmV0dXJuIGNoYXJSZW1haW5pbmcgPiAwID8gY2hhclJlbWFpbmluZyA6IDA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZWRpdG9yV3JhcHBlclwiIFtuZ0NsYXNzXT1cInsnaGFzRXJyb3InOiBsaW1pdEV4Y2VlZGVkfVwiPlxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLXRvb2x0aXA9XCJBZGQgaW1hZ2VcIiBkYXRhLXBvc2l0aW9uPVwiYm90dG9tIGNlbnRlclwiIGRhdGEtdmFyaWF0aW9uPVwibWluaVwiIGRhdGEtaW52ZXJ0ZWQ9XCJcIlxuICAgIHRpdGxlPVwiQWRkIGltYWdlXCIgW2Rpc2FibGVkXT1cImlzQXNzZXRCcm93c2VyUmVhZE9ubHkgfHwgaXNFZGl0b3JGb2N1c2VkXCIgKGNsaWNrKT1cImluaXRpYWxpemVJbWFnZVBpY2tlcigncXVlc3Rpb24nKVwiXG4gICAgY2xhc3M9XCJ1aSBpY29uIGJ1dHRvbiBpbnNlcnQtaW1hZ2UtYnRuXCI+XG4gICAgPGkgY2xhc3M9XCJpbWFnZSBvdXRsaW5lIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gIDwvYnV0dG9uPlxuICA8dGV4dGFyZWEgY2xhc3M9XCJlZGl0b3JcIiAjZWRpdG9yIG5hbWU9XCJxdWVzdGlvblwiIHBsYWNlaG9sZGVyPVwiXCI+PC90ZXh0YXJlYT5cbiAgPGRpdiAqbmdJZj1cInNldENoYXJhY3RlckxpbWl0ID4gMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjaGFyYWN0ZXJDb3VudFwiPlxuICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNoYXJhY3RlcnNMZWZ0fX0ge3tjaGFyYWN0ZXJzTGVmdH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxzdWktbW9kYWwgW2lzQ2xvc2FibGVdPVwidHJ1ZVwiIGNsYXNzPVwic2ItbW9kYWwgb3ZlcmZsb3ctbW9kYWxcIiBbaXNJbnZlcnRlZF09XCJmYWxzZVwiIChkaXNtaXNzZWQpPVwiZGlzbWlzc0ltYWdlUGlja2VyKClcIlxuICAqbmdJZj1cInNob3dJbWFnZVBpY2tlclwiIFtzaXplXT1cIidub3JtYWwnXCIgW2lzRnVsbFNjcmVlbl09XCJmYWxzZVwiIFttdXN0U2Nyb2xsXT1cInRydWVcIiAjbW9kYWw+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1oZWFkZXJcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VsZWN0SW1hZ2V9fTwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtY29udGVudCBwLTBcIj5cbiAgICA8c3VpLXRhYnNldD5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYi10YWJzZXQtbWVudVwiPlxuICAgICAgICA8YSBjbGFzcz1cInNiLWl0ZW1cIiAoYWN0aXZhdGUpPVwiZ2V0TXlJbWFnZXMoMClcIiBzdWlUYWJIZWFkZXI9XCIxXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/Lm15SW1hZ2VzfX08L2E+XG4gICAgICAgIDxhIGNsYXNzPVwic2ItaXRlbVwiIChhY3RpdmF0ZSk9XCJnZXRBbGxJbWFnZXMoMClcIiBzdWlUYWJIZWFkZXI9XCIyXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmFsbEltYWdlfX08L2E+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ1aSBzZWdtZW50IHNiLXRhYnNldC1zZWdtZW50IG0tMCBwdC0xNVwiIGluZmluaXRlU2Nyb2xsIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIlxuICAgICAgICBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCI1MDBcIiBbc2Nyb2xsV2luZG93XT1cImZhbHNlXCIgKHNjcm9sbGVkKT1cImxhenlsb2FkTXlJbWFnZXMoKVwiIHN1aVRhYkNvbnRlbnQ9XCIxXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1aSAgcGItMTYgZC1mbGV4IHBsLTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Itc2VhcmNoLWJveCBzbWFsbCBuby1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1kaXYgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzZWFyY2ggaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwic2VhcmNoSW1hZ2VzKCRldmVudCwgJ215SW1hZ2VzJylcIiBjbGFzcz1cInNiLXNlYXJjaC1pbnB1dFwiIFsobmdNb2RlbCldPVwic2VhcmNoTXlJbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj17e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VhcmNoUGxhY2Vob2xkZXJ9fSAvPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImNsb3NlIGljb25cIiAoY2xpY2spPVwic2VhcmNoSW1hZ2VzKCdjbGVhcklucHV0JywgJ215SW1hZ2VzJylcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYi1idG4gc2ItYnRuLW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8uc2VhcmNoX2J0bl9sYWJlbH19PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAgY2xhc3M9XCJmcy0wLTk4NiBtbC1hdXRvIHNiLWNvbG9yLWdyZXlcIiA+e3thc3NldHNDb3VudH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFteUFzc2V0cz8ubGVuZ3RoICYmIHNlYXJjaE15SW5wdXRcIiBjbGFzcz1cImZzLTA3ODVcIj4ge3tlbXB0eUltYWdlU2VhcmNoTWVzc2FnZX19IDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2ItZ3JpZC1sYXlvdXQgaW1hZ2VcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItdmlkZW8tY29udGVudFwiICpuZ0Zvcj1cImxldCBkYXRhIG9mIG15QXNzZXRzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItaW1hZ2Utc2VjdGlvbiByZWxhdGl2ZSBwb3NpdGlvblwiPlxuICAgICAgICAgICAgICA8aW1nIChjbGljayk9XCJhZGRJbWFnZUluRWRpdG9yKGRhdGEuZG93bmxvYWRVcmwsIGRhdGEuaWRlbnRpZmllcilcIiBbc3JjXT1cImRhdGEuZG93bmxvYWRVcmxcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ1aSBzZWdtZW50IHNiLXRhYnNldC1zZWdtZW50IG0tMCBwdC0xNVwiIGluZmluaXRlU2Nyb2xsIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIlxuICAgICAgICBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCI1MDBcIiBbc2Nyb2xsV2luZG93XT1cImZhbHNlXCIgKHNjcm9sbGVkKT1cImxhenlsb2FkQWxsSW1hZ2VzKClcIiBzdWlUYWJDb250ZW50PVwiMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidWkgIHBiLTE2IGQtZmxleCBwbC0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiLXNlYXJjaC1ib3ggc21hbGwgbm8tYnRuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZGl2IHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwic2VhcmNoIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cInNlYXJjaEltYWdlcygkZXZlbnQsICdhbGxJbWFnZXMnKVwiIGNsYXNzPVwic2Itc2VhcmNoLWlucHV0XCIgWyhuZ01vZGVsKV09XCJzZWFyY2hBbGxJbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj17e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VhcmNoUGxhY2Vob2xkZXJ9fSAvPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImNsb3NlIGljb25cIiAoY2xpY2spPVwic2VhcmNoSW1hZ2VzKCdjbGVhcklucHV0JywgJ2FsbEltYWdlcycpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnNlYXJjaF9idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZnMtMC05ODYgbWwtYXV0byBzYi1jb2xvci1ncmV5XCI+e3thc3NldHNDb3VudH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFhbGxJbWFnZXM/Lmxlbmd0aCAmJiBzZWFyY2hBbGxJbnB1dFwiIGNsYXNzPVwiZnMtMDc4NVwiPiB7e2VtcHR5SW1hZ2VTZWFyY2hNZXNzYWdlfX0gPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYi1ncmlkLWxheW91dCBpbWFnZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi12aWRlby1jb250ZW50XCIgKm5nRm9yPVwibGV0IGRhdGEgb2YgYWxsSW1hZ2VzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItaW1hZ2Utc2VjdGlvblwiPlxuICAgICAgICAgICAgICA8aW1nIChjbGljayk9XCJhZGRJbWFnZUluRWRpdG9yKGRhdGEuZG93bmxvYWRVcmwsIGRhdGEuaWRlbnRpZmllcilcIiBbc3JjXT1cImRhdGEuZG93bmxvYWRVcmxcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9zdWktdGFic2V0PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWFjdGlvbnMgZmxleC1qYy1zcGFjZS1lbmRcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJvcGVuSW1hZ2VVcGxvYWRNb2RhbCgpO1wiIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1wcmltYXJ5IHNiLWJ0bi1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnVwbG9hZF91c2VfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgPC9kaXY+XG48L3N1aS1tb2RhbD5cblxuPHN1aS1tb2RhbCBbaXNDbG9zYWJsZV09XCJpc0Nsb3NhYmxlXCIgY2xhc3M9XCJzYi1tb2RhbCBvdmVyZmxvdy1tb2RhbFwiIFtpc0ludmVydGVkXT1cImZhbHNlXCJcbiAgKGRpc21pc3NlZCk9XCJkaXNtaXNzVmlkZW9QaWNrZXIoKVwiICpuZ0lmPVwic2hvd1ZpZGVvUGlja2VyXCIgW3NpemVdPVwiJ25vcm1hbCdcIiBbaXNGdWxsU2NyZWVuXT1cImZhbHNlXCJcbiAgW211c3RTY3JvbGxdPVwidHJ1ZVwiICNtb2RhbD5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWhlYWRlclwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5zZWxlY3RWaWRlb319PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1jb250ZW50IHAtMFwiPlxuICAgIDxzdWktdGFic2V0PlxuICAgICAgPGRpdiBjbGFzcz1cInNiLXRhYnNldC1tZW51XCI+XG4gICAgICAgIDxhIGNsYXNzPVwic2ItaXRlbVwiIChhY3RpdmF0ZSk9XCJnZXRNeVZpZGVvcygwKVwiIHN1aVRhYkhlYWRlcj1cIjFcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ubXlWaWRlb3N9fTwvYT5cbiAgICAgICAgPGEgY2xhc3M9XCJzYi1pdGVtXCIgKGFjdGl2YXRlKT1cImdldEFsbFZpZGVvcygwKVwiIHN1aVRhYkhlYWRlcj1cIjJcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uYWxsVmlkZW9zfX08L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInVpIHNlZ21lbnQgc2ItdGFic2V0LXNlZ21lbnQgbS0wIHB0LTE1XCIgaW5maW5pdGVTY3JvbGwgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwMFwiIFtzY3JvbGxXaW5kb3ddPVwiZmFsc2VcIiAoc2Nyb2xsZWQpPVwibGF6eWxvYWRNeVZpZGVvcygpXCIgc3VpVGFiQ29udGVudD1cIjFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBiLTE2IGQtZmxleCBwbC0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiLXNlYXJjaC1ib3ggc21hbGwgbm8tYnRuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZGl2IHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwic2VhcmNoIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cInNlYXJjaFZpZGVvKCRldmVudCwgJ215VmlkZW9zJylcIiBjbGFzcz1cInNiLXNlYXJjaC1pbnB1dFwiIFsobmdNb2RlbCldPVwic2VhcmNoTXlJbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj17e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VhcmNoUGxhY2Vob2xkZXJ9fSAvPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImNsb3NlIGljb25cIiAoY2xpY2spPVwic2VhcmNoVmlkZW8oJ2NsZWFySW5wdXQnLCAnbXlWaWRlb3MnKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNiLWJ0biBzYi1idG4tbm9ybWFsXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5zZWFyY2hfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cImZzLTAtOTg2IG1sLWF1dG8gc2ItY29sb3ItZ3JleVwiID57e2Fzc2V0c0NvdW50fX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIW15QXNzZXRzPy5sZW5ndGggJiYgc2VhcmNoTXlJbnB1dFwiIGNsYXNzPVwiZnMtMDc4NVwiPiB7e2VtcHR5VmlkZW9TZWFyY2hNZXNzYWdlfX0gPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYi1ncmlkLWxheW91dCB2aWRlb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi12aWRlby1jb250ZW50XCIgKm5nRm9yPVwibGV0IGRhdGEgb2YgbXlBc3NldHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1pbWFnZS1zZWN0aW9uIHJlbGF0aXZlIHBvc2l0aW9uXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBzZWxlY3RlZFZpZGVvSWQgPT09IGRhdGEuaWRlbnRpZmllcn1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VmlkZW8oZGF0YSlcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW1hZ2VcIj48aSBjbGFzcz1cInBsYXkgY2lyY2xlIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9kaXY+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiY2hlY2sgY2lyY2xlIGljb24gc2VsZWN0ZWQtdmlkZW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJkYXRhLnRodW1ibmFpbFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInVpIHNlZ21lbnQgc2ItdGFic2V0LXNlZ21lbnQgbS0wIHB0LTE1XCIgaW5maW5pdGVTY3JvbGwgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwMFwiIFtzY3JvbGxXaW5kb3ddPVwiZmFsc2VcIiAoc2Nyb2xsZWQpPVwibGF6eWxvYWRBbGxWaWRlb3MoKVwiIHN1aVRhYkNvbnRlbnQ9XCIyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCIgcGItMTYgZC1mbGV4IHBsLTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Itc2VhcmNoLWJveCBzbWFsbCBuby1idG5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1kaXYgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzZWFyY2ggaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwic2VhcmNoVmlkZW8oJGV2ZW50LCAnYWxsVmlkZW9zJylcIiBjbGFzcz1cInNiLXNlYXJjaC1pbnB1dFwiIFsobmdNb2RlbCldPVwic2VhcmNoQWxsSW5wdXRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnNlYXJjaFBsYWNlaG9sZGVyfX0gLz5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJjbG9zZSBpY29uXCIgKGNsaWNrKT1cInNlYXJjaFZpZGVvKCdjbGVhcklucHV0JywgJ2FsbFZpZGVvcycpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnNlYXJjaF9idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZnMtMC05ODYgbWwtYXV0byBzYi1jb2xvci1ncmV5XCIgPnt7YXNzZXRzQ291bnR9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhYWxsVmlkZW9zPy5sZW5ndGggJiYgc2VhcmNoQWxsSW5wdXRcIiBjbGFzcz1cImZzLTA3ODVcIj4ge3tlbXB0eVZpZGVvU2VhcmNoTWVzc2FnZX19IDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2ItZ3JpZC1sYXlvdXQgdmlkZW9cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItdmlkZW8tY29udGVudFwiICpuZ0Zvcj1cImxldCBkYXRhIG9mIGFsbFZpZGVvc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiLWltYWdlLXNlY3Rpb24gcmVsYXRpdmUgcG9zaXRpb25cIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IHNlbGVjdGVkVmlkZW9JZCA9PT0gZGF0YS5pZGVudGlmaWVyfVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RWaWRlbyhkYXRhKTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW1hZ2VcIj48aSBjbGFzcz1cInBsYXkgY2lyY2xlIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9kaXY+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiY2hlY2sgY2lyY2xlIGljb24gc2VsZWN0ZWQtdmlkZW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJkYXRhLnRodW1ibmFpbFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9zdWktdGFic2V0PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWFjdGlvbnMgZmxleC1qYy1zcGFjZS1iZXR3ZWVuIHBsLTIwXCI+XG4gICAgPGRpdj5cbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImFkZFZpZGVvSW5FZGl0b3IoKTtcIiBjbGFzcz1cInNiLWJ0biBzYi1idG4tbm9ybWFsXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieydzYi1idG4tcHJpbWFyeSc6IHNob3dBZGRCdXR0b24sICdzYi1idG4tZGlzYWJsZWQnOiAhc2hvd0FkZEJ1dHRvbn1cIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LmFkZF9idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJvcGVuVmlkZW9VcGxvYWRNb2RhbCgpO1wiIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1wcmltYXJ5IHNiLWJ0bi1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnVwbG9hZF91c2VfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3N1aS1tb2RhbD5cblxuPCEtLSBVcGxvYWQgaW1hZ2UgcG9wIHVwIGNvZGUgaGVyZSAgLS0+XG5cbjxzdWktbW9kYWwgY2xhc3M9XCJzYi1tb2RhbCBvdmVyZmxvdy1tb2RhbFwiIFtpc0Nsb3NhYmxlXT1cInRydWVcIiBbaXNJbnZlcnRlZF09XCJmYWxzZVwiXG4gIChkaXNtaXNzZWQpPVwiZGlzbWlzc0ltYWdlVXBsb2FkTW9kYWwoKVwiICpuZ0lmPVwic2hvd0ltYWdlVXBsb2FkTW9kYWxcIiBbc2l6ZV09XCInbGFyZ2UnXCIgW2lzRnVsbFNjcmVlbl09XCJmYWxzZVwiXG4gIFttdXN0U2Nyb2xsXT1cInRydWVcIiBhcHBCb2R5U2Nyb2xsICNtb2RhbD5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWhlYWRlclwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy51cGxvYWRBbmRVc2V9fTwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicC0xMCBzYi1iZy13aGl0ZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgICAgICAgPGg2IGNsYXNzPVwibWItOCBmcy1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uY2hvb3NlT3JEcmFnSW1hZ2V9fTxzcGFuIGNsYXNzPVwicmVkXCI+Kjwvc3Bhbj48L2g2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtaW1hZ2UtbW9kYWwtc2VjdGlvbiBkLWZsZXggZmxleC1haS1jZW50ZXIgZmxleC1qYy1jZW50ZXIgZmxleC1kY1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInVwbG9hZC1pbnB1dC1idXR0b24gc2ItYnRuIHNiLWJ0bi1zdWNjZXNzIHNiLWJ0bi1ub3JtYWxcIj5cbiAgICAgICAgICAgICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy51cGxvYWRfZnJvbV9jb21wdXRlcl9idG5fbGFiZWx9fVxuICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cInVwbG9hZEltYWdlKCRldmVudClcIiB0eXBlPVwiZmlsZVwiIFthY2NlcHRdPVwiYWNjZXB0SW1hZ2VUeXBlXCIgbmFtZT1cImFzc2V0ZmlsZVwiPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTEwIGZzLTAtNzg1IHNiLWNvbG9yLXByaW1hcnlcIiAqbmdJZj1cImltYWdlVXBsb2FkTG9hZGVyXCI+IHt7YXNzZXROYW1lfX0gPC9kaXY+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnNtYWxsIG10LThcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udXBsb2FkfX0ge3thc3NldENvbmZpZy5pbWFnZS5hY2NlcHRlZH19ICh7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ubWF4RmlsZVNpemV9fVxuICAgICAgICAgICAgICAgIHt7YXNzZXRDb25maWcuaW1hZ2Uuc2l6ZX19e3thc3NldENvbmZpZy5pbWFnZS5zaXplVHlwZX19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dFcnJvck1zZ1wiIGNsYXNzPVwic2ItY29sb3ItZXJyb3IgZnNtYWxsIG10LThcIj5cbiAgICAgICAgICAgICAgICA8cD57e2Vycm9yTXNnfX08L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVpIGluZm8gbWVzc2FnZSBzYi1pbmZvLWJ4XCI+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0XCI+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZzLTA3ODVcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uYWxsb3dlZEZpbGVUeXBlc319IHt7YXNzZXRDb25maWcuaW1hZ2UuYWNjZXB0ZWR9fTwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZzLTA3ODVcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ubWF4aW11bUFsbG93ZWRGaWxlU2l6ZX19IHt7YXNzZXRDb25maWcuaW1hZ2Uuc2l6ZX19e3thc3NldENvbmZpZy5pbWFnZS5zaXplVHlwZX19PC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGg2IGNsYXNzPVwiZnMtMDc4NVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5jb3B5UmlnaHRzQW5kTGljZW5zZX19PHNwYW4gY2xhc3M9XCJyZWRcIj4qPC9zcGFuPjwvaDY+XG4gICAgICAgICAgPHAgY2xhc3M9XCJmc21hbGwgbXQtOCB0ZXJtcy1hbmQtY29uZGl0aW9uXCI+e3t0ZXJtc0FuZENvbmRpdGlvbn19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInctNTAgcGwtMTAgbWwtMTAgYi1ibFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidWkgaW5mbyBtZXNzYWdlIHNiLWluZm8tYnggbWItMFwiPlxuICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3RcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImZzLTA3ODUgZm9udC13ZWlnaHQtYm9sZFwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb24gaW5mbyBjaXJjbGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5kcm9wQ2hvb3NlRmlsZX19PC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiLWZvcm0tZmllbGRzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyIHVwbG9hZC1mb3JtXCI+XG4gICAgICAgICAgICA8c2ItZHluYW1pYy1mb3JtIFtjb25maWddPVwiZm9ybUNvbmZpZ1wiIChzdGF0dXNDaGFuZ2VzKT1cIm9uU3RhdHVzQ2hhbmdlcygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlcyk9XCJ2YWx1ZUNoYW5nZXMoJGV2ZW50KVwiPjwvc2ItZHluYW1pYy1mb3JtPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1hY3Rpb25zIGZsZXgtamMtc3BhY2UtYmV0d2VlbiBwLTBcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImRpc21pc3NQb3BzKG1vZGFsKTtcIiBjbGFzcz1cIm1yLTEwIHNiLWJ0biBzYi1idG4tcHJpbWFyeSBzYi1idG4tbm9ybWFsXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5jYW5jZWxfYnRuX2xhYmVsfX08L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ1cGxvYWRBbmRVc2VJbWFnZShtb2RhbCk7XCIgW2Rpc2FibGVkXT1cIiFpbWFnZUZvcm1WYWxpZFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydzYi1idG4tcHJpbWFyeSc6IGltYWdlRm9ybVZhbGlkLCAnc2ItYnRuLWRpc2FibGVkJzogIWltYWdlRm9ybVZhbGlkfVwiXG4gICAgICAgICAgY2xhc3M9XCJzYi1idG4gIHNiLWJ0bi1ub3JtYWwgdGV4dC1sZWZ0XCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy51cGxvYWRfdXNlX2J0bl9sYWJlbH19IFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJkaXNtaXNzSW1hZ2VVcGxvYWRNb2RhbCgpO1wiIGNsYXNzPVwiIHNiLWJ0biBzYi1idG4tcHJpbWFyeSBzYi1idG4tbm9ybWFsXCI+IHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8uYmFja19idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9zdWktbW9kYWw+XG5cbjwhLS0gVXBsb2FkIHZpZGVvIHBvcCB1cCBjb2RlIGhlcmUgIC0tPlxuPHN1aS1tb2RhbCBjbGFzcz1cInNiLW1vZGFsIG92ZXJmbG93LW1vZGFsXCIgW2lzQ2xvc2FibGVdPVwiaXNDbG9zYWJsZVwiIFtpc0ludmVydGVkXT1cImZhbHNlXCJcbiAgKGRpc21pc3NlZCk9XCJkaXNtaXNzVmlkZW9VcGxvYWRNb2RhbCgpXCIgKm5nSWY9XCJzaG93VmlkZW9VcGxvYWRNb2RhbFwiIFtzaXplXT1cIidsYXJnZSdcIiBbaXNGdWxsU2NyZWVuXT1cImZhbHNlXCJcbiAgW211c3RTY3JvbGxdPVwidHJ1ZVwiIGFwcEJvZHlTY3JvbGwgI21vZGFsPlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtaGVhZGVyXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnVwbG9hZEFuZFVzZX19PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJwLTEwIHNiLWJnLXdoaXRlXCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInctNTBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICA8aDYgY2xhc3M9XCJtYi04IGZzLW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5jaG9vc2VPckRyYWdWaWRlb319PHNwYW4gY2xhc3M9XCJyZWRcIj4qPC9zcGFuPjwvaDY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1pbWFnZS1tb2RhbC1zZWN0aW9uIGQtZmxleCBmbGV4LWFpLWNlbnRlciBmbGV4LWpjLWNlbnRlciBmbGV4LWRjXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidXBsb2FkLWlucHV0LWJ1dHRvbiBzYi1idG4gc2ItYnRuLXN1Y2Nlc3Mgc2ItYnRuLW5vcm1hbFwiPlxuICAgICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnVwbG9hZF9mcm9tX2NvbXB1dGVyX2J0bl9sYWJlbH19XG4gICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwidXBsb2FkVmlkZW9Gcm9tTG9jYWwoJGV2ZW50KVwiIHR5cGU9XCJmaWxlXCIgW2FjY2VwdF09XCJhY2NlcHRWaWRlb1R5cGVcIiBuYW1lPVwiYXNzZXRmaWxlXCI+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktMTAgZnMtMC03ODUgc2ItY29sb3ItcHJpbWFyeVwiICpuZ0lmPVwiaW1hZ2VVcGxvYWRMb2FkZXJcIj4ge3t2aWRlb0ZpbGU/Lm5hbWV9fSA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmc21hbGwgbXQtOFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy51cGxvYWR9fSB7e2Fzc2V0Q29uZmlnLnZpZGVvLmFjY2VwdGVkfX0gKHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5tYXhGaWxlU2l6ZX19XG4gICAgICAgICAgICAgICAge3thc3NldENvbmZpZy52aWRlby5zaXplfX17e2Fzc2V0Q29uZmlnLnZpZGVvLnNpemVUeXBlfX0pPC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0Vycm9yTXNnXCIgY2xhc3M9XCJzYi1jb2xvci1lcnJvciBmc21hbGwgbXQtOFwiPlxuICAgICAgICAgICAgICAgIDxwPnt7ZXJyb3JNc2d9fTwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWkgaW5mbyBtZXNzYWdlIHNiLWluZm8tYnhcIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3RcIj5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZnMtMDc4NVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5hbGxvd2VkRmlsZVR5cGVzfX0ge3thc3NldENvbmZpZy52aWRlby5hY2NlcHRlZH19PC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZnMtMDc4NVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5tYXhpbXVtQWxsb3dlZEZpbGVTaXplfX0ge3thc3NldENvbmZpZy52aWRlby5zaXplfX17e2Fzc2V0Q29uZmlnLnZpZGVvLnNpemVUeXBlfX08L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aDYgY2xhc3M9XCJmcy0wNzg1XCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNvcHlSaWdodHNBbmRMaWNlbnNlfX08c3BhbiBjbGFzcz1cInJlZFwiPio8L3NwYW4+PC9oNj5cbiAgICAgICAgICA8cCBjbGFzcz1cImZzbWFsbCBtdC04IHRlcm1zLWFuZC1jb25kaXRpb25cIj57e3Rlcm1zQW5kQ29uZGl0aW9ufX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidy01MCBwbC0xMCBtbC0xMCBiLWJsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1aSBpbmZvIG1lc3NhZ2Ugc2ItaW5mby1ieCBtYi0wXCI+XG4gICAgICAgICAgPHVsIGNsYXNzPVwibGlzdFwiPlxuICAgICAgICAgICAgPGxpIGNsYXNzPVwiZnMtMDc4NSBmb250LXdlaWdodC1ib2xkXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbiBpbmZvIGNpcmNsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmRyb3BDaG9vc2VGaWxlfX08L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2ItZm9ybS1maWVsZHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250YWluZXIgdXBsb2FkLWZvcm1cIj5cbiAgICAgICAgICAgIDxzYi1keW5hbWljLWZvcm0gW2NvbmZpZ109XCJmb3JtQ29uZmlnXCIgKHN0YXR1c0NoYW5nZXMpPVwib25TdGF0dXNDaGFuZ2VzKCRldmVudClcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2VzKT1cInZhbHVlQ2hhbmdlcygkZXZlbnQpXCI+PC9zYi1keW5hbWljLWZvcm0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWFjdGlvbnMgZmxleC1qYy1zcGFjZS1iZXR3ZWVuIHAtMFwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGlzbWlzc1ZpZGVvUG9wcyhtb2RhbCk7XCIgY2xhc3M9XCJtci0xMCBzYi1idG4gc2ItYnRuLXByaW1hcnkgc2ItYnRuLW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8uY2FuY2VsX2J0bl9sYWJlbH19PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzYi1idG4gc2ItYnRuLW5vcm1hbCB0ZXh0LWxlZnQgc2ItYnRuLWxvYWRpbmctc3Bpbm5lciBzYi1idG4tcHJpbWFyeVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpbWFnZUZvcm1WYWxpZFwiICAoY2xpY2spPVwidXBsb2FkVmlkZW8obW9kYWwpO1wiIFxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2ItYnRuLXByaW1hcnknOiBpbWFnZUZvcm1WYWxpZCwgJ3NiLWJ0bi1kaXNhYmxlZCc6ICFpbWFnZUZvcm1WYWxpZH1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1sb2FkaW5nLXNwaW5uZXJcIiAgKm5nSWY9XCJsb2FkaW5nXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udXBsb2FkQW5kVXNlfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGlzbWlzc1ZpZGVvVXBsb2FkTW9kYWwoKTtcIiBjbGFzcz1cIiBzYi1idG4gc2ItYnRuLXByaW1hcnkgc2ItYnRuLW5vcm1hbFwiPiB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LmJhY2tfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvc3VpLW1vZGFsPiJdfQ==
|