UNPKG

breeze-client

Version:

Breeze data management for JavaScript clients

135 lines 18.4 kB
import { config, core } from 'breeze-client'; import { appendQueryStringParameter, encodeParams } from './adapter-core'; export class AjaxAngularjsAdapter { name; defaultSettings; requestInterceptor; $http; $rootScope; constructor() { this.name = "angularjs"; this.defaultSettings = {}; this.requestInterceptor = undefined; // Will set: // this.$http; // this.$rootScope; } static register(breezeConfig) { breezeConfig = breezeConfig || config; breezeConfig.registerAdapter("ajax", AjaxAngularjsAdapter); return breezeConfig.initializeAdapterInstance("ajax", "angularjs", true); } initialize() { let ng = core.requireLib("angular"); if (ng) { let $injector = ng.injector(['ng']); let http, rootScope; $injector.invoke(['$http', '$rootScope', function ($http, $rootScope) { http = $http; rootScope = $rootScope; }]); this.$http = http; this.$rootScope = rootScope; } } setHttp(http) { this.$http = http; this.$rootScope = null; // to suppress $rootScope.digest } ajax(config) { if (!this.$http) { throw new Error("Unable to locate angularjs for ajax adapter"); } let ngConfig = { method: config.type, url: config.url, dataType: config.dataType, contentType: config.contentType, crossDomain: config.crossDomain, headers: config.headers || {}, data: undefined }; if (config.params) { // Hack: because of the way that Angular handles writing parameters out to the url. // so this approach takes over the url param writing completely. // See: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/ ngConfig.url = appendQueryStringParameter(ngConfig.url, encodeParams(config.params)); } if (config.data) { ngConfig.data = config.data; } if (!core.isEmpty(this.defaultSettings)) { let compositeConfig = core.extend({}, this.defaultSettings); ngConfig = core.extend(compositeConfig, ngConfig); // extend is shallow; extend headers separately let headers = core.extend({}, this.defaultSettings.headers); // copy default headers 1st ngConfig.headers = core.extend(headers, ngConfig.headers); } let requestInfo = { adapter: this, config: ngConfig, dsaConfig: config, success: successFn, error: errorFn, responseSuccess: responseSuccessFn, responseError: responseErrorFn // adapter's error callback (ng 1.6+) }; if (core.isFunction(this.requestInterceptor)) { let ri = this.requestInterceptor; ri(requestInfo); if (ri.oneTime) { this.requestInterceptor = undefined; } } if (requestInfo.config) { // exists unless requestInterceptor killed it. let prom = this.$http(requestInfo.config); if (prom.success) { // response for ng < 1.6 prom.success(requestInfo.success).error(requestInfo.error); } else { // response for ng 1.6+ prom.then(requestInfo.responseSuccess).catch(requestInfo.responseError); } this.$rootScope && this.$rootScope.$digest(); } function responseSuccessFn(response) { return successFn(response.data, response.status, response.headers, response.config, response.statusText); } function successFn(data, status, headers, xconfig, statusText) { // HACK: because $http returns a server side null as a string containing "null" - this is WRONG. if (data === "null") data = null; let httpResponse = { config: config, data: data, getHeaders: headers, ngConfig: xconfig, status: status, statusText: statusText }; config.success(httpResponse); } function responseErrorFn(response) { return errorFn(response.data, response.status, response.headers, response.config, response.statusText); } function errorFn(data, status, headers, xconfig, statusText) { // Timeout appears as an error with status===0 and no data. // Make it better if (status === 0 && data == null) { data = 'timeout'; } let httpResponse = { config: config, data: data, getHeaders: headers, ngConfig: xconfig, status: status, statusText: statusText }; config.error(httpResponse); } } } config.registerAdapter("ajax", AjaxAngularjsAdapter); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci1hamF4LWFuZ3VsYXJqcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGVyLWFqYXgtYW5ndWxhcmpzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUQsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUUsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixJQUFJLENBQVM7SUFDYixlQUFlLENBQTJDO0lBQzFELGtCQUFrQixDQUEwQjtJQUM1QyxLQUFLLENBQU07SUFDWCxVQUFVLENBQU07SUFDaEI7UUFDRSxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIscUJBQXFCO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQTJCO1FBQ3pDLFlBQVksR0FBRyxZQUFZLElBQUksTUFBTSxDQUFDO1FBQ3RDLFlBQVksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDM0QsT0FBTyxZQUFZLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQXlCLENBQUM7SUFDbkcsQ0FBQztJQUVELFVBQVU7UUFFUixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksRUFBRSxFQUFFO1lBQ04sSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxJQUFTLEVBQUUsU0FBYyxDQUFDO1lBQzlC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QWE7WUFDcEMsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUVELFNBQVMsT0FBTyxDQUFDLElBQVMsRUFBRSxNQUFXLEVBQUUsT0FBWSxFQUFFLE9BQVksRUFBRSxVQUFrQjtZQUNyRiwyREFBMkQ7WUFDM0QsaUJBQWlCO1lBQ2pCLElBQUksTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO2dCQUNoQyxJQUFJLEdBQUcsU0FBUyxDQUFDO2FBQ2xCO1lBQ0QsSUFBSSxZQUFZLEdBQUc7Z0JBQ2pCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxJQUFJO2dCQUNWLFVBQVUsRUFBRSxPQUFPO2dCQUNuQixRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsVUFBVSxFQUFFLFVBQVU7YUFDdkIsQ0FBQztZQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBamF4QWRhcHRlciwgQWpheFJlcXVlc3RJbnRlcmNlcHRvciwgQnJlZXplQ29uZmlnLCBjb25maWcsIGNvcmUgfSBmcm9tICdicmVlemUtY2xpZW50JztcclxuaW1wb3J0IHsgYXBwZW5kUXVlcnlTdHJpbmdQYXJhbWV0ZXIsIGVuY29kZVBhcmFtcyB9IGZyb20gJy4vYWRhcHRlci1jb3JlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBBamF4QW5ndWxhcmpzQWRhcHRlciBpbXBsZW1lbnRzIEFqYXhBZGFwdGVyIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZGVmYXVsdFNldHRpbmdzOiB7IGhlYWRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSB9O1xyXG4gIHJlcXVlc3RJbnRlcmNlcHRvcj86IEFqYXhSZXF1ZXN0SW50ZXJjZXB0b3I7XHJcbiAgJGh0dHA6IGFueTtcclxuICAkcm9vdFNjb3BlOiBhbnk7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLm5hbWUgPSBcImFuZ3VsYXJqc1wiO1xyXG4gICAgdGhpcy5kZWZhdWx0U2V0dGluZ3MgPSB7fTtcclxuICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9yID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gV2lsbCBzZXQ6XHJcbiAgICAvLyAgIHRoaXMuJGh0dHA7XHJcbiAgICAvLyAgIHRoaXMuJHJvb3RTY29wZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyByZWdpc3RlcihicmVlemVDb25maWc/OiBCcmVlemVDb25maWcpIHtcclxuICAgIGJyZWV6ZUNvbmZpZyA9IGJyZWV6ZUNvbmZpZyB8fCBjb25maWc7XHJcbiAgICBicmVlemVDb25maWcucmVnaXN0ZXJBZGFwdGVyKFwiYWpheFwiLCBBamF4QW5ndWxhcmpzQWRhcHRlcik7XHJcbiAgICByZXR1cm4gYnJlZXplQ29uZmlnLmluaXRpYWxpemVBZGFwdGVySW5zdGFuY2UoXCJhamF4XCIsIFwiYW5ndWxhcmpzXCIsIHRydWUpIGFzIEFqYXhBbmd1bGFyanNBZGFwdGVyO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZSgpIHtcclxuXHJcbiAgICBsZXQgbmcgPSBjb3JlLnJlcXVpcmVMaWIoXCJhbmd1bGFyXCIpO1xyXG4gICAgaWYgKG5nKSB7XHJcbiAgICAgIGxldCAkaW5qZWN0b3IgPSBuZy5pbmplY3RvcihbJ25nJ10pO1xyXG4gICAgICBsZXQgaHR0cDogYW55LCByb290U2NvcGU6IGFueTtcclxuICAgICAgJGluamVjdG9yLmludm9rZShbJyRodHRwJywgJyRyb290U2NvcGUnLCBmdW5jdGlvbiAoJGh0dHA6IGFueSwgJHJvb3RTY29wZTogYW55KSB7XHJcbiAgICAgICAgaHR0cCA9ICRodHRwO1xyXG4gICAgICAgIHJvb3RTY29wZSA9ICRyb290U2NvcGU7XHJcbiAgICAgIH1dKTtcclxuICAgICAgdGhpcy4kaHR0cCA9IGh0dHA7XHJcbiAgICAgIHRoaXMuJHJvb3RTY29wZSA9IHJvb3RTY29wZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzZXRIdHRwKGh0dHA6IGFueSkge1xyXG4gICAgdGhpcy4kaHR0cCA9IGh0dHA7XHJcbiAgICB0aGlzLiRyb290U2NvcGUgPSBudWxsOyAvLyB0byBzdXBwcmVzcyAkcm9vdFNjb3BlLmRpZ2VzdFxyXG4gIH1cclxuXHJcblxyXG4gIGFqYXgoY29uZmlnOiBhbnkpIHtcclxuICAgIGlmICghdGhpcy4kaHR0cCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gbG9jYXRlIGFuZ3VsYXJqcyBmb3IgYWpheCBhZGFwdGVyXCIpO1xyXG4gICAgfVxyXG4gICAgbGV0IG5nQ29uZmlnID0ge1xyXG4gICAgICBtZXRob2Q6IGNvbmZpZy50eXBlLFxyXG4gICAgICB1cmw6IGNvbmZpZy51cmwsXHJcbiAgICAgIGRhdGFUeXBlOiBjb25maWcuZGF0YVR5cGUsXHJcbiAgICAgIGNvbnRlbnRUeXBlOiBjb25maWcuY29udGVudFR5cGUsXHJcbiAgICAgIGNyb3NzRG9tYWluOiBjb25maWcuY3Jvc3NEb21haW4sXHJcbiAgICAgIGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzIHx8IHt9LFxyXG4gICAgICBkYXRhOiB1bmRlZmluZWQgYXMgYW55XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChjb25maWcucGFyYW1zKSB7XHJcbiAgICAgIC8vIEhhY2s6IGJlY2F1c2Ugb2YgdGhlIHdheSB0aGF0IEFuZ3VsYXIgaGFuZGxlcyB3cml0aW5nIHBhcmFtZXRlcnMgb3V0IHRvIHRoZSB1cmwuXHJcbiAgICAgIC8vIHNvIHRoaXMgYXBwcm9hY2ggdGFrZXMgb3ZlciB0aGUgdXJsIHBhcmFtIHdyaXRpbmcgY29tcGxldGVseS5cclxuICAgICAgLy8gU2VlOiBodHRwOi8vdmljdG9yYmxvZy5jb20vMjAxMi8xMi8yMC9tYWtlLWFuZ3VsYXJqcy1odHRwLXNlcnZpY2UtYmVoYXZlLWxpa2UtanF1ZXJ5LWFqYXgvXHJcbiAgICAgIG5nQ29uZmlnLnVybCA9IGFwcGVuZFF1ZXJ5U3RyaW5nUGFyYW1ldGVyKG5nQ29uZmlnLnVybCwgZW5jb2RlUGFyYW1zKGNvbmZpZy5wYXJhbXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZmlnLmRhdGEpIHtcclxuICAgICAgbmdDb25maWcuZGF0YSA9IGNvbmZpZy5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29yZS5pc0VtcHR5KHRoaXMuZGVmYXVsdFNldHRpbmdzKSkge1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZmlnID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzKTtcclxuICAgICAgbmdDb25maWcgPSBjb3JlLmV4dGVuZChjb21wb3NpdGVDb25maWcsIG5nQ29uZmlnKSBhcyBhbnk7XHJcbiAgICAgIC8vIGV4dGVuZCBpcyBzaGFsbG93OyBleHRlbmQgaGVhZGVycyBzZXBhcmF0ZWx5XHJcbiAgICAgIGxldCBoZWFkZXJzID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzLmhlYWRlcnMpOyAvLyBjb3B5IGRlZmF1bHQgaGVhZGVycyAxc3RcclxuICAgICAgbmdDb25maWcuaGVhZGVycyA9IGNvcmUuZXh0ZW5kKGhlYWRlcnMsIG5nQ29uZmlnLmhlYWRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXF1ZXN0SW5mbyA9IHtcclxuICAgICAgYWRhcHRlcjogdGhpcywgICAgICAvLyB0aGlzIGFkYXB0ZXJcclxuICAgICAgY29uZmlnOiBuZ0NvbmZpZywgICAvLyBhbmd1bGFyJ3MgJGh0dHAgY29uZmlndXJhdGlvbiBvYmplY3RcclxuICAgICAgZHNhQ29uZmlnOiBjb25maWcsICAvLyB0aGUgY29uZmlnIGFyZyBmcm9tIHRoZSBjYWxsaW5nIEJyZWV6ZSBEYXRhU2VydmljZUFkYXB0ZXJcclxuICAgICAgc3VjY2Vzczogc3VjY2Vzc0ZuLCAvLyBhZGFwdGVyJ3Mgc3VjY2VzcyBjYWxsYmFja1xyXG4gICAgICBlcnJvcjogZXJyb3JGbiwgICAgICAvLyBhZGFwdGVyJ3MgZXJyb3IgY2FsbGJhY2tcclxuICAgICAgcmVzcG9uc2VTdWNjZXNzOiByZXNwb25zZVN1Y2Nlc3NGbiwgLy8gYWRhcHRlcidzIHN1Y2Nlc3MgY2FsbGJhY2sgKG5nIDEuNispXHJcbiAgICAgIHJlc3BvbnNlRXJyb3I6IHJlc3BvbnNlRXJyb3JGbiAgICAgIC8vIGFkYXB0ZXIncyBlcnJvciBjYWxsYmFjayAobmcgMS42KylcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGNvcmUuaXNGdW5jdGlvbih0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcikpIHtcclxuICAgICAgbGV0IHJpID0gdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IgYXMgYW55O1xyXG4gICAgICByaShyZXF1ZXN0SW5mbyk7XHJcbiAgICAgIGlmIChyaS5vbmVUaW1lKSB7XHJcbiAgICAgICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVxdWVzdEluZm8uY29uZmlnKSB7IC8vIGV4aXN0cyB1bmxlc3MgcmVxdWVzdEludGVyY2VwdG9yIGtpbGxlZCBpdC5cclxuICAgICAgbGV0IHByb20gPSB0aGlzLiRodHRwKHJlcXVlc3RJbmZvLmNvbmZpZyk7XHJcbiAgICAgIGlmIChwcm9tLnN1Y2Nlc3MpIHtcclxuICAgICAgICAvLyByZXNwb25zZSBmb3IgbmcgPCAxLjYgICAgICAgIFxyXG4gICAgICAgIHByb20uc3VjY2VzcyhyZXF1ZXN0SW5mby5zdWNjZXNzKS5lcnJvcihyZXF1ZXN0SW5mby5lcnJvcik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gcmVzcG9uc2UgZm9yIG5nIDEuNitcclxuICAgICAgICBwcm9tLnRoZW4ocmVxdWVzdEluZm8ucmVzcG9uc2VTdWNjZXNzKS5jYXRjaChyZXF1ZXN0SW5mby5yZXNwb25zZUVycm9yKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLiRyb290U2NvcGUgJiYgdGhpcy4kcm9vdFNjb3BlLiRkaWdlc3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZXNwb25zZVN1Y2Nlc3NGbihyZXNwb25zZTogYW55KSB7XHJcbiAgICAgIHJldHVybiBzdWNjZXNzRm4ocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLCByZXNwb25zZS5jb25maWcsIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHN1Y2Nlc3NGbihkYXRhOiBhbnksIHN0YXR1czogYW55LCBoZWFkZXJzOiBhbnksIHhjb25maWc6IGFueSwgc3RhdHVzVGV4dDogc3RyaW5nKSB7XHJcbiAgICAgIC8vIEhBQ0s6IGJlY2F1c2UgJGh0dHAgcmV0dXJucyBhIHNlcnZlciBzaWRlIG51bGwgYXMgYSBzdHJpbmcgY29udGFpbmluZyBcIm51bGxcIiAtIHRoaXMgaXMgV1JPTkcuXHJcbiAgICAgIGlmIChkYXRhID09PSBcIm51bGxcIikgZGF0YSA9IG51bGw7XHJcbiAgICAgIGxldCBodHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgY29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICBnZXRIZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICAgIG5nQ29uZmlnOiB4Y29uZmlnLFxyXG4gICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHRcclxuICAgICAgfTtcclxuICAgICAgY29uZmlnLnN1Y2Nlc3MoaHR0cFJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZXNwb25zZUVycm9yRm4ocmVzcG9uc2U6IGFueSkge1xyXG4gICAgICByZXR1cm4gZXJyb3JGbihyZXNwb25zZS5kYXRhLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMsIHJlc3BvbnNlLmNvbmZpZywgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZXJyb3JGbihkYXRhOiBhbnksIHN0YXR1czogYW55LCBoZWFkZXJzOiBhbnksIHhjb25maWc6IGFueSwgc3RhdHVzVGV4dDogc3RyaW5nKSB7XHJcbiAgICAgIC8vIFRpbWVvdXQgYXBwZWFycyBhcyBhbiBlcnJvciB3aXRoIHN0YXR1cz09PTAgYW5kIG5vIGRhdGEuXHJcbiAgICAgIC8vIE1ha2UgaXQgYmV0dGVyXHJcbiAgICAgIGlmIChzdGF0dXMgPT09IDAgJiYgZGF0YSA9PSBudWxsKSB7XHJcbiAgICAgICAgZGF0YSA9ICd0aW1lb3V0JztcclxuICAgICAgfVxyXG4gICAgICBsZXQgaHR0cFJlc3BvbnNlID0ge1xyXG4gICAgICAgIGNvbmZpZzogY29uZmlnLFxyXG4gICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgZ2V0SGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICBuZ0NvbmZpZzogeGNvbmZpZyxcclxuICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICBzdGF0dXNUZXh0OiBzdGF0dXNUZXh0XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbmZpZy5lcnJvcihodHRwUmVzcG9uc2UpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuY29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImFqYXhcIiwgQWpheEFuZ3VsYXJqc0FkYXB0ZXIpO1xyXG4iXX0=