/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { Headers, Http, RequestOptions } from '@angular/http'; import { Observable } from 'rxjs/Observable'; import { of } from 'rxjs'; import { AppConfigService } from '../app-config/app-config.service'; import * as _ from 'lodash'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import 'rxjs/add/operator/map'; export class B2bService { /** * @param {?} http * @param {?} appConfigService */ constructor(http, appConfigService) { this.http = http; this.appConfigService = appConfigService; this.verifyTokenUrl = ''; this.downloadTokenUrl = ''; this._verifyToken = new BehaviorSubject({}); this.verifyToken = { 'username': '$username', 'sessionId': '$sessionId', 'groupIntegrationNames': ['groupName1', 'groupName2', 'groupName3'], 'menus': ['menu1', 'menu2'], 'menuPermissions': [ { 'menuName': 'menu1', 'permissions': ['add', 'edit', 'delete'] }, { 'menuName': 'menu2', 'permissions': ['view', 'add', 'edit'] } ], 'attachmentToken': { 'token': 'DOWNLOADS_AEB496F6DED34FFF93F668412E3CDD38', 'expire': '2018-09-21 09:00:00' } }; this.config = appConfigService.getConfig(); // console.log('b2b config',this.config); this.verifyTokenUrl = _.get(this.config, 'apiServers.portal-backend.verifyToken'); this.downloadTokenUrl = _.get(this.config, 'apiServers.portal-backend.downloadToken'); } /** * @return {?} */ verify() { /** @type {?} */ const body = { 'microIntegrationName': _.get(this.config, 'microIntegrationName') }; return this.http.post(this.verifyTokenUrl, body, this.jwt()).map((res) => { // console.log(res.json()); // console.log(res); res = res.json(); if (+res['resultCode'] === 20000) { this.verifyToken = res['resultData']; this._verifyToken.next(res['resultData']); } // else if(+res['resultCode'] === 40100){ // let __resultData = res['resultData']; // this.checkSession(__resultData.userMessage); // } // console.log(this.verifyToken); return res; }).catch((error) => Observable.throw(error.json().error || 'Server error')).toPromise(); } /** * @return {?} */ subscribeVerifyToken() { return this._verifyToken.asObservable(); } /** * @return {?} */ getVerifyToken() { return this._verifyToken.getValue(); } /** * @param {?} userMessage * @return {?} */ checkSession(userMessage) { console.log('checkSession'); /** @type {?} */ const token = sessionStorage.getItem('token'); window.parent.postMessage(JSON.stringify({ command: "checkSession", message: token, userMessage: userMessage || 'Unknow' }), '*'); console.log('checkSession', JSON.stringify({ command: "checkSession", message: token, userMessage: userMessage || 'Unknow' })); } /** * รับค่า role ที่มีสิทธิ์ * @param {?} route * @return {?} */ isCheckGroup(route) { /** @type {?} */ let verify = []; for (let menuPermissions of this.verifyToken.menuPermissions) { /** @type {?} */ let url = menuPermissions.url || ""; /** @type {?} */ let splitPath = url.split('?'); splitPath = splitPath.length > 0 ? splitPath[0].split('/') : []; /** @type {?} */ let path; // ดึง path สุดท้าย for (let i = 0; i <= splitPath.length; i++) { // console.log('isCheckGroup splitPath[i]', splitPath[i]); if (splitPath[i] === '#') { path = splitPath[i + 1]; // ดึง path หลัง # break; } } // console.log("isCheckGroup path", path); if (path === route.route) { verify = menuPermissions.permissions; } } /** @type {?} */ const checkArrary = _.intersection(verify, route.component); // console.log("isCheckGroup checkArrary", checkArrary); if (checkArrary.length !== 0) { return true; } else { return false; } } /** * รับค่า guard ที่มีสิทธิ์ * @param {?} role * @return {?} */ isCheckGuard(role) { /** * * mockup response @type {?} */ const checkArrary = _.intersection(this.verifyToken.menus, [role]); // console.log("checkArrary",checkArrary); if (checkArrary.length !== 0) { return true; } else { return false; } } /** * @return {?} */ verifyDemo() { /** @type {?} */ const token = sessionStorage.getItem('token'); // console.log('token', token); if (token && token === 'demo') { return of({ 'resultCode': '20000', 'resultDescription': 'Success', 'resultData': { 'b2bToken': '$b2bToken' } }).toPromise(); } return of({ 'resultCode': '40000', 'resultDescription': '', }).toPromise(); } /** * @return {?} */ jwt() { /** @type {?} */ const token = sessionStorage.getItem('token'); if (token) { /** @type {?} */ const headers = new Headers({ 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json', 'x-token': '1' }); return new RequestOptions({ headers: headers }); } } /** * @return {?} */ getAttachmentToken() { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ let now = new Date(); /** @type {?} */ let expireDate = new Date(this.verifyToken.attachmentToken.expire); /** @type {?} */ let checkDateValid = now <= expireDate; // console.log("checkDateValid",checkDateValid); if (checkDateValid) { return this.verifyToken.attachmentToken.token; } else { try { /** @type {?} */ let response = yield this.http.post(this.downloadTokenUrl, {}, this.jwt()).map((res) => { return res.json(); }).catch((error) => Observable.throw(error.json().error || 'Server error')).toPromise(); // console.log('response ',response); if (+response['resultCode'] === 20000) { this.verifyToken.attachmentToken = response['resultData']; return response['resultData'].token; } // else if(+response['resultCode'] === 40100){ // let __resultData = response['resultData']; // this.checkSession(__resultData.userMessage); // return ''; // } else { return ''; } } catch (e) { console.log('error ', e); return ''; } } }); } /** * รับค่า guard ที่มีสิทธิ์ * @param {?} route * @return {?} */ isCheckGuardRoutePath(route) { // console.log("route",route); // console.log("this.verifyToken",this.verifyToken); for (let menuPermissions of this.verifyToken.menuPermissions) { /** @type {?} */ let url = menuPermissions.url || ""; /** @type {?} */ let splitPath = url.split('?'); splitPath = splitPath.length > 0 ? splitPath[0].split('/') : []; /** @type {?} */ let path; // ดึง path สุดท้าย for (let i = 0; i <= splitPath.length; i++) { // console.log('splitPath[i]', splitPath[i]); if (splitPath[i] === '#') { path = splitPath[i + 1]; // ดึง path หลัง # break; } } // console.log("path",path); if (path === route) { return true; } } return false; } } B2bService.decorators = [ { type: Injectable } ]; /** @nocollapse */ B2bService.ctorParameters = () => [ { type: Http }, { type: AppConfigService } ]; if (false) { /** @type {?} */ B2bService.prototype.verifyTokenUrl; /** @type {?} */ B2bService.prototype.downloadTokenUrl; /** @type {?} */ B2bService.prototype._verifyToken; /** @type {?} */ B2bService.prototype.config; /** @type {?} */ B2bService.prototype.verifyToken; /** @type {?} */ B2bService.prototype.http; /** @type {?} */ B2bService.prototype.appConfigService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYjJiLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvX3NlcnZpY2VzL2IyYi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sdUJBQXVCLENBQUM7QUFHL0IsTUFBTTs7Ozs7SUFtQkYsWUFBb0IsSUFBVSxFQUNWO1FBREEsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUNWLHFCQUFnQixHQUFoQixnQkFBZ0I7OEJBbkJuQixFQUFFO2dDQUNBLEVBQUU7NEJBQ0QsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDOzJCQUV4QjtZQUNmLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLHVCQUF1QixFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUM7WUFDbkUsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUMzQixpQkFBaUIsRUFBRTtnQkFDZixFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDakUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFB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QUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7WUFDaEUsSUFBSSxJQUFJLENBQUM7WUFDVCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7Z0JBRXhDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtvQkFDdEIsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLE1BQU07aUJBQ1Q7YUFDSjs7WUFFRCxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0tBQ2hCOzs7WUF0T0osVUFBVTs7OztZQVJPLElBQUk7WUFHYixnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIZWFkZXJzLCBIdHRwLCBSZXF1ZXN0T3B0aW9ucywgUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL09ic2VydmFibGUnO1xuaW1wb3J0IHsgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFwcENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9hcHAtY29uZmlnL2FwcC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCMmJTZXJ2aWNlIHtcbiAgICB2ZXJpZnlUb2tlblVybCA9ICcnO1xuICAgIGRvd25sb2FkVG9rZW5VcmwgPSAnJztcbiAgICBfdmVyaWZ5VG9rZW46IGFueSA9IG5ldyBCZWhhdmlvclN1YmplY3Qoe30pO1xuICAgIGNvbmZpZzogYW55O1xuICAgIHZlcmlmeVRva2VuOiBhbnkgPSB7XG4gICAgICAgICd1c2VybmFtZSc6ICckdXNlcm5hbWUnLFxuICAgICAgICAnc2Vzc2lvbklkJzogJyRzZXNzaW9uSWQnLFxuICAgICAgICAnZ3JvdXBJbnRlZ3JhdGlvbk5hbWVzJzogWydncm91cE5hbWUxJywgJ2dyb3VwTmFtZTInLCAnZ3JvdXBOYW1lMyddLFxuICAgICAgICAnbWVudXMnOiBbJ21lbnUxJywgJ21lbnUyJ10sXG4gICAgICAgICdtZW51UGVybWlzc2lvbnMnOiBbXG4gICAgICAgICAgICB7ICdtZW51TmFtZSc6ICdtZW51MScsICdwZXJtaXNzaW9ucyc6IFsnYWRkJywgJ2VkaXQnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIHsgJ21lbnVOYW1lJzogJ21lbnUyJywgJ3Blcm1pc3Npb25zJzogWyd2aWV3JywgJ2FkZCcsICdlZGl0J10gfVxuICAgICAgICBdLFxuICAgICAgICAnYXR0YWNobWVudFRva2VuJzoge1xuICAgICAgICAgICAgJ3Rva2VuJzogJ0RPV05MT0FEU19BRUI0OTZGNkRFRDM0RkZGOTNGNjY4NDEyRTNDREQzOCcsXG4gICAgICAgICAgICAnZXhwaXJlJzogJzIwMTgtMDktMjEgMDk6MDA6MDAnXG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cCxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGFwcENvbmZpZ1NlcnZpY2U6IEFwcENvbmZpZ1NlcnZpY2UsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gYXBwQ29uZmlnU2VydmljZS5nZXRDb25maWcoKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2IyYiBjb25maWcnLHRoaXMuY29uZmlnKTtcbiAgICAgICAgdGhpcy52ZXJpZnlUb2tlblVybCA9IF8uZ2V0KHRoaXMuY29uZmlnLCAnYXBpU2VydmVycy5wb3J0YWwtYmFja2VuZC52ZXJpZnlUb2tlbicpO1xuICAgICAgICB0aGlzLmRvd25sb2FkVG9rZW5VcmwgPSBfLmdldCh0aGlzLmNvbmZpZywgJ2FwaVNlcnZlcnMucG9ydGFsLWJhY2tlbmQuZG93bmxvYWRUb2tlbicpO1xuICAgIH1cbiAgICB2ZXJpZnkoKSB7XG4gICAgICAgIC8vIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuY29uZmlnLmFwaVZlcmlmeVRva2VuICsgdGhpcy51cmwsIHRoaXMuand0KCkpLnRvUHJvbWlzZSgpO1xuICAgICAgICBjb25zdCBib2R5ID0ge1xuICAgICAgICAgICAgJ21pY3JvSW50ZWdyYXRpb25OYW1lJzogXy5nZXQodGhpcy5jb25maWcsICdtaWNyb0ludGVncmF0aW9uTmFtZScpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnZlcmlmeVRva2VuVXJsLCBib2R5LCB0aGlzLmp3dCgpKS5tYXAoKHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlcy5qc29uKCkpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzKTtcbiAgICAgICAgICAgIHJlcyA9IHJlcy5qc29uKCk7XG4gICAgICAgICAgICBpZiAoK3Jlc1sncmVzdWx0Q29kZSddID09PSAyMDAwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmVyaWZ5VG9rZW4gPSByZXNbJ3Jlc3VsdERhdGEnXTtcbiAgICAgICAgICAgICAgICB0aGlzLl92ZXJpZnlUb2tlbi5uZXh0KHJlc1sncmVzdWx0RGF0YSddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2UgaWYoK3Jlc1sncmVzdWx0Q29kZSddID09PSA0MDEwMCl7XG4gICAgICAgICAgICAvLyAgIGxldCBfX3Jlc3VsdERhdGEgPSByZXNbJ3Jlc3VsdERhdGEnXTtcbiAgICAgICAgICAgIC8vICAgdGhpcy5jaGVja1Nlc3Npb24oX19yZXN1bHREYXRhLnVzZXJNZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudmVyaWZ5VG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yOiBhbnkpID0+IE9ic2VydmFibGUudGhyb3coZXJyb3IuanNvbigpLmVycm9yIHx8ICdTZXJ2ZXIgZXJyb3InKSkudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN1YnNjcmliZVZlcmlmeVRva2VuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5VG9rZW4uYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgZ2V0VmVyaWZ5VG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnlUb2tlbi5nZXRWYWx1ZSgpO1xuICAgIH1cblxuXG4gICAgY2hlY2tTZXNzaW9uKHVzZXJNZXNzYWdlKXtcbiAgICAgIGNvbnNvbGUubG9nKCdjaGVja1Nlc3Npb24nKTtcbiAgICAgIGNvbnN0IHRva2VuID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKTtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNvbW1hbmQ6XCJjaGVja1Nlc3Npb25cIixcbiAgICAgICAgICBtZXNzYWdlOiB0b2tlbixcbiAgICAgICAgICB1c2VyTWVzc2FnZTogdXNlck1lc3NhZ2UgfHwgJ1Vua25vdydcbiAgICAgIH0pLCAnKicpO1xuICAgICAgY29uc29sZS5sb2coJ2NoZWNrU2Vzc2lvbicsSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNvbW1hbmQ6XCJjaGVja1Nlc3Npb25cIixcbiAgICAgICAgICBtZXNzYWdlOiB0b2tlbixcbiAgICAgICAgICB1c2VyTWVzc2FnZTogdXNlck1lc3NhZ2UgfHwgJ1Vua25vdydcbiAgICAgIH0pKTtcbiAgICB9XG5cblxuICAgIC8qKiDguKPguLHguJrguITguYjguLIgcm9sZSDguJfguLXguYjguKHguLXguKrguLTguJfguJjguLTguYwgKi9cbiAgICAvLyBpc0NoZWNrR3JvdXAocm9sZVBlcm1pc3Npb24pIHtcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCJyb2xlUGVybWlzc2lvblwiLHJvbGVQZXJtaXNzaW9uKTtcbiAgICAvLyAgICAgLyoqIG1vY2t1cCByZXNwb25zZSovXG4gICAgLy8gICAgIGxldCB2ZXJpZnkgPSBbXTtcbiAgICAvLyAgICAgdGhpcy52ZXJpZnlUb2tlbi5tZW51UGVybWlzc2lvbnMuZm9yRWFjaChtZW51UGVybWlzc2lvbnMgPT4ge1xuICAgIC8vICAgICAgICAgaWYgKG1lbnVQZXJtaXNzaW9ucy5tZW51TmFtZSA9PT0gcm9sZVBlcm1pc3Npb24ucm9sZSkge1xuICAgIC8vICAgICAgICAgICAgIHZlcmlmeSA9IG1lbnVQZXJtaXNzaW9ucy5wZXJtaXNzaW9ucztcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwidmVyaWZ5XCIsdmVyaWZ5KTtcblxuICAgIC8vICAgICBjb25zdCBjaGVja0FycmFyeSA9IF8uaW50ZXJzZWN0aW9uKHZlcmlmeSwgcm9sZVBlcm1pc3Npb24uY29tcG9uZW50KTtcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCJjaGVja0FycmFyeVwiLGNoZWNrQXJyYXJ5KTtcbiAgICAvLyAgICAgaWYgKGNoZWNrQXJyYXJ5Lmxlbmd0aCAhPT0gMCkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBpc0NoZWNrR3JvdXAocm91dGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJpc0NoZWNrR3JvdXAgcm91dGVcIiwgcm91dGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzQ2hlY2tHcm91cCB0aGlzLnZlcmlmeVRva2VuXCIsIHRoaXMudmVyaWZ5VG9rZW4pO1xuICAgICAgICBsZXQgdmVyaWZ5ID0gW107XG4gICAgICAgIGZvciAobGV0IG1lbnVQZXJtaXNzaW9ucyBvZiB0aGlzLnZlcmlmeVRva2VuLm1lbnVQZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpc0NoZWNrR3JvdXAgbWVudVBlcm1pc3Npb25zXCIsIG1lbnVQZXJtaXNzaW9ucyk7XG4gICAgICAgICAgICBsZXQgdXJsID0gbWVudVBlcm1pc3Npb25zLnVybCB8fCBcIlwiO1xuICAgICAgICAgICAgbGV0IHNwbGl0UGF0aCA9IHVybC5zcGxpdCgnPycpO1xuICAgICAgICAgICAgc3BsaXRQYXRoID0gc3BsaXRQYXRoLmxlbmd0aCA+IDAgPyBzcGxpdFBhdGhbMF0uc3BsaXQoJy8nKSA6IFtdOyAvLyBzcGxpdCBwYXRoXG4gICAgICAgICAgICBsZXQgcGF0aDsgLy8g4LiU4Li24LiHIHBhdGgg4Liq4Li44LiU4LiX4LmJ4Liy4LiiXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBzcGxpdFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnaXNDaGVja0dyb3VwIHNwbGl0UGF0aFtpXScsIHNwbGl0UGF0aFtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0UGF0aFtpXSA9PT0gJyMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBzcGxpdFBhdGhbaSArIDFdOyAvLyDguJTguLbguIcgcGF0aCDguKvguKXguLHguIcgI1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzQ2hlY2tHcm91cCBwYXRoXCIsIHBhdGgpO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IHJvdXRlLnJvdXRlKSB7XG4gICAgICAgICAgICAgICAgdmVyaWZ5ID0gbWVudVBlcm1pc3Npb25zLnBlcm1pc3Npb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXNDaGVja0dyb3VwIHZlcmlmeVwiLCB2ZXJpZnkpO1xuXG4gICAgICAgIGNvbnN0IGNoZWNrQXJyYXJ5ID0gXy5pbnRlcnNlY3Rpb24odmVyaWZ5LCByb3V0ZS5jb21wb25lbnQpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzQ2hlY2tHcm91cCBjaGVja0FycmFyeVwiLCBjaGVja0FycmFyeSk7XG4gICAgICAgIGlmIChjaGVja0FycmFyeS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIOC4o+C4seC4muC4hOC5iOC4siBndWFyZCDguJfguLXguYjguKHguLXguKrguLTguJfguJjguLTguYwgKi9cbiAgICBpc0NoZWNrR3VhcmQocm9sZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJvbGVcIixyb2xlKTtcbiAgICAgICAgLyoqIG1vY2t1cCByZXNwb25zZSovXG5cbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy52ZXJpZnlUb2tlbi5tZW51cyk7XG4gICAgICAgIGNvbnN0IGNoZWNrQXJyYXJ5ID0gXy5pbnRlcnNlY3Rpb24odGhpcy52ZXJpZnlUb2tlbi5tZW51cywgW3JvbGVdKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja0FycmFyeVwiLGNoZWNrQXJyYXJ5KTtcbiAgICAgICAgaWYgKGNoZWNrQXJyYXJ5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2ZXJpZnlEZW1vKCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3Rva2VuJyk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCd0b2tlbicsIHRva2VuKTtcbiAgICAgICAgaWYgKHRva2VuICYmIHRva2VuID09PSAnZGVtbycpIHtcbiAgICAgICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgICAgICAgJ3Jlc3VsdENvZGUnOiAnMjAwMDAnLFxuICAgICAgICAgICAgICAgICdyZXN1bHREZXNjcmlwdGlvbic6ICdTdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAncmVzdWx0RGF0YSc6IHtcbiAgICAgICAgICAgICAgICAgICAgJ2IyYlRva2VuJzogJyRiMmJUb2tlbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS50b1Byb21pc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgICAgJ3Jlc3VsdENvZGUnOiAnNDAwMDAnLFxuICAgICAgICAgICAgJ3Jlc3VsdERlc2NyaXB0aW9uJzogJycsXG4gICAgICAgIH0pLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgand0KCkge1xuICAgICAgICAvLyBjcmVhdGUgYXV0aG9yaXphdGlvbiBoZWFkZXIgd2l0aCBqd3QgdG9rZW5cbiAgICAgICAgY29uc3QgdG9rZW4gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd0b2tlbicpO1xuXG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgJ0F1dGhvcml6YXRpb24nOiAnQmVhcmVyICcgKyB0b2tlbiAsICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICd4LXRva2VuJzogJzEnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0T3B0aW9ucyh7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRBdHRhY2htZW50VG9rZW4oKXtcblxuICAgICAgICBsZXQgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGV0IGV4cGlyZURhdGUgPSBuZXcgRGF0ZSh0aGlzLnZlcmlmeVRva2VuLmF0dGFjaG1lbnRUb2tlbi5leHBpcmUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIm5vd1wiLG5vdyk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXhwaXJlRGF0ZVwiLGV4cGlyZURhdGUpO1xuICAgICAgICBsZXQgY2hlY2tEYXRlVmFsaWQgPSBub3cgPD0gZXhwaXJlRGF0ZTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja0RhdGVWYWxpZFwiLGNoZWNrRGF0ZVZhbGlkKTtcbiAgICAgICAgaWYoY2hlY2tEYXRlVmFsaWQpe1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVyaWZ5VG9rZW4uYXR0YWNobWVudFRva2VuLnRva2VuO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmh0dHAucG9zdCh0aGlzLmRvd25sb2FkVG9rZW5VcmwsIHt9LCB0aGlzLmp3dCgpKS5tYXAoKHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yOiBhbnkpID0+IE9ic2VydmFibGUudGhyb3coZXJyb3IuanNvbigpLmVycm9yIHx8ICdTZXJ2ZXIgZXJyb3InKSkudG9Qcm9taXNlKCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3Jlc3BvbnNlICcscmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIGlmICgrcmVzcG9uc2VbJ3Jlc3VsdENvZGUnXSA9PT0gMjAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ZXJpZnlUb2tlbi5hdHRhY2htZW50VG9rZW4gPSByZXNwb25zZVsncmVzdWx0RGF0YSddO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VbJ3Jlc3VsdERhdGEnXS50b2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZWxzZSBpZigrcmVzcG9uc2VbJ3Jlc3VsdENvZGUnXSA9PT0gNDAxMDApe1xuICAgICAgICAgICAgICAgIC8vICAgbGV0IF9fcmVzdWx0RGF0YSA9IHJlc3BvbnNlWydyZXN1bHREYXRhJ107XG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLmNoZWNrU2Vzc2lvbihfX3Jlc3VsdERhdGEudXNlck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIC8vICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWNhdGNoIChlKXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgJyxlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIOC4o+C4seC4muC4hOC5iOC4siBndWFyZCDguJfguLXguYjguKHguLXguKrguLTguJfguJjguLTguYwgKi9cbiAgICBpc0NoZWNrR3VhcmRSb3V0ZVBhdGgocm91dGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJyb3V0ZVwiLHJvdXRlKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0aGlzLnZlcmlmeVRva2VuXCIsdGhpcy52ZXJpZnlUb2tlbik7XG4gICAgICAgIGZvcihsZXQgbWVudVBlcm1pc3Npb25zIG9mIHRoaXMudmVyaWZ5VG9rZW4ubWVudVBlcm1pc3Npb25zKXtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibWVudVBlcm1pc3Npb25zXCIsbWVudVBlcm1pc3Npb25zKTtcbiAgICAgICAgICAgIGxldCB1cmwgPSBtZW51UGVybWlzc2lvbnMudXJsIHx8IFwiXCI7XG4gICAgICAgICAgICBsZXQgc3BsaXRQYXRoID0gdXJsLnNwbGl0KCc/Jyk7XG4gICAgICAgICAgICBzcGxpdFBhdGggPSBzcGxpdFBhdGgubGVuZ3RoID4gMCA/IHNwbGl0UGF0aFswXS5zcGxpdCgnLycpIDogW107IC8vIHNwbGl0IHBhdGhcbiAgICAgICAgICAgIGxldCBwYXRoOyAvLyDguJTguLbguIcgcGF0aCDguKrguLjguJTguJfguYnguLLguKJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNwbGl0UGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzcGxpdFBhdGhbaV0nLCBzcGxpdFBhdGhbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdFBhdGhbaV0gPT09ICcjJykge1xuICAgICAgICAgICAgICAgICAgICBwYXRoID0gc3BsaXRQYXRoW2krMV07IC8vIOC4lOC4tuC4hyBwYXRoIOC4q+C4peC4seC4hyAjXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGF0aFwiLHBhdGgpO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IHJvdXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiJdfQ==