@cause-911/social-network
Version:
Run `npm install @cause-911/social-network --save` to add this library to your project
471 lines • 32.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import { LoadScriptService } from './load-script.service';
import { HttpClient, HttpBackend } from '@angular/common/http';
import { Observable, forkJoin, of } from 'rxjs';
import { catchError, delay, map, retryWhen, take } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "./load-script.service";
/**
* @record
*/
function Facebook() { }
if (false) {
/** @type {?} */
Facebook.prototype.Event;
/**
* @param {?} url
* @param {?} callback
* @return {?}
*/
Facebook.prototype.api = function (url, callback) { };
/**
* @param {?} config
* @return {?}
*/
Facebook.prototype.init = function (config) { };
/**
* @param {?} callback
* @param {?} permissions
* @return {?}
*/
Facebook.prototype.login = function (callback, permissions) { };
/**
* @param {?} config
* @return {?}
*/
Facebook.prototype.getAuthResponse = function (config) { };
/**
* @param {?} config
* @return {?}
*/
Facebook.prototype.getLoginStatus = function (config) { };
}
var FacebookService = /** @class */ (function () {
function FacebookService(httpBackend, loadScript) {
var _this = this;
this.isLoaded = false;
this.isInitialize = false;
this.httpClient = new HttpClient(httpBackend);
loadScript.get('https://connect.facebook.net/en_US/sdk.js').subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
_this.isLoaded = true;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.error = error;
}));
}
/**
* @param {?} appId
* @param {?=} version
* @return {?}
*/
FacebookService.prototype.initialize = /**
* @param {?} appId
* @param {?=} version
* @return {?}
*/
function (appId, version) {
var _this = this;
if (version === void 0) { version = 'v6.0'; }
this.appId = appId;
this.version = version;
return Observable.create((/**
* @param {?} observer
* @return {?}
*/
function (observer) {
if (_this.error) {
observer.error(_this.error);
}
else if (!_this.isLoaded) {
observer.error(new Error('Facebook SDK is not loaded'));
}
else {
observer.next(true);
}
observer.complete();
})).pipe(map((/**
* @return {?}
*/
function () { return _this.initializeSDK(); })), retryWhen((/**
* @param {?} error
* @return {?}
*/
function (error) { return error.pipe(delay(200), take(25)); })), catchError((/**
* @param {?} error
* @return {?}
*/
function (error) { return of(error); })));
};
/**
* @return {?}
*/
FacebookService.prototype.findManageablePage = /**
* @return {?}
*/
function () {
var _this = this;
return Observable.create((/**
* @param {?} observer
* @return {?}
*/
function (observer) {
/** @type {?} */
var loadError = _this.validateSDK();
if (loadError) {
observer.error(loadError);
}
_this.getAuthentification().subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
if (response && response.userID) {
_this.listAccessiblePage(response.userID).subscribe((/**
* @param {?} pages
* @return {?}
*/
function (pages) {
observer.next(pages);
observer.complete();
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
observer.error(error);
}));
}
else {
observer.error(new Error('No user are connected to Facebook'));
}
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
observer.error(error);
}));
}));
};
/**
* @return {?}
*/
FacebookService.prototype.askToManagePage = /**
* @return {?}
*/
function () {
var _this = this;
return Observable.create((/**
* @param {?} observer
* @return {?}
*/
function (observer) {
/** @type {?} */
var loadError = _this.validateSDK();
if (loadError) {
observer.error(loadError);
}
_this.askTokenWithScope('manage_pages, publish_pages').subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
if (!response.userID) {
observer.error(response);
}
else {
_this.listAccessiblePage(response.userID).subscribe((/**
* @param {?} pages
* @return {?}
*/
function (pages) {
observer.next(pages);
observer.complete();
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
observer.error(error);
}));
}
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
observer.error(error);
}));
}));
};
/**
* @param {?} pageId
* @param {?} accessToken
* @param {?} message
* @param {?=} photos
* @return {?}
*/
FacebookService.prototype.publishToPage = /**
* @param {?} pageId
* @param {?} accessToken
* @param {?} message
* @param {?=} photos
* @return {?}
*/
function (pageId, accessToken, message, photos) {
var _this = this;
if (photos === void 0) { photos = null; }
/** @type {?} */
var body = {
message: message,
access_token: accessToken,
};
if (photos) {
return this.postUnpublishedPhotos(pageId, accessToken, photos).pipe(catchError((/**
* @param {?} error
* @return {?}
*/
function (error) {
return _this.httpClient.post("https://graph.facebook.com/" + pageId + "/feed", body);
})), map((/**
* @param {?} response
* @return {?}
*/
function (response) {
response.forEach((/**
* @param {?} id
* @param {?} index
* @return {?}
*/
function (id, index) {
body["attached_media[" + index + "]"] = { media_fbid: id };
}));
return _this.httpClient.post("https://graph.facebook.com/" + pageId + "/feed", body);
})));
}
else {
return this.httpClient.post("https://graph.facebook.com/" + pageId + "/feed", body);
}
};
/**
* @private
* @param {?} pageId
* @param {?} accessToken
* @param {?} photos
* @return {?}
*/
FacebookService.prototype.postUnpublishedPhotos = /**
* @private
* @param {?} pageId
* @param {?} accessToken
* @param {?} photos
* @return {?}
*/
function (pageId, accessToken, photos) {
var _this = this;
/** @type {?} */
var posts = [];
photos.forEach((/**
* @param {?} photoUrl
* @return {?}
*/
function (photoUrl) {
/** @type {?} */
var task = _this.httpClient.post("https://graph.facebook.com/" + pageId + "/photos", {
url: photoUrl,
caption: '',
published: false,
access_token: accessToken,
}).pipe(map((/**
* @param {?} response
* @return {?}
*/
function (response) { return response['id']; })));
posts.push(task);
}));
return forkJoin(posts);
};
/**
* @private
* @param {?} userId
* @return {?}
*/
FacebookService.prototype.listAccessiblePage = /**
* @private
* @param {?} userId
* @return {?}
*/
function (userId) {
return Observable.create((/**
* @param {?} observer
* @return {?}
*/
function (observer) {
FB.api("/" + userId + "/accounts", (/**
* @param {?} response
* @return {?}
*/
function (response) {
if (response && !response.error) {
if (response.data instanceof Error) {
observer.error(response.data);
}
else {
observer.next(response.data);
observer.complete();
}
}
else {
observer.error(response);
}
}));
}));
};
/**
* @private
* @param {?} scope
* @return {?}
*/
FacebookService.prototype.askTokenWithScope = /**
* @private
* @param {?} scope
* @return {?}
*/
function (scope) {
return Observable.create((/**
* @param {?} observer
* @return {?}
*/
function (observer) {
FB.login((/**
* @param {?} response
* @return {?}
*/
function (response) {
if (response.authResponse) {
observer.next(response.authResponse);
observer.complete();
}
else {
observer.error(new Error('User cancelled login or did not fully authorize'));
}
}), {
scope: scope,
});
}));
};
/**
* @private
* @return {?}
*/
FacebookService.prototype.getAuthentification = /**
* @private
* @return {?}
*/
function () {
return Observable.create((/**
* @param {?} observer
* @return {?}
*/
function (observer) {
/** @type {?} */
var timer = setTimeout((/**
* @return {?}
*/
function () {
observer.error("Facebook SDK can't be used");
}), 2000);
FB.getLoginStatus((/**
* @param {?} response
* @return {?}
*/
function (response) {
clearTimeout(timer);
if (response.status === 'connected') {
observer.next(response.authResponse);
}
else {
observer.next({});
}
observer.complete();
}));
}));
};
/**
* @private
* @return {?}
*/
FacebookService.prototype.initializeSDK = /**
* @private
* @return {?}
*/
function () {
FB.init({
appId: this.appId,
cookie: true,
xfbml: true,
version: this.version,
});
this.isInitialize = true;
};
/**
* @private
* @return {?}
*/
FacebookService.prototype.validateSDK = /**
* @private
* @return {?}
*/
function () {
if (location.protocol !== 'https:') {
return new Error("You can only use the Facebook SDK on HTTPS");
}
if (!this.isInitialize) {
return new Error('You need to initialize the service');
}
return false;
};
FacebookService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
FacebookService.ctorParameters = function () { return [
{ type: HttpBackend },
{ type: LoadScriptService }
]; };
/** @nocollapse */ FacebookService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function FacebookService_Factory() { return new FacebookService(i0.ɵɵinject(i1.HttpBackend), i0.ɵɵinject(i2.LoadScriptService)); }, token: FacebookService, providedIn: "root" });
return FacebookService;
}());
export { FacebookService };
if (false) {
/**
* @type {?}
* @private
*/
FacebookService.prototype.httpClient;
/** @type {?} */
FacebookService.prototype.error;
/** @type {?} */
FacebookService.prototype.appId;
/** @type {?} */
FacebookService.prototype.version;
/** @type {?} */
FacebookService.prototype.isLoaded;
/** @type {?} */
FacebookService.prototype.isInitialize;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZWJvb2suc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjYXVzZS05MTEvc29jaWFsLW5ldHdvcmsvIiwic291cmNlcyI6WyJsaWIvc2hhcmVkL3NlcnZpY2VzL2ZhY2Vib29rLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQUl2RSx1QkFZQzs7O0lBWEcseUJBQVc7Ozs7OztJQUVYLHNEQUFzQzs7Ozs7SUFFdEMsZ0RBQXdCOzs7Ozs7SUFFeEIsZ0VBQTZDOzs7OztJQUU3QywyREFBbUM7Ozs7O0lBRW5DLDBEQUFrQzs7QUFHdEM7SUFXSSx5QkFDSSxXQUF3QixFQUN4QixVQUE2QjtRQUZqQyxpQkFXQztRQWRNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFNeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU5QyxVQUFVLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUMsU0FBUzs7OztRQUFDLFVBQUEsUUFBUTtZQUMxRSxLQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDOzs7O1FBQUUsVUFBQSxLQUFLO1lBQ0osS0FBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDdkIsQ0FB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Z0JBRHZCLGlCQUFpQjs7OzBCQUR6QjtDQTBPQyxBQXBORCxJQW9OQztTQWpOWSxlQUFlOzs7Ozs7SUFDeEIscUNBQStCOztJQUMvQixnQ0FBa0I7O0lBQ2xCLGdDQUFxQjs7SUFDckIsa0NBQXVCOztJQUN2QixtQ0FBd0I7O0lBQ3hCLHVDQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0xvYWRTY3JpcHRTZXJ2aWNlfSBmcm9tICcuL2xvYWQtc2NyaXB0LnNlcnZpY2UnO1xuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwQmFja2VuZH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBmb3JrSm9pbiwgb2Z9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBkZWxheSwgbWFwLCByZXRyeVdoZW4sIHRha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZGVjbGFyZSB2YXIgRkI6IEZhY2Vib29rO1xuXG5pbnRlcmZhY2UgRmFjZWJvb2sge1xuICAgIEV2ZW50OiBhbnk7XG5cbiAgICBhcGkodXJsOiBzdHJpbmcsIGNhbGxiYWNrOiBhbnkpOiB2b2lkO1xuXG4gICAgaW5pdChjb25maWc6IGFueSk6IHZvaWQ7XG5cbiAgICBsb2dpbihjYWxsYmFjazogYW55LCBwZXJtaXNzaW9uczogYW55KTogdm9pZDtcblxuICAgIGdldEF1dGhSZXNwb25zZShjb25maWc6IGFueSk6IHZvaWQ7XG5cbiAgICBnZXRMb2dpblN0YXR1cyhjb25maWc6IGFueSk6IHZvaWQ7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRmFjZWJvb2tTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG4gICAgcHVibGljIGVycm9yOiBhbnk7XG4gICAgcHVibGljIGFwcElkOiBzdHJpbmc7XG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZztcbiAgICBwdWJsaWMgaXNMb2FkZWQgPSBmYWxzZTtcbiAgICBwdWJsaWMgaXNJbml0aWFsaXplID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgaHR0cEJhY2tlbmQ6IEh0dHBCYWNrZW5kLFxuICAgICAgICBsb2FkU2NyaXB0OiBMb2FkU2NyaXB0U2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5odHRwQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoaHR0cEJhY2tlbmQpO1xuXG4gICAgICAgIGxvYWRTY3JpcHQuZ2V0KCdodHRwczovL2Nvbm5lY3QuZmFjZWJvb2submV0L2VuX1VTL3Nkay5qcycpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdGlhbGl6ZShhcHBJZDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcgPSAndjYuMCcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5hcHBJZCA9IGFwcElkO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZShvYnNlcnZlciA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5lcnJvcikge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHRoaXMuZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0xvYWRlZCkge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBFcnJvcignRmFjZWJvb2sgU0RLIGlzIG5vdCBsb2FkZWQnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5pbml0aWFsaXplU0RLKCkpLFxuICAgICAgICAgICAgcmV0cnlXaGVuKGVycm9yID0+IGVycm9yLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVsYXkoMjAwKSxcbiAgICAgICAgICAgICAgICB0YWtlKDI1KSxcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiBvZihlcnJvcikpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmRNYW5hZ2VhYmxlUGFnZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9hZEVycm9yID0gdGhpcy52YWxpZGF0ZVNESygpO1xuICAgICAgICAgICAgaWYgKGxvYWRFcnJvcikge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGxvYWRFcnJvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0QXV0aGVudGlmaWNhdGlvbigpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnVzZXJJRCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RBY2Nlc3NpYmxlUGFnZShyZXNwb25zZS51c2VySUQpLnN1YnNjcmliZShwYWdlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHBhZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEVycm9yKCdObyB1c2VyIGFyZSBjb25uZWN0ZWQgdG8gRmFjZWJvb2snKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNrVG9NYW5hZ2VQYWdlKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZShvYnNlcnZlciA9PiB7XG4gICAgICAgICAgICBjb25zdCBsb2FkRXJyb3IgPSB0aGlzLnZhbGlkYXRlU0RLKCk7XG4gICAgICAgICAgICBpZiAobG9hZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobG9hZEVycm9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hc2tUb2tlbldpdGhTY29wZSgnbWFuYWdlX3BhZ2VzLCBwdWJsaXNoX3BhZ2VzJykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLnVzZXJJRCkge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0QWNjZXNzaWJsZVBhZ2UocmVzcG9uc2UudXNlcklEKS5zdWJzY3JpYmUocGFnZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChwYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHB1Ymxpc2hUb1BhZ2UocGFnZUlkOiBzdHJpbmcsIGFjY2Vzc1Rva2VuOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgcGhvdG9zOiBzdHJpbmdbXSA9IG51bGwpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBib2R5ID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgIGFjY2Vzc190b2tlbjogYWNjZXNzVG9rZW4sXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHBob3Rvcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdFVucHVibGlzaGVkUGhvdG9zKHBhZ2VJZCwgYWNjZXNzVG9rZW4sIHBob3RvcykucGlwZShcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KGBodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8ke3BhZ2VJZH0vZmVlZGAsIGJvZHkpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG1hcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmZvckVhY2goKGlkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keVtgYXR0YWNoZWRfbWVkaWFbJHtpbmRleH1dYF0gPSB7IG1lZGlhX2ZiaWQ6IGlkIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdChgaHR0cHM6Ly9ncmFwaC5mYWNlYm9vay5jb20vJHtwYWdlSWR9L2ZlZWRgLCBib2R5KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdChgaHR0cHM6Ly9ncmFwaC5mYWNlYm9vay5jb20vJHtwYWdlSWR9L2ZlZWRgLCBib2R5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcG9zdFVucHVibGlzaGVkUGhvdG9zKHBhZ2VJZDogc3RyaW5nLCBhY2Nlc3NUb2tlbjogc3RyaW5nLCBwaG90b3M6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgcG9zdHMgPSBbXTtcblxuICAgICAgICBwaG90b3MuZm9yRWFjaChwaG90b1VybCA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXNrID0gdGhpcy5odHRwQ2xpZW50LnBvc3QoYGh0dHBzOi8vZ3JhcGguZmFjZWJvb2suY29tLyR7cGFnZUlkfS9waG90b3NgLCB7XG4gICAgICAgICAgICAgICAgdXJsOiBwaG90b1VybCxcbiAgICAgICAgICAgICAgICBjYXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBwdWJsaXNoZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbjogYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICB9KS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZVsnaWQnXSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHBvc3RzLnB1c2godGFzayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihwb3N0cyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsaXN0QWNjZXNzaWJsZVBhZ2UodXNlcklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgRkIuYXBpKGAvJHt1c2VySWR9L2FjY291bnRzYCwgKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgIXJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXNrVG9rZW5XaXRoU2NvcGUoc2NvcGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZShvYnNlcnZlciA9PiB7XG4gICAgICAgICAgICBGQi5sb2dpbigocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5hdXRoUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwb25zZS5hdXRoUmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBFcnJvcignVXNlciBjYW5jZWxsZWQgbG9naW4gb3IgZGlkIG5vdCBmdWxseSBhdXRob3JpemUnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHNjb3BlOiBzY29wZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEF1dGhlbnRpZmljYXRpb24oKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKG9ic2VydmVyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoYEZhY2Vib29rIFNESyBjYW4ndCBiZSB1c2VkYCk7XG4gICAgICAgICAgICB9LCAyMDAwKTtcblxuICAgICAgICAgICAgRkIuZ2V0TG9naW5TdGF0dXMoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwb25zZS5hdXRoUmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoe30pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplU0RLKCkge1xuICAgICAgICBGQi5pbml0KHtcbiAgICAgICAgICAgIGFwcElkOiB0aGlzLmFwcElkLFxuICAgICAgICAgICAgY29va2llOiB0cnVlLFxuICAgICAgICAgICAgeGZibWw6IHRydWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYXRlU0RLKCkge1xuICAgICAgICBpZiAobG9jYXRpb24ucHJvdG9jb2wgIT09ICdodHRwczonKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBZb3UgY2FuIG9ubHkgdXNlIHRoZSBGYWNlYm9vayBTREsgb24gSFRUUFNgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdZb3UgbmVlZCB0byBpbml0aWFsaXplIHRoZSBzZXJ2aWNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIl19