@deepakhb2/ngx-embed-video
Version:
> Get embed code for embedding youtube/vimeo/dailymotion/\* video in websites from URL or ID in Angular 7+ (Tested on 9/10). > Currently supports YouTube, Vimeo and Dailymotion. Feel free to make pull request to add others!
186 lines • 22.8 kB
JavaScript
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { DomSanitizer } from '@angular/platform-browser';
import { map } from 'rxjs/operators';
export class NgxEmbedVideoService {
constructor(http, sanitizer) {
this.http = http;
this.sanitizer = sanitizer;
this.validYouTubeOptions = [
'default',
'mqdefault',
'hqdefault',
'sddefault',
'maxresdefault'
];
this.validVimeoOptions = [
'thumbnail_small',
'thumbnail_medium',
'thumbnail_large'
];
this.validDailyMotionOptions = [
'thumbnail_60_url',
'thumbnail_120_url',
'thumbnail_180_url',
'thumbnail_240_url',
'thumbnail_360_url',
'thumbnail_480_url',
'thumbnail_720_url',
'thumbnail_1080_url'
];
}
embed(url, options) {
let id;
url = new URL(url);
id = this.detectYoutube(url);
if (id) {
return this.embed_youtube(id, options);
}
id = this.detectVimeo(url);
if (id) {
return this.embed_vimeo(id, options);
}
id = this.detectDailymotion(url);
if (id) {
return this.embed_dailymotion(id, options);
}
}
embed_youtube(id, options) {
options = this.parseOptions(options);
return this.sanitize_iframe('<iframe src="https://www.youtube.com/embed/'
+ id + options.query + '"' + options.attr
+ ' frameborder="0" allowfullscreen></iframe>');
}
embed_vimeo(id, options) {
options = this.parseOptions(options);
return this.sanitize_iframe('<iframe src="https://player.vimeo.com/video/'
+ id + options.query + '"' + options.attr
+ ' frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>');
}
embed_dailymotion(id, options) {
options = this.parseOptions(options);
return this.sanitize_iframe('<iframe src="https://www.dailymotion.com/embed/video/'
+ id + options.query + '"' + options.attr
+ ' frameborder="0" allowfullscreen></iframe>');
}
embed_image(url, options) {
let id;
url = new URL(url);
id = this.detectYoutube(url);
if (id) {
return this.embed_youtube_image(id, options);
}
id = this.detectVimeo(url);
if (id) {
return this.embed_vimeo_image(id, options);
}
id = this.detectDailymotion(url);
if (id) {
return this.embed_dailymotion_image(id, options);
}
}
embed_youtube_image(id, options) {
if (typeof options === 'function') {
options = {};
}
options = options || {};
options.image = this.validYouTubeOptions.indexOf(options.image) > 0 ? options.image : 'default';
let src = 'https://img.youtube.com/vi/' + id + '/' + options.image + '.jpg';
let result = {
link: src,
html: '<img src="' + src + '"/>'
};
return new Promise((resolve) => {
resolve(result);
});
}
embed_vimeo_image(id, options) {
if (typeof options === 'function') {
options = {};
}
options = options || {};
options.image = this.validVimeoOptions.indexOf(options.image) >= 0 ? options.image : 'thumbnail_large';
return this.http.get('https://vimeo.com/api/v2/video/' + id + '.json').pipe(map((res) => {
return {
'link': res[0][options.image],
'html': '<img src="' + res[0][options.image] + '"/>'
};
}))
.toPromise()
.catch(error => console.log(error));
}
embed_dailymotion_image(id, options) {
if (typeof options === 'function') {
options = {};
}
options = options || {};
options.image = this.validDailyMotionOptions.indexOf(options.image) >= 0 ? options.image : 'thumbnail_480_url';
return this.http.get('https://api.dailymotion.com/video/' + id + '?fields=' + options.image)
.pipe(map((res) => {
return {
'link': res[options.image],
'html': '<img src="' + res[options.image] + '"/>'
};
}))
.toPromise()
.catch(error => console.log(error));
}
parseOptions(options) {
let queryString = '', attributes = '';
if (options && options.hasOwnProperty('query')) {
queryString = '?' + this.serializeQuery(options.query);
}
if (options && options.hasOwnProperty('attr')) {
let temp = [];
Object.keys(options.attr).forEach(function (key) {
temp.push(key + '="' + (options.attr[key]) + '"');
});
attributes = ' ' + temp.join(' ');
}
return {
query: queryString,
attr: attributes
};
}
serializeQuery(query) {
let queryString = [];
for (let p in query) {
if (query.hasOwnProperty(p)) {
queryString.push(encodeURIComponent(p) + '=' + encodeURIComponent(query[p]));
}
}
return queryString.join('&');
}
sanitize_iframe(iframe) {
return this.sanitizer.bypassSecurityTrustHtml(iframe);
}
detectVimeo(url) {
return (url.hostname === 'vimeo.com') ? url.pathname.split('/')[1] : null;
}
detectYoutube(url) {
if (url.hostname.indexOf('youtube.com') > -1) {
return url.search.split('=')[1];
}
if (url.hostname === 'youtu.be') {
return url.pathname.split('/')[1];
}
return '';
}
detectDailymotion(url) {
if (url.hostname.indexOf('dailymotion.com') > -1) {
return url.pathname.split('/')[2].split('_')[0];
}
if (url.hostname === 'dai.ly') {
return url.pathname.split('/')[1];
}
return '';
}
}
NgxEmbedVideoService.decorators = [
{ type: Injectable }
];
NgxEmbedVideoService.ctorParameters = () => [
{ type: HttpClient },
{ type: DomSanitizer }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWVtYmVkLXZpZGVvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZW1iZWQtdmlkZW8vc3JjL2xpYi9uZ3gtZW1iZWQtdmlkZW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JDLE1BQU0sT0FBTyxvQkFBb0I7SUF3Qi9CLFlBQ1UsSUFBZ0IsRUFDaEIsU0FBdUI7UUFEdkIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBekJ6Qix3QkFBbUIsR0FBRztZQUM1QixTQUFTO1lBQ1QsV0FBVztZQUNYLFdBQVc7WUFDWCxXQUFXO1lBQ1gsZUFBZTtTQUNoQixDQUFDO1FBQ00sc0JBQWlCLEdBQUc7WUFDMUIsaUJBQWlCO1lBQ2pCLGtCQUFrQjtZQUNsQixpQkFBaUI7U0FDbEIsQ0FBQztRQUNNLDRCQUF1QixHQUFHO1lBQ2hDLGtCQUFrQjtZQUNsQixtQkFBbUI7WUFDbkIsbUJBQW1CO1lBQ25CLG1CQUFtQjtZQUNuQixtQkFBbUI7WUFDbkIsbUJBQW1CO1lBQ25CLG1CQUFtQjtZQUNuQixvQkFBb0I7U0FDckIsQ0FBQztJQU1GLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBUSxFQUFFLE9BQWE7UUFDbEMsSUFBSSxFQUFFLENBQUM7UUFDUCxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbkIsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxFQUFF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V0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUUsQ0FBQztJQUVPLGFBQWEsQ0FBQyxHQUFRO1FBQzVCLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQztRQUVELElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUU7WUFDL0IsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVPLGlCQUFpQixDQUFDLEdBQVE7UUFDaEMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2hELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUM3QixPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDOzs7WUE1TkYsVUFBVTs7O1lBSkYsVUFBVTtZQUNWLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ3hFbWJlZFZpZGVvU2VydmljZSB7XG4gIHByaXZhdGUgdmFsaWRZb3VUdWJlT3B0aW9ucyA9IFtcbiAgICAnZGVmYXVsdCcsXG4gICAgJ21xZGVmYXVsdCcsXG4gICAgJ2hxZGVmYXVsdCcsXG4gICAgJ3NkZGVmYXVsdCcsXG4gICAgJ21heHJlc2RlZmF1bHQnXG4gIF07XG4gIHByaXZhdGUgdmFsaWRWaW1lb09wdGlvbnMgPSBbXG4gICAgJ3RodW1ibmFpbF9zbWFsbCcsXG4gICAgJ3RodW1ibmFpbF9tZWRpdW0nLFxuICAgICd0aHVtYm5haWxfbGFyZ2UnXG4gIF07XG4gIHByaXZhdGUgdmFsaWREYWlseU1vdGlvbk9wdGlvbnMgPSBbXG4gICAgJ3RodW1ibmFpbF82MF91cmwnLFxuICAgICd0aHVtYm5haWxfMTIwX3VybCcsXG4gICAgJ3RodW1ibmFpbF8xODBfdXJsJyxcbiAgICAndGh1bWJuYWlsXzI0MF91cmwnLFxuICAgICd0aHVtYm5haWxfMzYwX3VybCcsXG4gICAgJ3RodW1ibmFpbF80ODBfdXJsJyxcbiAgICAndGh1bWJuYWlsXzcyMF91cmwnLFxuICAgICd0aHVtYm5haWxfMTA4MF91cmwnXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXJcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgZW1iZWQodXJsOiBhbnksIG9wdGlvbnM/OiBhbnkpOiBhbnkge1xuICAgIGxldCBpZDtcbiAgICB1cmwgPSBuZXcgVVJMKHVybCk7XG5cbiAgICBpZCA9IHRoaXMuZGV0ZWN0WW91dHViZSh1cmwpO1xuICAgIGlmIChpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZW1iZWRfeW91dHViZShpZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWQgPSB0aGlzLmRldGVjdFZpbWVvKHVybCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWJlZF92aW1lbyhpZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWQgPSB0aGlzLmRldGVjdERhaWx5bW90aW9uKHVybCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWJlZF9kYWlseW1vdGlvbihpZCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtYmVkX3lvdXR1YmUoaWQ6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IHN0cmluZyB7XG4gICAgb3B0aW9ucyA9IHRoaXMucGFyc2VPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVfaWZyYW1lKCc8aWZyYW1lIHNyYz1cImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLydcbiAgICAgICsgaWQgKyBvcHRpb25zLnF1ZXJ5ICsgJ1wiJyArIG9wdGlvbnMuYXR0clxuICAgICAgKyAnIGZyYW1lYm9yZGVyPVwiMFwiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWJlZF92aW1lbyhpZDogc3RyaW5nLCBvcHRpb25zPzogYW55KTogc3RyaW5nIHtcbiAgICBvcHRpb25zID0gdGhpcy5wYXJzZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZV9pZnJhbWUoJzxpZnJhbWUgc3JjPVwiaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLydcbiAgICAgICsgaWQgKyBvcHRpb25zLnF1ZXJ5ICsgJ1wiJyArIG9wdGlvbnMuYXR0clxuICAgICAgKyAnIGZyYW1lYm9yZGVyPVwiMFwiIHdlYmtpdGFsbG93ZnVsbHNjcmVlbiBtb3phbGxvd2Z1bGxzY3JlZW4gYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPicpO1xuICB9XG5cbiAgcHVibGljIGVtYmVkX2RhaWx5bW90aW9uKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBzdHJpbmcge1xuICAgIG9wdGlvbnMgPSB0aGlzLnBhcnNlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIHJldHVybiB0aGlzLnNhbml0aXplX2lmcmFtZSgnPGlmcmFtZSBzcmM9XCJodHRwczovL3d3dy5kYWlseW1vdGlvbi5jb20vZW1iZWQvdmlkZW8vJ1xuICAgICAgKyBpZCArIG9wdGlvbnMucXVlcnkgKyAnXCInICsgb3B0aW9ucy5hdHRyXG4gICAgICArICcgZnJhbWVib3JkZXI9XCIwXCIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPicpO1xuICB9XG5cbiAgcHVibGljIGVtYmVkX2ltYWdlKHVybDogYW55LCBvcHRpb25zPzogYW55KTogYW55IHtcbiAgICBsZXQgaWQ7XG5cbiAgICB1cmwgPSBuZXcgVVJMKHVybCk7XG5cbiAgICBpZCA9IHRoaXMuZGV0ZWN0WW91dHViZSh1cmwpO1xuICAgIGlmIChpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZW1iZWRfeW91dHViZV9pbWFnZShpZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWQgPSB0aGlzLmRldGVjdFZpbWVvKHVybCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWJlZF92aW1lb19pbWFnZShpZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWQgPSB0aGlzLmRldGVjdERhaWx5bW90aW9uKHVybCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWJlZF9kYWlseW1vdGlvbl9pbWFnZShpZCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWJlZF95b3V0dWJlX2ltYWdlKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBhbnkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIG9wdGlvbnMuaW1hZ2UgPSB0aGlzLnZhbGlkWW91VHViZU9wdGlvbnMuaW5kZXhPZihvcHRpb25zLmltYWdlKSA+IDAgPyBvcHRpb25zLmltYWdlIDogJ2RlZmF1bHQnO1xuXG4gICAgbGV0IHNyYyA9ICdodHRwczovL2ltZy55b3V0dWJlLmNvbS92aS8nICsgaWQgKyAnLycgKyBvcHRpb25zLmltYWdlICsgJy5qcGcnO1xuXG4gICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgIGxpbms6IHNyYyxcbiAgICAgIGh0bWw6ICc8aW1nIHNyYz1cIicgKyBzcmMgKyAnXCIvPidcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtYmVkX3ZpbWVvX2ltYWdlKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBhbnkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgb3B0aW9ucy5pbWFnZSA9IHRoaXMudmFsaWRWaW1lb09wdGlvbnMuaW5kZXhPZihvcHRpb25zLmltYWdlKSA+PSAwID8gb3B0aW9ucy5pbWFnZSA6ICd0aHVtYm5haWxfbGFyZ2UnO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoJ2h0dHBzOi8vdmltZW8uY29tL2FwaS92Mi92aWRlby8nICsgaWQgKyAnLmpzb24nKS5waXBlKG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdsaW5rJzogcmVzWzBdW29wdGlvbnMuaW1hZ2VdLFxuICAgICAgICAnaHRtbCc6ICc8aW1nIHNyYz1cIicgKyByZXNbMF1bb3B0aW9ucy5pbWFnZV0gKyAnXCIvPidcbiAgICAgIH07XG4gICAgfSkpXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC5jYXRjaChlcnJvciA9PiBjb25zb2xlLmxvZyhlcnJvcikpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWJlZF9kYWlseW1vdGlvbl9pbWFnZShpZDogc3RyaW5nLCBvcHRpb25zPzogYW55KTogYW55IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIG9wdGlvbnMuaW1hZ2UgPSB0aGlzLnZhbGlkRGFpbHlNb3Rpb25PcHRpb25zLmluZGV4T2Yob3B0aW9ucy5pbWFnZSkgPj0gMCA/IG9wdGlvbnMuaW1hZ2UgOiAndGh1bWJuYWlsXzQ4MF91cmwnO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoJ2h0dHBzOi8vYXBpLmRhaWx5bW90aW9uLmNvbS92aWRlby8nICsgaWQgKyAnP2ZpZWxkcz0nICsgb3B0aW9ucy5pbWFnZSlcbiAgICAgIC5waXBlKG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnbGluayc6IHJlc1tvcHRpb25zLmltYWdlXSxcbiAgICAgICAgICAnaHRtbCc6ICc8aW1nIHNyYz1cIicgKyByZXNbb3B0aW9ucy5pbWFnZV0gKyAnXCIvPidcbiAgICAgICAgfTtcbiAgICAgIH0pKVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5sb2coZXJyb3IpKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VPcHRpb25zKG9wdGlvbnM6IGFueSk6IGFueSB7XG4gICAgbGV0IHF1ZXJ5U3RyaW5nID0gJycsXG4gICAgICBhdHRyaWJ1dGVzID0gJyc7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KCdxdWVyeScpKSB7XG4gICAgICBxdWVyeVN0cmluZyA9ICc/JyArIHRoaXMuc2VyaWFsaXplUXVlcnkob3B0aW9ucy5xdWVyeSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYXR0cicpKSB7XG4gICAgICBsZXQgdGVtcCA9IDxhbnk+W107XG5cbiAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuYXR0cikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHRlbXAucHVzaChrZXkgKyAnPVwiJyArIChvcHRpb25zLmF0dHJba2V5XSkgKyAnXCInKTtcbiAgICAgIH0pO1xuXG4gICAgICBhdHRyaWJ1dGVzID0gJyAnICsgdGVtcC5qb2luKCcgJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBxdWVyeTogcXVlcnlTdHJpbmcsXG4gICAgICBhdHRyOiBhdHRyaWJ1dGVzXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2VyaWFsaXplUXVlcnkocXVlcnk6IGFueSk6IGFueSB7XG4gICAgbGV0IHF1ZXJ5U3RyaW5nOiBhbnkgPSBbXTtcblxuICAgIGZvciAobGV0IHAgaW4gcXVlcnkpIHtcbiAgICAgIGlmIChxdWVyeS5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICBxdWVyeVN0cmluZy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChwKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChxdWVyeVtwXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeVN0cmluZy5qb2luKCcmJyk7XG4gIH1cblxuICBwcml2YXRlIHNhbml0aXplX2lmcmFtZShpZnJhbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGlmcmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGRldGVjdFZpbWVvKHVybDogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHVybC5ob3N0bmFtZSA9PT0gJ3ZpbWVvLmNvbScpID8gdXJsLnBhdGhuYW1lLnNwbGl0KCcvJylbMV0gOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RZb3V0dWJlKHVybDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodXJsLmhvc3RuYW1lLmluZGV4T2YoJ3lvdXR1YmUuY29tJykgPiAtMSkge1xuICAgICAgcmV0dXJuIHVybC5zZWFyY2guc3BsaXQoJz0nKVsxXTtcbiAgICB9XG5cbiAgICBpZiAodXJsLmhvc3RuYW1lID09PSAneW91dHUuYmUnKSB7XG4gICAgICByZXR1cm4gdXJsLnBhdGhuYW1lLnNwbGl0KCcvJylbMV07XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3REYWlseW1vdGlvbih1cmw6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHVybC5ob3N0bmFtZS5pbmRleE9mKCdkYWlseW1vdGlvbi5jb20nKSA+IC0xKSB7XG4gICAgICByZXR1cm4gdXJsLnBhdGhuYW1lLnNwbGl0KCcvJylbMl0uc3BsaXQoJ18nKVswXTtcbiAgICB9XG5cbiAgICBpZiAodXJsLmhvc3RuYW1lID09PSAnZGFpLmx5Jykge1xuICAgICAgcmV0dXJuIHVybC5wYXRobmFtZS5zcGxpdCgnLycpWzFdO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuIl19