ng2-rest 13.2.8 → 13.2.9

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.
Files changed (131) hide show
  1. package/README.md +135 -135
  2. package/assets/shared/shared_folder_info.txt +1 -1
  3. package/browser/README.md +24 -24
  4. package/browser/esm2020/lib/content-type.mjs +12 -12
  5. package/browser/esm2020/lib/cookie.mjs +28 -28
  6. package/browser/esm2020/lib/helpers.mjs +23 -23
  7. package/browser/esm2020/lib/index.mjs +12 -12
  8. package/browser/esm2020/lib/mapping.mjs +238 -238
  9. package/browser/esm2020/lib/models.mjs +159 -159
  10. package/browser/esm2020/lib/other/simple-resource.mjs +116 -116
  11. package/browser/esm2020/lib/params.mjs +278 -278
  12. package/browser/esm2020/lib/request-cache.mjs +100 -100
  13. package/browser/esm2020/lib/resource.service.mjs +213 -213
  14. package/browser/esm2020/lib/rest-headers.mjs +128 -128
  15. package/browser/esm2020/lib/rest-request.mjs +321 -321
  16. package/browser/esm2020/lib/rest.class.mjs +115 -115
  17. package/browser/esm2020/ng2-rest.mjs +4 -4
  18. package/browser/esm2020/public-api.mjs +1 -1
  19. package/browser/fesm2015/ng2-rest.mjs +1677 -1677
  20. package/browser/fesm2020/ng2-rest.mjs +1675 -1675
  21. package/browser/lib/content-type.d.ts +4 -4
  22. package/browser/lib/cookie.d.ts +7 -7
  23. package/browser/lib/helpers.d.ts +10 -10
  24. package/browser/lib/index.d.ts +9 -9
  25. package/browser/lib/mapping.d.ts +12 -12
  26. package/browser/lib/models.d.ts +157 -157
  27. package/browser/lib/other/simple-resource.d.ts +29 -29
  28. package/browser/lib/params.d.ts +23 -23
  29. package/browser/lib/request-cache.d.ts +17 -17
  30. package/browser/lib/resource.service.d.ts +43 -43
  31. package/browser/lib/rest-headers.d.ts +57 -57
  32. package/browser/lib/rest-request.d.ts +21 -21
  33. package/browser/lib/rest.class.d.ts +36 -36
  34. package/browser/ng2-rest.d.ts +4 -4
  35. package/client/README.md +24 -24
  36. package/client/esm2020/lib/content-type.mjs +12 -12
  37. package/client/esm2020/lib/cookie.mjs +28 -28
  38. package/client/esm2020/lib/helpers.mjs +23 -23
  39. package/client/esm2020/lib/index.mjs +12 -12
  40. package/client/esm2020/lib/mapping.mjs +238 -238
  41. package/client/esm2020/lib/models.mjs +159 -159
  42. package/client/esm2020/lib/other/simple-resource.mjs +116 -116
  43. package/client/esm2020/lib/params.mjs +278 -278
  44. package/client/esm2020/lib/request-cache.mjs +100 -100
  45. package/client/esm2020/lib/resource.service.mjs +213 -213
  46. package/client/esm2020/lib/rest-headers.mjs +128 -128
  47. package/client/esm2020/lib/rest-request.mjs +321 -321
  48. package/client/esm2020/lib/rest.class.mjs +115 -115
  49. package/client/esm2020/ng2-rest.mjs +4 -4
  50. package/client/esm2020/public-api.mjs +1 -1
  51. package/client/fesm2015/ng2-rest.mjs +1677 -1677
  52. package/client/fesm2020/ng2-rest.mjs +1675 -1675
  53. package/client/lib/content-type.d.ts +4 -4
  54. package/client/lib/cookie.d.ts +7 -7
  55. package/client/lib/helpers.d.ts +10 -10
  56. package/client/lib/index.d.ts +9 -9
  57. package/client/lib/mapping.d.ts +12 -12
  58. package/client/lib/models.d.ts +157 -157
  59. package/client/lib/other/simple-resource.d.ts +29 -29
  60. package/client/lib/params.d.ts +23 -23
  61. package/client/lib/request-cache.d.ts +17 -17
  62. package/client/lib/resource.service.d.ts +43 -43
  63. package/client/lib/rest-headers.d.ts +57 -57
  64. package/client/lib/rest-request.d.ts +21 -21
  65. package/client/lib/rest.class.d.ts +36 -36
  66. package/client/ng2-rest.d.ts +4 -4
  67. package/client/package.json +33 -31
  68. package/index.d.ts +1 -1
  69. package/index.js.map +1 -1
  70. package/lib/content-type.d.ts +5 -5
  71. package/lib/content-type.js.map +1 -1
  72. package/lib/cookie.d.ts +8 -8
  73. package/lib/cookie.js.map +1 -1
  74. package/lib/helpers.d.ts +11 -11
  75. package/lib/helpers.js.map +1 -1
  76. package/lib/index.d.ts +10 -10
  77. package/lib/index.js.map +1 -1
  78. package/lib/mapping.d.ts +13 -13
  79. package/lib/mapping.js.map +1 -1
  80. package/lib/models.d.ts +158 -158
  81. package/lib/models.js.map +1 -1
  82. package/lib/other/simple-resource.d.ts +30 -30
  83. package/lib/other/simple-resource.js.map +1 -1
  84. package/lib/params.d.ts +24 -24
  85. package/lib/params.js.map +1 -1
  86. package/lib/request-cache.d.ts +18 -18
  87. package/lib/request-cache.js.map +1 -1
  88. package/lib/resource.service.d.ts +44 -44
  89. package/lib/resource.service.js.map +1 -1
  90. package/lib/rest-headers.d.ts +58 -58
  91. package/lib/rest-headers.js.map +1 -1
  92. package/lib/rest-request.d.ts +22 -22
  93. package/lib/rest-request.js.map +1 -1
  94. package/lib/rest.class.d.ts +37 -37
  95. package/lib/rest.class.js.map +1 -1
  96. package/package.json +6 -6
  97. package/package.json_devDependencies.json +217 -217
  98. package/package.json_tnp.json5 +53 -53
  99. package/tmp-environment.json +37 -35
  100. package/websql/README.md +24 -24
  101. package/websql/esm2020/lib/content-type.mjs +12 -12
  102. package/websql/esm2020/lib/cookie.mjs +28 -28
  103. package/websql/esm2020/lib/helpers.mjs +23 -23
  104. package/websql/esm2020/lib/index.mjs +12 -12
  105. package/websql/esm2020/lib/mapping.mjs +238 -238
  106. package/websql/esm2020/lib/models.mjs +159 -159
  107. package/websql/esm2020/lib/other/simple-resource.mjs +116 -116
  108. package/websql/esm2020/lib/params.mjs +278 -278
  109. package/websql/esm2020/lib/request-cache.mjs +100 -100
  110. package/websql/esm2020/lib/resource.service.mjs +213 -213
  111. package/websql/esm2020/lib/rest-headers.mjs +128 -128
  112. package/websql/esm2020/lib/rest-request.mjs +321 -321
  113. package/websql/esm2020/lib/rest.class.mjs +115 -115
  114. package/websql/esm2020/ng2-rest.mjs +4 -4
  115. package/websql/esm2020/public-api.mjs +1 -1
  116. package/websql/fesm2015/ng2-rest.mjs +1677 -1677
  117. package/websql/fesm2020/ng2-rest.mjs +1675 -1675
  118. package/websql/lib/content-type.d.ts +4 -4
  119. package/websql/lib/cookie.d.ts +7 -7
  120. package/websql/lib/helpers.d.ts +10 -10
  121. package/websql/lib/index.d.ts +9 -9
  122. package/websql/lib/mapping.d.ts +12 -12
  123. package/websql/lib/models.d.ts +157 -157
  124. package/websql/lib/other/simple-resource.d.ts +29 -29
  125. package/websql/lib/params.d.ts +23 -23
  126. package/websql/lib/request-cache.d.ts +17 -17
  127. package/websql/lib/resource.service.d.ts +43 -43
  128. package/websql/lib/rest-headers.d.ts +57 -57
  129. package/websql/lib/rest-request.d.ts +21 -21
  130. package/websql/lib/rest.class.d.ts +36 -36
  131. package/websql/ng2-rest.d.ts +4 -4
@@ -1,220 +1,220 @@
1
- import { Subject } from 'rxjs';
2
- import { Log, Level } from 'ng2-logger/websql';
3
- const log = Log.create('resouce-service', Level.__NOTHING);
4
- import { Rest } from './rest.class';
5
- import { RestRequest } from './rest-request';
6
- import { Cookie } from './cookie';
7
- import { interpolateParamsToUrl, isValid, containsModels, getModels } from './params';
8
- import { Helpers } from 'tnp-core/websql';
9
- export class Resource {
10
- constructor() {
11
- setTimeout(() => {
12
- const zone = this.getZone();
13
- if (!RestRequest.zone) {
14
- RestRequest.zone = zone;
15
- }
16
- ;
17
- });
18
- }
19
- static get listenErrors() {
20
- return this._listenErrors.asObservable();
21
- }
22
- static get listenSuccessOperations() {
23
- return this._listenSuccess.asObservable();
24
- }
25
- getZone() {
26
- const isNode = (typeof window === 'undefined');
27
- if (isNode) {
28
- return;
29
- }
30
- ;
31
- const ng = window['ng'];
32
- const getAllAngularRootElements = window['getAllAngularRootElements'];
33
- if (!ng || !getAllAngularRootElements) {
34
- return;
35
- }
36
- const probe = ng.probe;
37
- const coreTokens = ng.coreTokens;
38
- if (!coreTokens || !coreTokens.NgZone) {
39
- return;
40
- }
41
- const zoneClass = coreTokens.NgZone;
42
- if (!probe || typeof probe !== 'function' || !getAllAngularRootElements) {
43
- return;
44
- }
45
- const angularElements = getAllAngularRootElements();
46
- if (!Array.isArray(angularElements) || angularElements.length === 0) {
47
- return;
48
- }
49
- const rootElement = ng.probe(angularElements[0]);
50
- if (!rootElement) {
51
- return;
52
- }
53
- const injector = rootElement.injector;
54
- if (!injector || !injector.get || typeof injector.get !== 'function') {
55
- return;
56
- }
57
- const zone = injector.get(zoneClass);
58
- return zone;
59
- }
60
- static initAngularNgZone(zone) {
61
- RestRequest.zone = zone;
62
- }
63
- checkNestedModels(model, allModels) {
64
- for (let p in allModels) {
65
- if (allModels.hasOwnProperty(p)) {
66
- let m = allModels[p];
67
- if (isValid(p)) {
68
- let urlModels = getModels(p);
69
- if (containsModels(model, urlModels)) {
70
- model = p;
71
- break;
72
- }
73
- }
74
- }
75
- }
76
- return model;
77
- }
78
- static getModel(endpoint, model) {
79
- model = Resource.prepareModel(model);
80
- const e = Resource.endpoints[endpoint];
81
- if (!e) {
82
- return void 0;
83
- }
84
- const r = Resource.endpoints[endpoint].models[model];
85
- return Resource.endpoints[endpoint].models[model];
86
- }
87
- static create(e, model, entityMapping, circular, customContentType) {
88
- const badRestRegEX = new RegExp('((\/:)[a-z]+)+', 'g');
89
- const matchArr = model.match(badRestRegEX) || [];
90
- const badModelsNextToEachOther = matchArr.join();
91
- const atleas2DoubleDots = ((badModelsNextToEachOther.match(new RegExp(':', 'g')) || []).length >= 2);
92
- if (atleas2DoubleDots && model.search(badModelsNextToEachOther) !== -1) {
1
+ import { Subject } from 'rxjs';
2
+ import { Log, Level } from 'ng2-logger/websql';
3
+ const log = Log.create('resouce-service', Level.__NOTHING);
4
+ import { Rest } from './rest.class';
5
+ import { RestRequest } from './rest-request';
6
+ import { Cookie } from './cookie';
7
+ import { interpolateParamsToUrl, isValid, containsModels, getModels } from './params';
8
+ import { Helpers } from 'tnp-core/websql';
9
+ export class Resource {
10
+ constructor() {
11
+ setTimeout(() => {
12
+ const zone = this.getZone();
13
+ if (!RestRequest.zone) {
14
+ RestRequest.zone = zone;
15
+ }
16
+ ;
17
+ });
18
+ }
19
+ static get listenErrors() {
20
+ return this._listenErrors.asObservable();
21
+ }
22
+ static get listenSuccessOperations() {
23
+ return this._listenSuccess.asObservable();
24
+ }
25
+ getZone() {
26
+ const isNode = (typeof window === 'undefined');
27
+ if (isNode) {
28
+ return;
29
+ }
30
+ ;
31
+ const ng = window['ng'];
32
+ const getAllAngularRootElements = window['getAllAngularRootElements'];
33
+ if (!ng || !getAllAngularRootElements) {
34
+ return;
35
+ }
36
+ const probe = ng.probe;
37
+ const coreTokens = ng.coreTokens;
38
+ if (!coreTokens || !coreTokens.NgZone) {
39
+ return;
40
+ }
41
+ const zoneClass = coreTokens.NgZone;
42
+ if (!probe || typeof probe !== 'function' || !getAllAngularRootElements) {
43
+ return;
44
+ }
45
+ const angularElements = getAllAngularRootElements();
46
+ if (!Array.isArray(angularElements) || angularElements.length === 0) {
47
+ return;
48
+ }
49
+ const rootElement = ng.probe(angularElements[0]);
50
+ if (!rootElement) {
51
+ return;
52
+ }
53
+ const injector = rootElement.injector;
54
+ if (!injector || !injector.get || typeof injector.get !== 'function') {
55
+ return;
56
+ }
57
+ const zone = injector.get(zoneClass);
58
+ return zone;
59
+ }
60
+ static initAngularNgZone(zone) {
61
+ RestRequest.zone = zone;
62
+ }
63
+ checkNestedModels(model, allModels) {
64
+ for (let p in allModels) {
65
+ if (allModels.hasOwnProperty(p)) {
66
+ let m = allModels[p];
67
+ if (isValid(p)) {
68
+ let urlModels = getModels(p);
69
+ if (containsModels(model, urlModels)) {
70
+ model = p;
71
+ break;
72
+ }
73
+ }
74
+ }
75
+ }
76
+ return model;
77
+ }
78
+ static getModel(endpoint, model) {
79
+ model = Resource.prepareModel(model);
80
+ const e = Resource.endpoints[endpoint];
81
+ if (!e) {
82
+ return void 0;
83
+ }
84
+ const r = Resource.endpoints[endpoint].models[model];
85
+ return Resource.endpoints[endpoint].models[model];
86
+ }
87
+ static create(e, model, entityMapping, circular, customContentType) {
88
+ const badRestRegEX = new RegExp('((\/:)[a-z]+)+', 'g');
89
+ const matchArr = model.match(badRestRegEX) || [];
90
+ const badModelsNextToEachOther = matchArr.join();
91
+ const atleas2DoubleDots = ((badModelsNextToEachOther.match(new RegExp(':', 'g')) || []).length >= 2);
92
+ if (atleas2DoubleDots && model.search(badModelsNextToEachOther) !== -1) {
93
93
  throw new Error(`
94
94
 
95
95
  Bad rest model: ${model}
96
96
 
97
97
  Do not create rest models like this: /book/author/:bookid/:authorid
98
98
  Instead use nested approach: /book/:bookid/author/:authorid
99
- `);
100
- }
101
- ;
102
- Resource.map(e, e);
103
- Resource.instance.add(e, model ? model : '', entityMapping, circular, customContentType);
104
- return {
105
- model: (params) => Resource.instance.api(e, interpolateParamsToUrl(params, model)),
106
- replay: (method) => {
107
- Resource.getModel(e, model).replay(method);
108
- },
109
- get headers() {
110
- return Resource.getModel(e, model).headers;
111
- }
112
- };
113
- }
114
- static reset() {
115
- Resource.endpoints = {};
116
- }
117
- static map(endpoint, url) {
118
- log.i('url', url);
119
- let regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
120
- let e = endpoint;
121
- if (!regex.test(url)) {
122
- throw `Url address is not correct: ${url}`;
123
- }
124
- if (url.charAt(url.length - 1) === '/')
125
- url = url.slice(0, url.length - 1);
126
- log.i('url after', url);
127
- if (Resource.endpoints[e] !== void 0) {
128
- Helpers.log('Cannot use map function at the same API endpoint again ('
129
- + Resource.endpoints[e].url + ')');
130
- return false;
131
- }
132
- Resource.endpoints[e] = {
133
- url: url,
134
- models: {},
135
- entity: null
136
- };
137
- log.i('enpoints', Resource.endpoints);
138
- return true;
139
- }
140
- static prepareModel(model) {
141
- if (model.charAt(model.length - 1) === '/')
142
- model = model.slice(0, model.length - 1);
143
- if (model.charAt(0) === '/')
144
- model = model.slice(1, model.length);
145
- return model;
146
- }
147
- /**
148
- * And enipoint to application
149
- *
150
- * @param {E} endpoint
151
- * @param {string} model
152
- * @returns {boolean}
153
- */
154
- add(endpoint, model, entity, circular, customContentType) {
155
- log.i(`I am maping ${model} on ${endpoint}`);
156
- model = Resource.prepareModel(model);
157
- let e;
158
- e = (endpoint).toString();
159
- if (Resource.endpoints[e] === void 0) {
160
- console.error('Endpoint is not mapped ! Cannot add model ' + model);
161
- return;
162
- }
163
- if (Resource.endpoints[e].models[model] !== void 0) {
164
- if (Resource.enableWarnings)
165
- console.warn(`Model '${model}' is already defined in endpoint: `
166
- + Resource.endpoints[e].url);
167
- return;
168
- }
169
- Resource.endpoints[e].models[model] =
170
- new Rest(Resource.endpoints[e].url
171
- + '/' + model, Resource.request, {
172
- endpoint: e,
173
- path: model,
174
- entity,
175
- circular,
176
- }, customContentType); // TODO put custom content type in meta ?
177
- return;
178
- }
179
- /**
180
- * Access api throught endpoint
181
- *
182
- * @param {E} endpoint
183
- * @param {string} model
184
- * @returns {Rest<T, TA>}
185
- */
186
- api(endpoint, model) {
187
- if (model.charAt(0) === '/')
188
- model = model.slice(1, model.length);
189
- let e = (endpoint).toString();
190
- if (Resource.endpoints[e] === void 0) {
191
- throw `Endpoint: ${endpoint} is not mapped ! Cannot add model: ${model}`;
192
- }
193
- let allModels = Resource.endpoints[e].models;
194
- let orgModel = model;
195
- model = this.checkNestedModels(model, allModels);
196
- if (Resource.endpoints[e].models[model] === void 0) {
197
- throw `Model '${model}' is undefined in endpoint: ${Resource.endpoints[e].url} `;
198
- }
199
- let res = Resource.endpoints[(endpoint).toString()].models[model];
200
- if (orgModel !== model) {
201
- let baseUrl = Resource.endpoints[(endpoint).toString()].url;
202
- res.__rest_endpoint = `${baseUrl}/${orgModel}`;
203
- }
204
- else {
205
- res.__rest_endpoint = void 0;
206
- }
207
- ;
208
- return res;
209
- }
210
- }
211
- Resource._listenErrors = new Subject();
212
- Resource._listenSuccess = new Subject();
213
- Resource.enableWarnings = true;
214
- Resource.instance = new Resource();
215
- Resource.endpoints = {};
216
- Resource.request = new RestRequest();
217
- Resource.Cookies = Cookie.Instance;
218
- ;
219
- ({}); // @--end-of-file-for-module=ng2-rest lib/resource.service.ts
99
+ `);
100
+ }
101
+ ;
102
+ Resource.map(e, e);
103
+ Resource.instance.add(e, model ? model : '', entityMapping, circular, customContentType);
104
+ return {
105
+ model: (params) => Resource.instance.api(e, interpolateParamsToUrl(params, model)),
106
+ replay: (method) => {
107
+ Resource.getModel(e, model).replay(method);
108
+ },
109
+ get headers() {
110
+ return Resource.getModel(e, model).headers;
111
+ }
112
+ };
113
+ }
114
+ static reset() {
115
+ Resource.endpoints = {};
116
+ }
117
+ static map(endpoint, url) {
118
+ log.i('url', url);
119
+ let regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
120
+ let e = endpoint;
121
+ if (!regex.test(url)) {
122
+ throw `Url address is not correct: ${url}`;
123
+ }
124
+ if (url.charAt(url.length - 1) === '/')
125
+ url = url.slice(0, url.length - 1);
126
+ log.i('url after', url);
127
+ if (Resource.endpoints[e] !== void 0) {
128
+ Helpers.log('Cannot use map function at the same API endpoint again ('
129
+ + Resource.endpoints[e].url + ')');
130
+ return false;
131
+ }
132
+ Resource.endpoints[e] = {
133
+ url: url,
134
+ models: {},
135
+ entity: null
136
+ };
137
+ log.i('enpoints', Resource.endpoints);
138
+ return true;
139
+ }
140
+ static prepareModel(model) {
141
+ if (model.charAt(model.length - 1) === '/')
142
+ model = model.slice(0, model.length - 1);
143
+ if (model.charAt(0) === '/')
144
+ model = model.slice(1, model.length);
145
+ return model;
146
+ }
147
+ /**
148
+ * And enipoint to application
149
+ *
150
+ * @param {E} endpoint
151
+ * @param {string} model
152
+ * @returns {boolean}
153
+ */
154
+ add(endpoint, model, entity, circular, customContentType) {
155
+ log.i(`I am maping ${model} on ${endpoint}`);
156
+ model = Resource.prepareModel(model);
157
+ let e;
158
+ e = (endpoint).toString();
159
+ if (Resource.endpoints[e] === void 0) {
160
+ console.error('Endpoint is not mapped ! Cannot add model ' + model);
161
+ return;
162
+ }
163
+ if (Resource.endpoints[e].models[model] !== void 0) {
164
+ if (Resource.enableWarnings)
165
+ console.warn(`Model '${model}' is already defined in endpoint: `
166
+ + Resource.endpoints[e].url);
167
+ return;
168
+ }
169
+ Resource.endpoints[e].models[model] =
170
+ new Rest(Resource.endpoints[e].url
171
+ + '/' + model, Resource.request, {
172
+ endpoint: e,
173
+ path: model,
174
+ entity,
175
+ circular,
176
+ }, customContentType); // TODO put custom content type in meta ?
177
+ return;
178
+ }
179
+ /**
180
+ * Access api throught endpoint
181
+ *
182
+ * @param {E} endpoint
183
+ * @param {string} model
184
+ * @returns {Rest<T, TA>}
185
+ */
186
+ api(endpoint, model) {
187
+ if (model.charAt(0) === '/')
188
+ model = model.slice(1, model.length);
189
+ let e = (endpoint).toString();
190
+ if (Resource.endpoints[e] === void 0) {
191
+ throw `Endpoint: ${endpoint} is not mapped ! Cannot add model: ${model}`;
192
+ }
193
+ let allModels = Resource.endpoints[e].models;
194
+ let orgModel = model;
195
+ model = this.checkNestedModels(model, allModels);
196
+ if (Resource.endpoints[e].models[model] === void 0) {
197
+ throw `Model '${model}' is undefined in endpoint: ${Resource.endpoints[e].url} `;
198
+ }
199
+ let res = Resource.endpoints[(endpoint).toString()].models[model];
200
+ if (orgModel !== model) {
201
+ let baseUrl = Resource.endpoints[(endpoint).toString()].url;
202
+ res.__rest_endpoint = `${baseUrl}/${orgModel}`;
203
+ }
204
+ else {
205
+ res.__rest_endpoint = void 0;
206
+ }
207
+ ;
208
+ return res;
209
+ }
210
+ }
211
+ Resource._listenErrors = new Subject();
212
+ Resource._listenSuccess = new Subject();
213
+ Resource.enableWarnings = true;
214
+ Resource.instance = new Resource();
215
+ Resource.endpoints = {};
216
+ Resource.request = new RestRequest();
217
+ Resource.Cookies = Cookie.Instance;
218
+ ;
219
+ ({}); // @--end-of-file-for-module=ng2-rest lib/resource.service.ts
220
220
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RtcC1saWJzLWZvci1idW5kbGUtd2Vic3FsL25nMi1yZXN0L3Byb2plY3RzL25nMi1yZXN0L3NyYy9saWIvcmVzb3VyY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFDdEMsS0FBSyxDQUFDLFNBQVMsQ0FDaEIsQ0FBQTtBQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHbEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXRGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQU16QyxNQUFNLE9BQU8sUUFBUTtJQW9IbkI7UUFDRSxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFO2dCQUFFLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO2FBQUU7WUFBQSxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQXRITSxNQUFNLEtBQUssWUFBWTtRQUM1QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVN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QUErQzlCLGlCQUFRLEdBQUcsSUFBSSxRQUFRLEVBQW9CLENBQUM7QUFDNUMsa0JBQVMsR0FBRyxFQUFFLENBQUM7QUFRZixnQkFBTyxHQUFnQixJQUFJLFdBQVcsRUFBRSxDQUFDO0FBMEQxQyxnQkFBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUF1SXpDLENBQUM7QUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsNkRBQTZEIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMb2csIExldmVsIH0gZnJvbSAnbmcyLWxvZ2dlci93ZWJzcWwnO1xuY29uc3QgbG9nID0gTG9nLmNyZWF0ZSgncmVzb3VjZS1zZXJ2aWNlJyxcbiAgTGV2ZWwuX19OT1RISU5HXG4pXG5cbmltcG9ydCB7IFJlc3QgfSBmcm9tICcuL3Jlc3QuY2xhc3MnO1xuaW1wb3J0IHsgUmVzdFJlcXVlc3QgfSBmcm9tICcuL3Jlc3QtcmVxdWVzdCc7XG5pbXBvcnQgeyBSZXN0SGVhZGVycyB9IGZyb20gJy4vcmVzdC1oZWFkZXJzJztcbmltcG9ydCB7IENvb2tpZSB9IGZyb20gJy4vY29va2llJztcbmltcG9ydCB7IE1hcHBpbmcgfSBmcm9tICcuL21hcHBpbmcnO1xuaW1wb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgaW50ZXJwb2xhdGVQYXJhbXNUb1VybCwgaXNWYWxpZCwgY29udGFpbnNNb2RlbHMsIGdldE1vZGVscyB9IGZyb20gJy4vcGFyYW1zJztcbmltcG9ydCB7IENpcmMgfSBmcm9tICdqc29uMTAvd2Vic3FsJztcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tICd0bnAtY29yZS93ZWJzcWwnXG5cblxuZGVjbGFyZSBjb25zdCBnbG9iYWw6IGFueTtcblxuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2U8RSwgVCwgVEE+IHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBfbGlzdGVuRXJyb3JzID0gbmV3IFN1YmplY3Q8TW9kZWxzLkJhY2tlbmRFcnJvcj4oKTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBfbGlzdGVuU3VjY2VzcyA9IG5ldyBTdWJqZWN0PE1vZGVscy5IdHRwUmVzcG9uc2U8YW55Pj4oKTtcbiAgcHVibGljIHN0YXRpYyBnZXQgbGlzdGVuRXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9saXN0ZW5FcnJvcnMuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldCBsaXN0ZW5TdWNjZXNzT3BlcmF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdGVuU3VjY2Vzcy5hc09ic2VydmFibGUoKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGVuYWJsZVdhcm5pbmdzOiBib29sZWFuID0gdHJ1ZTtcblxuXG4gIHByaXZhdGUgZ2V0Wm9uZSgpIHtcbiAgICBjb25zdCBpc05vZGUgPSAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgaWYgKGlzTm9kZSkgeyByZXR1cm4gfTtcbiAgICBjb25zdCBuZyA9IHdpbmRvd1snbmcnXTtcbiAgICBjb25zdCBnZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzID0gd2luZG93WydnZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzJ107XG4gICAgaWYgKCFuZyB8fCAhZ2V0QWxsQW5ndWxhclJvb3RFbGVtZW50cykgeyByZXR1cm47IH1cbiAgICBjb25zdCBwcm9iZSA9IG5nLnByb2JlO1xuICAgIGNvbnN0IGNvcmVUb2tlbnMgPSBuZy5jb3JlVG9rZW5zO1xuICAgIGlmICghY29yZVRva2VucyB8fCAhY29yZVRva2Vucy5OZ1pvbmUpIHsgcmV0dXJuOyB9XG4gICAgY29uc3Qgem9uZUNsYXNzID0gY29yZVRva2Vucy5OZ1pvbmU7XG4gICAgaWYgKCFwcm9iZSB8fCB0eXBlb2YgcHJvYmUgIT09ICdmdW5jdGlvbicgfHwgIWdldEFsbEFuZ3VsYXJSb290RWxlbWVudHMpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgYW5ndWxhckVsZW1lbnRzOiBhbnlbXSA9IGdldEFsbEFuZ3VsYXJSb290RWxlbWVudHMoKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYW5ndWxhckVsZW1lbnRzKSB8fCBhbmd1bGFyRWxlbWVudHMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gbmcucHJvYmUoYW5ndWxhckVsZW1lbnRzWzBdKTtcbiAgICBpZiAoIXJvb3RFbGVtZW50KSB7IHJldHVybjsgfVxuICAgIGNvbnN0IGluamVjdG9yID0gcm9vdEVsZW1lbnQuaW5qZWN0b3I7XG4gICAgaWYgKCFpbmplY3RvciB8fCAhaW5qZWN0b3IuZ2V0IHx8IHR5cGVvZiBpbmplY3Rvci5nZXQgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuOyB9XG4gICAgY29uc3Qgem9uZSA9IGluamVjdG9yLmdldCh6b25lQ2xhc3MpXG4gICAgcmV0dXJuIHpvbmU7XG4gIH1cblxuXG4gIHB1YmxpYyBzdGF0aWMgaW5pdEFuZ3VsYXJOZ1pvbmUoem9uZSkge1xuICAgIFJlc3RSZXF1ZXN0LnpvbmUgPSB6b25lO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja05lc3RlZE1vZGVscyhtb2RlbDogc3RyaW5nLCBhbGxNb2RlbHM6IE9iamVjdCkge1xuXG4gICAgZm9yIChsZXQgcCBpbiBhbGxNb2RlbHMpIHtcbiAgICAgIGlmIChhbGxNb2RlbHMuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgbGV0IG0gPSBhbGxNb2RlbHNbcF07XG4gICAgICAgIGlmIChpc1ZhbGlkKHApKSB7XG4gICAgICAgICAgbGV0IHVybE1vZGVscyA9IGdldE1vZGVscyhwKTtcbiAgICAgICAgICBpZiAoY29udGFpbnNNb2RlbHMobW9kZWwsIHVybE1vZGVscykpIHtcbiAgICAgICAgICAgIG1vZGVsID0gcDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlID0gbmV3IFJlc291cmNlPHN0cmluZywgYW55LCBhbnk+KCk7XG4gIHByaXZhdGUgc3RhdGljIGVuZHBvaW50cyA9IHt9O1xuICBwdWJsaWMgc3RhdGljIGdldE1vZGVsKGVuZHBvaW50OiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcpOiBSZXN0PGFueT4ge1xuICAgIG1vZGVsID0gUmVzb3VyY2UucHJlcGFyZU1vZGVsKG1vZGVsKTtcbiAgICBjb25zdCBlID0gUmVzb3VyY2UuZW5kcG9pbnRzW2VuZHBvaW50XTtcbiAgICBpZiAoIWUpIHsgcmV0dXJuIHZvaWQgMDsgfVxuICAgIGNvbnN0IHIgPSBSZXNvdXJjZS5lbmRwb2ludHNbZW5kcG9pbnRdLm1vZGVsc1ttb2RlbF07XG4gICAgcmV0dXJuIFJlc291cmNlLmVuZHBvaW50c1tlbmRwb2ludF0ubW9kZWxzW21vZGVsXTtcbiAgfVxuICBwcml2YXRlIHN0YXRpYyByZXF1ZXN0OiBSZXN0UmVxdWVzdCA9IG5ldyBSZXN0UmVxdWVzdCgpO1xuXG5cblxuXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEEsIFRBID0gQVtdPihcbiAgICBlOiBzdHJpbmcsXG4gICAgbW9kZWw/OiBzdHJpbmcsXG4gICAgZW50aXR5TWFwcGluZz86IE1hcHBpbmcuTWFwcGluZyxcbiAgICBjaXJjdWxhcj86IENpcmNbXSxcbiAgICBjdXN0b21Db250ZW50VHlwZT86IFJlc3RIZWFkZXJzLFxuICApOiBNb2RlbHMuUmVzb3VyY2VNb2RlbDxBLCBUQT4ge1xuICAgIGNvbnN0IGJhZFJlc3RSZWdFWCA9IG5ldyBSZWdFeHAoJygoXFwvOilbYS16XSspKycsICdnJyk7XG4gICAgY29uc3QgbWF0Y2hBcnIgPSBtb2RlbC5tYXRjaChiYWRSZXN0UmVnRVgpIHx8IFtdO1xuICAgIGNvbnN0IGJhZE1vZGVsc05leHRUb0VhY2hPdGhlciA9IG1hdGNoQXJyLmpvaW4oKTtcbiAgICBjb25zdCBhdGxlYXMyRG91YmxlRG90cyA9ICgoYmFkTW9kZWxzTmV4dFRvRWFjaE90aGVyLm1hdGNoKG5ldyBSZWdFeHAoJzonLCAnZycpKSB8fCBbXSkubGVuZ3RoID49IDIpO1xuICAgIGlmIChhdGxlYXMyRG91YmxlRG90cyAmJiBtb2RlbC5zZWFyY2goYmFkTW9kZWxzTmV4dFRvRWFjaE90aGVyKSAhPT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG5cbkJhZCByZXN0IG1vZGVsOiAke21vZGVsfVxuXG5EbyBub3QgY3JlYXRlIHJlc3QgbW9kZWxzIGxpa2UgdGhpczogICAgL2Jvb2svYXV0aG9yLzpib29raWQvOmF1dGhvcmlkXG5JbnN0ZWFkIHVzZSBuZXN0ZWQgYXBwcm9hY2g6ICAgICAgICAgICAgL2Jvb2svOmJvb2tpZC9hdXRob3IvOmF1dGhvcmlkXG4gICAgICAgICAgICBgKVxuICAgIH07XG4gICAgUmVzb3VyY2UubWFwKGUsIGUpO1xuICAgIFJlc291cmNlLmluc3RhbmNlLmFkZChlLCBtb2RlbCA/IG1vZGVsIDogJycsIGVudGl0eU1hcHBpbmcsIGNpcmN1bGFyLCBjdXN0b21Db250ZW50VHlwZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWw6IChwYXJhbXM/OiBPYmplY3QpID0+IFJlc291cmNlLmluc3RhbmNlLmFwaShcbiAgICAgICAgZSxcbiAgICAgICAgaW50ZXJwb2xhdGVQYXJhbXNUb1VybChwYXJhbXMsIG1vZGVsKVxuICAgICAgKSxcbiAgICAgIHJlcGxheTogKG1ldGhvZDogTW9kZWxzLkh0dHBNZXRob2QpID0+IHtcbiAgICAgICAgUmVzb3VyY2UuZ2V0TW9kZWwoZSwgbW9kZWwpLnJlcGxheShtZXRob2QpO1xuICAgICAgfSxcbiAgICAgIGdldCBoZWFkZXJzKCkge1xuICAgICAgICByZXR1cm4gUmVzb3VyY2UuZ2V0TW9kZWwoZSwgbW9kZWwpLmhlYWRlcnM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXQoKSB7XG4gICAgUmVzb3VyY2UuZW5kcG9pbnRzID0ge307XG4gIH1cblxuXG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHpvbmUgPSB0aGlzLmdldFpvbmUoKTtcbiAgICAgIGlmICghUmVzdFJlcXVlc3Quem9uZSkgeyBSZXN0UmVxdWVzdC56b25lID0gem9uZSB9O1xuICAgIH0pXG4gIH1cblxuXG4gIHB1YmxpYyBzdGF0aWMgQ29va2llcyA9IENvb2tpZS5JbnN0YW5jZTtcblxuXG4gIHByaXZhdGUgc3RhdGljIG1hcChlbmRwb2ludDogc3RyaW5nLCB1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgbG9nLmkoJ3VybCcsIHVybClcbiAgICBsZXQgcmVnZXggPSAvKGh0dHB8aHR0cHMpOlxcL1xcLyhcXHcrOnswLDF9XFx3Kik/KFxcUyspKDpbMC05XSspPyhcXC98XFwvKFtcXHcjITouPys9JiUhXFwtXFwvXSkpPy87XG4gICAgbGV0IGUgPSBlbmRwb2ludDtcbiAgICBpZiAoIXJlZ2V4LnRlc3QodXJsKSkge1xuICAgICAgdGhyb3cgYFVybCBhZGRyZXNzIGlzIG5vdCBjb3JyZWN0OiAke3VybH1gO1xuICAgIH1cbiAgICBpZiAodXJsLmNoYXJBdCh1cmwubGVuZ3RoIC0gMSkgPT09ICcvJykgdXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSAxKTtcbiAgICBsb2cuaSgndXJsIGFmdGVyJywgdXJsKVxuICAgIGlmIChSZXNvdXJjZS5lbmRwb2ludHNbZV0gIT09IHZvaWQgMCkge1xuICAgICAgSGVscGVycy5sb2coJ0Nhbm5vdCB1c2UgbWFwIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIEFQSSBlbmRwb2ludCBhZ2FpbiAoJ1xuICAgICAgICArIFJlc291cmNlLmVuZHBvaW50c1tlXS51cmwgKyAnKScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBSZXNvdXJjZS5lbmRwb2ludHNbZV0gPSB7XG4gICAgICB1cmw6IHVybCxcbiAgICAgIG1vZGVsczoge30sXG4gICAgICBlbnRpdHk6IG51bGxcbiAgICB9O1xuICAgIGxvZy5pKCdlbnBvaW50cycsIFJlc291cmNlLmVuZHBvaW50cylcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBzdGF0aWMgcHJlcGFyZU1vZGVsKG1vZGVsKSB7XG4gICAgaWYgKG1vZGVsLmNoYXJBdChtb2RlbC5sZW5ndGggLSAxKSA9PT0gJy8nKSBtb2RlbCA9IG1vZGVsLnNsaWNlKDAsIG1vZGVsLmxlbmd0aCAtIDEpO1xuICAgIGlmIChtb2RlbC5jaGFyQXQoMCkgPT09ICcvJykgbW9kZWwgPSBtb2RlbC5zbGljZSgxLCBtb2RlbC5sZW5ndGgpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG5cblxuICAvKipcbiAgICogQW5kIGVuaXBvaW50IHRvIGFwcGxpY2F0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7RX0gZW5kcG9pbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcHJpdmF0ZSBhZGQoZW5kcG9pbnQ6IEUsIG1vZGVsOiBzdHJpbmcsIGVudGl0eTogTWFwcGluZy5NYXBwaW5nLCBjaXJjdWxhcj86IENpcmNbXSwgY3VzdG9tQ29udGVudFR5cGU/OiBSZXN0SGVhZGVycykge1xuICAgIGxvZy5pKGBJIGFtIG1hcGluZyAke21vZGVsfSBvbiAkezxhbnk+ZW5kcG9pbnR9YCk7XG4gICAgbW9kZWwgPSBSZXNvdXJjZS5wcmVwYXJlTW9kZWwobW9kZWwpO1xuXG4gICAgbGV0IGU6IHN0cmluZztcbiAgICBlID0gPHN0cmluZz4oZW5kcG9pbnQpLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoUmVzb3VyY2UuZW5kcG9pbnRzW2VdID09PSB2b2lkIDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0VuZHBvaW50IGlzIG5vdCBtYXBwZWQgISBDYW5ub3QgYWRkIG1vZGVsICcgKyBtb2RlbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChSZXNvdXJjZS5lbmRwb2ludHNbZV0ubW9kZWxzW21vZGVsXSAhPT0gdm9pZCAwKSB7XG4gICAgICBpZiAoUmVzb3VyY2UuZW5hYmxlV2FybmluZ3MpIGNvbnNvbGUud2FybihgTW9kZWwgJyR7bW9kZWx9JyBpcyBhbHJlYWR5IGRlZmluZWQgaW4gZW5kcG9pbnQ6IGBcbiAgICAgICAgKyBSZXNvdXJjZS5lbmRwb2ludHNbZV0udXJsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgUmVzb3VyY2UuZW5kcG9pbnRzW2VdLm1vZGVsc1ttb2RlbF0gPVxuICAgICAgbmV3IFJlc3Q8VCwgVEE+KFJlc291cmNlLmVuZHBvaW50c1tlXS51cmxcbiAgICAgICAgKyAnLycgKyBtb2RlbCwgUmVzb3VyY2UucmVxdWVzdCwge1xuICAgICAgICBlbmRwb2ludDogZSxcbiAgICAgICAgcGF0aDogbW9kZWwsXG4gICAgICAgIGVudGl0eSxcbiAgICAgICAgY2lyY3VsYXIsXG4gICAgICB9LCBjdXN0b21Db250ZW50VHlwZSk7IC8vIFRPRE8gcHV0IGN1c3RvbSBjb250ZW50IHR5cGUgaW4gbWV0YSA/XG4gICAgcmV0dXJuO1xuICB9XG5cblxuXG4gIC8qKlxuICAgKiBBY2Nlc3MgYXBpIHRocm91Z2h0IGVuZHBvaW50XG4gICAqXG4gICAqIEBwYXJhbSB7RX0gZW5kcG9pbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsXG4gICAqIEByZXR1cm5zIHtSZXN0PFQsIFRBPn1cbiAgICovXG4gIHByaXZhdGUgYXBpKGVuZHBvaW50OiBFLCBtb2RlbDogc3RyaW5nKTogUmVzdDxULCBUQT4ge1xuXG5cblxuXG5cblxuICAgIGlmIChtb2RlbC5jaGFyQXQoMCkgPT09ICcvJykgbW9kZWwgPSBtb2RlbC5zbGljZSgxLCBtb2RlbC5sZW5ndGgpO1xuICAgIGxldCBlID0gPHN0cmluZz4oZW5kcG9pbnQpLnRvU3RyaW5nKCk7XG4gICAgaWYgKFJlc291cmNlLmVuZHBvaW50c1tlXSA9PT0gdm9pZCAwKSB7XG4gICAgICB0aHJvdyBgRW5kcG9pbnQ6ICR7PGFueT5lbmRwb2ludH0gaXMgbm90IG1hcHBlZCAhIENhbm5vdCBhZGQgbW9kZWw6ICR7bW9kZWx9YDtcbiAgICB9XG4gICAgbGV0IGFsbE1vZGVsczogT2JqZWN0ID0gUmVzb3VyY2UuZW5kcG9pbnRzW2VdLm1vZGVscztcbiAgICBsZXQgb3JnTW9kZWwgPSBtb2RlbDtcbiAgICBtb2RlbCA9IHRoaXMuY2hlY2tOZXN0ZWRNb2RlbHMobW9kZWwsIGFsbE1vZGVscyk7XG5cbiAgICBpZiAoUmVzb3VyY2UuZW5kcG9pbnRzW2VdLm1vZGVsc1ttb2RlbF0gPT09IHZvaWQgMCkge1xuXG4gICAgICB0aHJvdyBgTW9kZWwgJyR7bW9kZWx9JyBpcyB1bmRlZmluZWQgaW4gZW5kcG9pbnQ6ICR7UmVzb3VyY2UuZW5kcG9pbnRzW2VdLnVybH0gYDtcbiAgICB9XG5cbiAgICBsZXQgcmVzOiBSZXN0PFQsIFRBPiA9IFJlc291cmNlLmVuZHBvaW50c1s8c3RyaW5nPihlbmRwb2ludCkudG9TdHJpbmcoKV0ubW9kZWxzW21vZGVsXTtcblxuXG5cblxuXG5cbiAgICBpZiAob3JnTW9kZWwgIT09IG1vZGVsKSB7XG4gICAgICBsZXQgYmFzZVVybCA9IFJlc291cmNlLmVuZHBvaW50c1s8c3RyaW5nPihlbmRwb2ludCkudG9TdHJpbmcoKV0udXJsO1xuXG5cblxuICAgICAgcmVzLl9fcmVzdF9lbmRwb2ludCA9IGAke2Jhc2VVcmx9LyR7b3JnTW9kZWx9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLl9fcmVzdF9lbmRwb2ludCA9IHZvaWQgMDtcbiAgICB9O1xuXG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cblxufVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuIDsoe30pOyAvLyBALS1lbmQtb2YtZmlsZS1mb3ItbW9kdWxlPW5nMi1yZXN0IGxpYi9yZXNvdXJjZS5zZXJ2aWNlLnRzIl19