@thecodeblogs/blog 0.11.7 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/entry-creator/entry-creator.component.mjs +347 -0
- package/esm2020/lib/components/entry-renderer/entry-renderer.component.mjs +108 -0
- package/esm2020/lib/components/entry-renderer-wrapper/entry-renderer-wrapper.component.mjs +75 -0
- package/esm2020/lib/components/entry-selector-dialog/entry-selector-dialog-data.mjs +3 -0
- package/esm2020/lib/components/entry-selector-dialog/entry-selector-dialog.component.mjs +45 -0
- package/esm2020/lib/components/entry-summary/entry-summary.component.mjs +28 -0
- package/esm2020/lib/components/json-renderer/json-renderer.component.mjs +26 -0
- package/esm2020/lib/components/landing-page/landing-page.component.mjs +35 -0
- package/esm2020/lib/components/main/main.component.mjs +56 -0
- package/esm2020/lib/components/media-upload-modal/media-upload-modal.component.mjs +160 -0
- package/esm2020/lib/components/outline-view/outline-view.component.mjs +40 -0
- package/esm2020/lib/components/schedule-publish-dialog/schedule-publish-dialog-data.mjs +3 -0
- package/esm2020/lib/components/schedule-publish-dialog/schedule-publish-dialog.component.mjs +33 -0
- package/esm2020/lib/components/side-navigation/side-navigation.component.mjs +151 -0
- package/esm2020/lib/components/static-html/static-html.component.mjs +28 -0
- package/esm2020/lib/core.module.mjs +207 -0
- package/esm2020/lib/data/base.mjs +7 -0
- package/esm2020/lib/data/content-type.mjs +10 -0
- package/esm2020/lib/data/content.mjs +5 -0
- package/esm2020/lib/data/core-event-type.enum.mjs +7 -0
- package/esm2020/lib/data/core-event.mjs +7 -0
- package/esm2020/lib/data/entry.mjs +80 -0
- package/esm2020/lib/data/guid.mjs +12 -0
- package/esm2020/lib/data/identity.mjs +2 -0
- package/esm2020/lib/data/list-response.mjs +3 -0
- package/esm2020/lib/data/section.mjs +11 -0
- package/esm2020/lib/data/tag.mjs +7 -0
- package/esm2020/lib/data/visitor-profile.mjs +3 -0
- package/esm2020/lib/pipes/LinkyPipe.mjs +15 -0
- package/esm2020/lib/pipes/TimeAgoPipe.mjs +100 -0
- package/esm2020/lib/routing/routes.mjs +25 -0
- package/esm2020/lib/services/analytics/interaction.service.mjs +20 -0
- package/esm2020/lib/services/analytics/view.service.mjs +20 -0
- package/esm2020/lib/services/comment.service.mjs +28 -0
- package/esm2020/lib/services/django-rest-framework-endpoint.service.mjs +50 -0
- package/esm2020/lib/services/entry.service.mjs +73 -0
- package/esm2020/lib/services/identity.service.mjs +20 -0
- package/esm2020/lib/services/interaction.mjs +3 -0
- package/esm2020/lib/services/prism.service.mjs +39 -0
- package/esm2020/lib/services/static-html.service.mjs +22 -0
- package/esm2020/lib/services/tag.service.mjs +33 -0
- package/esm2020/lib/services/upload.mjs +3 -0
- package/esm2020/lib/services/upload.service.mjs +22 -0
- package/esm2020/lib/services/view.mjs +3 -0
- package/esm2020/lib/services/visitor-profile.service.mjs +35 -0
- package/esm2020/public-api.mjs +45 -0
- package/esm2020/thecodeblogs-blog.mjs +5 -0
- package/fesm2015/thecodeblogs-blog.mjs +1826 -0
- package/fesm2015/thecodeblogs-blog.mjs.map +1 -0
- package/fesm2020/thecodeblogs-blog.mjs +1820 -0
- package/fesm2020/thecodeblogs-blog.mjs.map +1 -0
- package/lib/components/entry-creator/entry-creator.component.d.ts +3 -0
- package/lib/components/entry-renderer/entry-renderer.component.d.ts +3 -0
- package/lib/components/entry-renderer-wrapper/entry-renderer-wrapper.component.d.ts +3 -0
- package/lib/components/entry-selector-dialog/entry-selector-dialog.component.d.ts +3 -0
- package/lib/components/entry-summary/entry-summary.component.d.ts +3 -0
- package/lib/components/json-renderer/json-renderer.component.d.ts +3 -0
- package/lib/components/landing-page/landing-page.component.d.ts +3 -0
- package/lib/components/main/main.component.d.ts +3 -0
- package/lib/components/media-upload-modal/media-upload-modal.component.d.ts +3 -0
- package/lib/components/outline-view/outline-view.component.d.ts +3 -0
- package/lib/components/schedule-publish-dialog/schedule-publish-dialog.component.d.ts +3 -0
- package/lib/components/side-navigation/side-navigation.component.d.ts +3 -0
- package/lib/components/static-html/static-html.component.d.ts +3 -0
- package/lib/core.module.d.ts +40 -0
- package/lib/pipes/LinkyPipe.d.ts +3 -0
- package/lib/pipes/TimeAgoPipe.d.ts +3 -0
- package/lib/services/analytics/interaction.service.d.ts +3 -0
- package/lib/services/analytics/view.service.d.ts +3 -0
- package/lib/services/comment.service.d.ts +3 -0
- package/lib/services/django-rest-framework-endpoint.service.d.ts +3 -0
- package/lib/services/entry.service.d.ts +3 -0
- package/lib/services/identity.service.d.ts +3 -0
- package/lib/services/prism.service.d.ts +3 -0
- package/lib/services/static-html.service.d.ts +3 -0
- package/lib/services/tag.service.d.ts +3 -0
- package/lib/services/upload.service.d.ts +3 -0
- package/lib/services/visitor-profile.service.d.ts +3 -0
- package/package.json +36 -24
- package/thecodeblogs-blog.d.ts +1 -3
- package/bundles/thecodeblogs-blog.umd.js +0 -2279
- package/bundles/thecodeblogs-blog.umd.js.map +0 -1
- package/bundles/thecodeblogs-blog.umd.min.js +0 -17
- package/bundles/thecodeblogs-blog.umd.min.js.map +0 -1
- package/esm2015/lib/components/entry-creator/entry-creator.component.js +0 -336
- package/esm2015/lib/components/entry-renderer/entry-renderer.component.js +0 -108
- package/esm2015/lib/components/entry-renderer-wrapper/entry-renderer-wrapper.component.js +0 -79
- package/esm2015/lib/components/entry-selector-dialog/entry-selector-dialog-data.js +0 -3
- package/esm2015/lib/components/entry-selector-dialog/entry-selector-dialog.component.js +0 -41
- package/esm2015/lib/components/entry-summary/entry-summary.component.js +0 -29
- package/esm2015/lib/components/json-renderer/json-renderer.component.js +0 -29
- package/esm2015/lib/components/landing-page/landing-page.component.js +0 -37
- package/esm2015/lib/components/main/main.component.js +0 -55
- package/esm2015/lib/components/media-upload-modal/media-upload-modal.component.js +0 -155
- package/esm2015/lib/components/outline-view/outline-view.component.js +0 -40
- package/esm2015/lib/components/schedule-publish-dialog/schedule-publish-dialog-data.js +0 -3
- package/esm2015/lib/components/schedule-publish-dialog/schedule-publish-dialog.component.js +0 -28
- package/esm2015/lib/components/side-navigation/side-navigation.component.js +0 -154
- package/esm2015/lib/components/static-html/static-html.component.js +0 -33
- package/esm2015/lib/core.module.js +0 -125
- package/esm2015/lib/data/base.js +0 -7
- package/esm2015/lib/data/content-type.js +0 -10
- package/esm2015/lib/data/content.js +0 -5
- package/esm2015/lib/data/core-event-type.enum.js +0 -7
- package/esm2015/lib/data/core-event.js +0 -7
- package/esm2015/lib/data/entry.js +0 -80
- package/esm2015/lib/data/guid.js +0 -12
- package/esm2015/lib/data/identity.js +0 -2
- package/esm2015/lib/data/list-response.js +0 -3
- package/esm2015/lib/data/section.js +0 -11
- package/esm2015/lib/data/tag.js +0 -7
- package/esm2015/lib/data/visitor-profile.js +0 -3
- package/esm2015/lib/pipes/LinkyPipe.js +0 -11
- package/esm2015/lib/pipes/TimeAgoPipe.js +0 -100
- package/esm2015/lib/routing/routes.js +0 -25
- package/esm2015/lib/services/analytics/interaction.service.js +0 -22
- package/esm2015/lib/services/analytics/view.service.js +0 -22
- package/esm2015/lib/services/comment.service.js +0 -30
- package/esm2015/lib/services/django-rest-framework-endpoint.service.js +0 -52
- package/esm2015/lib/services/entry.service.js +0 -74
- package/esm2015/lib/services/identity.service.js +0 -22
- package/esm2015/lib/services/interaction.js +0 -3
- package/esm2015/lib/services/prism.service.js +0 -37
- package/esm2015/lib/services/static-html.service.js +0 -24
- package/esm2015/lib/services/tag.service.js +0 -35
- package/esm2015/lib/services/upload.js +0 -3
- package/esm2015/lib/services/upload.service.js +0 -24
- package/esm2015/lib/services/view.js +0 -3
- package/esm2015/lib/services/visitor-profile.service.js +0 -39
- package/esm2015/public-api.js +0 -45
- package/esm2015/thecodeblogs-blog.js +0 -8
- package/fesm2015/thecodeblogs-blog.js +0 -1786
- package/fesm2015/thecodeblogs-blog.js.map +0 -1
- package/thecodeblogs-blog.metadata.json +0 -1
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { COMMA, ENTER, TAB } from '@angular/cdk/keycodes';
|
|
2
|
+
import { Component, ViewChild, Input } from '@angular/core';
|
|
3
|
+
import { Entry } from '../../data/entry';
|
|
4
|
+
import { Section } from '../../data/section';
|
|
5
|
+
import { Content } from '../../data/content';
|
|
6
|
+
import { ContentType } from '../../data/content-type';
|
|
7
|
+
import { map as loMap, filter } from 'lodash';
|
|
8
|
+
import { EntrySelectorDialogComponent } from '../../components/entry-selector-dialog/entry-selector-dialog.component';
|
|
9
|
+
import { FileUploader } from 'ng2-file-upload';
|
|
10
|
+
import { MediaUploadModalComponent } from '../../components/media-upload-modal/media-upload-modal.component';
|
|
11
|
+
import { map, startWith } from 'rxjs/operators';
|
|
12
|
+
import { FormControl } from '@angular/forms';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "../../services/entry.service";
|
|
15
|
+
import * as i2 from "../../services/tag.service";
|
|
16
|
+
import * as i3 from "../../services/identity.service";
|
|
17
|
+
import * as i4 from "@angular/material/dialog";
|
|
18
|
+
import * as i5 from "@angular/material/form-field";
|
|
19
|
+
import * as i6 from "@angular/material/card";
|
|
20
|
+
import * as i7 from "@angular/material/chips";
|
|
21
|
+
import * as i8 from "@angular/material/icon";
|
|
22
|
+
import * as i9 from "@angular/material/autocomplete";
|
|
23
|
+
import * as i10 from "@angular/material/core";
|
|
24
|
+
import * as i11 from "@angular/material/radio";
|
|
25
|
+
import * as i12 from "@angular/material/button";
|
|
26
|
+
import * as i13 from "@angular/material/datepicker";
|
|
27
|
+
import * as i14 from "ngx-material-timepicker";
|
|
28
|
+
import * as i15 from "@angular/common";
|
|
29
|
+
import * as i16 from "@angular/forms";
|
|
30
|
+
import * as i17 from "@angular/material/input";
|
|
31
|
+
import * as i18 from "@angular/cdk/text-field";
|
|
32
|
+
const slugify = require('slugify');
|
|
33
|
+
export class EntryCreatorComponent {
|
|
34
|
+
constructor(entryService, tagService, identityService, cdr, dialog) {
|
|
35
|
+
this.entryService = entryService;
|
|
36
|
+
this.tagService = tagService;
|
|
37
|
+
this.identityService = identityService;
|
|
38
|
+
this.cdr = cdr;
|
|
39
|
+
this.dialog = dialog;
|
|
40
|
+
this.ContentType = ContentType;
|
|
41
|
+
this.Object = Object;
|
|
42
|
+
this.entry = new Entry();
|
|
43
|
+
this.separatorKeysCodes = [ENTER, COMMA, TAB];
|
|
44
|
+
this.removable = true;
|
|
45
|
+
this.all_tags = ['Angular', 'Bash', 'MacOS', 'Typescript', 'NPM', 'Databases'];
|
|
46
|
+
this.tagCtrl = new FormControl();
|
|
47
|
+
this.publishDateControl = new FormControl();
|
|
48
|
+
this.selectable = false;
|
|
49
|
+
this.scheduling = false;
|
|
50
|
+
this.customScheduleTime = '';
|
|
51
|
+
this.today = new Date();
|
|
52
|
+
this.allowedMimeTypes = [
|
|
53
|
+
'image/jpeg',
|
|
54
|
+
'image/gif',
|
|
55
|
+
'image/png',
|
|
56
|
+
'image/jpg',
|
|
57
|
+
'video/mp4',
|
|
58
|
+
'video/webm',
|
|
59
|
+
'video/ogg',
|
|
60
|
+
];
|
|
61
|
+
this.uploadUrlKey = 'path_to_file';
|
|
62
|
+
this.uploader = new FileUploader({
|
|
63
|
+
url: '/file_api/uploads/create_image/',
|
|
64
|
+
itemAlias: 'file',
|
|
65
|
+
authToken: '',
|
|
66
|
+
headers: [
|
|
67
|
+
{
|
|
68
|
+
name: 'X-CSRFToken',
|
|
69
|
+
value: EntryCreatorComponent.getCookie('csrftoken')
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
additionalParameter: {
|
|
73
|
+
'csrf_token': EntryCreatorComponent.getCookie('csrftoken')
|
|
74
|
+
},
|
|
75
|
+
removeAfterUpload: true,
|
|
76
|
+
allowedMimeType: this.allowedMimeTypes,
|
|
77
|
+
});
|
|
78
|
+
const scheduledDate = new Date();
|
|
79
|
+
this.customScheduleTime = scheduledDate.getHours() + ':' + scheduledDate.getMinutes() + ' AM';
|
|
80
|
+
}
|
|
81
|
+
static getCookie(name) {
|
|
82
|
+
const ca = document.cookie.split(';');
|
|
83
|
+
const caLen = ca.length;
|
|
84
|
+
const cookieName = `${name}=`;
|
|
85
|
+
let c;
|
|
86
|
+
for (let i = 0; i < caLen; i += 1) {
|
|
87
|
+
c = ca[i].replace(/^\s+/g, '');
|
|
88
|
+
if (c.indexOf(cookieName) === 0) {
|
|
89
|
+
return c.substring(cookieName.length, c.length);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return '';
|
|
93
|
+
}
|
|
94
|
+
_filter(value) {
|
|
95
|
+
const filterValue = value.toLowerCase();
|
|
96
|
+
return this.all_tags.filter(tag => tag.toLowerCase().indexOf(filterValue) === 0);
|
|
97
|
+
}
|
|
98
|
+
add(event) {
|
|
99
|
+
const input = event.input;
|
|
100
|
+
const value = event.value;
|
|
101
|
+
// Add our tag
|
|
102
|
+
if ((value || '').trim()) {
|
|
103
|
+
this.tags.push(value.trim());
|
|
104
|
+
}
|
|
105
|
+
// Reset the input value
|
|
106
|
+
if (input) {
|
|
107
|
+
input.value = '';
|
|
108
|
+
}
|
|
109
|
+
this.tagCtrl.setValue(null);
|
|
110
|
+
this.onChange();
|
|
111
|
+
}
|
|
112
|
+
remove(fruit) {
|
|
113
|
+
const index = this.tags.indexOf(fruit);
|
|
114
|
+
if (index >= 0) {
|
|
115
|
+
this.tags.splice(index, 1);
|
|
116
|
+
}
|
|
117
|
+
this.onChange();
|
|
118
|
+
}
|
|
119
|
+
selected(event) {
|
|
120
|
+
this.tags.push(event.option.viewValue);
|
|
121
|
+
this.tagInput.nativeElement.value = '';
|
|
122
|
+
this.tagCtrl.setValue(null);
|
|
123
|
+
this.onChange();
|
|
124
|
+
}
|
|
125
|
+
refreshTags() {
|
|
126
|
+
this.tagService.get().subscribe((response) => {
|
|
127
|
+
this.all_tags = loMap(response.results, (t) => t.label);
|
|
128
|
+
this.filtered_tags = this.tagCtrl.valueChanges.pipe(startWith(null), map((tag) => tag ? this._filter(tag) : this.all_tags.slice()));
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
createNewEntry() {
|
|
132
|
+
this.entry = new Entry();
|
|
133
|
+
this.entry.title = EntryCreatorComponent.DEFAULT_NEW_ENTRY_TITLE;
|
|
134
|
+
this.entry.published = false;
|
|
135
|
+
this.entry.version = 1;
|
|
136
|
+
this.entryService.create(this.entry).subscribe((response) => {
|
|
137
|
+
this.entry = response;
|
|
138
|
+
this.entry.sort();
|
|
139
|
+
setTimeout(() => {
|
|
140
|
+
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
141
|
+
}, 10);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
ngOnInit() {
|
|
145
|
+
this.refreshTags();
|
|
146
|
+
this.identityService.getMe().subscribe((me) => {
|
|
147
|
+
this.me = me;
|
|
148
|
+
});
|
|
149
|
+
const savedEntry = localStorage.getItem(EntryCreatorComponent.CURRENT_ENTRY);
|
|
150
|
+
if (savedEntry) {
|
|
151
|
+
this.entry = new Entry(JSON.parse(savedEntry));
|
|
152
|
+
if (this.entry.should_publish_in_future && this.entry.future_publish_date < new Date()) {
|
|
153
|
+
this.createNewEntry();
|
|
154
|
+
}
|
|
155
|
+
this.entry.sort();
|
|
156
|
+
if (this.entry.should_publish_in_future) {
|
|
157
|
+
// Restore scheduling settings
|
|
158
|
+
this.scheduling = true;
|
|
159
|
+
let hours = this.entry.future_publish_date.getHours();
|
|
160
|
+
let minutes = this.entry.future_publish_date.getMinutes();
|
|
161
|
+
const ampm = hours >= 12 ? 'PM' : 'AM';
|
|
162
|
+
if (hours >= 12) {
|
|
163
|
+
hours = hours % 12;
|
|
164
|
+
hours = hours ? hours : 12;
|
|
165
|
+
}
|
|
166
|
+
minutes = minutes < 10 ? '0' + minutes : minutes;
|
|
167
|
+
this.customScheduleTime = hours + ':' + minutes + ' ' + ampm;
|
|
168
|
+
}
|
|
169
|
+
setTimeout(() => {
|
|
170
|
+
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
171
|
+
}, 10);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
this.createNewEntry();
|
|
175
|
+
}
|
|
176
|
+
this.uploader.onCompleteItem = (item, response) => {
|
|
177
|
+
// const responseObj = JSON.parse(response)
|
|
178
|
+
// this.uploadId = responseObj.id;
|
|
179
|
+
};
|
|
180
|
+
this.uploader.onWhenAddingFileFailed = (item, uploadFilter, options) => {
|
|
181
|
+
// this.error = 'This file is not a supported mimetype.'
|
|
182
|
+
// this.uploading = false;
|
|
183
|
+
};
|
|
184
|
+
this.tags = this.entry.tags;
|
|
185
|
+
}
|
|
186
|
+
onFileSelected(e) {
|
|
187
|
+
this.uploader.uploadAll();
|
|
188
|
+
}
|
|
189
|
+
startUploader(content) {
|
|
190
|
+
const dialogRef = this.dialog.open(MediaUploadModalComponent, {});
|
|
191
|
+
dialogRef.componentInstance.allowedMimeTypes = this.allowedMimeTypes;
|
|
192
|
+
dialogRef.componentInstance.uploadUrlKey = this.uploadUrlKey;
|
|
193
|
+
dialogRef.afterClosed().subscribe(() => {
|
|
194
|
+
content.value = dialogRef.componentInstance.imgLink;
|
|
195
|
+
content.additional = [];
|
|
196
|
+
content.additional.push({ key: Content.KEY_MIMETYPE, value: dialogRef.componentInstance.mimeType });
|
|
197
|
+
this.onChange();
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
addSection() {
|
|
201
|
+
this.entry.sections.push(new Section());
|
|
202
|
+
this.onChange();
|
|
203
|
+
}
|
|
204
|
+
removeSection(section) {
|
|
205
|
+
const remove = confirm('Are you sure you want to remove this section?');
|
|
206
|
+
if (remove) {
|
|
207
|
+
this.entry.sections =
|
|
208
|
+
filter(this.entry.sections, (sct) => sct.id !== section.id);
|
|
209
|
+
this.onChange();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
addContent(section) {
|
|
213
|
+
section.contents.push(new Content());
|
|
214
|
+
this.onChange();
|
|
215
|
+
}
|
|
216
|
+
removeContent(content) {
|
|
217
|
+
const remove = confirm('Are you sure you want to remove this content?');
|
|
218
|
+
if (remove) {
|
|
219
|
+
for (const section of this.entry.sections) {
|
|
220
|
+
section.contents = filter(section.contents, (ct) => ct.id !== content.id);
|
|
221
|
+
}
|
|
222
|
+
this.onChange();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
onChange() {
|
|
226
|
+
this.entry.slug = slugify(this.entry.title).toLowerCase();
|
|
227
|
+
localStorage.setItem(EntryCreatorComponent.CURRENT_ENTRY, JSON.stringify(this.entry));
|
|
228
|
+
this.entry.sort();
|
|
229
|
+
this.cdr.detectChanges();
|
|
230
|
+
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
231
|
+
this.entryService._currentlyEditedEntry = this.entry;
|
|
232
|
+
}
|
|
233
|
+
resetDate() {
|
|
234
|
+
this.entry.create_date = new Date();
|
|
235
|
+
this.entry.edit_date = new Date();
|
|
236
|
+
this.onChange();
|
|
237
|
+
}
|
|
238
|
+
startNew() {
|
|
239
|
+
const finish = confirm('Are you sure your finished? The JSON and entry displayed will be removed. Make sure you have already copied it.');
|
|
240
|
+
if (finish) {
|
|
241
|
+
this.entry = new Entry();
|
|
242
|
+
this.entry.title = EntryCreatorComponent.DEFAULT_NEW_ENTRY_TITLE;
|
|
243
|
+
this.entry.published = false;
|
|
244
|
+
this.entry.version = 1;
|
|
245
|
+
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
246
|
+
localStorage.setItem(EntryCreatorComponent.CURRENT_ENTRY, JSON.stringify(this.entry));
|
|
247
|
+
this.entryService.create(this.entry).subscribe((next) => {
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
seeEntries() {
|
|
252
|
+
const dialogRef = this.dialog.open(EntrySelectorDialogComponent, {
|
|
253
|
+
width: '500px',
|
|
254
|
+
data: { name: 'test', animal: 'test' }
|
|
255
|
+
});
|
|
256
|
+
dialogRef.afterClosed().subscribe((id) => {
|
|
257
|
+
if (id) {
|
|
258
|
+
this.entryService.getUnpublishedById(id).subscribe((result) => {
|
|
259
|
+
const entry = result;
|
|
260
|
+
this.entryService.currentlyEditedEntry.next(entry);
|
|
261
|
+
localStorage.setItem(EntryCreatorComponent.CURRENT_ENTRY, JSON.stringify(entry));
|
|
262
|
+
this.entry = entry;
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
postPublishCallback() {
|
|
268
|
+
this.entry = new Entry();
|
|
269
|
+
this.entry.title = EntryCreatorComponent.DEFAULT_NEW_ENTRY_TITLE;
|
|
270
|
+
this.entry.published = false;
|
|
271
|
+
this.entry.version = 1;
|
|
272
|
+
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
273
|
+
localStorage.setItem(EntryCreatorComponent.CURRENT_ENTRY, JSON.stringify(this.entry));
|
|
274
|
+
this.entryService.create(this.entry).subscribe((next) => {
|
|
275
|
+
this.tags = [];
|
|
276
|
+
this.refreshTags();
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
cancelScheduling() {
|
|
280
|
+
this.entry.future_publish_date = null;
|
|
281
|
+
this.entry.should_publish_in_future = false;
|
|
282
|
+
this.scheduling = false;
|
|
283
|
+
this.onChange();
|
|
284
|
+
}
|
|
285
|
+
exposeScheduling() {
|
|
286
|
+
const scheduledDate = new Date();
|
|
287
|
+
scheduledDate.setDate(scheduledDate.getDate() + 1);
|
|
288
|
+
this.entry.future_publish_date = scheduledDate;
|
|
289
|
+
this.setTime(this.customScheduleTime);
|
|
290
|
+
this.entry.should_publish_in_future = true;
|
|
291
|
+
this.scheduling = true;
|
|
292
|
+
this.onChange();
|
|
293
|
+
}
|
|
294
|
+
publish() {
|
|
295
|
+
const publish = confirm('Are you sure you want to publish? Once an article is published it is available to everyone.');
|
|
296
|
+
if (publish) {
|
|
297
|
+
this.entry.published = true;
|
|
298
|
+
this.entry.publish_date = new Date();
|
|
299
|
+
this.entry.edit_date = new Date();
|
|
300
|
+
this.entryService.updateUnpublishedEntry(this.entry).subscribe(this.postPublishCallback.bind(this));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
delete() {
|
|
304
|
+
const confirmDelete = confirm('Are you sure you want to delete this draft? Once it is deleted it cannot be recovered.');
|
|
305
|
+
if (confirmDelete) {
|
|
306
|
+
this.entryService.delete(this.entry).subscribe(() => {
|
|
307
|
+
this.entry = null;
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
onDateChange() {
|
|
312
|
+
this.entry.future_publish_date.setHours(this.hours);
|
|
313
|
+
this.entry.future_publish_date.setMinutes(this.minutes);
|
|
314
|
+
this.onChange();
|
|
315
|
+
}
|
|
316
|
+
setTime(e) {
|
|
317
|
+
const firstTimeSplit = e.split(' ');
|
|
318
|
+
const secondTimeSplit = firstTimeSplit[0].split(':');
|
|
319
|
+
this.hours = Number(secondTimeSplit[0]);
|
|
320
|
+
this.minutes = Number(secondTimeSplit[1]);
|
|
321
|
+
if (firstTimeSplit[1] === 'PM') {
|
|
322
|
+
this.hours = Number(this.hours) + 12;
|
|
323
|
+
}
|
|
324
|
+
this.entry.future_publish_date.setHours(this.hours);
|
|
325
|
+
this.entry.future_publish_date.setMinutes(this.minutes);
|
|
326
|
+
this.onChange();
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
EntryCreatorComponent.CURRENT_ENTRY = 'current_entry';
|
|
330
|
+
EntryCreatorComponent.DEFAULT_NEW_ENTRY_TITLE = 'A New Entry';
|
|
331
|
+
EntryCreatorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: EntryCreatorComponent, deps: [{ token: i1.EntryService }, { token: i2.TagService }, { token: i3.IdentityService }, { token: i0.ChangeDetectorRef }, { token: i4.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
332
|
+
EntryCreatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: EntryCreatorComponent, selector: "app-entry-creator", inputs: { allowedMimeTypes: "allowedMimeTypes", uploadUrlKey: "uploadUrlKey" }, viewQueries: [{ propertyName: "tagInput", first: true, predicate: ["tagInput"], descendants: true }, { propertyName: "matAutocomplete", first: true, predicate: ["tagauto"], descendants: true }], ngImport: i0, template: "<div class=\"section creator fields\">\n <form #createForm=\"ngForm\" (change)=\"onChange()\" *ngIf=\"this.entry\">\n <div class=\"form-group\">\n <mat-form-field class=\"full-width\">\n <mat-label>Title</mat-label>\n <input matInput\n [(ngModel)]=\"entry.title\"\n name=\"title\">\n </mat-form-field>\n </div>\n <mat-card class=\"form-section tags\">\n <div>\n <mat-form-field class=\"full-width\" hintLabel=\"Use a comma to seperate different tags\">\n <mat-chip-list #tagList aria-label=\"Tags\">\n <mat-chip\n *ngFor=\"let tag of tags\"\n [selectable]=\"selectable\"\n [removable]=\"removable\"\n (removed)=\"remove(tag)\">\n {{tag}}\n <mat-icon matChipRemove *ngIf=\"removable\">cancel</mat-icon>\n </mat-chip>\n <input\n matInput\n placeholder=\"Tags...\"\n #tagInput\n [formControl]=\"tagCtrl\"\n [matAutocomplete]=\"tagauto\"\n [matChipInputFor]=\"tagList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"add($event)\">\n </mat-chip-list>\n <mat-autocomplete #tagauto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\n <mat-option *ngFor=\"let tag of filtered_tags | async\" [value]=\"tag\">\n {{tag}}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n </mat-card>\n <mat-card class=\"form-section\" *ngFor=\"let section of entry.sections\">\n <div>\n <mat-form-field class=\"full-width\">\n <mat-label>Subheading</mat-label>\n <input matInput\n [(ngModel)]=\"section.subheading\"\n name=\"{{section.id}}-subheading\">\n </mat-form-field>\n <div class=\"form-content\" *ngFor=\"let content of section.contents\">\n <div class=\"form-group\">\n <mat-radio-group\n aria-label=\"Select the Content Type\"\n name=\"{{content.id}}-content-type\"\n class=\"radio-group\"\n [(ngModel)]=\"content.type\">\n <mat-radio-button\n *ngFor=\"let value of Object.values(ContentType)\"\n class=\"radio-button\"\n [value]=\"value\">{{value}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n <ng-container [ngSwitch]=\"content.type\">\n <ng-container *ngSwitchCase=\"ContentType.URL\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Title</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-title\"\n [(ngModel)]=\"content.title\">\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.TEXT\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <textarea matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"3\"\n cdkAutosizeMaxRows=\"20\"\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\"\n ></textarea>\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.HTML\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <textarea matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"3\"\n cdkAutosizeMaxRows=\"20\"\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\"\n ></textarea>\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.CODE\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <textarea matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"10\"\n cdkAutosizeMaxRows=\"100\"\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\"\n ></textarea>\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.IMAGE\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-source\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Description</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-description\"\n [(ngModel)]=\"content.description\">\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.MEDIA\">\n <div class=\"full-width\">\n <ng-container *ngIf=\"content.value\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Description</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-description\"\n [(ngModel)]=\"content.description\">\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"content.additional\">\n <ng-container *ngFor=\"let add of content.additional\">\n <mat-form-field class=\"full-width\">\n <mat-label>{{add.key}}</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-{{add.key}}\"\n [(ngModel)]=\"add.value\"\n [disabled]=\"true\"\n >\n </mat-form-field>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!content.value\">\n <button mat-raised-button (click)=startUploader(content)>Upload</button>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n <button mat-raised-button (click)=removeContent(content)>Remove Content</button>\n <button mat-raised-button (click)=\"addContent(section)\">+ Add Content</button>\n </div>\n <button mat-raised-button (click)=\"removeSection(section)\">Remove Section</button>\n <button mat-raised-button (click)=\"addContent(section)\" *ngIf=\"section.contents.length === 0\">+ Add\n Content\n </button>\n <button mat-raised-button (click)=\"addSection()\">+ Add Section</button>\n </div>\n\n </mat-card>\n <button mat-raised-button (click)=\"addSection()\" *ngIf=\"entry.sections?.length === 0\">+ Add Section</button>\n <button mat-raised-button (click)=\"addSection()\" *ngIf=\"!entry.sections\">+ Add Section</button>\n\n <div class=\"controls\">\n <button mat-raised-button (click)=\"resetDate()\">Reset the Date</button>\n <button mat-raised-button (click)=\"delete()\">Delete</button>\n <button mat-raised-button [disabled]=\"scheduling\" (click)=\"publish()\">Publish</button>\n <button mat-raised-button [disabled]=\"scheduling\" (click)=\"exposeScheduling()\">Schedule</button>\n <button mat-raised-button (click)=\"startNew()\">New</button>\n </div>\n <p *ngIf=\"scheduling\">Publishing is disabled while scheduling is being used.</p>\n\n <mat-card [hidden]=\"!scheduling\">\n <h4>\n Scheduling Options\n </h4>\n\n <div class=\"form-group\">\n <mat-form-field class=\"full-width\">\n <mat-label>Date</mat-label>\n <input\n #futurePublishDate\n matInput\n [matDatepicker]=\"picker\"\n [min]=\"today\"\n (dateInput)=\"onDateChange()\"\n (dateChange)=\"onDateChange()\"\n [(ngModel)]=\"entry.future_publish_date\"\n name=\"future-publish-date\"\n >\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker\n #picker></mat-datepicker>\n </mat-form-field>\n\n <mat-label>Time</mat-label>\n <ngx-timepicker-field\n [defaultTime]=\"customScheduleTime\"\n [format]=\"12\"\n [buttonAlign]=\"'left'\"\n (timeChanged)=\"setTime($event)\"\n ></ngx-timepicker-field>\n <p>Times are represented in your local time zone</p>\n </div>\n\n <div mat-dialog-actions>\n <div class=\"controls\">\n <button mat-raised-button (click)=\"cancelScheduling()\">Cancel Scheduling</button>\n </div>\n </div>\n <p>This post will be published as soon as its scheduled date and time arrive. No further action is needed by you. If you do not\n want to use scheduling, you can cancel scheduling and manually publish.</p>\n </mat-card>\n </form>\n <div class=\"controls\">\n <button mat-raised-button (click)=\"seeEntries()\">See Entries</button>\n <button *ngIf=\"!this.entry\" mat-raised-button (click)=\"startNew()\">New</button>\n </div>\n</div>\n", styles: [".creator{min-height:calc(100vh - 100px)}form{padding:20px}.content{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}button{margin:4px}.radio-group{display:flex;flex-direction:column;margin:15px 0}.radio-button{margin:4px}.full-width{width:100%}.content-card{margin:0 0 10px}.form-section{margin-bottom:10px}.form-content:not(:last-child){border-bottom:1px dotted #aaa;padding-bottom:10px}.controls{display:inline-block;width:100%;padding:10px}[hidden]{display:none!important}\n"], components: [{ type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i6.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i7.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i9.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i10.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i11.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { type: i12.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i13.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { type: i13.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { type: i14.NgxTimepickerFieldComponent, selector: "ngx-timepicker-field", inputs: ["buttonAlign", "format", "min", "max", "defaultTime", "disabled", "toggleIcon", "clockTheme", "controlOnly", "cancelBtnTmpl", "confirmBtnTmpl"], outputs: ["timeChanged"] }], directives: [{ type: i15.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i16.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i16.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i16.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.MatLabel, selector: "mat-label" }, { type: i17.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i16.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i16.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i16.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i15.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i7.MatChipRemove, selector: "[matChipRemove]" }, { type: i9.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i7.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i16.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i11.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { type: i15.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i15.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i18.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { type: i13.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { type: i5.MatSuffix, selector: "[matSuffix]" }, { type: i4.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }], pipes: { "async": i15.AsyncPipe } });
|
|
333
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: EntryCreatorComponent, decorators: [{
|
|
334
|
+
type: Component,
|
|
335
|
+
args: [{ selector: 'app-entry-creator', template: "<div class=\"section creator fields\">\n <form #createForm=\"ngForm\" (change)=\"onChange()\" *ngIf=\"this.entry\">\n <div class=\"form-group\">\n <mat-form-field class=\"full-width\">\n <mat-label>Title</mat-label>\n <input matInput\n [(ngModel)]=\"entry.title\"\n name=\"title\">\n </mat-form-field>\n </div>\n <mat-card class=\"form-section tags\">\n <div>\n <mat-form-field class=\"full-width\" hintLabel=\"Use a comma to seperate different tags\">\n <mat-chip-list #tagList aria-label=\"Tags\">\n <mat-chip\n *ngFor=\"let tag of tags\"\n [selectable]=\"selectable\"\n [removable]=\"removable\"\n (removed)=\"remove(tag)\">\n {{tag}}\n <mat-icon matChipRemove *ngIf=\"removable\">cancel</mat-icon>\n </mat-chip>\n <input\n matInput\n placeholder=\"Tags...\"\n #tagInput\n [formControl]=\"tagCtrl\"\n [matAutocomplete]=\"tagauto\"\n [matChipInputFor]=\"tagList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"add($event)\">\n </mat-chip-list>\n <mat-autocomplete #tagauto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\n <mat-option *ngFor=\"let tag of filtered_tags | async\" [value]=\"tag\">\n {{tag}}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n </mat-card>\n <mat-card class=\"form-section\" *ngFor=\"let section of entry.sections\">\n <div>\n <mat-form-field class=\"full-width\">\n <mat-label>Subheading</mat-label>\n <input matInput\n [(ngModel)]=\"section.subheading\"\n name=\"{{section.id}}-subheading\">\n </mat-form-field>\n <div class=\"form-content\" *ngFor=\"let content of section.contents\">\n <div class=\"form-group\">\n <mat-radio-group\n aria-label=\"Select the Content Type\"\n name=\"{{content.id}}-content-type\"\n class=\"radio-group\"\n [(ngModel)]=\"content.type\">\n <mat-radio-button\n *ngFor=\"let value of Object.values(ContentType)\"\n class=\"radio-button\"\n [value]=\"value\">{{value}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n <ng-container [ngSwitch]=\"content.type\">\n <ng-container *ngSwitchCase=\"ContentType.URL\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Title</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-title\"\n [(ngModel)]=\"content.title\">\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.TEXT\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <textarea matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"3\"\n cdkAutosizeMaxRows=\"20\"\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\"\n ></textarea>\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.HTML\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <textarea matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"3\"\n cdkAutosizeMaxRows=\"20\"\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\"\n ></textarea>\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.CODE\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <textarea matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"10\"\n cdkAutosizeMaxRows=\"100\"\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\"\n ></textarea>\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.IMAGE\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-source\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Description</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-description\"\n [(ngModel)]=\"content.description\">\n </mat-form-field>\n </ng-container>\n <ng-container *ngSwitchCase=\"ContentType.MEDIA\">\n <div class=\"full-width\">\n <ng-container *ngIf=\"content.value\">\n <mat-form-field class=\"full-width\">\n <mat-label>Value</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-value\"\n [(ngModel)]=\"content.value\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>Description</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-description\"\n [(ngModel)]=\"content.description\">\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"content.additional\">\n <ng-container *ngFor=\"let add of content.additional\">\n <mat-form-field class=\"full-width\">\n <mat-label>{{add.key}}</mat-label>\n <input\n matInput\n name=\"{{content.id}}-content-{{add.key}}\"\n [(ngModel)]=\"add.value\"\n [disabled]=\"true\"\n >\n </mat-form-field>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!content.value\">\n <button mat-raised-button (click)=startUploader(content)>Upload</button>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n <button mat-raised-button (click)=removeContent(content)>Remove Content</button>\n <button mat-raised-button (click)=\"addContent(section)\">+ Add Content</button>\n </div>\n <button mat-raised-button (click)=\"removeSection(section)\">Remove Section</button>\n <button mat-raised-button (click)=\"addContent(section)\" *ngIf=\"section.contents.length === 0\">+ Add\n Content\n </button>\n <button mat-raised-button (click)=\"addSection()\">+ Add Section</button>\n </div>\n\n </mat-card>\n <button mat-raised-button (click)=\"addSection()\" *ngIf=\"entry.sections?.length === 0\">+ Add Section</button>\n <button mat-raised-button (click)=\"addSection()\" *ngIf=\"!entry.sections\">+ Add Section</button>\n\n <div class=\"controls\">\n <button mat-raised-button (click)=\"resetDate()\">Reset the Date</button>\n <button mat-raised-button (click)=\"delete()\">Delete</button>\n <button mat-raised-button [disabled]=\"scheduling\" (click)=\"publish()\">Publish</button>\n <button mat-raised-button [disabled]=\"scheduling\" (click)=\"exposeScheduling()\">Schedule</button>\n <button mat-raised-button (click)=\"startNew()\">New</button>\n </div>\n <p *ngIf=\"scheduling\">Publishing is disabled while scheduling is being used.</p>\n\n <mat-card [hidden]=\"!scheduling\">\n <h4>\n Scheduling Options\n </h4>\n\n <div class=\"form-group\">\n <mat-form-field class=\"full-width\">\n <mat-label>Date</mat-label>\n <input\n #futurePublishDate\n matInput\n [matDatepicker]=\"picker\"\n [min]=\"today\"\n (dateInput)=\"onDateChange()\"\n (dateChange)=\"onDateChange()\"\n [(ngModel)]=\"entry.future_publish_date\"\n name=\"future-publish-date\"\n >\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker\n #picker></mat-datepicker>\n </mat-form-field>\n\n <mat-label>Time</mat-label>\n <ngx-timepicker-field\n [defaultTime]=\"customScheduleTime\"\n [format]=\"12\"\n [buttonAlign]=\"'left'\"\n (timeChanged)=\"setTime($event)\"\n ></ngx-timepicker-field>\n <p>Times are represented in your local time zone</p>\n </div>\n\n <div mat-dialog-actions>\n <div class=\"controls\">\n <button mat-raised-button (click)=\"cancelScheduling()\">Cancel Scheduling</button>\n </div>\n </div>\n <p>This post will be published as soon as its scheduled date and time arrive. No further action is needed by you. If you do not\n want to use scheduling, you can cancel scheduling and manually publish.</p>\n </mat-card>\n </form>\n <div class=\"controls\">\n <button mat-raised-button (click)=\"seeEntries()\">See Entries</button>\n <button *ngIf=\"!this.entry\" mat-raised-button (click)=\"startNew()\">New</button>\n </div>\n</div>\n", styles: [".creator{min-height:calc(100vh - 100px)}form{padding:20px}.content{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}button{margin:4px}.radio-group{display:flex;flex-direction:column;margin:15px 0}.radio-button{margin:4px}.full-width{width:100%}.content-card{margin:0 0 10px}.form-section{margin-bottom:10px}.form-content:not(:last-child){border-bottom:1px dotted #aaa;padding-bottom:10px}.controls{display:inline-block;width:100%;padding:10px}[hidden]{display:none!important}\n"] }]
|
|
336
|
+
}], ctorParameters: function () { return [{ type: i1.EntryService }, { type: i2.TagService }, { type: i3.IdentityService }, { type: i0.ChangeDetectorRef }, { type: i4.MatDialog }]; }, propDecorators: { tagInput: [{
|
|
337
|
+
type: ViewChild,
|
|
338
|
+
args: ['tagInput']
|
|
339
|
+
}], matAutocomplete: [{
|
|
340
|
+
type: ViewChild,
|
|
341
|
+
args: ['tagauto']
|
|
342
|
+
}], allowedMimeTypes: [{
|
|
343
|
+
type: Input
|
|
344
|
+
}], uploadUrlKey: [{
|
|
345
|
+
type: Input
|
|
346
|
+
}] } });
|
|
347
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cnktY3JlYXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvY29tcG9uZW50cy9lbnRyeS1jcmVhdG9yL2VudHJ5LWNyZWF0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2NvbXBvbmVudHMvZW50cnktY3JlYXRvci9lbnRyeS1jcmVhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBb0IsU0FBUyxFQUFVLFNBQVMsRUFBb0MsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXZILE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQU1wRCxPQUFPLEVBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxNQUFNLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFHNUMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sd0VBQXdFLENBQUM7QUFDcEgsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGtFQUFrRSxDQUFDO0FBRTNHLE9BQU8sRUFBQyxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUkz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QUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUN4QztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7O0FBNVhNLG1DQUFhLEdBQUcsZUFBZSxDQUFDO0FBQ2hDLDZDQUF1QixHQUFHLGFBQWEsQ0FBQztrSEFIdEMscUJBQXFCO3NHQUFyQixxQkFBcUIsNFVDL0JsQyx1dGJBd1BBOzJGRHpOYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0ksbUJBQW1CO2tOQW9CTixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ0MsZUFBZTtzQkFBcEMsU0FBUzt1QkFBQyxTQUFTO2dCQWNYLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFVRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDT01NQSwgRU5URVIsIFRBQn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7RW50cnl9IGZyb20gJy4uLy4uL2RhdGEvZW50cnknO1xuaW1wb3J0IHtTZWN0aW9ufSBmcm9tICcuLi8uLi9kYXRhL3NlY3Rpb24nO1xuaW1wb3J0IHtDb250ZW50fSBmcm9tICcuLi8uLi9kYXRhL2NvbnRlbnQnO1xuaW1wb3J0IHtDb250ZW50VHlwZX0gZnJvbSAnLi4vLi4vZGF0YS9jb250ZW50LXR5cGUnO1xuaW1wb3J0IHtJZGVudGl0eX0gZnJvbSAnLi4vLi4vZGF0YS9pZGVudGl0eSc7XG5cbmltcG9ydCB7RW50cnlTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbnRyeS5zZXJ2aWNlJztcbmltcG9ydCB7SWRlbnRpdHlTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pZGVudGl0eS5zZXJ2aWNlJztcblxuaW1wb3J0IHttYXAgYXMgbG9NYXAsIGZpbHRlcn0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHtNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LCBNYXRBdXRvY29tcGxldGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQge0VudHJ5U2VsZWN0b3JEaWFsb2dDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZW50cnktc2VsZWN0b3ItZGlhbG9nL2VudHJ5LXNlbGVjdG9yLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHtGaWxlVXBsb2FkZXJ9IGZyb20gJ25nMi1maWxlLXVwbG9hZCc7XG5pbXBvcnQge01lZGlhVXBsb2FkTW9kYWxDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbWVkaWEtdXBsb2FkLW1vZGFsL21lZGlhLXVwbG9hZC1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7bWFwLCBzdGFydFdpdGh9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TWF0Q2hpcElucHV0RXZlbnR9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcbmltcG9ydCB7VGFnU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFnLnNlcnZpY2UnO1xuaW1wb3J0IHtTY2hlZHVsZVB1Ymxpc2hEaWFsb2dDb21wb25lbnR9IGZyb20gJy4uL3NjaGVkdWxlLXB1Ymxpc2gtZGlhbG9nL3NjaGVkdWxlLXB1Ymxpc2gtZGlhbG9nLmNvbXBvbmVudCc7XG5jb25zdCBzbHVnaWZ5ID0gcmVxdWlyZSgnc2x1Z2lmeScpO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1lbnRyeS1jcmVhdG9yJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZW50cnktY3JlYXRvci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZW50cnktY3JlYXRvci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEVudHJ5Q3JlYXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBzdGF0aWMgQ1VSUkVOVF9FTlRSWSA9ICdjdXJyZW50X2VudHJ5JztcbiAgICBzdGF0aWMgREVGQVVMVF9ORVdfRU5UUllfVElUTEUgPSAnQSBOZXcgRW50cnknO1xuXG4gICAgQ29udGVudFR5cGUgPSBDb250ZW50VHlwZTtcbiAgICBPYmplY3QgPSBPYmplY3Q7XG5cbiAgICBlbnRyeTogRW50cnkgPSBuZXcgRW50cnkoKTtcbiAgICBtZTogSWRlbnRpdHk7XG5cbiAgICBzZXBhcmF0b3JLZXlzQ29kZXM6IG51bWJlcltdID0gW0VOVEVSLCBDT01NQSwgVEFCXTtcbiAgICByZW1vdmFibGUgPSB0cnVlO1xuICAgIHRhZ3M6IHN0cmluZ1tdO1xuICAgIGFsbF90YWdzOiBzdHJpbmdbXSA9IFsnQW5ndWxhcicsICdCYXNoJywgJ01hY09TJywgJ1R5cGVzY3JpcHQnLCAnTlBNJywgJ0RhdGFiYXNlcyddO1xuICAgIGZpbHRlcmVkX3RhZ3M6IE9ic2VydmFibGU8c3RyaW5nW10+O1xuICAgIEBWaWV3Q2hpbGQoJ3RhZ0lucHV0JykgdGFnSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gICAgQFZpZXdDaGlsZCgndGFnYXV0bycpIG1hdEF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlO1xuXG4gICAgdGFnQ3RybCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICAgIHB1Ymxpc2hEYXRlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuXG4gICAgdGFnX3RvX2FkZDogc3RyaW5nO1xuICAgIHNlbGVjdGFibGUgPSBmYWxzZTtcblxuICAgIHNjaGVkdWxpbmcgPSBmYWxzZTtcbiAgICBjdXN0b21TY2hlZHVsZVRpbWUgPSAnJztcbiAgICB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgaG91cnM6IG51bWJlcjtcbiAgICBtaW51dGVzOiBudW1iZXI7XG5cbiAgICBASW5wdXQoKSBhbGxvd2VkTWltZVR5cGVzID0gW1xuICAgICAgICAgICAgICAgICdpbWFnZS9qcGVnJyxcbiAgICAgICAgICAgICAgICAnaW1hZ2UvZ2lmJyxcbiAgICAgICAgICAgICAgICAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICAgICAgICAnaW1hZ2UvanBnJyxcbiAgICAgICAgICAgICAgICAndmlkZW8vbXA0JyxcbiAgICAgICAgICAgICAgICAndmlkZW8vd2VibScsXG4gICAgICAgICAgICAgICAgJ3ZpZGVvL29nZycsXG4gICAgXTtcblxuICAgIEBJbnB1dCgpIHVwbG9hZFVybEtleSA9ICdwYXRoX3RvX2ZpbGUnO1xuXG4gICAgcHVibGljIHVwbG9hZGVyOiBGaWxlVXBsb2FkZXIgPSBuZXcgRmlsZVVwbG9hZGVyKFxuICAgICAgICB7XG4gICAgICAgICAgICB1cmw6ICcvZmlsZV9hcGkvdXBsb2Fkcy9jcmVhdGVfaW1hZ2UvJyxcbiAgICAgICAgICAgIGl0ZW1BbGlhczogJ2ZpbGUnLFxuICAgICAgICAgICAgYXV0aFRva2VuOiAnJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdYLUNTUkZUb2tlbicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBFbnRyeUNyZWF0b3JDb21wb25lbnQuZ2V0Q29va2llKCdjc3JmdG9rZW4nKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgYWRkaXRpb25hbFBhcmFtZXRlcjoge1xuICAgICAgICAgICAgICAgICdjc3JmX3Rva2VuJzogRW50cnlDcmVhdG9yQ29tcG9uZW50LmdldENvb2tpZSgnY3NyZnRva2VuJylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZW1vdmVBZnRlclVwbG9hZDogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNaW1lVHlwZTogdGhpcy5hbGxvd2VkTWltZVR5cGVzLFxuICAgICAgICB9XG4gICAgKTtcblxuICAgIHN0YXRpYyBnZXRDb29raWUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGNhOiBBcnJheTxzdHJpbmc+ID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgIGNvbnN0IGNhTGVuOiBudW1iZXIgPSBjYS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvb2tpZU5hbWUgPSBgJHtuYW1lfT1gO1xuICAgICAgICBsZXQgYzogc3RyaW5nO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgYyA9IGNhW2ldLnJlcGxhY2UoL15cXHMrL2csICcnKTtcbiAgICAgICAgICAgIGlmIChjLmluZGV4T2YoY29va2llTmFtZSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcoY29va2llTmFtZS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZW50cnlTZXJ2aWNlOiBFbnRyeVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdGFnU2VydmljZTogVGFnU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBpZGVudGl0eVNlcnZpY2U6IElkZW50aXR5U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgICkge1xuICAgICAgICBjb25zdCBzY2hlZHVsZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgdGhpcy5jdXN0b21TY2hlZHVsZVRpbWUgPSBzY2hlZHVsZWREYXRlLmdldEhvdXJzKCkgKyAnOicgKyBzY2hlZHVsZWREYXRlLmdldE1pbnV0ZXMoKSArICcgQU0nO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2ZpbHRlcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFsbF90YWdzLmZpbHRlcih0YWcgPT4gdGFnLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmaWx0ZXJWYWx1ZSkgPT09IDApO1xuICAgIH1cblxuICAgIGFkZChldmVudDogTWF0Q2hpcElucHV0RXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC5pbnB1dDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBldmVudC52YWx1ZTtcblxuICAgICAgICAvLyBBZGQgb3VyIHRhZ1xuICAgICAgICBpZiAoKHZhbHVlIHx8ICcnKS50cmltKCkpIHtcbiAgICAgICAgICAgIHRoaXMudGFncy5wdXNoKHZhbHVlLnRyaW0oKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCB0aGUgaW5wdXQgdmFsdWVcbiAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50YWdDdHJsLnNldFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlKGZydWl0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRhZ3MuaW5kZXhPZihmcnVpdCk7XG5cbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMudGFncy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhZ3MucHVzaChldmVudC5vcHRpb24udmlld1ZhbHVlKTtcbiAgICAgICAgdGhpcy50YWdJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMudGFnQ3RybC5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIHJlZnJlc2hUYWdzKCkge1xuICAgICAgICB0aGlzLnRhZ1NlcnZpY2UuZ2V0KCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGxfdGFncyA9IGxvTWFwKHJlc3BvbnNlLnJlc3VsdHMsICh0KSA9PiB0LmxhYmVsKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRfdGFncyA9IHRoaXMudGFnQ3RybC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICAgICAgICAgICAgbWFwKCh0YWc6IHN0cmluZyB8IG51bGwpID0+IHRhZyA/IHRoaXMuX2ZpbHRlcih0YWcpIDogdGhpcy5hbGxfdGFncy5zbGljZSgpKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNyZWF0ZU5ld0VudHJ5KCkge1xuICAgICAgICB0aGlzLmVudHJ5ID0gbmV3IEVudHJ5KCk7XG4gICAgICAgIHRoaXMuZW50cnkudGl0bGUgPSBFbnRyeUNyZWF0b3JDb21wb25lbnQuREVGQVVMVF9ORVdfRU5UUllfVElUTEU7XG4gICAgICAgIHRoaXMuZW50cnkucHVibGlzaGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW50cnkudmVyc2lvbiA9IDE7XG5cbiAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuY3JlYXRlKHRoaXMuZW50cnkpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW50cnkgPSByZXNwb25zZTtcbiAgICAgICAgICAgIHRoaXMuZW50cnkuc29ydCgpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuY3VycmVudGx5RWRpdGVkRW50cnkubmV4dCh0aGlzLmVudHJ5KTtcbiAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucmVmcmVzaFRhZ3MoKTtcbiAgICAgICAgdGhpcy5pZGVudGl0eVNlcnZpY2UuZ2V0TWUoKS5zdWJzY3JpYmUoKG1lKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lID0gbWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNhdmVkRW50cnkgPVxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oRW50cnlDcmVhdG9yQ29tcG9uZW50LkNVUlJFTlRfRU5UUlkpO1xuXG4gICAgICAgIGlmIChzYXZlZEVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmVudHJ5ID0gbmV3IEVudHJ5KEpTT04ucGFyc2Uoc2F2ZWRFbnRyeSkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5lbnRyeS5zaG91bGRfcHVibGlzaF9pbl9mdXR1cmUgJiYgdGhpcy5lbnRyeS5mdXR1cmVfcHVibGlzaF9kYXRlIDwgbmV3IERhdGUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTmV3RW50cnkoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lbnRyeS5zb3J0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5lbnRyeS5zaG91bGRfcHVibGlzaF9pbl9mdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHNjaGVkdWxpbmcgc2V0dGluZ3NcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBob3VycyA9IHRoaXMuZW50cnkuZnV0dXJlX3B1Ymxpc2hfZGF0ZS5nZXRIb3VycygpO1xuICAgICAgICAgICAgICAgIGxldCBtaW51dGVzOiBzdHJpbmcgfCBudW1iZXIgPSB0aGlzLmVudHJ5LmZ1dHVyZV9wdWJsaXNoX2RhdGUuZ2V0TWludXRlcygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFtcG0gPSBob3VycyA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgICAgICAgICAgICAgIGlmIChob3VycyA+PSAxMikge1xuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGhvdXJzICUgMTI7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzID0gaG91cnMgPyBob3VycyA6IDEyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtaW51dGVzID0gbWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXM7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXN0b21TY2hlZHVsZVRpbWUgPSBob3VycyArICc6JyArIG1pbnV0ZXMgKyAnICcgKyBhbXBtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuY3VycmVudGx5RWRpdGVkRW50cnkubmV4dCh0aGlzLmVudHJ5KTtcbiAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTmV3RW50cnkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBsb2FkZXIub25Db21wbGV0ZUl0ZW0gPSAoaXRlbSwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnN0IHJlc3BvbnNlT2JqID0gSlNPTi5wYXJzZShyZXNwb25zZSlcbiAgICAgICAgICAgIC8vIHRoaXMudXBsb2FkSWQgPSByZXNwb25zZU9iai5pZDtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnVwbG9hZGVyLm9uV2hlbkFkZGluZ0ZpbGVGYWlsZWQgPSAoaXRlbSwgdXBsb2FkRmlsdGVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAvLyB0aGlzLmVycm9yID0gJ1RoaXMgZmlsZSBpcyBub3QgYSBzdXBwb3J0ZWQgbWltZXR5cGUuJ1xuICAgICAgICAgICAgLy8gdGhpcy51cGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnRhZ3MgPSB0aGlzLmVudHJ5LnRhZ3M7XG4gICAgfVxuXG4gICAgb25GaWxlU2VsZWN0ZWQoZSkge1xuICAgICAgICB0aGlzLnVwbG9hZGVyLnVwbG9hZEFsbCgpO1xuICAgIH1cblxuICAgIHN0YXJ0VXBsb2FkZXIoY29udGVudCkge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKE1lZGlhVXBsb2FkTW9kYWxDb21wb25lbnQsIHtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5hbGxvd2VkTWltZVR5cGVzID0gdGhpcy5hbGxvd2VkTWltZVR5cGVzO1xuICAgICAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UudXBsb2FkVXJsS2V5ID0gdGhpcy51cGxvYWRVcmxLZXk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb250ZW50LnZhbHVlID0gZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmltZ0xpbms7XG4gICAgICAgICAgICBjb250ZW50LmFkZGl0aW9uYWwgPSBbXTtcbiAgICAgICAgICAgIGNvbnRlbnQuYWRkaXRpb25hbC5wdXNoKHtrZXk6IENvbnRlbnQuS0VZX01JTUVUWVBFLCB2YWx1ZTogZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLm1pbWVUeXBlfSk7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZFNlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZW50cnkuc2VjdGlvbnMucHVzaChuZXcgU2VjdGlvbigpKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZVNlY3Rpb24oc2VjdGlvbikge1xuICAgICAgICBjb25zdCByZW1vdmUgPSBjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgc2VjdGlvbj8nKTtcbiAgICAgICAgaWYgKHJlbW92ZSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyeS5zZWN0aW9ucyA9XG4gICAgICAgICAgICAgICAgZmlsdGVyKHRoaXMuZW50cnkuc2VjdGlvbnMsIChzY3QpID0+IHNjdC5pZCAhPT0gc2VjdGlvbi5pZCk7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRDb250ZW50KHNlY3Rpb24pIHtcbiAgICAgICAgc2VjdGlvbi5jb250ZW50cy5wdXNoKG5ldyBDb250ZW50KCkpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQ29udGVudChjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IGNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhpcyBjb250ZW50PycpO1xuXG4gICAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLmVudHJ5LnNlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbi5jb250ZW50cyA9IGZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5jb250ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgKGN0KSA9PiBjdC5pZCAhPT0gY29udGVudC5pZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5lbnRyeS5zbHVnID0gc2x1Z2lmeSh0aGlzLmVudHJ5LnRpdGxlKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgIEVudHJ5Q3JlYXRvckNvbXBvbmVudC5DVVJSRU5UX0VOVFJZLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5lbnRyeSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lbnRyeS5zb3J0KCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuY3VycmVudGx5RWRpdGVkRW50cnkubmV4dCh0aGlzLmVudHJ5KTtcbiAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuX2N1cnJlbnRseUVkaXRlZEVudHJ5ID0gdGhpcy5lbnRyeTtcbiAgICB9XG5cbiAgICByZXNldERhdGUoKSB7XG4gICAgICAgIHRoaXMuZW50cnkuY3JlYXRlX2RhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLmVudHJ5LmVkaXRfZGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIHN0YXJ0TmV3KCkge1xuICAgICAgICBjb25zdCBmaW5pc2ggPSBjb25maXJtKCdBcmUgeW91IHN1cmUgeW91ciBmaW5pc2hlZD8gVGhlIEpTT04gYW5kIGVudHJ5IGRpc3BsYXllZCB3aWxsIGJlIHJlbW92ZWQuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBhbHJlYWR5IGNvcGllZCBpdC4nKTtcbiAgICAgICAgaWYgKGZpbmlzaCkge1xuXG4gICAgICAgICAgICB0aGlzLmVudHJ5ID0gbmV3IEVudHJ5KCk7XG4gICAgICAgICAgICB0aGlzLmVudHJ5LnRpdGxlID0gRW50cnlDcmVhdG9yQ29tcG9uZW50LkRFRkFVTFRfTkVXX0VOVFJZX1RJVExFO1xuICAgICAgICAgICAgdGhpcy5lbnRyeS5wdWJsaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZW50cnkudmVyc2lvbiA9IDE7XG5cbiAgICAgICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmN1cnJlbnRseUVkaXRlZEVudHJ5Lm5leHQodGhpcy5lbnRyeSk7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgICBFbnRyeUNyZWF0b3JDb21wb25lbnQuQ1VSUkVOVF9FTlRSWSxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmVudHJ5KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmNyZWF0ZSh0aGlzLmVudHJ5KS5zdWJzY3JpYmUoKG5leHQpID0+IHtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VlRW50cmllcygpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihFbnRyeVNlbGVjdG9yRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgICAgICAgIGRhdGE6IHtuYW1lOiAndGVzdCcsIGFuaW1hbDogJ3Rlc3QnfVxuICAgICAgICB9KTtcblxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKGlkKSA9PiB7XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudHJ5U2VydmljZS5nZXRVbnB1Ymxpc2hlZEJ5SWQoaWQpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVudHJ5U2VydmljZS5jdXJyZW50bHlFZGl0ZWRFbnRyeS5uZXh0KGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgICAgICBFbnRyeUNyZWF0b3JDb21wb25lbnQuQ1VSUkVOVF9FTlRSWSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHBvc3RQdWJsaXNoQ2FsbGJhY2soKSB7XG4gICAgICAgIHRoaXMuZW50cnkgPSBuZXcgRW50cnkoKTtcbiAgICAgICAgdGhpcy5lbnRyeS50aXRsZSA9IEVudHJ5Q3JlYXRvckNvbXBvbmVudC5ERUZBVUxUX05FV19FTlRSWV9USVRMRTtcbiAgICAgICAgdGhpcy5lbnRyeS5wdWJsaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbnRyeS52ZXJzaW9uID0gMTtcbiAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuY3VycmVudGx5RWRpdGVkRW50cnkubmV4dCh0aGlzLmVudHJ5KTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICBFbnRyeUNyZWF0b3JDb21wb25lbnQuQ1VSUkVOVF9FTlRSWSxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuZW50cnkpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmNyZWF0ZSh0aGlzLmVudHJ5KS5zdWJzY3JpYmUoKG5leHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMudGFncyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVGFncygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjYW5jZWxTY2hlZHVsaW5nKCkge1xuICAgICAgICB0aGlzLmVudHJ5LmZ1dHVyZV9wdWJsaXNoX2RhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLmVudHJ5LnNob3VsZF9wdWJsaXNoX2luX2Z1dHVyZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjaGVkdWxpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIGV4cG9zZVNjaGVkdWxpbmcoKSB7XG4gICAgICAgIGNvbnN0IHNjaGVkdWxlZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBzY2hlZHVsZWREYXRlLnNldERhdGUoc2NoZWR1bGVkRGF0ZS5nZXREYXRlKCkgKyAxKTtcblxuICAgICAgICB0aGlzLmVudHJ5LmZ1dHVyZV9wdWJsaXNoX2RhdGUgPSBzY2hlZHVsZWREYXRlO1xuICAgICAgICB0aGlzLnNldFRpbWUodGhpcy5jdXN0b21TY2hlZHVsZVRpbWUpO1xuXG4gICAgICAgIHRoaXMuZW50cnkuc2hvdWxkX3B1Ymxpc2hfaW5fZnV0dXJlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsaW5nID0gIHRydWU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKTtcbiAgICB9XG4gICAgcHVibGlzaCgpIHtcbiAgICAgICAgY29uc3QgcHVibGlzaCA9IGNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwdWJsaXNoPyBPbmNlIGFuIGFydGljbGUgaXMgcHVibGlzaGVkIGl0IGlzIGF2YWlsYWJsZSB0byBldmVyeW9uZS4nKTtcbiAgICAgICAgaWYgKHB1Ymxpc2gpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cnkucHVibGlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZW50cnkucHVibGlzaF9kYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuZW50cnkuZWRpdF9kYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLnVwZGF0ZVVucHVibGlzaGVkRW50cnkodGhpcy5lbnRyeSkuc3Vic2NyaWJlKHRoaXMucG9zdFB1Ymxpc2hDYWxsYmFjay5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1EZWxldGUgPSBjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZHJhZnQ/IE9uY2UgaXQgaXMgZGVsZXRlZCBpdCBjYW5ub3QgYmUgcmVjb3ZlcmVkLicpO1xuICAgICAgICBpZiAoY29uZmlybURlbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuZGVsZXRlKHRoaXMuZW50cnkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbnRyeSA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkRhdGVDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuZW50cnkuZnV0dXJlX3B1Ymxpc2hfZGF0ZS5zZXRIb3Vycyh0aGlzLmhvdXJzKTtcbiAgICAgICAgdGhpcy5lbnRyeS5mdXR1cmVfcHVibGlzaF9kYXRlLnNldE1pbnV0ZXModGhpcy5taW51dGVzKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgIH1cblxuXG4gICAgc2V0VGltZShlKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0VGltZVNwbGl0ID0gZS5zcGxpdCgnICcpO1xuICAgICAgICBjb25zdCBzZWNvbmRUaW1lU3BsaXQgPSBmaXJzdFRpbWVTcGxpdFswXS5zcGxpdCgnOicpO1xuICAgICAgICB0aGlzLmhvdXJzID0gTnVtYmVyKHNlY29uZFRpbWVTcGxpdFswXSk7XG4gICAgICAgIHRoaXMubWludXRlcyA9IE51bWJlcihzZWNvbmRUaW1lU3BsaXRbMV0pO1xuXG4gICAgICAgIGlmIChmaXJzdFRpbWVTcGxpdFsxXSA9PT0gJ1BNJykge1xuICAgICAgICAgICAgdGhpcy5ob3VycyA9IE51bWJlcih0aGlzLmhvdXJzKSArIDEyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRyeS5mdXR1cmVfcHVibGlzaF9kYXRlLnNldEhvdXJzKHRoaXMuaG91cnMpO1xuICAgICAgICB0aGlzLmVudHJ5LmZ1dHVyZV9wdWJsaXNoX2RhdGUuc2V0TWludXRlcyh0aGlzLm1pbnV0ZXMpO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2VjdGlvbiBjcmVhdG9yIGZpZWxkc1wiPlxuICAgIDxmb3JtICNjcmVhdGVGb3JtPVwibmdGb3JtXCIgKGNoYW5nZSk9XCJvbkNoYW5nZSgpXCIgKm5nSWY9XCJ0aGlzLmVudHJ5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5UaXRsZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudHJ5LnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInRpdGxlXCI+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwiZm9ybS1zZWN0aW9uIHRhZ3NcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiIGhpbnRMYWJlbD1cIlVzZSBhIGNvbW1hIHRvIHNlcGVyYXRlIGRpZmZlcmVudCB0YWdzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1saXN0ICN0YWdMaXN0IGFyaWEtbGFiZWw9XCJUYWdzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGFnIG9mIHRhZ3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwicmVtb3ZhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmUodGFnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dGFnfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZSAqbmdJZj1cInJlbW92YWJsZVwiPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRhZ3MuLi5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0YWdJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJ0YWdDdHJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cInRhZ2F1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwidGFnTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cInNlcGFyYXRvcktleXNDb2Rlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI3RhZ2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwic2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHRhZyBvZiBmaWx0ZXJlZF90YWdzIHwgYXN5bmNcIiBbdmFsdWVdPVwidGFnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3t0YWd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1jYXJkPlxuICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBlbnRyeS5zZWN0aW9uc1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+U3ViaGVhZGluZzwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VjdGlvbi5zdWJoZWFkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7e3NlY3Rpb24uaWR9fS1zdWJoZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250ZW50XCIgKm5nRm9yPVwibGV0IGNvbnRlbnQgb2Ygc2VjdGlvbi5jb250ZW50c1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWxlY3QgdGhlIENvbnRlbnQgVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInt7Y29udGVudC5pZH19LWNvbnRlbnQtdHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyYWRpby1ncm91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb250ZW50LnR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgT2JqZWN0LnZhbHVlcyhDb250ZW50VHlwZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJhZGlvLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiPnt7dmFsdWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udGVudC50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJDb250ZW50VHlwZS5VUkxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VmFsdWU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInt7Y29udGVudC5pZH19LWNvbnRlbnQtdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb250ZW50LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VGl0bGU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInt7Y29udGVudC5pZH19LWNvbnRlbnQtdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb250ZW50LnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29udGVudFR5cGUuVEVYVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5WYWx1ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhdXRvc2l6ZT1cImNka1RleHRhcmVhQXV0b3NpemVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RrQXV0b3NpemVNaW5Sb3dzPVwiM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGtBdXRvc2l6ZU1heFJvd3M9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3tjb250ZW50LmlkfX0tY29udGVudC12YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbnRlbnQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29udGVudFR5cGUuSFRNTFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5WYWx1ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhdXRvc2l6ZT1cImNka1RleHRhcmVhQXV0b3NpemVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RrQXV0b3NpemVNaW5Sb3dzPVwiM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGtBdXRvc2l6ZU1heFJvd3M9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3tjb250ZW50LmlkfX0tY29udGVudC12YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbnRlbnQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29udGVudFR5cGUuQ09ERVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5WYWx1ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhdXRvc2l6ZT1cImNka1RleHRhcmVhQXV0b3NpemVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RrQXV0b3NpemVNaW5Sb3dzPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RrQXV0b3NpemVNYXhSb3dzPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7e2NvbnRlbnQuaWR9fS1jb250ZW50LXZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29udGVudC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJDb250ZW50VHlwZS5JTUFHRVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5WYWx1ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3tjb250ZW50LmlkfX0tY29udGVudC12YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbnRlbnQudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5WYWx1ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3tjb250ZW50LmlkfX0tY29udGVudC1zb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb250ZW50LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+RGVzY3JpcHRpb248L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInt7Y29udGVudC5pZH19LWNvbnRlbnQtZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb250ZW50LmRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29udGVudFR5cGUuTUVESUFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VmFsdWU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInt7Y29udGVudC5pZH19LWNvbnRlbnQtdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbnRlbnQudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5EZXNjcmlwdGlvbjwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3tjb250ZW50LmlkfX0tY29udGVudC1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29udGVudC5kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LmFkZGl0aW9uYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFkZCBvZiBjb250ZW50LmFkZGl0aW9uYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3thZGQua2V5fX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInt7Y29udGVudC5pZH19LWNvbnRlbnQte3thZGQua2V5fX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhZGQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudC52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPXN0YXJ0VXBsb2FkZXIoY29udGVudCk+VXBsb2FkPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9cmVtb3ZlQ29udGVudChjb250ZW50KT5SZW1vdmUgQ29udGVudDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJhZGRDb250ZW50KHNlY3Rpb24pXCI+KyBBZGQgQ29udGVudDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cInJlbW92ZVNlY3Rpb24oc2VjdGlvbilcIj5SZW1vdmUgU2VjdGlvbjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cImFkZENvbnRlbnQoc2VjdGlvbilcIiAqbmdJZj1cInNlY3Rpb24uY29udGVudHMubGVuZ3RoID09PSAwXCI+KyBBZGRcbiAgICAgICAgICAgICAgICAgICAgQ29udGVudFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cImFkZFNlY3Rpb24oKVwiPisgQWRkIFNlY3Rpb248L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cImFkZFNlY3Rpb24oKVwiICpuZ0lmPVwiZW50cnkuc2VjdGlvbnM/Lmxlbmd0aCA9PT0gMFwiPisgQWRkIFNlY3Rpb248L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiYWRkU2VjdGlvbigpXCIgKm5nSWY9XCIhZW50cnkuc2VjdGlvbnNcIj4rIEFkZCBTZWN0aW9uPC9idXR0b24+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xzXCI+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJyZXNldERhdGUoKVwiPlJlc2V0IHRoZSBEYXRlPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJkZWxldGUoKVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwic2NoZWR1bGluZ1wiIChjbGljayk9XCJwdWJsaXNoKClcIj5QdWJsaXNoPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJzY2hlZHVsaW5nXCIgKGNsaWNrKT1cImV4cG9zZVNjaGVkdWxpbmcoKVwiPlNjaGVkdWxlPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJzdGFydE5ldygpXCI+TmV3PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cCAqbmdJZj1cInNjaGVkdWxpbmdcIj5QdWJsaXNoaW5nIGlzIGRpc2FibGVkIHdoaWxlIHNjaGVkdWxpbmcgaXMgYmVpbmcgdXNlZC48L3A+XG5cbiAgICAgICAgPG1hdC1jYXJkIFtoaWRkZW5dPVwiIXNjaGVkdWxpbmdcIj5cbiAgICAgICAgICAgIDxoND5cbiAgICAgICAgICAgICAgIFNjaGVkdWxpbmcgT3B0aW9uc1xuICAgICAgICAgICAgPC9oND5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+RGF0ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICNmdXR1cmVQdWJsaXNoRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cInRvZGF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlSW5wdXQpPVwib25EYXRlQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwib25EYXRlQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlbnRyeS5mdXR1cmVfcHVibGlzaF9kYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJmdXR1cmUtcHVibGlzaC1kYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICNwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5UaW1lPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPG5neC10aW1lcGlja2VyLWZpZWxkXG4gICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGltZV09XCJjdXN0b21TY2hlZHVsZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybWF0XT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgW2J1dHRvbkFsaWduXT1cIidsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICh0aW1lQ2hhbmdlZCk9XCJzZXRUaW1lKCRldmVudClcIlxuICAgICAgICAgICAgICAgID48L25neC10aW1lcGlja2VyLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxwPlRpbWVzIGFyZSByZXByZXNlbnRlZCBpbiB5b3VyIGxvY2FsIHRpbWUgem9uZTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiY2FuY2VsU2NoZWR1bGluZygpXCI+Q2FuY2VsIFNjaGVkdWxpbmc8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHA+VGhpcyBwb3N0IHdpbGwgYmUgcHVibGlzaGVkIGFzIHNvb24gYXMgaXRzIHNjaGVkdWxlZCBkYXRlIGFuZCB0aW1lIGFycml2ZS4gTm8gZnVydGhlciBhY3Rpb24gaXMgbmVlZGVkIGJ5IHlvdS4gSWYgeW91IGRvIG5vdFxuICAgICAgICAgICAgd2FudCB0byB1c2Ugc2NoZWR1bGluZywgeW91IGNhbiBjYW5jZWwgc2NoZWR1bGluZyBhbmQgbWFudWFsbHkgcHVibGlzaC48L3A+XG4gICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgPC9mb3JtPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sc1wiPlxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJzZWVFbnRyaWVzKClcIj5TZWUgRW50cmllczwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXRoaXMuZW50cnlcIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwic3RhcnROZXcoKVwiPk5ldzwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|