@wavemaker/app-ng-runtime 12.0.0-next.1417157 → 12.0.0-next.1417166

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wavemaker/app-ng-runtime",
3
- "version": "12.0.0-next.1417157",
3
+ "version": "12.0.0-next.1417166",
4
4
  "description": "All modules required for a wavemaker application.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -96,6 +96,7 @@
96
96
  this.requestQueue[id] = null;
97
97
  }
98
98
  function onSuccess(config) {
99
+ config = config ? config : {};
99
100
  config.homePage = i1.getWmProjectProperties().homePage;
100
101
  if (config.userInfo) ;
101
102
  this.config = config;
@@ -77,6 +77,7 @@ export class SecurityService {
77
77
  this.requestQueue[id] = null;
78
78
  }
79
79
  function onSuccess(config) {
80
+ config = config ? config : {};
80
81
  config.homePage = getWmProjectProperties().homePage;
81
82
  if (config.userInfo) {
82
83
  // Backend returns landingPage instead of homePage, hence this statement(for consistency)
@@ -407,4 +408,4 @@ export class SecurityService {
407
408
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SecurityService, [{
408
409
  type: Injectable
409
410
  }], () => [{ type: i0.Injector }, { type: i1.AbstractHttpService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i3.Location }], null); })();
410
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NlY3VyaXR5L3NyYy9zZWN1cml0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsR0FBRyxFQUNILGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLFNBQVMsRUFDWixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSxXQUFXLENBQUM7Ozs7O0FBRWpFLHVEQUF1RDtBQUN2RCxNQUFNLGdCQUFnQixHQUFHLGVBQWUsRUFDcEMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBRzdCLE1BQU0sT0FBTyxlQUFlO0lBT3hCLFlBQ1ksUUFBa0IsRUFDbEIsS0FBMEIsRUFDMUIsYUFBcUIsRUFDckIsY0FBOEIsRUFDOUIsU0FBbUI7UUFKbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQVAvQixpQkFBWSxHQUFRLEVBQUUsQ0FBQztJQVFwQixDQUFDO0lBRUosUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsR0FBRztRQUNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FB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LENBQUM7NEJBQ1YsV0FBVyxFQUFFLENBQUM7d0JBQ2xCLENBQUMsQ0FBQyxDQUFDO29CQUNQLENBQUM7Z0JBQ0wsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE9BQU8sRUFBRSxDQUFDO2dCQUNkLENBQUM7WUFDTCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDWCxPQUFPLElBQUksT0FBTyxDQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUM1QixPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxFQUFFLENBQUM7Z0JBQ2IsQ0FBQztZQUNMLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxhQUFhO1FBQ1QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDckUsQ0FBQztnRkFyYVEsZUFBZTt1RUFBZixlQUFlLFdBQWYsZUFBZTs7aUZBQWYsZUFBZTtjQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1xuICAgIEFic3RyYWN0SHR0cFNlcnZpY2UsXG4gICAgQXBwLFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBnZXRXbVByb2plY3RQcm9wZXJ0aWVzLFxuICAgIGhhc0NvcmRvdmEsXG4gICAgdHJpZ2dlckZuXG59IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7ZWFjaCwgZm9yRWFjaCwgZ2V0LCBpc0VtcHR5LCBqb2luLCBzZXR9IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuLy8gVG9kb1tTaHViaGFtXTogTW92ZSBiZWxvdyBjb25zdGFudHMgdG8gYSBjb21tb24gZmlsZVxuY29uc3QgWFNSRl9DT09LSUVfTkFNRSA9ICd3bV94c3JmX3Rva2VuJyxcbiAgICBpc0FwcGxpY2F0aW9uVHlwZSA9IHRydWU7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZWN1cml0eVNlcnZpY2Uge1xuICAgIGNvbmZpZztcbiAgICBsYXN0TG9nZ2VkSW5Vc2VyO1xuICAgIGxvZ2dlZEluVXNlcjtcbiAgICBsb2FkUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuICAgIHJlcXVlc3RRdWV1ZTogYW55ID0ge307XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgJGh0dHA6IEFic3RyYWN0SHR0cFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcm91dGVyU2VydmljZTogUm91dGVyLFxuICAgICAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSBfbG9jYXRpb246IExvY2F0aW9uXG4gICAgKSB7fVxuXG4gICAgaXNMb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgICB9XG5cbiAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgICB9XG5cbiAgICBsb2FkKGZvcmNlRmxhZz86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYodGhpcy5sb2FkUHJvbWlzZSkge3JldHVybiB0aGlzLmxvYWRQcm9taXNlO31cbiAgICAgICAgIC8vIENoZWNrIHNlY3VyaXR5RW5hYmxlZCBmbGFnIGluIF9XTV9BUFBfUFJPUEVSVElFU1xuICAgICAgICBpZiAoISh3aW5kb3cgYXMgYW55KS5fV01fQVBQX1BST1BFUlRJRVM/LnNlY3VyaXR5RW5hYmxlZCB8fCAod2luZG93IGFzIGFueSkuX1dNX0FQUF9QUk9QRVJUSUVTWydzZWN1cml0eUluZm8nXSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsgXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JjZUZsYWcgJiYgdGhpcy5jb25maWcpIHtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29uZmlnKTt9XG4gICAgICAgIHRoaXMubG9hZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5zZW5kKHsndXJsJzogJy4vc2VydmljZXMvc2VjdXJpdHkvaW5mbycsICdtZXRob2QnOiAnR0VUJ30pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnID0gcmVzcG9uc2UuYm9keTtcbiAgICAgICAgICAgICAgICAgICAgKHdpbmRvdyBhcyBhbnkpLl9XTV9BUFBfUFJPUEVSVElFU1snc2VjdXJpdHlJbmZvJ10gPSB0aGlzLmNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RMb2dnZWRJblVzZXIgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5sb2dnZWRJblVzZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlZEluVXNlciA9IHRoaXMuY29uZmlnLnVzZXJJbmZvO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpPT57XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0pLmZpbmFsbHkoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkUHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBnZXRzIHRoZSBzZWN1cml0eSBjb25maWcgZnJvbSB0aGUgZGVwbG95ZWQgYXBwIChiYWNrZW5kIGNhbGwpXG4gICAgICogQHBhcmFtIHN1Y2Nlc3NcbiAgICAgKiBAcGFyYW0gZXJyb3JcbiAgICAgKi9cbiAgICBnZXRXZWJDb25maWcoc3VjY2VzcywgZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0KCkpIHtcbiAgICAgICAgICAgIC8vIGlmIGFscmVhZHkgZmV0Y2hlZCwgcmV0dXJuIGl0XG4gICAgICAgICAgICB0cmlnZ2VyRm4oc3VjY2VzcywgdGhpcy5nZXQoKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkKClcbiAgICAgICAgICAgIC50aGVuKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3MsIGNvbmZpZyk7XG4gICAgICAgICAgICB9LCBlcnJvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzZWN1cml0eSBjb25maWdcbiAgICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxiYWNrXG4gICAgICogQHBhcmFtIGZhaWx1cmVDYWxsYmFja1xuICAgICAqL1xuICAgIGdldENvbmZpZyhzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xuICAgICAgICBmdW5jdGlvbiBpbnZva2VRdWV1ZWRDYWxsYmFja3MoaWQsIG1ldGhvZCwgZGF0YSkge1xuICAgICAgICAgICAgZm9yRWFjaCh0aGlzLnJlcXVlc3RRdWV1ZVtpZF0sIGZuID0+IHRyaWdnZXJGbihmblttZXRob2RdLCBkYXRhKSk7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RRdWV1ZVtpZF0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKGNvbmZpZykge1xuICAgICAgICAgICAgY29uZmlnLmhvbWVQYWdlID0gZ2V0V21Qcm9qZWN0UHJvcGVydGllcygpLmhvbWVQYWdlO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy51c2VySW5mbykge1xuICAgICAgICAgICAgICAgIC8vIEJhY2tlbmQgcmV0dXJucyBsYW5kaW5nUGFnZSBpbnN0ZWFkIG9mIGhvbWVQYWdlLCBoZW5jZSB0aGlzIHN0YXRlbWVudChmb3IgY29uc2lzdGVuY3kpXG4gICAgICAgICAgICAgICAgLy8gY29uZmlnLnVzZXJJbmZvLmhvbWVQYWdlID0gY29uZmlnLnVzZXJJbmZvLmxhbmRpbmdQYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLmxhc3RMb2dnZWRJblVzZXIgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5sb2dnZWRJblVzZXIpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZWRJblVzZXIgPSBjb25maWcudXNlckluZm87XG4gICAgICAgICAgICBpbnZva2VRdWV1ZWRDYWxsYmFja3MuY2FsbCh0aGlzLCAnY29uZmlnJywgJ3N1Y2Nlc3MnLCB0aGlzLmdldCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgICAgIC8qaWYgKCRyb290U2NvcGUuaXNNb2JpbGVBcHBsaWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgICAnc2VjdXJpdHlFbmFibGVkJzogZmFsc2UsXG4gICAgICAgICAgICAgJ2F1dGhlbnRpY2F0ZWQnOiBmYWxzZSxcbiAgICAgICAgICAgICAnaG9tZVBhZ2UnOiBfV01fQVBQX1BST1BFUlRJRVMuaG9tZVBhZ2UsXG4gICAgICAgICAgICAgJ3VzZXJJbmZvJzogbnVsbCxcbiAgICAgICAgICAgICAnbG9naW4nOiBudWxsXG4gICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICBpbnZva2VRdWV1ZWRDYWxsYmFja3MoJ2NvbmZpZycsICdzdWNjZXNzJywgdGhpcy5nZXQoKSk7XG4gICAgICAgICAgICAgfSBlbHNlIHsqL1xuICAgICAgICAgICAgaW52b2tlUXVldWVkQ2FsbGJhY2tzLmNhbGwodGhpcywgJ2NvbmZpZycsICdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdldCgpKSB7XG4gICAgICAgICAgICAvLyBpZiBhbHJlYWR5IGZldGNoZWQsIHJldHVybiBpdFxuICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3NDYWxsYmFjaywgdGhpcy5nZXQoKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWV1ZSBjaGVjaywgaWYgc2FtZSBxdWV1ZSBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBkbyBub3Qgc2VuZCBhbm90aGVyIHJlcXVlc3RcbiAgICAgICAgdGhpcy5yZXF1ZXN0UXVldWUuY29uZmlnID0gdGhpcy5yZXF1ZXN0UXVldWUuY29uZmlnIHx8IFtdO1xuICAgICAgICB0aGlzLnJlcXVlc3RRdWV1ZS5jb25maWcucHVzaCh7XG4gICAgICAgICAgICBzdWNjZXNzOiBzdWNjZXNzQ2FsbGJhY2ssXG4gICAgICAgICAgICBlcnJvcjogZmFpbHVyZUNhbGxiYWNrXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0UXVldWUuY29uZmlnLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFzQ29yZG92YSgpKSB7XG4gICAgICAgICAgICAvLyBmb3Igd2ViIHByb2plY3QsIHJldHVybiBjb25maWcgcmV0dXJuZWQgZnJvbSBiYWNrZW5kIEFQSSBjYWxsLlxuICAgICAgICAgICAgdGhpcy5nZXRXZWJDb25maWcob25TdWNjZXNzLmJpbmQodGhpcyksIG9uRXJyb3IuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyogZWxzZSB7XG4gICAgICAgICAvISpcbiAgICAgICAgICogZm9yIG1vYmlsZSBhcHAsIGZpcnN0IGdldCB0aGUgbW9iaWxlIGNvbmZpZyAoc2F2ZWQgaW4gdGhlIGFwaylcbiAgICAgICAgICogLSBpZiBzZWN1cml0eSBub3QgZW5hYmxlZCwganVzdCByZXR1cm4gbW9iaWxlIGNvbmZpZyAobm8gYmFja2VuZCBjYWxsIHJlcXVpcmVkKVxuICAgICAgICAgKiAtIGVsc2UsIGdldCBXZWIgY29uZmlnICh3aWxsIGJlICB0aGUgc2FtZSBBUEkgaGl0IGZvciBsb2dpbikgYW5kIG1lcmdlIHRoZSBjb25maWcgd2l0aCBfbW9iaWxlY29uZmlnXG4gICAgICAgICAqIS9cbiAgICAgICAgIGdldE1vYmlsZUNvbmZpZyhmdW5jdGlvbiAobW9iaWxlY29uZmlnKSB7XG4gICAgICAgICBpZiAoIW1vYmlsZWNvbmZpZy5zZWN1cml0eUVuYWJsZWQpIHtcbiAgICAgICAgIG9uU3VjY2Vzcyhtb2JpbGVjb25maWcpO1xuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGdldFdlYkNvbmZpZyhmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICBjb25maWcgPSBtZXJnZVdlYkFuZE1vYmlsZUNvbmZpZyhjb25maWcpO1xuICAgICAgICAgb25TdWNjZXNzKGNvbmZpZyk7XG4gICAgICAgICB9LCBmdW5jdGlvbiAoKSB7b25TdWNjZXNzKG1vYmlsZWNvbmZpZyk7IH0pO1xuICAgICAgICAgfVxuICAgICAgICAgfSwgb25FcnJvcik7XG4gICAgICAgICB9Ki9cbiAgICB9XG5cbiAgICBnZXRMYXN0TG9nZ2VkSW5Vc2VybmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdExvZ2dlZEluVXNlciAmJiB0aGlzLmxhc3RMb2dnZWRJblVzZXIudXNlck5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwYWdlIG5hbWVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRSb3V0ZVBhZ2UoKSB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLl9sb2NhdGlvbi5wYXRoKCk7XG4gICAgICAgIGxldCBsSW5kZXggPSBwLmluZGV4T2YoJz8nKTtcbiAgICAgICAgbEluZGV4ID0gbEluZGV4ID09PSAtMSA/IHAubGVuZ3RoIDogbEluZGV4IC0gMTtcbiAgICAgICAgcmV0dXJuIHAuc3Vic3RyKDEsIGxJbmRleCk7IC8vIGlnbm9yZSB0aGUgcXVlcnkgcGFyYW1zXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBRdWVyeSBwYXJhbXMgZm9yIHNwZWNpZmllZCBwYXJhbSBuYW1lIGluIGN1cnJlbnQgUm91dGVcbiAgICAgKiBAcGFyYW0gcGFyYW1OYW1lLCB0aGUgcGFyYW0gbmFtZSB3aG9zZSBxdWVyeSBwYXJhbSB2YWx1ZSBpcyB0byBiZSByZXRyaWV2ZWRcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRSb3V0ZVF1ZXJ5UGFyYW0ocGFyYW1OYW1lKSB7XG4gICAgICAgIGxldCBwYXJhbVZhbDtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgICAgICAgIHBhcmFtVmFsID0gcGFyYW1zW3BhcmFtTmFtZV07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFyYW1WYWw7XG4gICAgfVxuXG4gICAgaXNOb1BhZ2VMb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiAhaXNFbXB0eSh0aGlzLmdldEN1cnJlbnRSb3V0ZVBhZ2UoKSk7XG4gICAgfVxuXG4gICAgZ2V0UGFnZUJ5TG9nZ2VkSW5Vc2VyKCkge1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGFnZTtcbiAgICAgICAgICAgIGlmICghaXNBcHBsaWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhhdC5pc05vUGFnZUxvYWRlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBnZXRXbVByb2plY3RQcm9wZXJ0aWVzKCkuaG9tZVBhZ2U7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGF0LmdldENvbmZpZygoY29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuc2VjdXJpdHlFbmFibGVkICYmIGNvbmZpZy5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gY29uZmlnLnVzZXJJbmZvLmxhbmRpbmdQYWdlIHx8IGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5ob21lUGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHhzcmYgY29va2llIG5hbWUgYW5kIHhzcmYgaGVhZGVyIG5hbWVzIHdpdGggV2F2ZU1ha2VyIHNwZWNpZmljIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuaXNYc3JmRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy4kaHR0cC5kZWZhdWx0cy54c3JmQ29va2llTmFtZSA9IFhTUkZfQ09PS0lFO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuJGh0dHAuZGVmYXVsdHMueHNyZkhlYWRlck5hbWUgPSBjb25maWcuY3NyZkhlYWRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gZ2V0V21Qcm9qZWN0UHJvcGVydGllcygpLmhvbWVQYWdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGFnZSk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5ob21lUGFnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBBcHAgcGFnZSBhcyBmb2xsb3dzOlxuICAgICAqIFNlY3VyaXR5IGRpc2FibGVkOlxuICAgICAqICAgICAgLSBIb21lIHBhZ2VcbiAgICAgKiBTZWN1cml0eSBlbmFibGVkOlxuICAgICAqICAgICAgLSBVc2VyIGlzIGxvZ2dlZCBpbiwgcmVzcGVjdGl2ZSBsYW5kaW5nIHBhZ2UgaXMgbG9hZGVkXG4gICAgICogICAgICAtIE5vdCBsb2dnZWQgaW46XG4gICAgICogICAgICAgICAgLSBIb21lIHBhZ2UgaXMgcHVibGljLCBsb2FkcyB0aGUgaG9tZSBwYWdlXG4gICAgICogICAgICAgICAgLSBIb21lIHBhZ2Ugbm90IHB1YmxpYywgTG9naW4gcGFnZShpbiBjb25maWcpIGlzIGxvYWRlZFxuICAgICAqIEBwYXJhbSBmb3JjZVBhZ2VMb2FkXG4gICAgICogQHJldHVybnMge1Byb21pc2U8VD59XG4gICAgICovXG4gICAgbG9hZFBhZ2VCeVVzZXJSb2xlKGZvcmNlUGFnZUxvYWQ/KSB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYWdlQnlMb2dnZWRJblVzZXIoKS50aGVuKHBhZ2UgPT4ge1xuICAgICAgICAgICAgaWYgKHRoYXQuaXNOb1BhZ2VMb2FkZWQoKSB8fCBmb3JjZVBhZ2VMb2FkKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBwYWdlIHdoZW4gY3VycmVudCBwYWdlIGFuZCBwb3N0IGxvZ2luIGxhbmRpbmcgcGFnZSBhcmUgc2FtZVxuICAgICAgICAgICAgICAgIGlmICh0aGF0LmdldEN1cnJlbnRSb3V0ZVBhZ2UoKSA9PT0gcGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAod2luZG93LmxvY2F0aW9uIGFzIGFueSkucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5yb3V0ZXJTZXJ2aWNlLm5hdmlnYXRlKFtgLyR7cGFnZX1gXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgdXNlcidzIGhvbWVQYWdlIGJhc2VkIG9uIHRoZSBjb25maWcgaW4gU2VjdXJpdHlTZXJ2aWNlXG4gICAgICogQXNzdW1wdGlvbiBpcyB0aGUgU2VjdXJpdHlTZXJ2aWNlIGlzIHVwZGF0ZWQgd2l0aCB0aGUgbGF0ZXN0IHNlY3VyaXR5IGNvbmZpZyBiZWZvcmUgbWFraW5nIGNhbGwgdG8gdGhpcyBmdW5jdGlvblxuICAgICAqL1xuICAgIG5hdmlnYXRlT25Mb2dpbigpIHtcbiAgICAgICAgdGhpcy5sb2FkUGFnZUJ5VXNlclJvbGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFnZSB3aGljaCBuZWVkcyB0byBiZSByZWRpcmVjdGVkIHRvIG9uIHN1Y2Nlc3NmdWwgbG9naW5cbiAgICAgKiBAcGFyYW0gY29uZmlnLFxuICAgICAqIEBwYXJhbSBwYWdlLCBwYWdlIG5hbWUgZm9yIHJlZGlyZWN0aW9uXG4gICAgICogQHJldHVybnMge2FueXxzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0UmVkaXJlY3RQYWdlKGNvbmZpZywgcGFnZT8pIHtcbiAgICAgICAgY29uc3QgaG9tZVBhZ2UgPSBnZXRXbVByb2plY3RQcm9wZXJ0aWVzKCkuaG9tZVBhZ2UsXG4gICAgICAgICAgICBsb2dpblBhZ2UgPSBnZXQoY29uZmlnLCAnbG9naW5Db25maWcucGFnZU5hbWUnKTtcbiAgICAgICAgbGV0IHByZXZSZWRpcmVjdFBhZ2UsXG4gICAgICAgICAgICByZWRpcmVjdFBhZ2UgPSBwYWdlIHx8IHRoaXMuZ2V0Q3VycmVudFJvdXRlUGFnZSgpO1xuXG4gICAgICAgIC8vIGlmIHVzZXIgaXMgYWxyZWFkeSBvbiBIb21lIHBhZ2Ugb3IgTG9naW4gcGFnZSwgdGhleSBzaG91bGQgbm90IGJlIHJlZGlyZWN0ZWQgdG8gdGhhdCBwYWdlLCBoZW5jZSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIGlmIChyZWRpcmVjdFBhZ2UgPT09IGhvbWVQYWdlIHx8IHJlZGlyZWN0UGFnZSA9PT0gbG9naW5QYWdlKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogZmluZCBwcmV2aW91cyByZWRpcmVjdCBwYWdlIGZyb20gVVJMLCBpZiBleGlzdHMsIHVzZXIgc2hvdWxkIHJlZGlyZWN0IHRvIHRoYXQgcGFnZS5cbiAgICAgICAgICAgICAqIFVTRSBDQVNFOlxuICAgICAgICAgICAgICogIHVzZXIgaXMgb24gaHR0cDovL2xvY2FsaG9zdDo4MDgwL2FwcC8jL0xvZ2luP3JlZGlyZWN0VG89cGFnZVxuICAgICAgICAgICAgICogIGEgdmFyaWFibGUgY2FsbCBmYWlscyByZXN1bHRpbmcgNDAxXG4gICAgICAgICAgICAgKiAgaW4gdGhpcyBjYXNlLCByZWRpcmVjdFRvIHBhZ2Ugc2hvdWxkIGJlICdwYWdlJyBhbmQgbm90IHVuZGVmaW5lZFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBwcmV2UmVkaXJlY3RQYWdlID0gdGhpcy5nZXRDdXJyZW50Um91dGVRdWVyeVBhcmFtKCdyZWRpcmVjdFRvJyk7XG4gICAgICAgICAgICByZWRpcmVjdFBhZ2UgPSAhaXNFbXB0eShwcmV2UmVkaXJlY3RQYWdlKSA/IHByZXZSZWRpcmVjdFBhZ2UgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVkaXJlY3RQYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHRoZSBxdWVyeSBwYXJhbXMoaW5jbHVkaW5nIHBhZ2UgcGFyYW1zIGFuZCByZWRpcmVjdCB0byBwYXJhbXMpIGFzc29jaWF0ZWQgd2l0aCByZWRpcmVjdGVkIHBhZ2VcbiAgICAgKi9cbiAgICBnZXRSZWRpcmVjdGVkUm91dGVRdWVyeVBhcmFtcygpIHtcbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1zID0ge307XG4gICAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbVZhbCkgPT4ge1xuICAgICAgICAgICAgZm9yRWFjaChwYXJhbVZhbCwgKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zO1xuICAgIH1cblxuICAgIC8vIGFjY2VwdHMgcXVlcnkgb2JqZWN0IGxpa2Uge2E6MSwgYjoyfSBhbmQgcmV0dXJucyBhPTEmYj0yIHN0cmluZ1xuICAgIGdldFF1ZXJ5U3RyaW5nKHF1ZXJ5T2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgICAgICBmb3JFYWNoKHF1ZXJ5T2JqZWN0LCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgcGFyYW1zLnB1c2goa2V5ICsgJz0nICsgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGpvaW4ocGFyYW1zLCAnJicpO1xuICAgIH1cblxuICAgIGFwcExvZ2luKHBhcmFtcywgc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHBheWxvYWQgPSAnJztcblxuICAgICAgICAvLyBlbmNvZGUgYWxsIHBhcmFtZXRlcnNcbiAgICAgICAgZWFjaChwYXJhbXMsIGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgICAgICAgcGF5bG9hZCArPSAocGF5bG9hZCA/ICcmJyA6ICcnKSArIGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLiRodHRwLnNlbmQoe1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXJsOiAnal9zcHJpbmdfc2VjdXJpdHlfY2hlY2snLFxuICAgICAgICAgICAgJ2RhdGEnOiBwYXlsb2FkXG4gICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB4c3JmQ29va2llVmFsdWUgPSByZXNwb25zZS5ib2R5ID8gcmVzcG9uc2UuYm9keVtYU1JGX0NPT0tJRV9OQU1FXSA6ICcnO1xuXG4gICAgICAgICAgICAvLyBvdmVycmlkZSB0aGUgZGVmYXVsdCB4c3JmIGNvb2tpZSBuYW1lIGFuZCB4c3JmIGhlYWRlciBuYW1lcyB3aXRoIFdhdmVNYWtlciBzcGVjaWZpYyB2YWx1ZXNcbiAgICAgICAgICAgIGlmICh4c3JmQ29va2llVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQ29yZG92YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFhTUkZfQ09PS0lFX05BTUUsIHhzcmZDb29raWVWYWx1ZSB8fCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlIHN1Y2Nlc3NmdWwgbG9naW4gaW4gZGV2aWNlLCB0aGlzIGZ1bmN0aW9uIHRyaWdnZXJzIHRoZSBwZW5kaW5nIG9uTG9naW5DYWxsYmFja3MuXG4gICAgICAgICAgICB0aGlzLmluamVjdG9yLmdldChBcHApLm5vdGlmeSgndXNlckxvZ2dlZEluJywge30pO1xuICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3NDYWxsYmFjaywgcmVzcG9uc2UpO1xuICAgICAgICB9LCBmYWlsdXJlQ2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBBUEkgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIGluIHRoZSBSVU4gbW9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1Y2Nlc3NDYWxsYmFjayB0byBiZSBjYWxsZWQgb24gc3VjY2Vzc1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZhaWx1cmVDYWxsYmFjayB0byBiZSBjYWxsZWQgb24gZmFpbHVyZVxuICAgICAqL1xuICAgIGlzQXV0aGVudGljYXRlZChzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdldENvbmZpZyhmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRm4oc3VjY2Vzc0NhbGxiYWNrLCBjb25maWcuYXV0aGVudGljYXRlZCk7XG4gICAgICAgIH0sIGZhaWx1cmVDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIEFQSSBpcyB1c2VkIHRvIGxvZ291dCBvZiB0aGUgYXBwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3VjY2Vzc0NhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBzdWNjZXNzXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZmFpbHVyZUNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBmYWlsdXJlXG4gICAgICovXG4gICAgYXBwTG9nb3V0KHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRodHRwLnNlbmQoe1xuICAgICAgICAgICAgdGFyZ2V0OiAnU2VjdXJpdHknLFxuICAgICAgICAgICAgdXJsOiAnal9zcHJpbmdfc2VjdXJpdHlfbG9nb3V0JyxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXG4gICAgICAgICAgICBieVBhc3NSZXN1bHQ6IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHNldCh0aGlzLmdldCgpLCAnYXV0aGVudGljYXRlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIHNldCh0aGlzLmdldCgpLCAndXNlckluZm8nLCBudWxsKTtcbiAgICAgICAgICAgIC8qaWYgKENPTlNUQU5UUy5oYXNDb3Jkb3ZhKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ09OU1RBTlRTLlhTUkZfQ09PS0lFX05BTUUsICcnKTtcbiAgICAgICAgICAgIH0qL1xuICAgICAgICAgICAgdGhpcy5pbmplY3Rvci5nZXQoQXBwKS5ub3RpZnkoJ3VzZXJMb2dnZWRPdXQnLCB7fSk7XG4gICAgICAgICAgICB0cmlnZ2VyRm4oc3VjY2Vzc0NhbGxiYWNrLCByZXNwb25zZSk7XG4gICAgICAgIH0sIGZhaWx1cmVDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGFuZCByZXR1cm4gdGhlIGNvb2tpZVxuICAgICAqIEBwYXJhbSBuYW1lLCBjb29raWUga2V5XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRDb29raWVCeU5hbWUobmFtZSkge1xuICAgICAgICAvLyBUb2RvOiBTaHViaGFtIEltcGxlbWVudCBjb29raWUgbmF0aXZlIGpzXG4gICAgICAgIHJldHVybiAnY29va2llJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvb2tpZVZhbHVlIGlmIHhzcmYgaXMgZW5hYmxlZC5cbiAgICAgKiBJbiBkZXZpY2UsIHhzcmYgY29va2llIGlzIHN0b3JlZCBpbiBsb2NhbFN0b3JhZ2UuXG4gICAgICogQHJldHVybnMgeHNyZiBjb29raWUgdmFsdWVcbiAgICAgKi9cbiAgICBpc1hzcmZFbmFibGVkKCkge1xuICAgICAgICBpZiAoaGFzQ29yZG92YSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oWFNSRl9DT09LSUVfTkFNRSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29va2llQnlOYW1lKFhTUkZfQ09PS0lFX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UuIFByb21pc2UgaXMgcmVzb2x2ZWQgd2hlbiBzZWN1cml0eSBpc1xuICAgICAqIDEuIGRpc2FibGVkXG4gICAgICogMi4gZW5hYmxlZCBhbmQgdXNlciBpcyBhdXRoZW50aWNhdGVkXG4gICAgICogMy4gZW5hYmxlZCBhbmQgdXNlciBpcyBub3QgYXV0aGVudGljYXRlZCwgdGhlbiBwcm9taXNlIGlzIHJlc29sdmVkIG9uIHVzZXIgbG9naW5cbiAgICAgKiBAcmV0dXJucyB7Kn0gcHJvbWlzZVxuICAgICAqL1xuICAgIHB1YmxpYyBvblVzZXJMb2dpbigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXRDb25maWcoY29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnNlY3VyaXR5RW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5pbmplY3Rvci5nZXQoQXBwKS5zdWJzY3JpYmUoJ3VzZXJMb2dnZWRJbicsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggbG9nZ2VkLWluLXVzZXJcbiAgICAgKi9cbiAgICBnZXRMb2dnZWRJblVzZXIoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29uZmlnKChjb25maWcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy51c2VySW5mbykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbmZpZy51c2VySW5mbyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBmb3IgbW9iaWxlIGFwcHMgdG8gYXV0aGVudGljYXRlIHZpYSBicm93c2VyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgYWZ0ZXIgbG9naW5cbiAgICAgKi9cbiAgICBhdXRoSW5Ccm93c2VyKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnVGhpcyBhdXRoSW5Ccm93c2VyIHNob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfVxufVxuIl19
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NlY3VyaXR5L3NyYy9zZWN1cml0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsR0FBRyxFQUNILGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLFNBQVMsRUFDWixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSxXQUFXLENBQUM7Ozs7O0FBRWpFLHVEQUF1RDtBQUN2RCxNQUFNLGdCQUFnQixHQUFHLGVBQWUsRUFDcEMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBRzdCLE1BQU0sT0FBTyxlQUFlO0lBT3hCLFlBQ1ksUUFBa0IsRUFDbEIsS0FBMEIsRUFDMUIsYUFBcUIsRUFDckIsY0FBOEIsRUFDOUIsU0FBbUI7UUFKbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQVAvQixpQkFBWSxHQUFRLEVBQUUsQ0FBQztJQVFwQixDQUFDO0lBRUosUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsR0FBRztRQUNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FB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Q0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTs0QkFDdEUsT0FBTyxFQUFFLENBQUM7NEJBQ1YsV0FBVyxFQUFFLENBQUM7d0JBQ2xCLENBQUMsQ0FBQyxDQUFDO29CQUNQLENBQUM7Z0JBQ0wsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE9BQU8sRUFBRSxDQUFDO2dCQUNkLENBQUM7WUFDTCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDWCxPQUFPLElBQUksT0FBTyxDQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUM1QixPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxFQUFFLENBQUM7Z0JBQ2IsQ0FBQztZQUNMLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxhQUFhO1FBQ1QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDckUsQ0FBQztnRkF0YVEsZUFBZTt1RUFBZixlQUFlLFdBQWYsZUFBZTs7aUZBQWYsZUFBZTtjQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1xuICAgIEFic3RyYWN0SHR0cFNlcnZpY2UsXG4gICAgQXBwLFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBnZXRXbVByb2plY3RQcm9wZXJ0aWVzLFxuICAgIGhhc0NvcmRvdmEsXG4gICAgdHJpZ2dlckZuXG59IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7ZWFjaCwgZm9yRWFjaCwgZ2V0LCBpc0VtcHR5LCBqb2luLCBzZXR9IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuLy8gVG9kb1tTaHViaGFtXTogTW92ZSBiZWxvdyBjb25zdGFudHMgdG8gYSBjb21tb24gZmlsZVxuY29uc3QgWFNSRl9DT09LSUVfTkFNRSA9ICd3bV94c3JmX3Rva2VuJyxcbiAgICBpc0FwcGxpY2F0aW9uVHlwZSA9IHRydWU7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZWN1cml0eVNlcnZpY2Uge1xuICAgIGNvbmZpZztcbiAgICBsYXN0TG9nZ2VkSW5Vc2VyO1xuICAgIGxvZ2dlZEluVXNlcjtcbiAgICBsb2FkUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuICAgIHJlcXVlc3RRdWV1ZTogYW55ID0ge307XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgJGh0dHA6IEFic3RyYWN0SHR0cFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcm91dGVyU2VydmljZTogUm91dGVyLFxuICAgICAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSBfbG9jYXRpb246IExvY2F0aW9uXG4gICAgKSB7fVxuXG4gICAgaXNMb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgICB9XG5cbiAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgICB9XG5cbiAgICBsb2FkKGZvcmNlRmxhZz86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYodGhpcy5sb2FkUHJvbWlzZSkge3JldHVybiB0aGlzLmxvYWRQcm9taXNlO31cbiAgICAgICAgIC8vIENoZWNrIHNlY3VyaXR5RW5hYmxlZCBmbGFnIGluIF9XTV9BUFBfUFJPUEVSVElFU1xuICAgICAgICBpZiAoISh3aW5kb3cgYXMgYW55KS5fV01fQVBQX1BST1BFUlRJRVM/LnNlY3VyaXR5RW5hYmxlZCB8fCAod2luZG93IGFzIGFueSkuX1dNX0FQUF9QUk9QRVJUSUVTWydzZWN1cml0eUluZm8nXSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsgXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JjZUZsYWcgJiYgdGhpcy5jb25maWcpIHtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29uZmlnKTt9XG4gICAgICAgIHRoaXMubG9hZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5zZW5kKHsndXJsJzogJy4vc2VydmljZXMvc2VjdXJpdHkvaW5mbycsICdtZXRob2QnOiAnR0VUJ30pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnID0gcmVzcG9uc2UuYm9keTtcbiAgICAgICAgICAgICAgICAgICAgKHdpbmRvdyBhcyBhbnkpLl9XTV9BUFBfUFJPUEVSVElFU1snc2VjdXJpdHlJbmZvJ10gPSB0aGlzLmNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RMb2dnZWRJblVzZXIgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5sb2dnZWRJblVzZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlZEluVXNlciA9IHRoaXMuY29uZmlnLnVzZXJJbmZvO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpPT57XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0pLmZpbmFsbHkoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkUHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBnZXRzIHRoZSBzZWN1cml0eSBjb25maWcgZnJvbSB0aGUgZGVwbG95ZWQgYXBwIChiYWNrZW5kIGNhbGwpXG4gICAgICogQHBhcmFtIHN1Y2Nlc3NcbiAgICAgKiBAcGFyYW0gZXJyb3JcbiAgICAgKi9cbiAgICBnZXRXZWJDb25maWcoc3VjY2VzcywgZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0KCkpIHtcbiAgICAgICAgICAgIC8vIGlmIGFscmVhZHkgZmV0Y2hlZCwgcmV0dXJuIGl0XG4gICAgICAgICAgICB0cmlnZ2VyRm4oc3VjY2VzcywgdGhpcy5nZXQoKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkKClcbiAgICAgICAgICAgIC50aGVuKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3MsIGNvbmZpZyk7XG4gICAgICAgICAgICB9LCBlcnJvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzZWN1cml0eSBjb25maWdcbiAgICAgKiBAcGFyYW0gc3VjY2Vzc0NhbGxiYWNrXG4gICAgICogQHBhcmFtIGZhaWx1cmVDYWxsYmFja1xuICAgICAqL1xuICAgIGdldENvbmZpZyhzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xuICAgICAgICBmdW5jdGlvbiBpbnZva2VRdWV1ZWRDYWxsYmFja3MoaWQsIG1ldGhvZCwgZGF0YSkge1xuICAgICAgICAgICAgZm9yRWFjaCh0aGlzLnJlcXVlc3RRdWV1ZVtpZF0sIGZuID0+IHRyaWdnZXJGbihmblttZXRob2RdLCBkYXRhKSk7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RRdWV1ZVtpZF0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKGNvbmZpZykge1xuICAgICAgICAgICAgY29uZmlnID0gY29uZmlnID8gY29uZmlnIDoge31cbiAgICAgICAgICAgIGNvbmZpZy5ob21lUGFnZSA9IGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5ob21lUGFnZTtcbiAgICAgICAgICAgIGlmIChjb25maWcudXNlckluZm8pIHtcbiAgICAgICAgICAgICAgICAvLyBCYWNrZW5kIHJldHVybnMgbGFuZGluZ1BhZ2UgaW5zdGVhZCBvZiBob21lUGFnZSwgaGVuY2UgdGhpcyBzdGF0ZW1lbnQoZm9yIGNvbnNpc3RlbmN5KVxuICAgICAgICAgICAgICAgIC8vIGNvbmZpZy51c2VySW5mby5ob21lUGFnZSA9IGNvbmZpZy51c2VySW5mby5sYW5kaW5nUGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgdGhpcy5sYXN0TG9nZ2VkSW5Vc2VyID0gZ2V0Q2xvbmVkT2JqZWN0KHRoaXMubG9nZ2VkSW5Vc2VyKTtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VkSW5Vc2VyID0gY29uZmlnLnVzZXJJbmZvO1xuICAgICAgICAgICAgaW52b2tlUXVldWVkQ2FsbGJhY2tzLmNhbGwodGhpcywgJ2NvbmZpZycsICdzdWNjZXNzJywgdGhpcy5nZXQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7XG4gICAgICAgICAgICAvKmlmICgkcm9vdFNjb3BlLmlzTW9iaWxlQXBwbGljYXRpb25UeXBlKSB7XG4gICAgICAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICAgJ3NlY3VyaXR5RW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAgICAgICdhdXRoZW50aWNhdGVkJzogZmFsc2UsXG4gICAgICAgICAgICAgJ2hvbWVQYWdlJzogX1dNX0FQUF9QUk9QRVJUSUVTLmhvbWVQYWdlLFxuICAgICAgICAgICAgICd1c2VySW5mbyc6IG51bGwsXG4gICAgICAgICAgICAgJ2xvZ2luJzogbnVsbFxuICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgaW52b2tlUXVldWVkQ2FsbGJhY2tzKCdjb25maWcnLCAnc3VjY2VzcycsIHRoaXMuZ2V0KCkpO1xuICAgICAgICAgICAgIH0gZWxzZSB7Ki9cbiAgICAgICAgICAgIGludm9rZVF1ZXVlZENhbGxiYWNrcy5jYWxsKHRoaXMsICdjb25maWcnLCAnZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nZXQoKSkge1xuICAgICAgICAgICAgLy8gaWYgYWxyZWFkeSBmZXRjaGVkLCByZXR1cm4gaXRcbiAgICAgICAgICAgIHRyaWdnZXJGbihzdWNjZXNzQ2FsbGJhY2ssIHRoaXMuZ2V0KCkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUXVldWUgY2hlY2ssIGlmIHNhbWUgcXVldWUgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgZG8gbm90IHNlbmQgYW5vdGhlciByZXF1ZXN0XG4gICAgICAgIHRoaXMucmVxdWVzdFF1ZXVlLmNvbmZpZyA9IHRoaXMucmVxdWVzdFF1ZXVlLmNvbmZpZyB8fCBbXTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UXVldWUuY29uZmlnLnB1c2goe1xuICAgICAgICAgICAgc3VjY2Vzczogc3VjY2Vzc0NhbGxiYWNrLFxuICAgICAgICAgICAgZXJyb3I6IGZhaWx1cmVDYWxsYmFja1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdFF1ZXVlLmNvbmZpZy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhc0NvcmRvdmEoKSkge1xuICAgICAgICAgICAgLy8gZm9yIHdlYiBwcm9qZWN0LCByZXR1cm4gY29uZmlnIHJldHVybmVkIGZyb20gYmFja2VuZCBBUEkgY2FsbC5cbiAgICAgICAgICAgIHRoaXMuZ2V0V2ViQ29uZmlnKG9uU3VjY2Vzcy5iaW5kKHRoaXMpLCBvbkVycm9yLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGVsc2Uge1xuICAgICAgICAgLyEqXG4gICAgICAgICAqIGZvciBtb2JpbGUgYXBwLCBmaXJzdCBnZXQgdGhlIG1vYmlsZSBjb25maWcgKHNhdmVkIGluIHRoZSBhcGspXG4gICAgICAgICAqIC0gaWYgc2VjdXJpdHkgbm90IGVuYWJsZWQsIGp1c3QgcmV0dXJuIG1vYmlsZSBjb25maWcgKG5vIGJhY2tlbmQgY2FsbCByZXF1aXJlZClcbiAgICAgICAgICogLSBlbHNlLCBnZXQgV2ViIGNvbmZpZyAod2lsbCBiZSAgdGhlIHNhbWUgQVBJIGhpdCBmb3IgbG9naW4pIGFuZCBtZXJnZSB0aGUgY29uZmlnIHdpdGggX21vYmlsZWNvbmZpZ1xuICAgICAgICAgKiEvXG4gICAgICAgICBnZXRNb2JpbGVDb25maWcoZnVuY3Rpb24gKG1vYmlsZWNvbmZpZykge1xuICAgICAgICAgaWYgKCFtb2JpbGVjb25maWcuc2VjdXJpdHlFbmFibGVkKSB7XG4gICAgICAgICBvblN1Y2Nlc3MobW9iaWxlY29uZmlnKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICBnZXRXZWJDb25maWcoZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICAgY29uZmlnID0gbWVyZ2VXZWJBbmRNb2JpbGVDb25maWcoY29uZmlnKTtcbiAgICAgICAgIG9uU3VjY2Vzcyhjb25maWcpO1xuICAgICAgICAgfSwgZnVuY3Rpb24gKCkge29uU3VjY2Vzcyhtb2JpbGVjb25maWcpOyB9KTtcbiAgICAgICAgIH1cbiAgICAgICAgIH0sIG9uRXJyb3IpO1xuICAgICAgICAgfSovXG4gICAgfVxuXG4gICAgZ2V0TGFzdExvZ2dlZEluVXNlcm5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RMb2dnZWRJblVzZXIgJiYgdGhpcy5sYXN0TG9nZ2VkSW5Vc2VyLnVzZXJOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFnZSBuYW1lXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRDdXJyZW50Um91dGVQYWdlKCkge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5fbG9jYXRpb24ucGF0aCgpO1xuICAgICAgICBsZXQgbEluZGV4ID0gcC5pbmRleE9mKCc/Jyk7XG4gICAgICAgIGxJbmRleCA9IGxJbmRleCA9PT0gLTEgPyBwLmxlbmd0aCA6IGxJbmRleCAtIDE7XG4gICAgICAgIHJldHVybiBwLnN1YnN0cigxLCBsSW5kZXgpOyAvLyBpZ25vcmUgdGhlIHF1ZXJ5IHBhcmFtc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgUXVlcnkgcGFyYW1zIGZvciBzcGVjaWZpZWQgcGFyYW0gbmFtZSBpbiBjdXJyZW50IFJvdXRlXG4gICAgICogQHBhcmFtIHBhcmFtTmFtZSwgdGhlIHBhcmFtIG5hbWUgd2hvc2UgcXVlcnkgcGFyYW0gdmFsdWUgaXMgdG8gYmUgcmV0cmlldmVkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBnZXRDdXJyZW50Um91dGVRdWVyeVBhcmFtKHBhcmFtTmFtZSkge1xuICAgICAgICBsZXQgcGFyYW1WYWw7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICAgICAgICBwYXJhbVZhbCA9IHBhcmFtc1twYXJhbU5hbWVdO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBhcmFtVmFsO1xuICAgIH1cblxuICAgIGlzTm9QYWdlTG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gIWlzRW1wdHkodGhpcy5nZXRDdXJyZW50Um91dGVQYWdlKCkpO1xuICAgIH1cblxuICAgIGdldFBhZ2VCeUxvZ2dlZEluVXNlcigpIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHBhZ2U7XG4gICAgICAgICAgICBpZiAoIWlzQXBwbGljYXRpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoYXQuaXNOb1BhZ2VMb2FkZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICBwYWdlID0gZ2V0V21Qcm9qZWN0UHJvcGVydGllcygpLmhvbWVQYWdlO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHBhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhhdC5nZXRDb25maWcoKGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnNlY3VyaXR5RW5hYmxlZCAmJiBjb25maWcuYXV0aGVudGljYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSA9IGNvbmZpZy51c2VySW5mby5sYW5kaW5nUGFnZSB8fCBnZXRXbVByb2plY3RQcm9wZXJ0aWVzKCkuaG9tZVBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVycmlkZSB0aGUgZGVmYXVsdCB4c3JmIGNvb2tpZSBuYW1lIGFuZCB4c3JmIGhlYWRlciBuYW1lcyB3aXRoIFdhdmVNYWtlciBzcGVjaWZpYyB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0LmlzWHNyZkVuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuJGh0dHAuZGVmYXVsdHMueHNyZkNvb2tpZU5hbWUgPSBYU1JGX0NPT0tJRTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLiRodHRwLmRlZmF1bHRzLnhzcmZIZWFkZXJOYW1lID0gY29uZmlnLmNzcmZIZWFkZXJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSA9IGdldFdtUHJvamVjdFByb3BlcnRpZXMoKS5ob21lUGFnZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHBhZ2UpO1xuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRXbVByb2plY3RQcm9wZXJ0aWVzKCkuaG9tZVBhZ2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgQXBwIHBhZ2UgYXMgZm9sbG93czpcbiAgICAgKiBTZWN1cml0eSBkaXNhYmxlZDpcbiAgICAgKiAgICAgIC0gSG9tZSBwYWdlXG4gICAgICogU2VjdXJpdHkgZW5hYmxlZDpcbiAgICAgKiAgICAgIC0gVXNlciBpcyBsb2dnZWQgaW4sIHJlc3BlY3RpdmUgbGFuZGluZyBwYWdlIGlzIGxvYWRlZFxuICAgICAqICAgICAgLSBOb3QgbG9nZ2VkIGluOlxuICAgICAqICAgICAgICAgIC0gSG9tZSBwYWdlIGlzIHB1YmxpYywgbG9hZHMgdGhlIGhvbWUgcGFnZVxuICAgICAqICAgICAgICAgIC0gSG9tZSBwYWdlIG5vdCBwdWJsaWMsIExvZ2luIHBhZ2UoaW4gY29uZmlnKSBpcyBsb2FkZWRcbiAgICAgKiBAcGFyYW0gZm9yY2VQYWdlTG9hZFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fVxuICAgICAqL1xuICAgIGxvYWRQYWdlQnlVc2VyUm9sZShmb3JjZVBhZ2VMb2FkPykge1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFnZUJ5TG9nZ2VkSW5Vc2VyKCkudGhlbihwYWdlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGF0LmlzTm9QYWdlTG9hZGVkKCkgfHwgZm9yY2VQYWdlTG9hZCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgcGFnZSB3aGVuIGN1cnJlbnQgcGFnZSBhbmQgcG9zdCBsb2dpbiBsYW5kaW5nIHBhZ2UgYXJlIHNhbWVcbiAgICAgICAgICAgICAgICBpZiAodGhhdC5nZXRDdXJyZW50Um91dGVQYWdlKCkgPT09IHBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgKHdpbmRvdy5sb2NhdGlvbiBhcyBhbnkpLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQucm91dGVyU2VydmljZS5uYXZpZ2F0ZShbYC8ke3BhZ2V9YF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmF2aWdhdGVzIHRvIHRoZSBjdXJyZW50IHVzZXIncyBob21lUGFnZSBiYXNlZCBvbiB0aGUgY29uZmlnIGluIFNlY3VyaXR5U2VydmljZVxuICAgICAqIEFzc3VtcHRpb24gaXMgdGhlIFNlY3VyaXR5U2VydmljZSBpcyB1cGRhdGVkIHdpdGggdGhlIGxhdGVzdCBzZWN1cml0eSBjb25maWcgYmVmb3JlIG1ha2luZyBjYWxsIHRvIHRoaXMgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBuYXZpZ2F0ZU9uTG9naW4oKSB7XG4gICAgICAgIHRoaXMubG9hZFBhZ2VCeVVzZXJSb2xlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBhZ2Ugd2hpY2ggbmVlZHMgdG8gYmUgcmVkaXJlY3RlZCB0byBvbiBzdWNjZXNzZnVsIGxvZ2luXG4gICAgICogQHBhcmFtIGNvbmZpZyxcbiAgICAgKiBAcGFyYW0gcGFnZSwgcGFnZSBuYW1lIGZvciByZWRpcmVjdGlvblxuICAgICAqIEByZXR1cm5zIHthbnl8c3RyaW5nfVxuICAgICAqL1xuICAgIGdldFJlZGlyZWN0UGFnZShjb25maWcsIHBhZ2U/KSB7XG4gICAgICAgIGNvbnN0IGhvbWVQYWdlID0gZ2V0V21Qcm9qZWN0UHJvcGVydGllcygpLmhvbWVQYWdlLFxuICAgICAgICAgICAgbG9naW5QYWdlID0gZ2V0KGNvbmZpZywgJ2xvZ2luQ29uZmlnLnBhZ2VOYW1lJyk7XG4gICAgICAgIGxldCBwcmV2UmVkaXJlY3RQYWdlLFxuICAgICAgICAgICAgcmVkaXJlY3RQYWdlID0gcGFnZSB8fCB0aGlzLmdldEN1cnJlbnRSb3V0ZVBhZ2UoKTtcblxuICAgICAgICAvLyBpZiB1c2VyIGlzIGFscmVhZHkgb24gSG9tZSBwYWdlIG9yIExvZ2luIHBhZ2UsIHRoZXkgc2hvdWxkIG5vdCBiZSByZWRpcmVjdGVkIHRvIHRoYXQgcGFnZSwgaGVuY2UgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICBpZiAocmVkaXJlY3RQYWdlID09PSBob21lUGFnZSB8fCByZWRpcmVjdFBhZ2UgPT09IGxvZ2luUGFnZSkge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIGZpbmQgcHJldmlvdXMgcmVkaXJlY3QgcGFnZSBmcm9tIFVSTCwgaWYgZXhpc3RzLCB1c2VyIHNob3VsZCByZWRpcmVjdCB0byB0aGF0IHBhZ2UuXG4gICAgICAgICAgICAgKiBVU0UgQ0FTRTpcbiAgICAgICAgICAgICAqICB1c2VyIGlzIG9uIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hcHAvIy9Mb2dpbj9yZWRpcmVjdFRvPXBhZ2VcbiAgICAgICAgICAgICAqICBhIHZhcmlhYmxlIGNhbGwgZmFpbHMgcmVzdWx0aW5nIDQwMVxuICAgICAgICAgICAgICogIGluIHRoaXMgY2FzZSwgcmVkaXJlY3RUbyBwYWdlIHNob3VsZCBiZSAncGFnZScgYW5kIG5vdCB1bmRlZmluZWRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgcHJldlJlZGlyZWN0UGFnZSA9IHRoaXMuZ2V0Q3VycmVudFJvdXRlUXVlcnlQYXJhbSgncmVkaXJlY3RUbycpO1xuICAgICAgICAgICAgcmVkaXJlY3RQYWdlID0gIWlzRW1wdHkocHJldlJlZGlyZWN0UGFnZSkgPyBwcmV2UmVkaXJlY3RQYWdlIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlZGlyZWN0UGFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCB0aGUgcXVlcnkgcGFyYW1zKGluY2x1ZGluZyBwYWdlIHBhcmFtcyBhbmQgcmVkaXJlY3QgdG8gcGFyYW1zKSBhc3NvY2lhdGVkIHdpdGggcmVkaXJlY3RlZCBwYWdlXG4gICAgICovXG4gICAgZ2V0UmVkaXJlY3RlZFJvdXRlUXVlcnlQYXJhbXMoKSB7XG4gICAgICAgIGxldCBxdWVyeVBhcmFtcyA9IHt9O1xuICAgICAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1WYWwpID0+IHtcbiAgICAgICAgICAgIGZvckVhY2gocGFyYW1WYWwsICh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zW2tleV0gPSB2YWw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBxdWVyeVBhcmFtcztcbiAgICB9XG5cbiAgICAvLyBhY2NlcHRzIHF1ZXJ5IG9iamVjdCBsaWtlIHthOjEsIGI6Mn0gYW5kIHJldHVybnMgYT0xJmI9MiBzdHJpbmdcbiAgICBnZXRRdWVyeVN0cmluZyhxdWVyeU9iamVjdCkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBbXTtcbiAgICAgICAgZm9yRWFjaChxdWVyeU9iamVjdCwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKGtleSArICc9JyArIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBqb2luKHBhcmFtcywgJyYnKTtcbiAgICB9XG5cbiAgICBhcHBMb2dpbihwYXJhbXMsIHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBwYXlsb2FkID0gJyc7XG5cbiAgICAgICAgLy8gZW5jb2RlIGFsbCBwYXJhbWV0ZXJzXG4gICAgICAgIGVhY2gocGFyYW1zLCBmdW5jdGlvbiAodmFsdWUsIG5hbWUpIHtcbiAgICAgICAgICAgIHBheWxvYWQgKz0gKHBheWxvYWQgPyAnJicgOiAnJykgKyBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy4kaHR0cC5zZW5kKHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVybDogJ2pfc3ByaW5nX3NlY3VyaXR5X2NoZWNrJyxcbiAgICAgICAgICAgICdkYXRhJzogcGF5bG9hZFxuICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeHNyZkNvb2tpZVZhbHVlID0gcmVzcG9uc2UuYm9keSA/IHJlc3BvbnNlLmJvZHlbWFNSRl9DT09LSUVfTkFNRV0gOiAnJztcblxuICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgeHNyZiBjb29raWUgbmFtZSBhbmQgeHNyZiBoZWFkZXIgbmFtZXMgd2l0aCBXYXZlTWFrZXIgc3BlY2lmaWMgdmFsdWVzXG4gICAgICAgICAgICBpZiAoeHNyZkNvb2tpZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0NvcmRvdmEoKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShYU1JGX0NPT0tJRV9OQU1FLCB4c3JmQ29va2llVmFsdWUgfHwgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFmdGVyIHRoZSBzdWNjZXNzZnVsIGxvZ2luIGluIGRldmljZSwgdGhpcyBmdW5jdGlvbiB0cmlnZ2VycyB0aGUgcGVuZGluZyBvbkxvZ2luQ2FsbGJhY2tzLlxuICAgICAgICAgICAgdGhpcy5pbmplY3Rvci5nZXQoQXBwKS5ub3RpZnkoJ3VzZXJMb2dnZWRJbicsIHt9KTtcbiAgICAgICAgICAgIHRyaWdnZXJGbihzdWNjZXNzQ2FsbGJhY2ssIHJlc3BvbnNlKTtcbiAgICAgICAgfSwgZmFpbHVyZUNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQVBJIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCBpbiB0aGUgUlVOIG1vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdWNjZXNzQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIHN1Y2Nlc3NcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmYWlsdXJlQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIGZhaWx1cmVcbiAgICAgKi9cbiAgICBpc0F1dGhlbnRpY2F0ZWQoc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5nZXRDb25maWcoZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3NDYWxsYmFjaywgY29uZmlnLmF1dGhlbnRpY2F0ZWQpO1xuICAgICAgICB9LCBmYWlsdXJlQ2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBBUEkgaXMgdXNlZCB0byBsb2dvdXQgb2YgdGhlIGFwcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1Y2Nlc3NDYWxsYmFjayB0byBiZSBjYWxsZWQgb24gc3VjY2Vzc1xuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZhaWx1cmVDYWxsYmFjayB0byBiZSBjYWxsZWQgb24gZmFpbHVyZVxuICAgICAqL1xuICAgIGFwcExvZ291dChzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy4kaHR0cC5zZW5kKHtcbiAgICAgICAgICAgIHRhcmdldDogJ1NlY3VyaXR5JyxcbiAgICAgICAgICAgIHVybDogJ2pfc3ByaW5nX3NlY3VyaXR5X2xvZ291dCcsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgYnlQYXNzUmVzdWx0OiB0cnVlXG4gICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBzZXQodGhpcy5nZXQoKSwgJ2F1dGhlbnRpY2F0ZWQnLCBmYWxzZSk7XG4gICAgICAgICAgICBzZXQodGhpcy5nZXQoKSwgJ3VzZXJJbmZvJywgbnVsbCk7XG4gICAgICAgICAgICAvKmlmIChDT05TVEFOVFMuaGFzQ29yZG92YSkge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENPTlNUQU5UUy5YU1JGX0NPT0tJRV9OQU1FLCAnJyk7XG4gICAgICAgICAgICB9Ki9cbiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KEFwcCkubm90aWZ5KCd1c2VyTG9nZ2VkT3V0Jywge30pO1xuICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3NDYWxsYmFjaywgcmVzcG9uc2UpO1xuICAgICAgICB9LCBmYWlsdXJlQ2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBhbmQgcmV0dXJuIHRoZSBjb29raWVcbiAgICAgKiBAcGFyYW0gbmFtZSwgY29va2llIGtleVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0Q29va2llQnlOYW1lKG5hbWUpIHtcbiAgICAgICAgLy8gVG9kbzogU2h1YmhhbSBJbXBsZW1lbnQgY29va2llIG5hdGl2ZSBqc1xuICAgICAgICByZXR1cm4gJ2Nvb2tpZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb29raWVWYWx1ZSBpZiB4c3JmIGlzIGVuYWJsZWQuXG4gICAgICogSW4gZGV2aWNlLCB4c3JmIGNvb2tpZSBpcyBzdG9yZWQgaW4gbG9jYWxTdG9yYWdlLlxuICAgICAqIEByZXR1cm5zIHhzcmYgY29va2llIHZhbHVlXG4gICAgICovXG4gICAgaXNYc3JmRW5hYmxlZCgpIHtcbiAgICAgICAgaWYgKGhhc0NvcmRvdmEoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFhTUkZfQ09PS0lFX05BTUUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvb2tpZUJ5TmFtZShYU1JGX0NPT0tJRV9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlLiBQcm9taXNlIGlzIHJlc29sdmVkIHdoZW4gc2VjdXJpdHkgaXNcbiAgICAgKiAxLiBkaXNhYmxlZFxuICAgICAqIDIuIGVuYWJsZWQgYW5kIHVzZXIgaXMgYXV0aGVudGljYXRlZFxuICAgICAqIDMuIGVuYWJsZWQgYW5kIHVzZXIgaXMgbm90IGF1dGhlbnRpY2F0ZWQsIHRoZW4gcHJvbWlzZSBpcyByZXNvbHZlZCBvbiB1c2VyIGxvZ2luXG4gICAgICogQHJldHVybnMgeyp9IHByb21pc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Vc2VyTG9naW4oKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29uZmlnKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5zZWN1cml0eUVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KEFwcCkuc3Vic2NyaWJlKCd1c2VyTG9nZ2VkSW4nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGxvZ2dlZC1pbi11c2VyXG4gICAgICovXG4gICAgZ2V0TG9nZ2VkSW5Vc2VyKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldENvbmZpZygoY29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcudXNlckluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb25maWcudXNlckluZm8pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgZm9yIG1vYmlsZSBhcHBzIHRvIGF1dGhlbnRpY2F0ZSB2aWEgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGFmdGVyIGxvZ2luXG4gICAgICovXG4gICAgYXV0aEluQnJvd3NlcigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1RoaXMgYXV0aEluQnJvd3NlciBzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgIH1cbn1cbiJdfQ==
@@ -76,6 +76,7 @@ class SecurityService {
76
76
  this.requestQueue[id] = null;
77
77
  }
78
78
  function onSuccess(config) {
79
+ config = config ? config : {};
79
80
  config.homePage = getWmProjectProperties().homePage;
80
81
  if (config.userInfo) {
81
82
  // Backend returns landingPage instead of homePage, hence this statement(for consistency)
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../projects/security/src/security.service.ts","../../../projects/security/src/security.module.ts","../../../projects/security/src/index.ts"],"sourcesContent":["import { Injectable, Injector } from '@angular/core';\nimport { Location } from '@angular/common';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport {\n AbstractHttpService,\n App,\n getClonedObject,\n getWmProjectProperties,\n hasCordova,\n triggerFn\n} from '@wm/core';\nimport {each, forEach, get, isEmpty, join, set} from \"lodash-es\";\n\n// Todo[Shubham]: Move below constants to a common file\nconst XSRF_COOKIE_NAME = 'wm_xsrf_token',\n isApplicationType = true;\n\n@Injectable()\nexport class SecurityService {\n config;\n lastLoggedInUser;\n loggedInUser;\n loadPromise: Promise<any>;\n requestQueue: any = {};\n\n constructor(\n private injector: Injector,\n private $http: AbstractHttpService,\n private routerService: Router,\n private activatedRoute: ActivatedRoute,\n private _location: Location\n ) {}\n\n isLoaded() {\n return this.config;\n }\n\n get() {\n return this.config;\n }\n\n load(forceFlag?: boolean) {\n if(this.loadPromise) {return this.loadPromise;}\n // Check securityEnabled flag in _WM_APP_PROPERTIES\n if (!(window as any)._WM_APP_PROPERTIES?.securityEnabled || (window as any)._WM_APP_PROPERTIES['securityInfo']) {\n return Promise.resolve(null); \n }\n if (!forceFlag && this.config) {return Promise.resolve(this.config);}\n this.loadPromise = new Promise((resolve, reject) => {\n this.$http.send({'url': './services/security/info', 'method': 'GET'}).then((response) => {\n this.config = response.body;\n (window as any)._WM_APP_PROPERTIES['securityInfo'] = this.config\n this.lastLoggedInUser = getClonedObject(this.loggedInUser);\n this.loggedInUser = this.config.userInfo;\n resolve(response.body);\n }).catch((err)=>{\n reject(err);\n }).finally(()=>{\n this.loadPromise = null;\n });\n });\n return this.loadPromise;\n }\n\n /**\n * gets the security config from the deployed app (backend call)\n * @param success\n * @param error\n */\n getWebConfig(success, error) {\n if (this.get()) {\n // if already fetched, return it\n triggerFn(success, this.get());\n return;\n }\n this.load()\n .then(config => {\n triggerFn(success, config);\n }, error);\n }\n\n /**\n * Returns security config\n * @param successCallback\n * @param failureCallback\n */\n getConfig(successCallback, failureCallback) {\n function invokeQueuedCallbacks(id, method, data) {\n forEach(this.requestQueue[id], fn => triggerFn(fn[method], data));\n this.requestQueue[id] = null;\n }\n\n function onSuccess(config) {\n config.homePage = getWmProjectProperties().homePage;\n if (config.userInfo) {\n // Backend returns landingPage instead of homePage, hence this statement(for consistency)\n // config.userInfo.homePage = config.userInfo.landingPage;\n }\n this.config = config;\n this.lastLoggedInUser = getClonedObject(this.loggedInUser);\n this.loggedInUser = config.userInfo;\n invokeQueuedCallbacks.call(this, 'config', 'success', this.get());\n }\n\n function onError(error) {\n /*if ($rootScope.isMobileApplicationType) {\n this.config = {\n 'securityEnabled': false,\n 'authenticated': false,\n 'homePage': _WM_APP_PROPERTIES.homePage,\n 'userInfo': null,\n 'login': null\n };\n invokeQueuedCallbacks('config', 'success', this.get());\n } else {*/\n invokeQueuedCallbacks.call(this, 'config', 'error', error);\n // }\n }\n\n if (this.get()) {\n // if already fetched, return it\n triggerFn(successCallback, this.get());\n return;\n }\n\n // Queue check, if same queue is already in progress, do not send another request\n this.requestQueue.config = this.requestQueue.config || [];\n this.requestQueue.config.push({\n success: successCallback,\n error: failureCallback\n });\n if (this.requestQueue.config.length > 1) {\n return;\n }\n\n if (!hasCordova()) {\n // for web project, return config returned from backend API call.\n this.getWebConfig(onSuccess.bind(this), onError.bind(this));\n }\n /* else {\n /!*\n * for mobile app, first get the mobile config (saved in the apk)\n * - if security not enabled, just return mobile config (no backend call required)\n * - else, get Web config (will be the same API hit for login) and merge the config with _mobileconfig\n *!/\n getMobileConfig(function (mobileconfig) {\n if (!mobileconfig.securityEnabled) {\n onSuccess(mobileconfig);\n } else {\n getWebConfig(function (config) {\n config = mergeWebAndMobileConfig(config);\n onSuccess(config);\n }, function () {onSuccess(mobileconfig); });\n }\n }, onError);\n }*/\n }\n\n getLastLoggedInUsername() {\n return this.lastLoggedInUser && this.lastLoggedInUser.userName;\n }\n\n /**\n * Returns the current page name\n * @returns {string}\n */\n getCurrentRoutePage() {\n const p = this._location.path();\n let lIndex = p.indexOf('?');\n lIndex = lIndex === -1 ? p.length : lIndex - 1;\n return p.substr(1, lIndex); // ignore the query params\n }\n\n /**\n * Returns Query params for specified param name in current Route\n * @param paramName, the param name whose query param value is to be retrieved\n * @returns {any}\n */\n getCurrentRouteQueryParam(paramName) {\n let paramVal;\n this.activatedRoute.queryParams.subscribe(params => {\n paramVal = params[paramName];\n });\n return paramVal;\n }\n\n isNoPageLoaded() {\n return !isEmpty(this.getCurrentRoutePage());\n }\n\n getPageByLoggedInUser() {\n const that = this;\n return new Promise((resolve) => {\n let page;\n if (!isApplicationType) {\n if (that.isNoPageLoaded()) {\n page = getWmProjectProperties().homePage;\n resolve(page);\n }\n } else {\n that.getConfig((config) => {\n if (config.securityEnabled && config.authenticated) {\n page = config.userInfo.landingPage || getWmProjectProperties().homePage;\n // override the default xsrf cookie name and xsrf header names with WaveMaker specific values\n if (that.isXsrfEnabled()) {\n // this.$http.defaults.xsrfCookieName = XSRF_COOKIE;\n // this.$http.defaults.xsrfHeaderName = config.csrfHeaderName;\n }\n } else {\n page = getWmProjectProperties().homePage;\n }\n resolve(page);\n }, function () {\n resolve(getWmProjectProperties().homePage);\n });\n }\n });\n }\n\n /**\n * Loads the App page as follows:\n * Security disabled:\n * - Home page\n * Security enabled:\n * - User is logged in, respective landing page is loaded\n * - Not logged in:\n * - Home page is public, loads the home page\n * - Home page not public, Login page(in config) is loaded\n * @param forcePageLoad\n * @returns {Promise<T>}\n */\n loadPageByUserRole(forcePageLoad?) {\n const that = this;\n return this.getPageByLoggedInUser().then(page => {\n if (that.isNoPageLoaded() || forcePageLoad) {\n // Reload the page when current page and post login landing page are same\n if (that.getCurrentRoutePage() === page) {\n (window.location as any).reload();\n } else {\n that.routerService.navigate([`/${page}`]);\n }\n }\n });\n }\n\n /**\n * Navigates to the current user's homePage based on the config in SecurityService\n * Assumption is the SecurityService is updated with the latest security config before making call to this function\n */\n navigateOnLogin() {\n this.loadPageByUserRole(true);\n }\n\n /**\n * Gets the page which needs to be redirected to on successful login\n * @param config,\n * @param page, page name for redirection\n * @returns {any|string}\n */\n getRedirectPage(config, page?) {\n const homePage = getWmProjectProperties().homePage,\n loginPage = get(config, 'loginConfig.pageName');\n let prevRedirectPage,\n redirectPage = page || this.getCurrentRoutePage();\n\n // if user is already on Home page or Login page, they should not be redirected to that page, hence return undefined\n if (redirectPage === homePage || redirectPage === loginPage) {\n /*\n * find previous redirect page from URL, if exists, user should redirect to that page.\n * USE CASE:\n * user is on http://localhost:8080/app/#/Login?redirectTo=page\n * a variable call fails resulting 401\n * in this case, redirectTo page should be 'page' and not undefined\n */\n prevRedirectPage = this.getCurrentRouteQueryParam('redirectTo');\n redirectPage = !isEmpty(prevRedirectPage) ? prevRedirectPage : undefined;\n }\n\n return redirectPage;\n }\n\n /**\n * Returns all the query params(including page params and redirect to params) associated with redirected page\n */\n getRedirectedRouteQueryParams() {\n let queryParams = {};\n this.activatedRoute.queryParams.subscribe((paramVal) => {\n forEach(paramVal, (val, key) => {\n queryParams[key] = val;\n });\n });\n return queryParams;\n }\n\n // accepts query object like {a:1, b:2} and returns a=1&b=2 string\n getQueryString(queryObject) {\n const params = [];\n forEach(queryObject, function (value, key) {\n params.push(key + '=' + value);\n });\n return join(params, '&');\n }\n\n appLogin(params, successCallback, failureCallback) {\n let payload = '';\n\n // encode all parameters\n each(params, function (value, name) {\n payload += (payload ? '&' : '') + encodeURIComponent(name) + '=' + encodeURIComponent(value);\n });\n\n return this.$http.send({\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n url: 'j_spring_security_check',\n 'data': payload\n }).then((response) => {\n const xsrfCookieValue = response.body ? response.body[XSRF_COOKIE_NAME] : '';\n\n // override the default xsrf cookie name and xsrf header names with WaveMaker specific values\n if (xsrfCookieValue) {\n if (hasCordova()) {\n localStorage.setItem(XSRF_COOKIE_NAME, xsrfCookieValue || '');\n }\n }\n // After the successful login in device, this function triggers the pending onLoginCallbacks.\n this.injector.get(App).notify('userLoggedIn', {});\n triggerFn(successCallback, response);\n }, failureCallback);\n }\n\n /**\n * The API is used to check if the user is authenticated in the RUN mode.\n *\n * @param {function} successCallback to be called on success\n * @param {function} failureCallback to be called on failure\n */\n isAuthenticated(successCallback, failureCallback) {\n this.getConfig(function (config) {\n triggerFn(successCallback, config.authenticated);\n }, failureCallback);\n }\n\n /**\n * The API is used to logout of the app.\n *\n * @param {function} successCallback to be called on success\n * @param {function} failureCallback to be called on failure\n */\n appLogout(successCallback, failureCallback) {\n return this.$http.send({\n target: 'Security',\n url: 'j_spring_security_logout',\n method: 'POST',\n responseType: 'text',\n byPassResult: true\n }).then((response) => {\n set(this.get(), 'authenticated', false);\n set(this.get(), 'userInfo', null);\n /*if (CONSTANTS.hasCordova) {\n localStorage.setItem(CONSTANTS.XSRF_COOKIE_NAME, '');\n }*/\n this.injector.get(App).notify('userLoggedOut', {});\n triggerFn(successCallback, response);\n }, failureCallback);\n }\n\n /**\n * Checks and return the cookie\n * @param name, cookie key\n * @returns {string}\n */\n getCookieByName(name) {\n // Todo: Shubham Implement cookie native js\n return 'cookie';\n }\n\n /**\n * This function returns the cookieValue if xsrf is enabled.\n * In device, xsrf cookie is stored in localStorage.\n * @returns xsrf cookie value\n */\n isXsrfEnabled() {\n if (hasCordova()) {\n return localStorage.getItem(XSRF_COOKIE_NAME);\n }\n return this.getCookieByName(XSRF_COOKIE_NAME);\n }\n\n /**\n * This function returns a promise. Promise is resolved when security is\n * 1. disabled\n * 2. enabled and user is authenticated\n * 3. enabled and user is not authenticated, then promise is resolved on user login\n * @returns {*} promise\n */\n public onUserLogin(): Promise<any> {\n return new Promise<void>((resolve, reject) => {\n this.getConfig(config => {\n if (config.securityEnabled) {\n if (config.authenticated) {\n resolve();\n } else {\n const unsubscribe = this.injector.get(App).subscribe('userLoggedIn', () => {\n resolve();\n unsubscribe();\n });\n }\n } else {\n resolve();\n }\n }, reject);\n });\n }\n\n /**\n * @returns a promise that is resolved with logged-in-user\n */\n getLoggedInUser() {\n return new Promise<any>((resolve, reject) => {\n this.getConfig((config) => {\n if (config && config.userInfo) {\n resolve(config.userInfo);\n } else {\n reject();\n }\n }, reject);\n });\n }\n\n /**\n * This is for mobile apps to authenticate via browser.\n *\n * @returns a promise that is resolved after login\n */\n authInBrowser(): Promise<any> {\n return Promise.reject('This authInBrowser should not be called');\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { SecurityService } from './security.service';\n\n@NgModule({})\nexport class SecurityModule {\n static forRoot(): ModuleWithProviders<SecurityModule> {\n return {\n ngModule: SecurityModule,\n providers: [SecurityService]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../projects/security/src/security.service.ts","../../../projects/security/src/security.module.ts","../../../projects/security/src/index.ts"],"sourcesContent":["import { Injectable, Injector } from '@angular/core';\nimport { Location } from '@angular/common';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport {\n AbstractHttpService,\n App,\n getClonedObject,\n getWmProjectProperties,\n hasCordova,\n triggerFn\n} from '@wm/core';\nimport {each, forEach, get, isEmpty, join, set} from \"lodash-es\";\n\n// Todo[Shubham]: Move below constants to a common file\nconst XSRF_COOKIE_NAME = 'wm_xsrf_token',\n isApplicationType = true;\n\n@Injectable()\nexport class SecurityService {\n config;\n lastLoggedInUser;\n loggedInUser;\n loadPromise: Promise<any>;\n requestQueue: any = {};\n\n constructor(\n private injector: Injector,\n private $http: AbstractHttpService,\n private routerService: Router,\n private activatedRoute: ActivatedRoute,\n private _location: Location\n ) {}\n\n isLoaded() {\n return this.config;\n }\n\n get() {\n return this.config;\n }\n\n load(forceFlag?: boolean) {\n if(this.loadPromise) {return this.loadPromise;}\n // Check securityEnabled flag in _WM_APP_PROPERTIES\n if (!(window as any)._WM_APP_PROPERTIES?.securityEnabled || (window as any)._WM_APP_PROPERTIES['securityInfo']) {\n return Promise.resolve(null); \n }\n if (!forceFlag && this.config) {return Promise.resolve(this.config);}\n this.loadPromise = new Promise((resolve, reject) => {\n this.$http.send({'url': './services/security/info', 'method': 'GET'}).then((response) => {\n this.config = response.body;\n (window as any)._WM_APP_PROPERTIES['securityInfo'] = this.config\n this.lastLoggedInUser = getClonedObject(this.loggedInUser);\n this.loggedInUser = this.config.userInfo;\n resolve(response.body);\n }).catch((err)=>{\n reject(err);\n }).finally(()=>{\n this.loadPromise = null;\n });\n });\n return this.loadPromise;\n }\n\n /**\n * gets the security config from the deployed app (backend call)\n * @param success\n * @param error\n */\n getWebConfig(success, error) {\n if (this.get()) {\n // if already fetched, return it\n triggerFn(success, this.get());\n return;\n }\n this.load()\n .then(config => {\n triggerFn(success, config);\n }, error);\n }\n\n /**\n * Returns security config\n * @param successCallback\n * @param failureCallback\n */\n getConfig(successCallback, failureCallback) {\n function invokeQueuedCallbacks(id, method, data) {\n forEach(this.requestQueue[id], fn => triggerFn(fn[method], data));\n this.requestQueue[id] = null;\n }\n\n function onSuccess(config) {\n config = config ? config : {}\n config.homePage = getWmProjectProperties().homePage;\n if (config.userInfo) {\n // Backend returns landingPage instead of homePage, hence this statement(for consistency)\n // config.userInfo.homePage = config.userInfo.landingPage;\n }\n this.config = config;\n this.lastLoggedInUser = getClonedObject(this.loggedInUser);\n this.loggedInUser = config.userInfo;\n invokeQueuedCallbacks.call(this, 'config', 'success', this.get());\n }\n\n function onError(error) {\n /*if ($rootScope.isMobileApplicationType) {\n this.config = {\n 'securityEnabled': false,\n 'authenticated': false,\n 'homePage': _WM_APP_PROPERTIES.homePage,\n 'userInfo': null,\n 'login': null\n };\n invokeQueuedCallbacks('config', 'success', this.get());\n } else {*/\n invokeQueuedCallbacks.call(this, 'config', 'error', error);\n // }\n }\n\n if (this.get()) {\n // if already fetched, return it\n triggerFn(successCallback, this.get());\n return;\n }\n\n // Queue check, if same queue is already in progress, do not send another request\n this.requestQueue.config = this.requestQueue.config || [];\n this.requestQueue.config.push({\n success: successCallback,\n error: failureCallback\n });\n if (this.requestQueue.config.length > 1) {\n return;\n }\n\n if (!hasCordova()) {\n // for web project, return config returned from backend API call.\n this.getWebConfig(onSuccess.bind(this), onError.bind(this));\n }\n /* else {\n /!*\n * for mobile app, first get the mobile config (saved in the apk)\n * - if security not enabled, just return mobile config (no backend call required)\n * - else, get Web config (will be the same API hit for login) and merge the config with _mobileconfig\n *!/\n getMobileConfig(function (mobileconfig) {\n if (!mobileconfig.securityEnabled) {\n onSuccess(mobileconfig);\n } else {\n getWebConfig(function (config) {\n config = mergeWebAndMobileConfig(config);\n onSuccess(config);\n }, function () {onSuccess(mobileconfig); });\n }\n }, onError);\n }*/\n }\n\n getLastLoggedInUsername() {\n return this.lastLoggedInUser && this.lastLoggedInUser.userName;\n }\n\n /**\n * Returns the current page name\n * @returns {string}\n */\n getCurrentRoutePage() {\n const p = this._location.path();\n let lIndex = p.indexOf('?');\n lIndex = lIndex === -1 ? p.length : lIndex - 1;\n return p.substr(1, lIndex); // ignore the query params\n }\n\n /**\n * Returns Query params for specified param name in current Route\n * @param paramName, the param name whose query param value is to be retrieved\n * @returns {any}\n */\n getCurrentRouteQueryParam(paramName) {\n let paramVal;\n this.activatedRoute.queryParams.subscribe(params => {\n paramVal = params[paramName];\n });\n return paramVal;\n }\n\n isNoPageLoaded() {\n return !isEmpty(this.getCurrentRoutePage());\n }\n\n getPageByLoggedInUser() {\n const that = this;\n return new Promise((resolve) => {\n let page;\n if (!isApplicationType) {\n if (that.isNoPageLoaded()) {\n page = getWmProjectProperties().homePage;\n resolve(page);\n }\n } else {\n that.getConfig((config) => {\n if (config.securityEnabled && config.authenticated) {\n page = config.userInfo.landingPage || getWmProjectProperties().homePage;\n // override the default xsrf cookie name and xsrf header names with WaveMaker specific values\n if (that.isXsrfEnabled()) {\n // this.$http.defaults.xsrfCookieName = XSRF_COOKIE;\n // this.$http.defaults.xsrfHeaderName = config.csrfHeaderName;\n }\n } else {\n page = getWmProjectProperties().homePage;\n }\n resolve(page);\n }, function () {\n resolve(getWmProjectProperties().homePage);\n });\n }\n });\n }\n\n /**\n * Loads the App page as follows:\n * Security disabled:\n * - Home page\n * Security enabled:\n * - User is logged in, respective landing page is loaded\n * - Not logged in:\n * - Home page is public, loads the home page\n * - Home page not public, Login page(in config) is loaded\n * @param forcePageLoad\n * @returns {Promise<T>}\n */\n loadPageByUserRole(forcePageLoad?) {\n const that = this;\n return this.getPageByLoggedInUser().then(page => {\n if (that.isNoPageLoaded() || forcePageLoad) {\n // Reload the page when current page and post login landing page are same\n if (that.getCurrentRoutePage() === page) {\n (window.location as any).reload();\n } else {\n that.routerService.navigate([`/${page}`]);\n }\n }\n });\n }\n\n /**\n * Navigates to the current user's homePage based on the config in SecurityService\n * Assumption is the SecurityService is updated with the latest security config before making call to this function\n */\n navigateOnLogin() {\n this.loadPageByUserRole(true);\n }\n\n /**\n * Gets the page which needs to be redirected to on successful login\n * @param config,\n * @param page, page name for redirection\n * @returns {any|string}\n */\n getRedirectPage(config, page?) {\n const homePage = getWmProjectProperties().homePage,\n loginPage = get(config, 'loginConfig.pageName');\n let prevRedirectPage,\n redirectPage = page || this.getCurrentRoutePage();\n\n // if user is already on Home page or Login page, they should not be redirected to that page, hence return undefined\n if (redirectPage === homePage || redirectPage === loginPage) {\n /*\n * find previous redirect page from URL, if exists, user should redirect to that page.\n * USE CASE:\n * user is on http://localhost:8080/app/#/Login?redirectTo=page\n * a variable call fails resulting 401\n * in this case, redirectTo page should be 'page' and not undefined\n */\n prevRedirectPage = this.getCurrentRouteQueryParam('redirectTo');\n redirectPage = !isEmpty(prevRedirectPage) ? prevRedirectPage : undefined;\n }\n\n return redirectPage;\n }\n\n /**\n * Returns all the query params(including page params and redirect to params) associated with redirected page\n */\n getRedirectedRouteQueryParams() {\n let queryParams = {};\n this.activatedRoute.queryParams.subscribe((paramVal) => {\n forEach(paramVal, (val, key) => {\n queryParams[key] = val;\n });\n });\n return queryParams;\n }\n\n // accepts query object like {a:1, b:2} and returns a=1&b=2 string\n getQueryString(queryObject) {\n const params = [];\n forEach(queryObject, function (value, key) {\n params.push(key + '=' + value);\n });\n return join(params, '&');\n }\n\n appLogin(params, successCallback, failureCallback) {\n let payload = '';\n\n // encode all parameters\n each(params, function (value, name) {\n payload += (payload ? '&' : '') + encodeURIComponent(name) + '=' + encodeURIComponent(value);\n });\n\n return this.$http.send({\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n url: 'j_spring_security_check',\n 'data': payload\n }).then((response) => {\n const xsrfCookieValue = response.body ? response.body[XSRF_COOKIE_NAME] : '';\n\n // override the default xsrf cookie name and xsrf header names with WaveMaker specific values\n if (xsrfCookieValue) {\n if (hasCordova()) {\n localStorage.setItem(XSRF_COOKIE_NAME, xsrfCookieValue || '');\n }\n }\n // After the successful login in device, this function triggers the pending onLoginCallbacks.\n this.injector.get(App).notify('userLoggedIn', {});\n triggerFn(successCallback, response);\n }, failureCallback);\n }\n\n /**\n * The API is used to check if the user is authenticated in the RUN mode.\n *\n * @param {function} successCallback to be called on success\n * @param {function} failureCallback to be called on failure\n */\n isAuthenticated(successCallback, failureCallback) {\n this.getConfig(function (config) {\n triggerFn(successCallback, config.authenticated);\n }, failureCallback);\n }\n\n /**\n * The API is used to logout of the app.\n *\n * @param {function} successCallback to be called on success\n * @param {function} failureCallback to be called on failure\n */\n appLogout(successCallback, failureCallback) {\n return this.$http.send({\n target: 'Security',\n url: 'j_spring_security_logout',\n method: 'POST',\n responseType: 'text',\n byPassResult: true\n }).then((response) => {\n set(this.get(), 'authenticated', false);\n set(this.get(), 'userInfo', null);\n /*if (CONSTANTS.hasCordova) {\n localStorage.setItem(CONSTANTS.XSRF_COOKIE_NAME, '');\n }*/\n this.injector.get(App).notify('userLoggedOut', {});\n triggerFn(successCallback, response);\n }, failureCallback);\n }\n\n /**\n * Checks and return the cookie\n * @param name, cookie key\n * @returns {string}\n */\n getCookieByName(name) {\n // Todo: Shubham Implement cookie native js\n return 'cookie';\n }\n\n /**\n * This function returns the cookieValue if xsrf is enabled.\n * In device, xsrf cookie is stored in localStorage.\n * @returns xsrf cookie value\n */\n isXsrfEnabled() {\n if (hasCordova()) {\n return localStorage.getItem(XSRF_COOKIE_NAME);\n }\n return this.getCookieByName(XSRF_COOKIE_NAME);\n }\n\n /**\n * This function returns a promise. Promise is resolved when security is\n * 1. disabled\n * 2. enabled and user is authenticated\n * 3. enabled and user is not authenticated, then promise is resolved on user login\n * @returns {*} promise\n */\n public onUserLogin(): Promise<any> {\n return new Promise<void>((resolve, reject) => {\n this.getConfig(config => {\n if (config.securityEnabled) {\n if (config.authenticated) {\n resolve();\n } else {\n const unsubscribe = this.injector.get(App).subscribe('userLoggedIn', () => {\n resolve();\n unsubscribe();\n });\n }\n } else {\n resolve();\n }\n }, reject);\n });\n }\n\n /**\n * @returns a promise that is resolved with logged-in-user\n */\n getLoggedInUser() {\n return new Promise<any>((resolve, reject) => {\n this.getConfig((config) => {\n if (config && config.userInfo) {\n resolve(config.userInfo);\n } else {\n reject();\n }\n }, reject);\n });\n }\n\n /**\n * This is for mobile apps to authenticate via browser.\n *\n * @returns a promise that is resolved after login\n */\n authInBrowser(): Promise<any> {\n return Promise.reject('This authInBrowser should not be called');\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { SecurityService } from './security.service';\n\n@NgModule({})\nexport class SecurityModule {\n static forRoot(): ModuleWithProviders<SecurityModule> {\n return {\n ngModule: SecurityModule,\n providers: [SecurityService]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -2988,7 +2988,8 @@
2988
2988
  url = 'metadata/' + (prefabName ? `prefabs/${prefabName}/` : 'app/') + 'service-definitions.json';
2989
2989
  }
2990
2990
  else {
2991
- url = './services/' + (prefabName ? `prefabs/${prefabName}/` : '') + 'servicedefs';
2991
+ let serviceDefFileName = prefabName ? prefabName + '-prefab-servicedefs.json' : 'app-servicedefs.json';
2992
+ url = './ng-bundle/servicedefs/' + serviceDefFileName;
2992
2993
  }
2993
2994
  return new Promise((resolve, reject) => {
2994
2995
  this.$http.send({ 'url': url, 'method': 'GET' }).then((response) => {
@@ -16,7 +16,8 @@ export class MetadataService {
16
16
  url = 'metadata/' + (prefabName ? `prefabs/${prefabName}/` : 'app/') + 'service-definitions.json';
17
17
  }
18
18
  else {
19
- url = './services/' + (prefabName ? `prefabs/${prefabName}/` : '') + 'servicedefs';
19
+ let serviceDefFileName = prefabName ? prefabName + '-prefab-servicedefs.json' : 'app-servicedefs.json';
20
+ url = './ng-bundle/servicedefs/' + serviceDefFileName;
20
21
  }
21
22
  return new Promise((resolve, reject) => {
22
23
  this.$http.send({ 'url': url, 'method': 'GET' }).then((response) => {
@@ -59,4 +60,4 @@ export class MetadataService {
59
60
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MetadataService, [{
60
61
  type: Injectable
61
62
  }], () => [{ type: i1.AbstractHttpService }], null); })();
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhcmlhYmxlcy9zcmMvc2VydmljZS9tZXRhZGF0YS1zZXJ2aWNlL21ldGFkYXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7QUFHM0QsTUFBTSxPQUFPLGVBQWU7SUFLeEIsWUFBb0IsS0FBMEI7UUFBMUIsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFGOUMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUFFNkIsQ0FBQztJQUVsRCxRQUFRO1FBQ0osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3RSxDQUFDO0lBRUQsSUFBSSxDQUFDLFVBQW1CO1FBQ3BCLElBQUksR0FBRyxDQUFDO1FBQ1IsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2YsR0FBRyxHQUFHLFdBQVcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsMEJBQTBCLENBQUM7UUFDdEcsQ0FBQzthQUFNLENBQUM7WUFDSixHQUFHLEdBQUcsYUFBYSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDdkYsQ0FBQztRQUNELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUcsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUM5RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2pELFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2hGLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMxRyxDQUFDO2dCQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGdCQUFnQixDQUFDLFdBQVcsRUFBRSxPQUFPO1FBQ2pDLE9BQU8sR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxlQUFlLENBQUMsVUFBVSxFQUFFLE9BQU87UUFDL0IsT0FBTyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPO1FBQ3ZCLE9BQU8sR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7Z0ZBdkRRLGVBQWU7dUVBQWYsZUFBZSxXQUFmLGVBQWU7O2lGQUFmLGVBQWU7Y0FEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQWJzdHJhY3RIdHRwU2VydmljZSwgaGFzQ29yZG92YSB9IGZyb20gJ0B3bS9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1ldGFkYXRhU2VydmljZSB7XG4gICAgbWV0YWRhdGFNYXA6IE1hcDxzdHJpbmcsIGFueT47XG4gICAgcHJvdmlkZXJNYXA6IE1hcDxzdHJpbmcsIGFueT47XG4gICAgQ09OVEVYVF9BUFAgPSAnYXBwJztcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJGh0dHA6IEFic3RyYWN0SHR0cFNlcnZpY2UpIHt9XG5cbiAgICBpc0xvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGFNYXAgPyB0aGlzLm1ldGFkYXRhTWFwLmhhcyh0aGlzLkNPTlRFWFRfQVBQKSA6IGZhbHNlO1xuICAgIH1cblxuICAgIGxvYWQocHJlZmFiTmFtZT86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxldCB1cmw7XG4gICAgICAgIGlmIChoYXNDb3Jkb3ZhKCkpIHtcbiAgICAgICAgICAgIHVybCA9ICdtZXRhZGF0YS8nICsgKHByZWZhYk5hbWUgPyBgcHJlZmFicy8ke3ByZWZhYk5hbWV9L2AgOiAnYXBwLycpICsgJ3NlcnZpY2UtZGVmaW5pdGlvbnMuanNvbic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cmwgPSAnLi9zZXJ2aWNlcy8nICsgKHByZWZhYk5hbWUgPyBgcHJlZmFicy8ke3ByZWZhYk5hbWV9L2AgOiAnJykgKyAnc2VydmljZWRlZnMnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLiRodHRwLnNlbmQoeyd1cmwnIDogdXJsLCAnbWV0aG9kJzogJ0dFVCd9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGFNYXAgPSB0aGlzLm1ldGFkYXRhTWFwIHx8IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVyTWFwID0gdGhpcy5wcm92aWRlck1hcCB8fCBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IHJlc3BvbnNlLmJvZHkgfHwge307XG4gICAgICAgICAgICAgICAgdGhpcy5tZXRhZGF0YU1hcC5zZXQocHJlZmFiTmFtZSB8fCB0aGlzLkNPTlRFWFRfQVBQLCByZXNwb25zZS5ib2R5LnNlcnZpY2VEZWZzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keS5zZWN1cml0eURlZmluaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvdmlkZXJNYXAuc2V0KHByZWZhYk5hbWUgfHwgdGhpcy5DT05URVhUX0FQUCwgcmVzcG9uc2UuYm9keS5zZWN1cml0eURlZmluaXRpb25zLm9hdXRoUHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmJvZHkuc2VydmljZURlZnMpO1xuICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0QnlPcGVyYXRpb25JZChvcGVyYXRpb25JZCwgY29udGV4dCkge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dCB8fCB0aGlzLkNPTlRFWFRfQVBQO1xuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLm1ldGFkYXRhTWFwLmdldChjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG1hcCAmJiBtYXBbb3BlcmF0aW9uSWRdO1xuICAgIH1cblxuICAgIC8vIGZ1bmN0aW9uIHRvIGdldCBQcm92aWRlciBkZXRhaWxzIGZyb20gcHJvdmlkZXJNYXAgZm9yIHRoZSBwYXNzZWQgcHJvdmlkZXJJZFxuICAgIGdldEJ5UHJvdmlkZXJJZChwcm92aWRlcklkLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMuQ09OVEVYVF9BUFA7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMucHJvdmlkZXJNYXAuZ2V0KGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gbWFwICYmIG1hcFtwcm92aWRlcklkXTtcbiAgICB9XG5cbiAgICBnZXRCeUNydWRJZChjcnVkSWQsIGNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgdGhpcy5DT05URVhUX0FQUDtcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5tZXRhZGF0YU1hcC5nZXQoY29udGV4dCk7XG4gICAgICAgIGxldCBvcHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgayBpbiBtYXApIHtcbiAgICAgICAgICAgIGlmIChtYXBba10gJiYgbWFwW2tdLmNydWRPcGVyYXRpb25JZCA9PT0gY3J1ZElkKSB7XG4gICAgICAgICAgICAgICAgb3BzLnB1c2gobWFwW2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3BzO1xuICAgIH1cbn1cbiJdfQ==
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhcmlhYmxlcy9zcmMvc2VydmljZS9tZXRhZGF0YS1zZXJ2aWNlL21ldGFkYXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7QUFHM0QsTUFBTSxPQUFPLGVBQWU7SUFLeEIsWUFBb0IsS0FBMEI7UUFBMUIsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFGOUMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUFFNkIsQ0FBQztJQUVsRCxRQUFRO1FBQ0osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3RSxDQUFDO0lBRUQsSUFBSSxDQUFDLFVBQW1CO1FBQ3BCLElBQUksR0FBRyxDQUFDO1FBQ1IsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2YsR0FBRyxHQUFHLFdBQVcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsMEJBQTBCLENBQUM7UUFDdEcsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLDBCQUEwQixDQUFFLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQTtZQUN2RyxHQUFHLEdBQUcsMEJBQTBCLEdBQUcsa0JBQWtCLENBQUM7UUFDMUQsQ0FBQztRQUNELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUcsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUM5RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2pELFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2hGLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMxRyxDQUFDO2dCQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGdCQUFnQixDQUFDLFdBQVcsRUFBRSxPQUFPO1FBQ2pDLE9BQU8sR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxlQUFlLENBQUMsVUFBVSxFQUFFLE9BQU87UUFDL0IsT0FBTyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPO1FBQ3ZCLE9BQU8sR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7Z0ZBeERRLGVBQWU7dUVBQWYsZUFBZSxXQUFmLGVBQWU7O2lGQUFmLGVBQWU7Y0FEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQWJzdHJhY3RIdHRwU2VydmljZSwgaGFzQ29yZG92YSB9IGZyb20gJ0B3bS9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1ldGFkYXRhU2VydmljZSB7XG4gICAgbWV0YWRhdGFNYXA6IE1hcDxzdHJpbmcsIGFueT47XG4gICAgcHJvdmlkZXJNYXA6IE1hcDxzdHJpbmcsIGFueT47XG4gICAgQ09OVEVYVF9BUFAgPSAnYXBwJztcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJGh0dHA6IEFic3RyYWN0SHR0cFNlcnZpY2UpIHt9XG5cbiAgICBpc0xvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGFNYXAgPyB0aGlzLm1ldGFkYXRhTWFwLmhhcyh0aGlzLkNPTlRFWFRfQVBQKSA6IGZhbHNlO1xuICAgIH1cblxuICAgIGxvYWQocHJlZmFiTmFtZT86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxldCB1cmw7XG4gICAgICAgIGlmIChoYXNDb3Jkb3ZhKCkpIHtcbiAgICAgICAgICAgIHVybCA9ICdtZXRhZGF0YS8nICsgKHByZWZhYk5hbWUgPyBgcHJlZmFicy8ke3ByZWZhYk5hbWV9L2AgOiAnYXBwLycpICsgJ3NlcnZpY2UtZGVmaW5pdGlvbnMuanNvbic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2VydmljZURlZkZpbGVOYW1lID0gcHJlZmFiTmFtZSA/IHByZWZhYk5hbWUgKyAnLXByZWZhYi1zZXJ2aWNlZGVmcy5qc29uJyAgOiAnYXBwLXNlcnZpY2VkZWZzLmpzb24nXG4gICAgICAgICAgICB1cmwgPSAnLi9uZy1idW5kbGUvc2VydmljZWRlZnMvJyArIHNlcnZpY2VEZWZGaWxlTmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kaHR0cC5zZW5kKHsndXJsJyA6IHVybCwgJ21ldGhvZCc6ICdHRVQnfSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1ldGFkYXRhTWFwID0gdGhpcy5tZXRhZGF0YU1hcCB8fCBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm92aWRlck1hcCA9IHRoaXMucHJvdmlkZXJNYXAgfHwgbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJvZHkgPSByZXNwb25zZS5ib2R5IHx8IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGFNYXAuc2V0KHByZWZhYk5hbWUgfHwgdGhpcy5DT05URVhUX0FQUCwgcmVzcG9uc2UuYm9keS5zZXJ2aWNlRGVmcyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmJvZHkuc2VjdXJpdHlEZWZpbml0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVyTWFwLnNldChwcmVmYWJOYW1lIHx8IHRoaXMuQ09OVEVYVF9BUFAsIHJlc3BvbnNlLmJvZHkuc2VjdXJpdHlEZWZpbml0aW9ucy5vYXV0aFByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5ib2R5LnNlcnZpY2VEZWZzKTtcbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEJ5T3BlcmF0aW9uSWQob3BlcmF0aW9uSWQsIGNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgdGhpcy5DT05URVhUX0FQUDtcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5tZXRhZGF0YU1hcC5nZXQoY29udGV4dCk7XG4gICAgICAgIHJldHVybiBtYXAgJiYgbWFwW29wZXJhdGlvbklkXTtcbiAgICB9XG5cbiAgICAvLyBmdW5jdGlvbiB0byBnZXQgUHJvdmlkZXIgZGV0YWlscyBmcm9tIHByb3ZpZGVyTWFwIGZvciB0aGUgcGFzc2VkIHByb3ZpZGVySWRcbiAgICBnZXRCeVByb3ZpZGVySWQocHJvdmlkZXJJZCwgY29udGV4dCkge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dCB8fCB0aGlzLkNPTlRFWFRfQVBQO1xuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLnByb3ZpZGVyTWFwLmdldChjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG1hcCAmJiBtYXBbcHJvdmlkZXJJZF07XG4gICAgfVxuXG4gICAgZ2V0QnlDcnVkSWQoY3J1ZElkLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMuQ09OVEVYVF9BUFA7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMubWV0YWRhdGFNYXAuZ2V0KGNvbnRleHQpO1xuICAgICAgICBsZXQgb3BzID0gW107XG4gICAgICAgIGZvciAobGV0IGsgaW4gbWFwKSB7XG4gICAgICAgICAgICBpZiAobWFwW2tdICYmIG1hcFtrXS5jcnVkT3BlcmF0aW9uSWQgPT09IGNydWRJZCkge1xuICAgICAgICAgICAgICAgIG9wcy5wdXNoKG1hcFtrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wcztcbiAgICB9XG59XG4iXX0=
@@ -3071,7 +3071,8 @@ class MetadataService {
3071
3071
  url = 'metadata/' + (prefabName ? `prefabs/${prefabName}/` : 'app/') + 'service-definitions.json';
3072
3072
  }
3073
3073
  else {
3074
- url = './services/' + (prefabName ? `prefabs/${prefabName}/` : '') + 'servicedefs';
3074
+ let serviceDefFileName = prefabName ? prefabName + '-prefab-servicedefs.json' : 'app-servicedefs.json';
3075
+ url = './ng-bundle/servicedefs/' + serviceDefFileName;
3075
3076
  }
3076
3077
  return new Promise((resolve, reject) => {
3077
3078
  this.$http.send({ 'url': url, 'method': 'GET' }).then((response) => {