@vcd/sdk 17.0.2 → 17.0.3

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.
package/LICENSE.txt ADDED
@@ -0,0 +1,9 @@
1
+ SOFTWARE LICENSE AGREEMENT
2
+
3
+ Copyright (c) CA, Inc. All rights reserved.
4
+
5
+ You are hereby granted a non-exclusive, worldwide, royalty-free license under CA, Inc.’s copyrights to use, copy, modify, and distribute this software in source code or binary form for use in connection with CA, Inc. products.
6
+
7
+ This copyright notice shall be included in all copies or substantial portions of the software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -419,8 +419,13 @@ export class VcdApiClient {
419
419
  return this.validateRequestContext().pipe(concatMap(() => this.http.delete(this.buildEndpointUrl(endpoint), { ...options, observe: 'response' })), concatMap(response => this.mapResponseToTask(response, 'DELETE')));
420
420
  }
421
421
  mapResponseToTask(response, httpVerb) {
422
+ //POST - Task link is returned in 'Location' header
422
423
  if (response.headers.has('Location') && response.status === 202) {
423
424
  return this.http.get(response.headers.get('Location'));
425
+ //PUT - Task link is returned in 'x-vmware-vcloud-task-location' header
426
+ }
427
+ else if (response.headers.has('x-vmware-vcloud-task-location') && response.status === 200) {
428
+ return this.http.get(response.headers.get('x-vmware-vcloud-task-location'));
424
429
  }
425
430
  else if (response.body && response.body.type.startsWith('application/vnd.vmware.vcloud.task+')) {
426
431
  const task = Object.assign(new TaskType(), response.body);
@@ -600,4 +605,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
600
605
  }], ctorParameters: () => [{ type: i1.VcdHttpClient }, { type: i0.Injector }, { type: i2.VcdSdkConfig, decorators: [{
601
606
  type: Optional
602
607
  }] }] });
603
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmNkLmFwaS5jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92Y2Qvc2RrL3NyYy9jbGllbnQvY2xpZW50L3ZjZC5hcGkuY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQVksUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBQyxXQUFXLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2RixPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwSCxPQUFPLEVBT0wsUUFBUSxFQUNULE1BQU0sMkNBQTJDLENBQUM7QUFJbkQsT0FBTyxFQUFDLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFFakgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV6QyxPQUFPLEVBQUMsV0FBVyxFQUFFLGVBQWUsRUFBQyxNQUFNLFNBQVMsQ0FBQzs7OztBQUVyRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUdsRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0FBRXJDLCtCQUErQjtBQUUvQjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE1BQWM7SUFDbEQsTUFBTSxPQUFPLEdBQWUsRUFBRSxDQUFDO0lBRS9C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bXBvcnQge0luamVjdGFibGUsIEluamVjdG9yLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0h0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBtZXJnZSwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3QsIHRocm93RXJyb3J9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBjb25jYXRNYXAsIGZpbHRlciwgbWFwLCBzaGFyZSwgc2tpcFdoaWxlLCBzd2l0Y2hNYXAsIHRhcCwgd2l0aExhdGVzdEZyb219IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEF1dGhvcml6ZWRMb2NhdGlvblR5cGUsXG4gIEVudGl0eVJlZmVyZW5jZVR5cGUsXG4gIEVudGl0eVR5cGUsXG4gIExpbmtUeXBlLFxuICBSZXNvdXJjZVR5cGUsXG4gIFNlc3Npb25UeXBlLFxuICBUYXNrVHlwZVxufSBmcm9tICdAdmNkL2JpbmRpbmdzL3ZjbG91ZC9hcGkvcmVzdC9zY2hlbWFfdjFfNSc7XG5pbXBvcnQge1N1cHBvcnRlZFZlcnNpb25zVHlwZX0gZnJvbSAnQHZjZC9iaW5kaW5ncy92Y2xvdWQvYXBpL3Jlc3Qvc2NoZW1hL3ZlcnNpb25pbmcnO1xuaW1wb3J0IHtBY2Nlc3NpYmxlTG9jYXRpb24sIEFjY2Vzc2libGVMb2NhdGlvbnMsIFNlc3Npb259IGZyb20gJy4uL29wZW5hcGknO1xuaW1wb3J0IHtRdWVyeX0gZnJvbSAnLi4vcXVlcnkvaW5kZXgnO1xuaW1wb3J0IHtBUElfUk9PVF9VUkwsIEF1dGhUb2tlbkhvbGRlclNlcnZpY2UsIFNFU1NJT05fT1JHX0lELCBTRVNTSU9OX1NDT1BFfSBmcm9tICcuLi8uLi9jb21tb24vY29udGFpbmVyLWhvb2tzJztcbmltcG9ydCB7VmNkSHR0cENsaWVudH0gZnJvbSAnLi92Y2QuaHR0cC5jbGllbnQnO1xuaW1wb3J0IHtWY2RUcmFuc2ZlckNsaWVudH0gZnJvbSAnLi92Y2QudHJhbnNmZXIuY2xpZW50JztcbmltcG9ydCB7SFRUUF9IRUFERVJTfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1ZjZFNka0NvbmZpZ30gZnJvbSBcIi4uLy4uL2NvcmUvcGx1Z2luLm1vZHVsZVwiO1xuaW1wb3J0IHtDbGllbnRFcnJvciwgQ2xpZW50RXJyb3JUeXBlfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgVFJBTlNGRVJfTElOS19SRUwgPSAndXBsb2FkOmRlZmF1bHQnO1xuZXhwb3J0IHR5cGUgTmF2aWdhYmxlID0gUmVzb3VyY2VUeXBlIHwgeyBsaW5rPzogTGlua1R5cGVbXSB9O1xuXG5leHBvcnQgY29uc3QgSEFURU9BU19IRUFERVIgPSAnTGluayc7XG5cbi8vIHRzbGludDpkaXNhYmxlOnZhcmlhYmxlLW5hbWVcblxuLyoqXG4gKiBQYXJzZSBvdXQgTGluayBoZWFkZXJzIHVzaW5nIGEgdmVyeSBsYXppbHkgaW1wbGVtZW50ZWQgcHVsbCBwYXJzZXJcbiAqIEBwYXJhbSBoZWFkZXIgJzx1cmwxPjtuYW1lMT1cInZhbHVlMVwiLG5hbWUyPVwidmFsdWUyXCIsPHVybDI+O25hbWUzPVwidmFsdWUzLHZhbHVlNFwiJ1xuICogQHJldHVybnMgcGFyc2VkIGxpbmsgaGVhZGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIZWFkZXJIYXRlb2FzTGlua3MoaGVhZGVyOiBzdHJpbmcpOiBMaW5rVHlwZVtdIHtcbiAgICBjb25zdCByZXN1bHRzOiBMaW5rVHlwZVtdID0gW107XG5cbiAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJGaWVsZE1hcHBpbmdzOiB7W2tleTogc3RyaW5nXToga2V5b2YgTGlua1R5cGV9ID0ge1xuICAgICAgICBocmVmOiAnaHJlZicsXG4gICAgICAgIG1vZGVsOiAndHlwZScsXG4gICAgICAgIHRpdGxlOiAnaWQnLFxuICAgICAgICByZWw6ICdyZWwnXG4gICAgfTtcbiAgICBsZXQgdG9rZW5JbmRleCA9IC0xO1xuXG4gICAgZnVuY3Rpb24gcGVlayh0b2tlbjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZih0b2tlbiwgdG9rZW5JbmRleCArIDEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5leHQodG9rZW46IHN0cmluZykge1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBwZWVrKHRva2VuKTtcbiAgICAgICAgaWYgKG5leHRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7aGVhZGVyLCB0b2tlbiwgdG9rZW5JbmRleH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbkluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICByZXR1cm4gdG9rZW5JbmRleDtcbiAgICB9XG5cbiAgICB3aGlsZSAocGVlaygnPCcpID4gLTEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhyZWZTdGFydCA9IG5leHQoJzwnKTtcbiAgICAgICAgICAgIGNvbnN0IGhyZWZFbmQgPSBuZXh0KCc+Jyk7XG4gICAgICAgICAgICBjb25zdCBocmVmID0gaGVhZGVyLnN1YnN0cmluZyhocmVmU3RhcnQgKyAxLCBocmVmRW5kKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTGlua1R5cGUgPSB7aHJlZiwgdHlwZTogbnVsbCwgaWQ6IG51bGwsIHJlbDogbnVsbCwgdkNsb3VkRXh0ZW5zaW9uOiBbXX07XG4gICAgICAgICAgICBsZXQgY29tbWEgPSBwZWVrKCcsJyk7XG4gICAgICAgICAgICBsZXQgc2VtaWNvbG9uID0gcGVlaygnOycpO1xuICAgICAgICAgICAgd2hpbGUgKChzZW1pY29sb24gPiAtMSAmJiBjb21tYSA+IC0xICYmIHNlbWljb2xvbiA8IGNvbW1hKSB8fCAoc2VtaWNvbG9uID4gLTEgJiYgY29tbWEgPT09IC0xKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVTdGFydCA9IG5leHQoJzsnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lRW5kID0gbmV4dCgnPScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBoZWFkZXIuc3Vic3RyaW5nKG5hbWVTdGFydCArIDEsIG5hbWVFbmQpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlU3RhcnQgPSBuZXh0KCdcIicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlRW5kID0gbmV4dCgnXCInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGhlYWRlci5zdWJzdHJpbmcodmFsdWVTdGFydCArIDEsIHZhbHVlRW5kKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWROYW1lID0gaGVhZGVyRmllbGRNYXBwaW5nc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAobWFwcGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFttYXBwZWROYW1lXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21tYSA9IHBlZWsoJywnKTtcbiAgICAgICAgICAgICAgICBzZW1pY29sb24gPSBwZWVrKCc7Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgIC8vIFdlIHdpbGwgdHJ5IHRoZSBuZXh0IG9uZS4uLlxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmV4cG9ydCBlbnVtIExpbmtSZWxUeXBlIHtcbiAgICBhZGQgPSAnYWRkJyxcbiAgICByZW1vdmUgPSAncmVtb3ZlJyxcbiAgICBlZGl0ID0gJ2VkaXQnLFxufVxuXG4vKipcbiAqIEEgYmFzaWMgY2xpZW50IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJcy5cbiAqXG4gKiBBIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBwbHVnaW4gY2FuIGdldCBhIHJlZmVyZW5jZSB0byB0aGlzIGNsaWVudCBieSB1c2luZyBhbmd1bGFyIGluamVjdGlvbi5cbiAqIGBgYFxuICogICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdmNkQXBpOiBWY2RBcGlDbGllbnQpIHt9XG4gKiBgYGBcbiAqXG4gKiBWY2RBcGlDbGllbnQgcmV1c2VzIHRoZSBhdXRoZW50aWNhdGlvbiBmcm9tIHRoZSBWQ0QgcGxhdGZvcm0gc28gaW4gZ2VuZXJhbCB0aGVyZSBpc1xuICogbm8gbmVlZCBvZiBhbiBleHBsaWNpdCBhdXRoZW50aWNhdGlvbi9sb2dpbi5cbiAqXG4gKiBXaGVuIGRlYWxpbmcgd2l0aCB0aGUgc2Vzc2lvbiBtYW5hZ2VtZW50IHRoZXJlIGFyZSB0d28gQVBJczpcbiAqIDEuIERlcHJlY2F0ZWQgbGVnYWN5IEFQSSB0aGF0IGlzIHVzaW5nIHRoZSBgYXBpL3Nlc3Npb25gIGVuZHBvaW50IGFuZCB0aGUgY29ycmVzcG9uZGluZyBtb2RlbHNcbiAqIDIuIE5ld2x5IGFkZGVkIEFQSSB0aGF0IGlzIHVzaW5nIHRoZSBgY2xvdWRhcGlgIGVuZHBvaW50IGFuZCB0aGUgY29ycmVzcG9uZGluZyBtb2RlbHNcbiAqXG4gKiBOb3RlIHRoYXQgaWYgYSBwbHVnaW4gcGVyZm9ybXMgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGF1dGhlbnRpY2F0aW9uIGNhbGwgdGhyb3VnaFxuICoge0BsaW5rIFZjZEFwaUNsaWVudCNzZXRDbG91ZEFwaUF1dGhlbnRpY2F0aW9ufSBvciB7QGxpbmsgVmNkQXBpQ2xpZW50I2Nsb3VkQXBpTG9naW59XG4gKiBmcm9tIHRoYXQgbW9tZW50IG9uIHRoZSBWY2RBcGlDbGllbnQgdXNlcyBvbmx5IGNsb3VkIGFwaSBzZXNzaW9uIG1hbmFnZW1lbnQuXG4gKiBUaGlzIG1lYW5zIGNhbGxzIHRvIHtAbGluayBWY2RBcGlDbGllbnQjc2V0QXV0aGVudGljYXRpb259IG9yIHtAbGluayBWY2RBcGlDbGllbnQjbG9naW59IGhhdmUgbm8gZWZmZWN0LlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVmNkQXBpQ2xpZW50IHtcbiAgICBzZXQgYmFzZVVybChfYmFzZVVybDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSBfYmFzZVVybDtcbiAgICB9XG5cbiAgICBnZXQgdmVyc2lvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IudmVyc2lvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9uZWdvdGlhdGVWZXJzaW9uOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgcHJpdmF0ZSBfYmFzZVVybDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBWY2RBcGlDbGllbnQjX2Nsb3VkQXBpU2Vzc2lvbn1cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXNzaW9uOiBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvblR5cGU+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZXNzaW9uVHlwZT4obnVsbCk7XG4gICAgcHJpdmF0ZSBfc2Vzc2lvbk9ic2VydmFibGU6IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+ID0gdGhpcy5fc2Vzc2lvbi5hc09ic2VydmFibGUoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHNraXBXaGlsZShzZXNzaW9uID0+ICFzZXNzaW9uKVxuICAgICAgICApO1xuICAgIHByaXZhdGUgX2dldFNlc3Npb246IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+O1xuXG4gICAgLyoqXG4gICAgICogQ2xvdWRBcGkgU2Vzc2lvblxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nsb3VkQXBpU2Vzc2lvbjogQmVoYXZpb3JTdWJqZWN0PFNlc3Npb24+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZXNzaW9uPihudWxsKTtcbiAgICBwcml2YXRlIF9jbG91ZEFwaVNlc3Npb25PYnNlcnZhYmxlOiBPYnNlcnZhYmxlPFNlc3Npb24+ID0gdGhpcy5fY2xvdWRBcGlTZXNzaW9uLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc2tpcFdoaWxlKHNlc3Npb24gPT4gIXNlc3Npb24pXG4gICAgICAgICk7XG4gICAgLyoqXG4gICAgICogVGhpcyBvYnNlcnZhYmxlIGhhcyBhIHNwZWNpYWwgcHVycG9zZSB3aGVuIGRvaW5nIGF1dG9tYXRpYyBsb2dpbiBkdXJpbmcgdGhlIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uLlxuICAgICAqIEl0IGFsbG93cyBiYWNrZW5kIGNhbGwgb25seSBhZnRlciBhbiBBUEkgdmVyc2lvbiBpcyBzZXQuXG4gICAgICogSXQgYWxzbyBlbnN1cmVzIHRoYXQgYSBiYWNrZW5kIGNhbGwgdG8gZ2V0IHRoZSBjdXJyZW50IHNlc3Npb24gaXMgZG9uZSBvbmNlIHByaW9yIHRvIGFueSBvdGhlciBjYWxscy5cbiAgICAgKlxuICAgICAqIEluIGNhc2Ugb2YgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGF1dGggcmVxdWVzdCB0aGVyZSBpcyBubyBuZWVkIG9mIHRoaXMgb2JzZXJ2YWJsZVxuICAgICAqIHNpbmNlIHRoaXMgYXV0aCByZXF1ZXN0IHdpbGwgcmV0cmlldmUgdGhlIHNlc3Npb24gaXRzZWxmXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0Q2xvdWRBcGlTZXNzaW9uOiBPYnNlcnZhYmxlPFNlc3Npb24+O1xuXG4gICAgcHJpdmF0ZSBfY2xvdWRBcGlTZXNzaW9uTGlua3M6IEJlaGF2aW9yU3ViamVjdDxMaW5rVHlwZVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TGlua1R5cGVbXT4oW10pO1xuXG4gICAgLyoqXG4gICAgICogQ2FjaGVkLCBsYXp5IGxvYWRlZCBvYnNlcnZhYmxlIG9mIHRoZSBBY2Nlc3NpYmxlTG9jYXRpb24gYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnM6IE9ic2VydmFibGU8QWNjZXNzaWJsZUxvY2F0aW9uW10+O1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBkZXRlcm1pbmVzIGlmIGl0IGlzIGFuIGV4cGxpY2l0IGNsb3VkIGFwaSBsb2dpbi5cbiAgICAgKiBJbiB0aGlzIGNhc2UgdGhlIG9sZCBBUEkgKC9hcGkvc2Vzc2lvbikgc2hvdWxkIG5vdCBiZSB1c2VkIGF0IGFsbC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9pc0Nsb3VkQXBpTG9naW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAgICAgcHJpdmF0ZSBodHRwOiBWY2RIdHRwQ2xpZW50LFxuICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbmZpZz86IFZjZFNka0NvbmZpZyxcbiAgICApIHtcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IHRoaXMuaW5qZWN0b3IuZ2V0KEFQSV9ST09UX1VSTCk7XG5cbiAgICAgICAgbGV0IG5lZ290aWF0ZWRWZXJzaW9uOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZz8uYXBpVmVyc2lvbikge1xuICAgICAgICAgICAgbmVnb3RpYXRlZFZlcnNpb24gPSBvZih0aGlzLmNvbmZpZy5hcGlWZXJzaW9uKS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgodmVyc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZlcnNpb24odmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmVnb3RpYXRlZFZlcnNpb24gPSB0aGlzLmh0dHAuZ2V0PFN1cHBvcnRlZFZlcnNpb25zVHlwZT4oYCR7dGhpcy5fYmFzZVVybH0vYXBpL3ZlcnNpb25zYCkucGlwZShcbiAgICAgICAgICAgICAgICBtYXAodmVyc2lvbnMgPT4gdGhpcy5uZWdvdGlhdGVWZXJzaW9uKHZlcnNpb25zKSksXG4gICAgICAgICAgICAgICAgdGFwKHZlcnNpb24gPT4gdGhpcy5zZXRWZXJzaW9uKHZlcnNpb24pKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9uZWdvdGlhdGVWZXJzaW9uID0gbmVnb3RpYXRlZFZlcnNpb24ucGlwZShcbiAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSwgcmVzZXRPbkVycm9yOiBmYWxzZSwgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSwgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0b2tlbkhvbGRlcjogQXV0aFRva2VuSG9sZGVyU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KEF1dGhUb2tlbkhvbGRlclNlcnZpY2UsIHsgdG9rZW46ICcnIH0pO1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2VuSG9sZGVyLmp3dCA/IGBCZWFyZXIgJHt0b2tlbkhvbGRlci5qd3R9YCA6IHRva2VuSG9sZGVyLnRva2VuO1xuICAgICAgICB0aGlzLl9nZXRTZXNzaW9uID0gdGhpcy5zZXRBdXRoZW50aWNhdGlvbih0b2tlbilcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSwgcmVzZXRPbkVycm9yOiBmYWxzZSwgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSwgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fZ2V0Q2xvdWRBcGlTZXNzaW9uID0gdGhpcy5zZXRDbG91ZEFwaUF1dGhlbnRpY2F0aW9uKHRva2VuKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc2hhcmUoeyBjb25uZWN0b3I6ICgpID0+IG5ldyBSZXBsYXlTdWJqZWN0KDEpLCByZXNldE9uRXJyb3I6IGZhbHNlLCByZXNldE9uQ29tcGxldGU6IGZhbHNlLCByZXNldE9uUmVmQ291bnRaZXJvOiBmYWxzZSB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGxvZ2luXG4gICAgICAgIHRoaXMuX2lzQ2xvdWRBcGlMb2dpbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgbmVnb3RpYXRlVmVyc2lvbihzZXJ2ZXJWZXJzaW9uczogU3VwcG9ydGVkVmVyc2lvbnNUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkVmVyc2lvbnM6IHN0cmluZ1tdID0gc2VydmVyVmVyc2lvbnMudmVyc2lvbkluZm8ubWFwKHZlcnNpb25JbmZvID0+IHZlcnNpb25JbmZvLnZlcnNpb24pO1xuXG4gICAgICAgIC8vIERlZmF1bHQgQVBJIFZlcnNpb24gdXNlZCBpcyB0aGUgTGF0ZXN0IEFQSSBWZXJzaW9uIGluIFZNd2FyZSBDbG91ZCBEaXJlY3RvclxuICAgICAgICByZXR1cm4gc3VwcG9ydGVkVmVyc2lvbnNbc3VwcG9ydGVkVmVyc2lvbnMubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBlbnN1cmUgdGhhdCBwcmlvciB0byBzZW5kaW5nIGFueSBjYWxsIHRvIHRoZSBiYWNrZW5kXG4gICAgICogdGhlIHZlcnNpb24gaGFzIGJlZW4gc2V0IGFuZCB0aGUgY3VycmVudCBzZXNzaW9uIGhhcyBiZWVuIHJldHJpZXZlZC5cbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBpbXBvcnRhbnQgZHVyaW5nIHRoZSBhdXRvbWF0aWMgYXV0aGVudGljYXRpb24gdGhhdCBpcyBkb25lIGR1cmluZyB0aGVcbiAgICAgKiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiwgd2hlbiB0aGUgcGx1Z2luIGlzIG5vdCByZXF1aXJlZCB0byBwZXJmb3JtIGl0cyBvd24gZXhwbGljaXQgYXV0aGVudGljYXRpb25cbiAgICAgKiBidXQgcmF0aGVyIHRoZSBvbmVzIGZyb20gdGhlIHVuZGVybHlpbmcgZnJhbWV3b3JrIGlzIHVzZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCk6IE9ic2VydmFibGU8dHJ1ZT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudmVyc2lvbiA/IG9mKHRoaXMudmVyc2lvbikgOiB0aGlzLl9uZWdvdGlhdGVWZXJzaW9uKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhIGNsb3VkIGFwaSBsb2dpbiB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhlIC9hcGkvc2Vzc2lvbiBzZXNzaW9uXG4gICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuX2lzQ2xvdWRBcGlMb2dpbiA/IG9mKG51bGwpIDogdGhpcy5fZ2V0U2Vzc2lvbiksXG4gICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuX2dldENsb3VkQXBpU2Vzc2lvblxuICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGNsb3VkIGFwaSBmYWlsdXJlIHdlIGRvIG5vdCB3YW50IHRvIHByZXZlbnQgZnVydGhlciBleGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgY29uc2lkZXJhdGlvbnMgc2luY2UgdGhpcyBtYXkgYmUgYSBjYXNlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gY2xvdWQgYXBpIGlzIG5vdCBzdXBwb3J0ZWQgYXQgYWxsIGZvciB0aGUgc3BlY2lmaWVkIHZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoZSkgPT4gb2YodHJ1ZSkpKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHRydWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEZvciB1c2UgY2FzZXMgd2ljaCBzb2xlbHkgZGVwZW5kcyBvbiBjbG91ZGFwaSB3aXRob3V0IGFueSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICogdGhlcmUgc2hvdWxkIGJlIG5vIGRlcGVuZGVuY2Ugb24gdGhlIG9sZCAvYXBpIGVuZHBvaW50IGF0IGFsbFxuICAgICAqL1xuICAgIHByaXZhdGUgdmFsaWRhdGVSZXF1ZXN0Q29udGV4dENsb3VkQXBpT25seSgpOiBPYnNlcnZhYmxlPFNlc3Npb24+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZlcnNpb24gPyBvZih0aGlzLnZlcnNpb24pIDogdGhpcy5fbmVnb3RpYXRlVmVyc2lvbikucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLl9nZXRDbG91ZEFwaVNlc3Npb24pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFZlcnNpb24oX3ZlcnNpb246IHN0cmluZyk6IFZjZEFwaUNsaWVudCB7XG4gICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLnZlcnNpb24gPSBfdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2xvYmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzZXJ2aWNlLCB0aGF0IGFsbG93cyBhIHByb3ZpZGVyIHVzZXIgdG8gZXhlY3V0ZSBBUEkgcmVxdWVzdHNcbiAgICAgKiBpbiB0aGUgc2NvcGUgb2YgYSBzcGVjaWZpYyB0ZW5hbnQuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBleGVjdXRlIHNpbmdsZSBBUEkgcmVxdWVzdCBpbiBzY29wZSBvZiBzcGVjaWZpYyB0ZW5hbnQgeW91IGNhbiBkbyBpdFxuICAgICAqIGJ5IHBhc3NpbmcgXCJYLVZNV0FSRS1WQ0xPVUQtVEVOQU5ULUNPTlRFWFRcIiBoZWFkZXIgdG8gdGhlIHNwZWNpZmljIEFQSSBSZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhpcyBzY29waW5nIGlzIGF2YWlsYWJsZSB0byBxdWVyeS1iYXNlZCBBUEkgY2FsbHMgYW5kIHRvIGJ1bGsgR0VUIGNhbGxzIGluIHRoZVxuICAgICAqIC9jbG91ZGFwaSBzcGFjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3RBcyBhbiBlbnRpdHlSZWYgb2YgdGhlIHRlbmFudCAob3JnYW5pemF0aW9uKSB0byBzY29wZSBzdWJzZXF1ZW50IGNhbGxzIHRvIGluXG4gICAgICogIHRoZSBWY2RBcGlDbGllbnQsIG9yIG51bGwvbm8gcGFyYW1ldGVyIHRvIHJlbW92ZSB0ZW5hbnQtc3BlY2lmaWMgc2NvcGluZ1xuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IFZjZEFwaUNsaWVudCBpbnN0YW5jZSAoZm9yIGNoYWluaW5nKVxuICAgICAqL1xuICAgIHB1YmxpYyBhY3RBcyhhY3RBczogRW50aXR5UmVmZXJlbmNlVHlwZSA9IG51bGwpOiBWY2RBcGlDbGllbnQge1xuICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hY3RBcyA9ICFhY3RBcyA/IG51bGwgOiBhY3RBcy5pZDtcbiAgICAgICAgdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IuYWN0QXNPcmdOYW1lID0gIWFjdEFzID8gbnVsbCA6IGFjdEFzLm5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgVmNkQXBpQ2xpZW50I3NldENsb3VkQXBpQXV0aGVudGljYXRpb259XG4gICAgICpcbiAgICAgKiBTZXRzIHRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiB0byB1c2UgZm9yIHRoZSBWY2RBcGlDbGllbnQuXG4gICAgICpcbiAgICAgKiBBZnRlciBzZXR0aW5nIHRoZSB0b2tlbiwgdGhlIGNsaWVudCB3aWxsIGdldCB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAgICogaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhdXRoZW50aWNhdGVkIHRva2VuLlxuICAgICAqXG4gICAgICogQHBhcmFtIGF1dGhlbnRpY2F0aW9uIHRoZSBhdXRoZW50aWNhdGlvbiBzdHJpbmcgKHRvIGJlIHVzZWQgaW4gZWl0aGVyIHRoZSAnQXV0aG9yaXphdGlvbidcbiAgICAgKiAgb3IgJ3gtdmNsb3VkLWF1dGhvcml6YXRpb24nIGhlYWRlcilcbiAgICAgKiBAcmV0dXJucyB0aGUgc2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuXG4gICAgICovXG4gICAgcHVibGljIHNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlc3Npb25UeXBlPiB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Nsb3VkQXBpTG9naW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCdPbmx5IGNsb3VkIGFwaSBhdXRoIGlzIGFsbG93ZWQgc2luY2UgaXQgd2FzIGFscmVhZHkgdXNlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IuYXV0aGVudGljYXRpb24gPSBhdXRoZW50aWNhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8U2Vzc2lvblR5cGU+KGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9zZXNzaW9uYCkucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoc2Vzc2lvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgc2V0IGFjdEFzIGZvciBwcm92aWRlciBpbiB0ZW5hbnQgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24ub3JnID09PSAnU3lzdGVtJyAmJiB0aGlzLmluamVjdG9yLmdldChTRVNTSU9OX1NDT1BFKSA9PT0gJ3RlbmFudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1dG9tYXRpYyBhY3RBcyBvbmx5IHdvcmtzIGluIHZlcnNpb25zID49OS41XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0QXMoe2lkOiB0aGlzLmluamVjdG9yLmdldChTRVNTSU9OX09SR19JRCl9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIFNFU1NJT05fT1JHX0lEIHNldCBpbiBjb250YWluZXIuIEF1dG9tYXRpYyBhY3RBcyBpcyBkaXNhYmxlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRhcChzZXNzaW9uID0+IHRoaXMuX3Nlc3Npb24ubmV4dChzZXNzaW9uKSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYXV0aGVudGljYXRpb24gdG9rZW4gdG8gdXNlIGZvciB0aGUgVmNkQXBpQ2xpZW50LlxuICAgICAqXG4gICAgICogQWZ0ZXIgc2V0dGluZyB0aGUgdG9rZW4sIHRoZSBjbGllbnQgd2lsbCBnZXQgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXV0aGVudGljYXRlZCB0b2tlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhdXRoZW50aWNhdGlvbiB0aGUgYXV0aGVudGljYXRpb24gc3RyaW5nICh0byBiZSB1c2VkIGluIGVpdGhlciB0aGUgJ0F1dGhvcml6YXRpb24nXG4gICAgICogIG9yICd4LXZjbG91ZC1hdXRob3JpemF0aW9uJyBoZWFkZXIpXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBzZXNzaW9uIG9ic2VydmFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdXRoZW50aWNhdGlvbiB0b2tlblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDbG91ZEFwaUF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlc3Npb24+IHtcbiAgICAgICAgdGhpcy5vbkJlZm9yZUNsb3VkQXBpQXV0aGVudGljYXRpb24oKTtcblxuICAgICAgICByZXR1cm4gb2YodHJ1ZSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgYXV0aGVudGljYXRpb24gYXMgcGFydCBvZiB0aGUgb2JzZXJ2YWJsZSBpbiBvcmRlciB0byBlbnN1cmUgdGhlIGNhbGxlciBoYXMgc3Vic2NyaWJlZCB0byB0aGUgb2JzZXJ2YWJsZVxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hdXRoZW50aWNhdGlvbiA9IGF1dGhlbnRpY2F0aW9uKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5odHRwLmdldDxTZXNzaW9uPihgJHt0aGlzLl9iYXNlVXJsfS9jbG91ZGFwaS8xLjAuMC9zZXNzaW9ucy9jdXJyZW50YCwgeyBvYnNlcnZlOiAncmVzcG9uc2UnIH0pKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRoaXMub25DbG91ZEFwaUF1dGhlbnRpY2F0aW9uKClcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGVuYWJsZUxvZ2dpbmcoKTogVmNkQXBpQ2xpZW50IHtcbiAgICAgICAgdGhpcy5odHRwLmxvZ2dpbmdJbnRlcmNlcHRvci5lbmFibGVkID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFZjZEFwaUNsaWVudCNjbG91ZEFwaUxvZ2lufVxuICAgICAqXG4gICAgICogQ3JlYXRlcyBhbiBhdXRoZW50aWNhdGVkIHNlc3Npb24gZm9yIHRoZSBzcGVjaWZpZWQgY3JlZGVudGlhbCBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJuYW1lIHRoZSBuYW1lIG9mIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZVxuICAgICAqIEBwYXJhbSB0ZW5hbnQgdGhlIG9yZ2FuaXphdGlvbiB0aGUgdXNlciBiZWxvbmdzIHRvXG4gICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXJcbiAgICAgKiBAcmV0dXJucyBhbiBhdXRoZW50aWNhdGVkIHNlc3Npb24gZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFsc1xuICAgICAqL1xuICAgIHB1YmxpYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCB0ZW5hbnQ6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ2xvdWRBcGlMb2dpbikge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ09ubHkgY2xvdWQgYXBpIGF1dGggaXMgYWxsb3dlZCBzaW5jZSBpdCB3YXMgYWxyZWFkeSB1c2VkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXV0aFN0cmluZzogc3RyaW5nID0gYnRvYShgJHt1c2VybmFtZX1AJHt0ZW5hbnR9OiR7cGFzc3dvcmR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFNlc3Npb25UeXBlPihcbiAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9zZXNzaW9uc2AsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7YXV0aFN0cmluZ31gfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRhcCgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+KSA9PlxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hdXRoZW50aWNhdGlvbiA9IGAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtdG9rZW4tdHlwZScpfSAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtYWNjZXNzLXRva2VuJyl9YFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZS5ib2R5KSxcbiAgICAgICAgICAgIHRhcChzZXNzaW9uID0+IHRoaXMuX3Nlc3Npb24ubmV4dChzZXNzaW9uKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGF1dGhlbnRpY2F0ZWQgc2Vzc2lvbiBmb3IgdGhlIHNwZWNpZmllZCBjcmVkZW50aWFsIGRhdGEgdXNpbmcgY2xvdWQgYXBpIGVuZHBvaW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJuYW1lIHRoZSBuYW1lIG9mIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZVxuICAgICAqIEBwYXJhbSB0ZW5hbnQgdGhlIG9yZ2FuaXphdGlvbiB0aGUgdXNlciBiZWxvbmdzIHRvXG4gICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXJcbiAgICAgKiBAcmV0dXJucyBhbiBhdXRoZW50aWNhdGVkIHNlc3Npb24gZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFsc1xuICAgICAqL1xuICAgIHB1YmxpYyBjbG91ZEFwaUxvZ2luKHVzZXJuYW1lOiBzdHJpbmcsIHRlbmFudDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZXNzaW9uPiB7XG4gICAgICAgIHRoaXMub25CZWZvcmVDbG91ZEFwaUF1dGhlbnRpY2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgYXV0aFN0cmluZzogc3RyaW5nID0gYnRvYShgJHt1c2VybmFtZX1AJHt0ZW5hbnR9OiR7cGFzc3dvcmR9YCk7XG4gICAgICAgIGxldCB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jbG91ZGFwaS8xLjAuMC9zZXNzaW9uc2A7XG4gICAgICAgIGlmICh0ZW5hbnQudG9Mb3dlckNhc2UoKSA9PT0gJ3N5c3RlbScpIHtcbiAgICAgICAgICAgIHVybCArPSAnL3Byb3ZpZGVyJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8U2Vzc2lvbj4oXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgW0hUVFBfSEVBREVSUy5BdXRob3JpemF0aW9uXTogYEJhc2ljICR7YXV0aFN0cmluZ31gIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICkucGlwZShcbiAgICAgICAgICAgIHRhcCgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxTZXNzaW9uPikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IGAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtdG9rZW4tdHlwZScpfSAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtYWNjZXNzLXRva2VuJyl9YDtcbiAgICAgICAgICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hdXRoZW50aWNhdGlvbiA9IHRva2VuO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLm9uQ2xvdWRBcGlBdXRoZW50aWNhdGlvbigpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXQgaXMgbmVjZXNzYXJ5IHRvIGtub3cgaWYgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGF1dGggcmVxdWVzdCB3YXMgZG9uZS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGZsYWdzLCBwcm9wZXJ0aWVzIGV0Yy5cbiAgICAgKi9cbiAgICBwcml2YXRlIG9uQmVmb3JlQ2xvdWRBcGlBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBleHBsaWNpdCBjbG91ZCBhcGkgYXV0aCByZXF1ZXN0OlxuICAgICAgICAvLyBTZXQgdGhlIGZsYWcgX2lzQ2xvdWRBcGlMb2dpbiBpbiBvcmRlciB0byBrbm93IHRoYXQgZXhwbGljaXQgY2xvdWQgYXBpIGF1dGhlbnRpY2F0aW9uIGlzIGRvbmVcbiAgICAgICAgLy8gVGhpcyB3aWxsIGhlbHAgdXMgc2tpcCBjb2RlIHJlbGF0ZWQgdG8gdGhlIG9sZCBhcGksIGkuZS4gd2Ugc2hvdWxkIG5vdCBhbGxvdyBleHBsaWNpdCBtaXggb2YgYm90aCB0aGUgYXBpLXNcbiAgICAgICAgdGhpcy5faXNDbG91ZEFwaUxvZ2luID0gdHJ1ZTtcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBleHBsaWNpdCBjbG91ZCBhcGkgYXV0aCByZXF1ZXN0OlxuICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIG9mIF9nZXRDbG91ZEFwaVNlc3Npb24gb2JzZXJ2YWJsZSB3aGljaCBpcyBuZWVkZWQgaW4gdGhlIGF1dG9tYXRpYyBsb2dpbiBkdXJpbmcgdGhlIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uLlxuICAgICAgICAvLyBUaGUgZXhwbGljaXQgY2xvdWQgYXBpIGF1dGggcmVxdWVzdCB3aWxsIHJldHJpZXZlIHRoZSBzZXNzaW9uLlxuICAgICAgICB0aGlzLl9nZXRDbG91ZEFwaVNlc3Npb24gPSBvZihudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgYXV0aGVudGljYXRpb24uXG4gICAgICogVGhpcyBpbmNsdWRlcyBnZXR0aW5nIEhBVEVPQVMgbGlua3MsIHNldHRpbmcgdGhlIHNlc3Npb24sIGhhbmRsaW5nIGVycm9ycyBldGMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBvbkNsb3VkQXBpQXV0aGVudGljYXRpb24oKTogKHNvdXJjZTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8U2Vzc2lvbj4+KSA9PiBPYnNlcnZhYmxlPFNlc3Npb24+IHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5waXBlKFxuICAgICAgICAgICAgdGFwKChyZXNwOiBIdHRwUmVzcG9uc2U8U2Vzc2lvbj4pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgSEFURU9BUyBsaW5rc1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2xvdWRBcGlTZXNzaW9uTGlua3MocGFyc2VIZWFkZXJIYXRlb2FzTGlua3MocmVzcC5oZWFkZXJzLmdldChIQVRFT0FTX0hFQURFUikpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGVuIHBhcnNpbmcgc2Vzc2lvbiBIQVRFT0FTIGxpbmtzOicsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKHJlc3AgPT4gcmVzcC5ib2R5KSxcbiAgICAgICAgICAgIHRhcCgoc2Vzc2lvbjogU2Vzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzIGFjdEFzXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RBcyhudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHNldCBhY3RBcyBmb3IgcHJvdmlkZXIgaW4gdGVuYW50IHNjb3BlXG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24ub3JnICYmIHNlc3Npb24ub3JnLm5hbWUgPT09ICdTeXN0ZW0nICYmIHRoaXMuaW5qZWN0b3IuZ2V0KFNFU1NJT05fU0NPUEUpID09PSAndGVuYW50Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdXRvbWF0aWMgYWN0QXMgb25seSB3b3JrcyBpbiB2ZXJzaW9ucyA+PTkuNVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RBcyh7IGlkOiB0aGlzLmluamVjdG9yLmdldChTRVNTSU9OX09SR19JRCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gU0VTU0lPTl9PUkdfSUQgc2V0IGluIGNvbnRhaW5lci4gQXV0b21hdGljIGFjdEFzIGlzIGRpc2FibGVkLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAoKHNlc3Npb246IFNlc3Npb24pID0+IHRoaXMuX2Nsb3VkQXBpU2Vzc2lvbi5uZXh0KHNlc3Npb24pKSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvdWRBcGlBdXRoZW50aWNhdGlvbkVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DbG91ZEFwaUF1dGhlbnRpY2F0aW9uRXJyb3IoKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSBhdXRoZW50aWNhdGlvbiBzbyB0aGF0IGFueSBzdWJzZXF1ZW50IGJhY2tlbmQgY2FsbHMgYXJlIG5vdCBhdXRoZW50aWNhdGVkXG4gICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLmF1dGhlbnRpY2F0aW9uID0gJyc7XG4gICAgICAgIC8vIF9nZXRDbG91ZEFwaVNlc3Npb24gaXMgaW4gdGhlIGNlbnRlciBvZiBhbnkgYmFja2VuZCBjYWxsLCBudWxsaWZ5IGl0IGluIG9yZGVyIG5vdCB0byBwcmV2ZW50IHRob3NlIGNhbGxzXG4gICAgICAgIC8vIHNpbmNlIGl0IGlzIGVhc2llciB0byB0cm91Ymxlc2hvb3QgZmFpbGluZyBiYWNrZW5kIHJhdGhlciB0aGFuIG5vIGNhbGxcbiAgICAgICAgdGhpcy5fZ2V0Q2xvdWRBcGlTZXNzaW9uID0gb2YobnVsbCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBsaW5rc1xuICAgICAgICB0aGlzLl9jbG91ZEFwaVNlc3Npb25MaW5rcy5uZXh0KFtdKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIHNlc3Npb25cbiAgICAgICAgdGhpcy5fY2xvdWRBcGlTZXNzaW9uLm5leHQobnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDbG91ZEFwaVNlc3Npb25MaW5rcyhsaW5rczogTGlua1R5cGVbXSkge1xuICAgICAgICB0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnMgPSBudWxsO1xuICAgICAgICB0aGlzLl9jbG91ZEFwaVNlc3Npb25MaW5rcy5uZXh0KGxpbmtzIHx8IFtdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KGVuZHBvaW50OiBzdHJpbmcsICBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZ2V0PFQ+KHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksIHsuLi5vcHRpb25zfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Q8VD4oZW5kcG9pbnQ6IHN0cmluZywgcXVlcnlCdWlsZGVyPzogUXVlcnkuQnVpbGRlciwgbXVsdGlzaXRlPzogYm9vbGVhbiB8IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pIHtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCk7XG5cbiAgICAgICAgaWYgKHF1ZXJ5QnVpbGRlcikge1xuICAgICAgICAgICAgdXJsID0gYCR7dXJsfSR7cXVlcnlCdWlsZGVyLmdldENsb3VkQVBJKCl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtdWx0aXNpdGUpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KHVybCwgeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyBfbXVsdGlzaXRlOiB0aGlzLnBhcnNlTXVsdGlzaXRlVmFsdWUobXVsdGlzaXRlKSB9KSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uaGVhZGVycykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVycy5hcHBlbmQoXCJfbXVsdGlzaXRlXCIsIHRoaXMucGFyc2VNdWx0aXNpdGVWYWx1ZShtdWx0aXNpdGUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih1cmwsIHsgLi4ub3B0aW9ucyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5nZXQ8VD4odXJsLCB7IC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZVN5bmM8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLnBvc3Q8VD4oXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSxcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlQXN5bmM8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5wb3N0KFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICB7IC4uLm9wdGlvbnMsIG9ic2VydmU6ICdyZXNwb25zZScgfVxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICBjb25jYXRNYXAocmVzcG9uc2UgPT4gdGhpcy5tYXBSZXNwb25zZVRvVGFzayhyZXNwb25zZSwgJ1BPU1QnKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJhbnNmZXJMaW5rPFQ+KGVuZHBvaW50OiBzdHJpbmcsIGl0ZW06IFQsIHRyYW5zZmVyUmVsOiBzdHJpbmcgPSBUUkFOU0ZFUl9MSU5LX1JFTCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wb3N0KHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksIGl0ZW0sIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChyZXM6IEh0dHBSZXNwb25zZTxUICYgTmF2aWdhYmxlPikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJMaW5rczogTGlua1R5cGVbXSA9IHJlcy5oZWFkZXJzLmhhcyhIQVRFT0FTX0hFQURFUilcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VIZWFkZXJIYXRlb2FzTGlua3MocmVzLmhlYWRlcnMuZ2V0KEhBVEVPQVNfSEVBREVSKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtzOiBMaW5rVHlwZVtdID0gcmVzLmJvZHkgPyAocmVzLmJvZHkubGluayB8fCBbXSkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluayA9IFsuLi5oZWFkZXJMaW5rcywgLi4ubGlua3NdXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgobCkgPT4gbC5yZWwgPT09IHRyYW5zZmVyUmVsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBSZXNwb25zZSBmcm9tICR7ZW5kcG9pbnR9IGRpZCBub3QgY29udGFpbiBhIHRyYW5zZmVyIGxpbmtgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRFcnJvclR5cGUuSGF0ZW9hc0xpbmtNaXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5rLmhyZWY7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0VHJhbnNmZXI8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgdHJhbnNmZXJSZWw6IHN0cmluZyA9IFRSQU5TRkVSX0xJTktfUkVMKTogT2JzZXJ2YWJsZTxWY2RUcmFuc2ZlckNsaWVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2ZlckxpbmsoZW5kcG9pbnQsIGl0ZW0sIHRyYW5zZmVyUmVsKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCh0cmFuc2ZlclVybCkgPT4gbmV3IFZjZFRyYW5zZmVyQ2xpZW50KHRoaXMuaHR0cCwgdHJhbnNmZXJVcmwpKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlU3luYzxUPihlbmRwb2ludDogc3RyaW5nLCBpdGVtOiBULCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAucHV0PFQ+KFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICB7IC4uLm9wdGlvbnMgfVxuICAgICAgICAgICAgKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQXN5bmM8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLnB1dChcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQpLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgeyAuLi5vcHRpb25zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH1cbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgY29uY2F0TWFwKHJlc3BvbnNlID0+IHRoaXMubWFwUmVzcG9uc2VUb1Rhc2socmVzcG9uc2UsICdQVVQnKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlU3luYyhlbmRwb2ludDogc3RyaW5nLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZGVsZXRlPHZvaWQ+KHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksIHsgLi4ub3B0aW9ucyB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlQXN5bmMoZW5kcG9pbnQ6IHN0cmluZywgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5kZWxldGUodGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSwgeyAuLi5vcHRpb25zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pKSxcbiAgICAgICAgICAgIGNvbmNhdE1hcChyZXNwb25zZSA9PiB0aGlzLm1hcFJlc3BvbnNlVG9UYXNrKHJlc3BvbnNlLCAnREVMRVRFJykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXBSZXNwb25zZVRvVGFzayhyZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT4sIGh0dHBWZXJiOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmhhcygnTG9jYXRpb24nKSAmJiByZXNwb25zZS5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VGFza1R5cGU+KHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdMb2NhdGlvbicpKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5ib2R5ICYmIHJlc3BvbnNlLmJvZHkudHlwZS5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi92bmQudm13YXJlLnZjbG91ZC50YXNrKycpKSB7XG4gICAgICAgICAgICBjb25zdCB0YXNrOiBUYXNrVHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IFRhc2tUeXBlKCksIHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRhc2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgIGBBbiBhc3luY2hyb25vdXMgcmVxdWVzdCB3YXMgbWFkZSB0byBbJHtodHRwVmVyYn0gJHtyZXNwb25zZS51cmx9XSwgYnV0IG5vIHRhc2sgd2FzIHJldHVybmVkLiAgVGhlIG9wZXJhdGlvbiBtYXkgc3RpbGwgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWwuYCxcbiAgICAgICAgICAgIENsaWVudEVycm9yVHlwZS5UYXNrTGlua01pc3NpbmdcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEVudGl0eTxUIGV4dGVuZHMgRW50aXR5UmVmZXJlbmNlVHlwZT4oZW50aXR5UmVmOiBFbnRpdHlSZWZlcmVuY2VUeXBlKTogT2JzZXJ2YWJsZTxUPjtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIGdldEVudGl0eTxUIGV4dGVuZHMgRW50aXR5UmVmZXJlbmNlVHlwZT4odXJuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+O1xuICAgIHB1YmxpYyBnZXRFbnRpdHk8VCBleHRlbmRzIEVudGl0eVJlZmVyZW5jZVR5cGU+KGVudGl0eVJlZk9yVXJuOiBFbnRpdHlSZWZlcmVuY2VUeXBlIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVJlc29sdmVyOiBPYnNlcnZhYmxlPEVudGl0eVR5cGU+ID0gdHlwZW9mIGVudGl0eVJlZk9yVXJuID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEVudGl0eVR5cGU+KGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9lbnRpdHkvJHtlbnRpdHlSZWZPclVybn1gKSA6XG4gICAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEVudGl0eVR5cGU+KGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9lbnRpdHkvdXJuOnZjbG91ZDoke2VudGl0eVJlZk9yVXJuLnR5cGV9OiR7ZW50aXR5UmVmT3JVcm4uaWR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gZW50aXR5UmVzb2x2ZXIpLFxuICAgICAgICAgICAgY29uY2F0TWFwKGVudGl0eSA9PiB0aGlzLmh0dHAuZ2V0PFQ+KGAke2VudGl0eS5saW5rWzBdLmhyZWZ9YCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVRhc2sodGFzazogVGFza1R5cGUsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUYXNrVHlwZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZ2V0PFRhc2tUeXBlPih0YXNrLmhyZWYsIHsgLi4ub3B0aW9ucyB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNUYXNrQ29tcGxldGUodGFzazogVGFza1R5cGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFsnc3VjY2VzcycsICdlcnJvcicsICdjYW5jZWxlZCcsICdhYm9ydGVkJ10uaW5kZXhPZih0YXNrLnN0YXR1cykgPiAtMTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlSXRlbShpdGVtOiBOYXZpZ2FibGUsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUYXNrVHlwZT4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsoaXRlbSwgJ3JlbW92ZScsIG51bGwpO1xuICAgICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBDbGllbnRFcnJvcihcbiAgICAgICAgICAgICAgYE5vICdyZW1vdmUnIGxpbmsgZm9yIHNwZWNpZmllZCByZXNvdXJjZS5gLFxuICAgICAgICAgICAgICBDbGllbnRFcnJvclR5cGUuSGF0ZW9hc0xpbmtNaXNzaW5nXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5kZWxldGU8VGFza1R5cGU+KGxpbmsuaHJlZiwgeyAuLi5vcHRpb25zIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBRdWVyeS5CdWlsZGVyIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1aWxkZXIgQW4gZGVmaW5pdGlvbiBvZiB0aGUgcXVlcnkgdG8gY29uc3RydWN0ICh0eXBlLCBmaWx0ZXIsIHBhZ2Ugc2l6ZSwgZXRjLilcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyBhIHF1ZXJ5IHJlc3VsdCBmb3IgdGhlIHNwZWNpZmllZCBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBxdWVyeTxUPihidWlsZGVyOiBRdWVyeS5CdWlsZGVyLCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIFF1ZXJ5LkJ1aWxkZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnVpbGRlciBBbiBkZWZpbml0aW9uIG9mIHRoZSBxdWVyeSB0byBjb25zdHJ1Y3QgKHR5cGUsIGZpbHRlciwgcGFnZSBzaXplLCBldGMuKVxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyBhIHF1ZXJ5IHJlc3VsdCBmb3IgdGhlIHNwZWNpZmllZCBxdWVyeVxuICAgICAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1bmlmaWVkLXNpZ25hdHVyZXNcbiAgICBwdWJsaWMgcXVlcnk8VD4oYnVpbGRlcjogUXVlcnkuQnVpbGRlciwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIHF1ZXJ5PFQ+KGJ1aWxkZXI6IFF1ZXJ5LkJ1aWxkZXIsIG11bHRpc2l0ZT86IGFueSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlQYWdlKGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9xdWVyeSR7YnVpbGRlci5nZXQoKX1gLCBtdWx0aXNpdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBwcm92aWRlZCByZXN1bHQgc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCB0aGUgcmVzdWx0IHNldCB0byByZXRyaWV2ZSB0aGUgZmlyc3QgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gZmFuIHRoZSBxdWVyeSBvdXQgdG8gYWxsIGF2YWlsYWJsZSBzaXRlc1xuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlyc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYm9vbGVhbiwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+O1xuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBwcm92aWRlZCByZXN1bHQgc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCB0aGUgcmVzdWx0IHNldCB0byByZXRyaWV2ZSB0aGUgZmlyc3QgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnVuaWZpZWQtc2lnbmF0dXJlc1xuICAgIHB1YmxpYyBmaXJzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBBdXRob3JpemVkTG9jYXRpb25UeXBlW10sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICBwdWJsaWMgZmlyc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsocmVzdWx0LCAnZmlyc3RQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBDbGllbnRFcnJvcihcbiAgICAgICAgICAgICAgYE5vICdmaXJzdFBhZ2UnIGxpbmsgZm9yIHNwZWNpZmllZCBxdWVyeS5gLFxuICAgICAgICAgICAgICBDbGllbnRFcnJvclR5cGUuSGF0ZW9hc0xpbmtNaXNzaW5nXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5UGFnZShsaW5rLmhyZWYsIG11bHRpc2l0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0ZpcnN0UGFnZTxUPihyZXN1bHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5maW5kTGluayhyZXN1bHQsICdmaXJzdFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBwcmV2aW91cyBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBmYW4gdGhlIHF1ZXJ5IG91dCB0byBhbGwgYXZhaWxhYmxlIHNpdGVzXG4gICAgICogQHJldHVybnMgdGhlIHJlY29yZHMgZm9yIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2aW91c1BhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBwcmV2aW91cyBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSB0aGUgc2V0IG9mIHNpdGUgbG9jYXRpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHF1ZXJ5IGZhbm91dFxuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIHByZXZpb3VzUGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+O1xuICAgIHB1YmxpYyBwcmV2aW91c1BhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBhbnksIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IGxpbms6IExpbmtUeXBlID0gdGhpcy5maW5kTGluayhyZXN1bHQsICdwcmV2aW91c1BhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgICAgICBgTm8gJ3ByZXZpb3VzUGFnZScgbGluayBmb3Igc3BlY2lmaWVkIHF1ZXJ5LmAsXG4gICAgICAgICAgICAgIENsaWVudEVycm9yVHlwZS5IYXRlb2FzTGlua01pc3NpbmdcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVBhZ2UobGluay5ocmVmLCBtdWx0aXNpdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNQcmV2aW91c1BhZ2U8VD4ocmVzdWx0OiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmluZExpbmsocmVzdWx0LCAncHJldmlvdXNQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBuZXh0IHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIG5leHQgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIG5leHRQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIG5leHRQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsocmVzdWx0LCAnbmV4dFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgICAgICBgTm8gJ25leHRQYWdlJyBsaW5rIGZvciBzcGVjaWZpZWQgcXVlcnkuYCxcbiAgICAgICAgICAgICAgQ2xpZW50RXJyb3JUeXBlLkhhdGVvYXNMaW5rTWlzc2luZ1xuICAgICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5UGFnZTxUPihsaW5rLmhyZWYsIG11bHRpc2l0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc05leHRQYWdlPFQ+KHJlc3VsdDogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbmRMaW5rKHJlc3VsdCwgJ25leHRQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBsYXN0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBsYXN0IHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIGxhc3QgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGFzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIGxhc3QgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIGxhc3QgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIGxhc3QgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIGxhc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIGxhc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsocmVzdWx0LCAnbGFzdFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgICAgICBgTm8gJ2xhc3RQYWdlJyBsaW5rIGZvciBzcGVjaWZpZWQgcXVlcnkuYCxcbiAgICAgICAgICAgICAgQ2xpZW50RXJyb3JUeXBlLkhhdGVvYXNMaW5rTWlzc2luZ1xuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVBhZ2UobGluay5ocmVmLCBtdWx0aXNpdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNMYXN0UGFnZTxUPihyZXN1bHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5maW5kTGluayhyZXN1bHQsICdsYXN0UGFnZScsIChyZXN1bHQgYXMgUmVzb3VyY2VUeXBlKS50eXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFF1ZXJ5UGFnZTxUPihocmVmOiBzdHJpbmcsIG11bHRpc2l0ZT86IGFueSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgaWYgKG11bHRpc2l0ZSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4oaHJlZiwgeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyBfbXVsdGlzaXRlOiB0aGlzLnBhcnNlTXVsdGlzaXRlVmFsdWUobXVsdGlzaXRlKSB9KSB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzLmFwcGVuZChcIl9tdWx0aXNpdGVcIiwgdGhpcy5wYXJzZU11bHRpc2l0ZVZhbHVlKG11bHRpc2l0ZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KGhyZWYsIHsgLi4ub3B0aW9ucyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLmdldDxUPihocmVmLCB7IC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdG8gcGVyZm9ybSBhY3Rpb24gYXZhaWxhYmlsaXR5IGNoZWNrIGJlZm9yZSBjYWxsaW5nIHRoZSBBUElcbiAgICogQHBhcmFtIGl0ZW0gLSB0aGUgbmF2aWdhYmxlIGl0ZW0gKGNvbnRhaW5pbmcgbGluayBjb2xsZWN0aW9uKVxuICAgKiBAcGFyYW0gbGlua1JlbFR5cGUgLSB0aGUgbGluayByZWwgdHlwZSwgcGFzcyBlaXRoZXIgTGlua1JlbFR5cGUgb3Igc3RyaW5nXG4gICAqIEBwYXJhbSBlbnRpdHlSZWZUeXBlIC0gdGhlIGVudGl0eSByZWZlcmVuY2UgdHlwZVxuICAgKi9cbiAgICBwdWJsaWMgY2FuUGVyZm9ybUFjdGlvbihpdGVtOiBOYXZpZ2FibGUsIGxpbmtSZWxUeXBlOiBMaW5rUmVsVHlwZSB8IHN0cmluZywgZW50aXR5UmVmVHlwZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbmRMaW5rKGl0ZW0sIGxpbmtSZWxUeXBlLCBlbnRpdHlSZWZUeXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRMaW5rKGl0ZW06IE5hdmlnYWJsZSwgcmVsOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IExpbmtUeXBlIHtcbiAgICAgICAgaWYgKCFpdGVtIHx8ICFpdGVtLmxpbmspIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbS5saW5rLmZpbmQoKGxpbmspID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmsucmVsLmluY2x1ZGVzKHJlbCkgJiYgbGluay50eXBlID09PSB0eXBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbGluay5yZWwuaW5jbHVkZXMocmVsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZU11bHRpc2l0ZVZhbHVlKG11bHRpc2l0ZTogYm9vbGVhbiB8IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbXVsdGlzaXRlID09PSAnYm9vbGVhbicgPyAobXVsdGlzaXRlID8gJ2dsb2JhbCcgOiAnbG9jYWwnKSA6IG11bHRpc2l0ZS5tYXAoc2l0ZSA9PiBzaXRlLmxvY2F0aW9uSWQpLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgY2xvdWRBcGlTZXNzaW9uXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZXNzaW9uKCk6IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5fc2Vzc2lvbk9ic2VydmFibGUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IFNlc3Npb24gb2JzZXJ2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2xvdWRBcGlTZXNzaW9uKCk6IE9ic2VydmFibGU8U2Vzc2lvbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0Q2xvdWRBcGlPbmx5KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLl9jbG91ZEFwaVNlc3Npb25PYnNlcnZhYmxlKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXNlcm5hbWUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICAgICAgICAgIHRoaXMuY2xvdWRBcGlTZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pc0Nsb3VkQXBpTG9naW4pLFxuICAgICAgICAgICAgICAgICAgICBtYXAoc2Vzc2lvbiA9PiBzZXNzaW9uICYmIHNlc3Npb24udXNlciAmJiBzZXNzaW9uLnVzZXIubmFtZSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuX2lzQ2xvdWRBcGlMb2dpbiksXG4gICAgICAgICAgICAgICAgICAgIG1hcChzZXNzaW9uID0+IHNlc3Npb24gJiYgc2Vzc2lvbi51c2VyKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvcmdhbml6YXRpb24oKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICAgICAgdGhpcy5jbG91ZEFwaVNlc3Npb24ucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faXNDbG91ZEFwaUxvZ2luKSxcbiAgICAgICAgICAgICAgICBtYXAoc2Vzc2lvbiA9PiBzZXNzaW9uICYmIHNlc3Npb24ub3JnICYmIHNlc3Npb24ub3JnLm5hbWUpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLl9pc0Nsb3VkQXBpTG9naW4pLFxuICAgICAgICAgICAgICAgIG1hcChzZXNzaW9uID0+IHNlc3Npb24gJiYgc2Vzc2lvbi5vcmcpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGNsb3VkQXBpTG9jYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxvY2F0aW9uKCk6IE9ic2VydmFibGU8QXV0aG9yaXplZExvY2F0aW9uVHlwZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICBtYXAoc2Vzc2lvbiA9PiBzZXNzaW9uLmF1dGhvcml6ZWRMb2NhdGlvbnMubG9jYXRpb24uZmluZChsb2NhdGlvbiA9PiBsb2NhdGlvbi5sb2NhdGlvbklkID09PSBzZXNzaW9uLmxvY2F0aW9uSWQpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2xvdWRBcGlMb2NhdGlvbigpOiBPYnNlcnZhYmxlPEFjY2Vzc2libGVMb2NhdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG91ZEFwaVNlc3Npb24ucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIGNhY2hpbmcgZm9yIGdldHRpbmcgQWNjZXNzaWJsZUxvY2F0aW9uc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnMgPSB0aGlzLl9jbG91ZEFwaVNlc3Npb25MaW5rc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBBY2Nlc3NpYmxlTG9jYXRpb25zIGxpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKGxpbmtzKSA9PiB0aGlzLmZpbmRMaW5rKHsgbGluazogbGlua3MgfSwgJ2Rvd24nLCAnQWNjZXNzaWJsZUxvY2F0aW9ucycpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGZXRjaCBBY2Nlc3NpYmxlTG9jYXRpb25zIGZyb20gdGhlIGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGxpbms6IExpbmtUeXBlKSA9PiBsaW5rID8gdGhpcy5odHRwLmdldDxBY2Nlc3NpYmxlTG9jYXRpb25zPihsaW5rLmhyZWYpIDogb2YobnVsbCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgYXJyYXkgd2l0aCBhbGwgbG9jYXRpb25zICh3aGF0IGlmIHRoZXJlIGFyZSBtYW55IHBhZ2VzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoYWNjZXNzaWJsZUxvY2F0aW9uczogQWNjZXNzaWJsZUxvY2F0aW9ucykgPT4gYWNjZXNzaWJsZUxvY2F0aW9ucyAmJiBhY2Nlc3NpYmxlTG9jYXRpb25zLnZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSwgcmVzZXRPbkVycm9yOiBmYWxzZSwgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSwgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnM7XG4gICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgLy8gTmVlZCB0byBoYXZlIHRoZSBzZXNzaW9uIGluIG9yZGVyIHRvIGdldCBpdHMgbG9jYXRpb25cbiAgICAgICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuY2xvdWRBcGlTZXNzaW9uKSxcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGxvY2F0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBzZXNzaW9uXG4gICAgICAgICAgICBtYXAoKFthY2Nlc3NpYmxlTG9jYXRpb25zLCBzZXNzaW9uXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghYWNjZXNzaWJsZUxvY2F0aW9ucyB8fCAhc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbkxvY2F0aW9uID0gc2Vzc2lvbi5sb2NhdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb25Mb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc2libGVMb2NhdGlvbnMuZmluZChsb2NhdGlvbiA9PiBsb2NhdGlvbi5sb2NhdGlvbklkID09PSBzZXNzaW9uTG9jYXRpb24pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExvY2F0aW9uKHNlc3Npb246IFNlc3Npb25UeXBlKTogQXV0aG9yaXplZExvY2F0aW9uVHlwZSB7XG4gICAgICAgIHJldHVybiBzZXNzaW9uLmF1dGhvcml6ZWRMb2NhdGlvbnMubG9jYXRpb24uZmluZChsb2NhdGlvbiA9PiBsb2NhdGlvbi5sb2NhdGlvbklkID09PSBzZXNzaW9uLmxvY2F0aW9uSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIHRoZSBlbmRwb2ludCB1cmwuIElmIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBhbHJlYWR5IGFuIGFic29sdXRlIFVSTCwgdGhlbiByZXR1cm4gaXQgYXMgaXQgaXMgd2l0aG91dFxuICAgICAqIGFueSBtb2RpZmljYXRpb25zLCBvdGhlcndpc2UgY29uc2lkZXIgaXQgYXMgYSByZWxhdGl2ZSBvbmUgYW5kIHByZXBlbmQgdGhlIGJhc2VVcmwgYXMgZGVmaW5lZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBlbmRwb2ludC5pbmRleE9mKCc6Ly8nKSA+IC0xID8gZW5kcG9pbnQgOiBgJHt0aGlzLl9iYXNlVXJsfS8ke2VuZHBvaW50fWA7XG4gICAgfVxuXG59XG4iXX0=
608
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmNkLmFwaS5jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92Y2Qvc2RrL3NyYy9jbGllbnQvY2xpZW50L3ZjZC5hcGkuY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQVksUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBQyxXQUFXLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2RixPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwSCxPQUFPLEVBT0wsUUFBUSxFQUNULE1BQU0sMkNBQTJDLENBQUM7QUFJbkQsT0FBTyxFQUFDLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFFakgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV6QyxPQUFPLEVBQUMsV0FBVyxFQUFFLGVBQWUsRUFBQyxNQUFNLFNBQVMsQ0FBQzs7OztBQUVyRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUdsRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0FBRXJDLCtCQUErQjtBQUUvQjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE1BQWM7SUFDbEQsTUFBTSxPQUFPLEdBQWUsRUFBRSxDQUFDO0lBRS9C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Q3JDLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxFQUFFLENBQUM7SUFDcEYsQ0FBQzs4R0ExekJRLFlBQVk7a0hBQVosWUFBWTs7MkZBQVosWUFBWTtrQkFEeEIsVUFBVTs7MEJBeURFLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIEluamVjdG9yLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0h0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBtZXJnZSwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3QsIHRocm93RXJyb3J9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBjb25jYXRNYXAsIGZpbHRlciwgbWFwLCBzaGFyZSwgc2tpcFdoaWxlLCBzd2l0Y2hNYXAsIHRhcCwgd2l0aExhdGVzdEZyb219IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEF1dGhvcml6ZWRMb2NhdGlvblR5cGUsXG4gIEVudGl0eVJlZmVyZW5jZVR5cGUsXG4gIEVudGl0eVR5cGUsXG4gIExpbmtUeXBlLFxuICBSZXNvdXJjZVR5cGUsXG4gIFNlc3Npb25UeXBlLFxuICBUYXNrVHlwZVxufSBmcm9tICdAdmNkL2JpbmRpbmdzL3ZjbG91ZC9hcGkvcmVzdC9zY2hlbWFfdjFfNSc7XG5pbXBvcnQge1N1cHBvcnRlZFZlcnNpb25zVHlwZX0gZnJvbSAnQHZjZC9iaW5kaW5ncy92Y2xvdWQvYXBpL3Jlc3Qvc2NoZW1hL3ZlcnNpb25pbmcnO1xuaW1wb3J0IHtBY2Nlc3NpYmxlTG9jYXRpb24sIEFjY2Vzc2libGVMb2NhdGlvbnMsIFNlc3Npb259IGZyb20gJy4uL29wZW5hcGknO1xuaW1wb3J0IHtRdWVyeX0gZnJvbSAnLi4vcXVlcnkvaW5kZXgnO1xuaW1wb3J0IHtBUElfUk9PVF9VUkwsIEF1dGhUb2tlbkhvbGRlclNlcnZpY2UsIFNFU1NJT05fT1JHX0lELCBTRVNTSU9OX1NDT1BFfSBmcm9tICcuLi8uLi9jb21tb24vY29udGFpbmVyLWhvb2tzJztcbmltcG9ydCB7VmNkSHR0cENsaWVudH0gZnJvbSAnLi92Y2QuaHR0cC5jbGllbnQnO1xuaW1wb3J0IHtWY2RUcmFuc2ZlckNsaWVudH0gZnJvbSAnLi92Y2QudHJhbnNmZXIuY2xpZW50JztcbmltcG9ydCB7SFRUUF9IRUFERVJTfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1ZjZFNka0NvbmZpZ30gZnJvbSBcIi4uLy4uL2NvcmUvcGx1Z2luLm1vZHVsZVwiO1xuaW1wb3J0IHtDbGllbnRFcnJvciwgQ2xpZW50RXJyb3JUeXBlfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgVFJBTlNGRVJfTElOS19SRUwgPSAndXBsb2FkOmRlZmF1bHQnO1xuZXhwb3J0IHR5cGUgTmF2aWdhYmxlID0gUmVzb3VyY2VUeXBlIHwgeyBsaW5rPzogTGlua1R5cGVbXSB9O1xuXG5leHBvcnQgY29uc3QgSEFURU9BU19IRUFERVIgPSAnTGluayc7XG5cbi8vIHRzbGludDpkaXNhYmxlOnZhcmlhYmxlLW5hbWVcblxuLyoqXG4gKiBQYXJzZSBvdXQgTGluayBoZWFkZXJzIHVzaW5nIGEgdmVyeSBsYXppbHkgaW1wbGVtZW50ZWQgcHVsbCBwYXJzZXJcbiAqIEBwYXJhbSBoZWFkZXIgJzx1cmwxPjtuYW1lMT1cInZhbHVlMVwiLG5hbWUyPVwidmFsdWUyXCIsPHVybDI+O25hbWUzPVwidmFsdWUzLHZhbHVlNFwiJ1xuICogQHJldHVybnMgcGFyc2VkIGxpbmsgaGVhZGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIZWFkZXJIYXRlb2FzTGlua3MoaGVhZGVyOiBzdHJpbmcpOiBMaW5rVHlwZVtdIHtcbiAgICBjb25zdCByZXN1bHRzOiBMaW5rVHlwZVtdID0gW107XG5cbiAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJGaWVsZE1hcHBpbmdzOiB7W2tleTogc3RyaW5nXToga2V5b2YgTGlua1R5cGV9ID0ge1xuICAgICAgICBocmVmOiAnaHJlZicsXG4gICAgICAgIG1vZGVsOiAndHlwZScsXG4gICAgICAgIHRpdGxlOiAnaWQnLFxuICAgICAgICByZWw6ICdyZWwnXG4gICAgfTtcbiAgICBsZXQgdG9rZW5JbmRleCA9IC0xO1xuXG4gICAgZnVuY3Rpb24gcGVlayh0b2tlbjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZih0b2tlbiwgdG9rZW5JbmRleCArIDEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5leHQodG9rZW46IHN0cmluZykge1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBwZWVrKHRva2VuKTtcbiAgICAgICAgaWYgKG5leHRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7aGVhZGVyLCB0b2tlbiwgdG9rZW5JbmRleH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbkluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICByZXR1cm4gdG9rZW5JbmRleDtcbiAgICB9XG5cbiAgICB3aGlsZSAocGVlaygnPCcpID4gLTEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhyZWZTdGFydCA9IG5leHQoJzwnKTtcbiAgICAgICAgICAgIGNvbnN0IGhyZWZFbmQgPSBuZXh0KCc+Jyk7XG4gICAgICAgICAgICBjb25zdCBocmVmID0gaGVhZGVyLnN1YnN0cmluZyhocmVmU3RhcnQgKyAxLCBocmVmRW5kKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTGlua1R5cGUgPSB7aHJlZiwgdHlwZTogbnVsbCwgaWQ6IG51bGwsIHJlbDogbnVsbCwgdkNsb3VkRXh0ZW5zaW9uOiBbXX07XG4gICAgICAgICAgICBsZXQgY29tbWEgPSBwZWVrKCcsJyk7XG4gICAgICAgICAgICBsZXQgc2VtaWNvbG9uID0gcGVlaygnOycpO1xuICAgICAgICAgICAgd2hpbGUgKChzZW1pY29sb24gPiAtMSAmJiBjb21tYSA+IC0xICYmIHNlbWljb2xvbiA8IGNvbW1hKSB8fCAoc2VtaWNvbG9uID4gLTEgJiYgY29tbWEgPT09IC0xKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVTdGFydCA9IG5leHQoJzsnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lRW5kID0gbmV4dCgnPScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBoZWFkZXIuc3Vic3RyaW5nKG5hbWVTdGFydCArIDEsIG5hbWVFbmQpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlU3RhcnQgPSBuZXh0KCdcIicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlRW5kID0gbmV4dCgnXCInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGhlYWRlci5zdWJzdHJpbmcodmFsdWVTdGFydCArIDEsIHZhbHVlRW5kKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWROYW1lID0gaGVhZGVyRmllbGRNYXBwaW5nc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAobWFwcGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFttYXBwZWROYW1lXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21tYSA9IHBlZWsoJywnKTtcbiAgICAgICAgICAgICAgICBzZW1pY29sb24gPSBwZWVrKCc7Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgIC8vIFdlIHdpbGwgdHJ5IHRoZSBuZXh0IG9uZS4uLlxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmV4cG9ydCBlbnVtIExpbmtSZWxUeXBlIHtcbiAgICBhZGQgPSAnYWRkJyxcbiAgICByZW1vdmUgPSAncmVtb3ZlJyxcbiAgICBlZGl0ID0gJ2VkaXQnLFxufVxuXG4vKipcbiAqIEEgYmFzaWMgY2xpZW50IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJcy5cbiAqXG4gKiBBIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBwbHVnaW4gY2FuIGdldCBhIHJlZmVyZW5jZSB0byB0aGlzIGNsaWVudCBieSB1c2luZyBhbmd1bGFyIGluamVjdGlvbi5cbiAqIGBgYFxuICogICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdmNkQXBpOiBWY2RBcGlDbGllbnQpIHt9XG4gKiBgYGBcbiAqXG4gKiBWY2RBcGlDbGllbnQgcmV1c2VzIHRoZSBhdXRoZW50aWNhdGlvbiBmcm9tIHRoZSBWQ0QgcGxhdGZvcm0gc28gaW4gZ2VuZXJhbCB0aGVyZSBpc1xuICogbm8gbmVlZCBvZiBhbiBleHBsaWNpdCBhdXRoZW50aWNhdGlvbi9sb2dpbi5cbiAqXG4gKiBXaGVuIGRlYWxpbmcgd2l0aCB0aGUgc2Vzc2lvbiBtYW5hZ2VtZW50IHRoZXJlIGFyZSB0d28gQVBJczpcbiAqIDEuIERlcHJlY2F0ZWQgbGVnYWN5IEFQSSB0aGF0IGlzIHVzaW5nIHRoZSBgYXBpL3Nlc3Npb25gIGVuZHBvaW50IGFuZCB0aGUgY29ycmVzcG9uZGluZyBtb2RlbHNcbiAqIDIuIE5ld2x5IGFkZGVkIEFQSSB0aGF0IGlzIHVzaW5nIHRoZSBgY2xvdWRhcGlgIGVuZHBvaW50IGFuZCB0aGUgY29ycmVzcG9uZGluZyBtb2RlbHNcbiAqXG4gKiBOb3RlIHRoYXQgaWYgYSBwbHVnaW4gcGVyZm9ybXMgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGF1dGhlbnRpY2F0aW9uIGNhbGwgdGhyb3VnaFxuICoge0BsaW5rIFZjZEFwaUNsaWVudCNzZXRDbG91ZEFwaUF1dGhlbnRpY2F0aW9ufSBvciB7QGxpbmsgVmNkQXBpQ2xpZW50I2Nsb3VkQXBpTG9naW59XG4gKiBmcm9tIHRoYXQgbW9tZW50IG9uIHRoZSBWY2RBcGlDbGllbnQgdXNlcyBvbmx5IGNsb3VkIGFwaSBzZXNzaW9uIG1hbmFnZW1lbnQuXG4gKiBUaGlzIG1lYW5zIGNhbGxzIHRvIHtAbGluayBWY2RBcGlDbGllbnQjc2V0QXV0aGVudGljYXRpb259IG9yIHtAbGluayBWY2RBcGlDbGllbnQjbG9naW59IGhhdmUgbm8gZWZmZWN0LlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVmNkQXBpQ2xpZW50IHtcbiAgICBzZXQgYmFzZVVybChfYmFzZVVybDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSBfYmFzZVVybDtcbiAgICB9XG5cbiAgICBnZXQgdmVyc2lvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IudmVyc2lvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9uZWdvdGlhdGVWZXJzaW9uOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgcHJpdmF0ZSBfYmFzZVVybDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBWY2RBcGlDbGllbnQjX2Nsb3VkQXBpU2Vzc2lvbn1cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXNzaW9uOiBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvblR5cGU+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZXNzaW9uVHlwZT4obnVsbCk7XG4gICAgcHJpdmF0ZSBfc2Vzc2lvbk9ic2VydmFibGU6IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+ID0gdGhpcy5fc2Vzc2lvbi5hc09ic2VydmFibGUoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHNraXBXaGlsZShzZXNzaW9uID0+ICFzZXNzaW9uKVxuICAgICAgICApO1xuICAgIHByaXZhdGUgX2dldFNlc3Npb246IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+O1xuXG4gICAgLyoqXG4gICAgICogQ2xvdWRBcGkgU2Vzc2lvblxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nsb3VkQXBpU2Vzc2lvbjogQmVoYXZpb3JTdWJqZWN0PFNlc3Npb24+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZXNzaW9uPihudWxsKTtcbiAgICBwcml2YXRlIF9jbG91ZEFwaVNlc3Npb25PYnNlcnZhYmxlOiBPYnNlcnZhYmxlPFNlc3Npb24+ID0gdGhpcy5fY2xvdWRBcGlTZXNzaW9uLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc2tpcFdoaWxlKHNlc3Npb24gPT4gIXNlc3Npb24pXG4gICAgICAgICk7XG4gICAgLyoqXG4gICAgICogVGhpcyBvYnNlcnZhYmxlIGhhcyBhIHNwZWNpYWwgcHVycG9zZSB3aGVuIGRvaW5nIGF1dG9tYXRpYyBsb2dpbiBkdXJpbmcgdGhlIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uLlxuICAgICAqIEl0IGFsbG93cyBiYWNrZW5kIGNhbGwgb25seSBhZnRlciBhbiBBUEkgdmVyc2lvbiBpcyBzZXQuXG4gICAgICogSXQgYWxzbyBlbnN1cmVzIHRoYXQgYSBiYWNrZW5kIGNhbGwgdG8gZ2V0IHRoZSBjdXJyZW50IHNlc3Npb24gaXMgZG9uZSBvbmNlIHByaW9yIHRvIGFueSBvdGhlciBjYWxscy5cbiAgICAgKlxuICAgICAqIEluIGNhc2Ugb2YgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGF1dGggcmVxdWVzdCB0aGVyZSBpcyBubyBuZWVkIG9mIHRoaXMgb2JzZXJ2YWJsZVxuICAgICAqIHNpbmNlIHRoaXMgYXV0aCByZXF1ZXN0IHdpbGwgcmV0cmlldmUgdGhlIHNlc3Npb24gaXRzZWxmXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0Q2xvdWRBcGlTZXNzaW9uOiBPYnNlcnZhYmxlPFNlc3Npb24+O1xuXG4gICAgcHJpdmF0ZSBfY2xvdWRBcGlTZXNzaW9uTGlua3M6IEJlaGF2aW9yU3ViamVjdDxMaW5rVHlwZVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TGlua1R5cGVbXT4oW10pO1xuXG4gICAgLyoqXG4gICAgICogQ2FjaGVkLCBsYXp5IGxvYWRlZCBvYnNlcnZhYmxlIG9mIHRoZSBBY2Nlc3NpYmxlTG9jYXRpb24gYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnM6IE9ic2VydmFibGU8QWNjZXNzaWJsZUxvY2F0aW9uW10+O1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBkZXRlcm1pbmVzIGlmIGl0IGlzIGFuIGV4cGxpY2l0IGNsb3VkIGFwaSBsb2dpbi5cbiAgICAgKiBJbiB0aGlzIGNhc2UgdGhlIG9sZCBBUEkgKC9hcGkvc2Vzc2lvbikgc2hvdWxkIG5vdCBiZSB1c2VkIGF0IGFsbC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9pc0Nsb3VkQXBpTG9naW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAgICAgcHJpdmF0ZSBodHRwOiBWY2RIdHRwQ2xpZW50LFxuICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbmZpZz86IFZjZFNka0NvbmZpZyxcbiAgICApIHtcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IHRoaXMuaW5qZWN0b3IuZ2V0KEFQSV9ST09UX1VSTCk7XG5cbiAgICAgICAgbGV0IG5lZ290aWF0ZWRWZXJzaW9uOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZz8uYXBpVmVyc2lvbikge1xuICAgICAgICAgICAgbmVnb3RpYXRlZFZlcnNpb24gPSBvZih0aGlzLmNvbmZpZy5hcGlWZXJzaW9uKS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgodmVyc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZlcnNpb24odmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmVnb3RpYXRlZFZlcnNpb24gPSB0aGlzLmh0dHAuZ2V0PFN1cHBvcnRlZFZlcnNpb25zVHlwZT4oYCR7dGhpcy5fYmFzZVVybH0vYXBpL3ZlcnNpb25zYCkucGlwZShcbiAgICAgICAgICAgICAgICBtYXAodmVyc2lvbnMgPT4gdGhpcy5uZWdvdGlhdGVWZXJzaW9uKHZlcnNpb25zKSksXG4gICAgICAgICAgICAgICAgdGFwKHZlcnNpb24gPT4gdGhpcy5zZXRWZXJzaW9uKHZlcnNpb24pKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9uZWdvdGlhdGVWZXJzaW9uID0gbmVnb3RpYXRlZFZlcnNpb24ucGlwZShcbiAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSwgcmVzZXRPbkVycm9yOiBmYWxzZSwgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSwgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0b2tlbkhvbGRlcjogQXV0aFRva2VuSG9sZGVyU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KEF1dGhUb2tlbkhvbGRlclNlcnZpY2UsIHsgdG9rZW46ICcnIH0pO1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2VuSG9sZGVyLmp3dCA/IGBCZWFyZXIgJHt0b2tlbkhvbGRlci5qd3R9YCA6IHRva2VuSG9sZGVyLnRva2VuO1xuICAgICAgICB0aGlzLl9nZXRTZXNzaW9uID0gdGhpcy5zZXRBdXRoZW50aWNhdGlvbih0b2tlbilcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSwgcmVzZXRPbkVycm9yOiBmYWxzZSwgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSwgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fZ2V0Q2xvdWRBcGlTZXNzaW9uID0gdGhpcy5zZXRDbG91ZEFwaUF1dGhlbnRpY2F0aW9uKHRva2VuKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc2hhcmUoeyBjb25uZWN0b3I6ICgpID0+IG5ldyBSZXBsYXlTdWJqZWN0KDEpLCByZXNldE9uRXJyb3I6IGZhbHNlLCByZXNldE9uQ29tcGxldGU6IGZhbHNlLCByZXNldE9uUmVmQ291bnRaZXJvOiBmYWxzZSB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGxvZ2luXG4gICAgICAgIHRoaXMuX2lzQ2xvdWRBcGlMb2dpbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgbmVnb3RpYXRlVmVyc2lvbihzZXJ2ZXJWZXJzaW9uczogU3VwcG9ydGVkVmVyc2lvbnNUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkVmVyc2lvbnM6IHN0cmluZ1tdID0gc2VydmVyVmVyc2lvbnMudmVyc2lvbkluZm8ubWFwKHZlcnNpb25JbmZvID0+IHZlcnNpb25JbmZvLnZlcnNpb24pO1xuXG4gICAgICAgIC8vIERlZmF1bHQgQVBJIFZlcnNpb24gdXNlZCBpcyB0aGUgTGF0ZXN0IEFQSSBWZXJzaW9uIGluIFZNd2FyZSBDbG91ZCBEaXJlY3RvclxuICAgICAgICByZXR1cm4gc3VwcG9ydGVkVmVyc2lvbnNbc3VwcG9ydGVkVmVyc2lvbnMubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBlbnN1cmUgdGhhdCBwcmlvciB0byBzZW5kaW5nIGFueSBjYWxsIHRvIHRoZSBiYWNrZW5kXG4gICAgICogdGhlIHZlcnNpb24gaGFzIGJlZW4gc2V0IGFuZCB0aGUgY3VycmVudCBzZXNzaW9uIGhhcyBiZWVuIHJldHJpZXZlZC5cbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBpbXBvcnRhbnQgZHVyaW5nIHRoZSBhdXRvbWF0aWMgYXV0aGVudGljYXRpb24gdGhhdCBpcyBkb25lIGR1cmluZyB0aGVcbiAgICAgKiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiwgd2hlbiB0aGUgcGx1Z2luIGlzIG5vdCByZXF1aXJlZCB0byBwZXJmb3JtIGl0cyBvd24gZXhwbGljaXQgYXV0aGVudGljYXRpb25cbiAgICAgKiBidXQgcmF0aGVyIHRoZSBvbmVzIGZyb20gdGhlIHVuZGVybHlpbmcgZnJhbWV3b3JrIGlzIHVzZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCk6IE9ic2VydmFibGU8dHJ1ZT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudmVyc2lvbiA/IG9mKHRoaXMudmVyc2lvbikgOiB0aGlzLl9uZWdvdGlhdGVWZXJzaW9uKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhIGNsb3VkIGFwaSBsb2dpbiB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhlIC9hcGkvc2Vzc2lvbiBzZXNzaW9uXG4gICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuX2lzQ2xvdWRBcGlMb2dpbiA/IG9mKG51bGwpIDogdGhpcy5fZ2V0U2Vzc2lvbiksXG4gICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuX2dldENsb3VkQXBpU2Vzc2lvblxuICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGNsb3VkIGFwaSBmYWlsdXJlIHdlIGRvIG5vdCB3YW50IHRvIHByZXZlbnQgZnVydGhlciBleGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgY29uc2lkZXJhdGlvbnMgc2luY2UgdGhpcyBtYXkgYmUgYSBjYXNlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gY2xvdWQgYXBpIGlzIG5vdCBzdXBwb3J0ZWQgYXQgYWxsIGZvciB0aGUgc3BlY2lmaWVkIHZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoZSkgPT4gb2YodHJ1ZSkpKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHRydWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEZvciB1c2UgY2FzZXMgd2ljaCBzb2xlbHkgZGVwZW5kcyBvbiBjbG91ZGFwaSB3aXRob3V0IGFueSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICogdGhlcmUgc2hvdWxkIGJlIG5vIGRlcGVuZGVuY2Ugb24gdGhlIG9sZCAvYXBpIGVuZHBvaW50IGF0IGFsbFxuICAgICAqL1xuICAgIHByaXZhdGUgdmFsaWRhdGVSZXF1ZXN0Q29udGV4dENsb3VkQXBpT25seSgpOiBPYnNlcnZhYmxlPFNlc3Npb24+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZlcnNpb24gPyBvZih0aGlzLnZlcnNpb24pIDogdGhpcy5fbmVnb3RpYXRlVmVyc2lvbikucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLl9nZXRDbG91ZEFwaVNlc3Npb24pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFZlcnNpb24oX3ZlcnNpb246IHN0cmluZyk6IFZjZEFwaUNsaWVudCB7XG4gICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLnZlcnNpb24gPSBfdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2xvYmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzZXJ2aWNlLCB0aGF0IGFsbG93cyBhIHByb3ZpZGVyIHVzZXIgdG8gZXhlY3V0ZSBBUEkgcmVxdWVzdHNcbiAgICAgKiBpbiB0aGUgc2NvcGUgb2YgYSBzcGVjaWZpYyB0ZW5hbnQuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBleGVjdXRlIHNpbmdsZSBBUEkgcmVxdWVzdCBpbiBzY29wZSBvZiBzcGVjaWZpYyB0ZW5hbnQgeW91IGNhbiBkbyBpdFxuICAgICAqIGJ5IHBhc3NpbmcgXCJYLVZNV0FSRS1WQ0xPVUQtVEVOQU5ULUNPTlRFWFRcIiBoZWFkZXIgdG8gdGhlIHNwZWNpZmljIEFQSSBSZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhpcyBzY29waW5nIGlzIGF2YWlsYWJsZSB0byBxdWVyeS1iYXNlZCBBUEkgY2FsbHMgYW5kIHRvIGJ1bGsgR0VUIGNhbGxzIGluIHRoZVxuICAgICAqIC9jbG91ZGFwaSBzcGFjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3RBcyBhbiBlbnRpdHlSZWYgb2YgdGhlIHRlbmFudCAob3JnYW5pemF0aW9uKSB0byBzY29wZSBzdWJzZXF1ZW50IGNhbGxzIHRvIGluXG4gICAgICogIHRoZSBWY2RBcGlDbGllbnQsIG9yIG51bGwvbm8gcGFyYW1ldGVyIHRvIHJlbW92ZSB0ZW5hbnQtc3BlY2lmaWMgc2NvcGluZ1xuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IFZjZEFwaUNsaWVudCBpbnN0YW5jZSAoZm9yIGNoYWluaW5nKVxuICAgICAqL1xuICAgIHB1YmxpYyBhY3RBcyhhY3RBczogRW50aXR5UmVmZXJlbmNlVHlwZSA9IG51bGwpOiBWY2RBcGlDbGllbnQge1xuICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hY3RBcyA9ICFhY3RBcyA/IG51bGwgOiBhY3RBcy5pZDtcbiAgICAgICAgdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IuYWN0QXNPcmdOYW1lID0gIWFjdEFzID8gbnVsbCA6IGFjdEFzLm5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgVmNkQXBpQ2xpZW50I3NldENsb3VkQXBpQXV0aGVudGljYXRpb259XG4gICAgICpcbiAgICAgKiBTZXRzIHRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiB0byB1c2UgZm9yIHRoZSBWY2RBcGlDbGllbnQuXG4gICAgICpcbiAgICAgKiBBZnRlciBzZXR0aW5nIHRoZSB0b2tlbiwgdGhlIGNsaWVudCB3aWxsIGdldCB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAgICogaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhdXRoZW50aWNhdGVkIHRva2VuLlxuICAgICAqXG4gICAgICogQHBhcmFtIGF1dGhlbnRpY2F0aW9uIHRoZSBhdXRoZW50aWNhdGlvbiBzdHJpbmcgKHRvIGJlIHVzZWQgaW4gZWl0aGVyIHRoZSAnQXV0aG9yaXphdGlvbidcbiAgICAgKiAgb3IgJ3gtdmNsb3VkLWF1dGhvcml6YXRpb24nIGhlYWRlcilcbiAgICAgKiBAcmV0dXJucyB0aGUgc2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuXG4gICAgICovXG4gICAgcHVibGljIHNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlc3Npb25UeXBlPiB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Nsb3VkQXBpTG9naW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCdPbmx5IGNsb3VkIGFwaSBhdXRoIGlzIGFsbG93ZWQgc2luY2UgaXQgd2FzIGFscmVhZHkgdXNlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IuYXV0aGVudGljYXRpb24gPSBhdXRoZW50aWNhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8U2Vzc2lvblR5cGU+KGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9zZXNzaW9uYCkucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoc2Vzc2lvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgc2V0IGFjdEFzIGZvciBwcm92aWRlciBpbiB0ZW5hbnQgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24ub3JnID09PSAnU3lzdGVtJyAmJiB0aGlzLmluamVjdG9yLmdldChTRVNTSU9OX1NDT1BFKSA9PT0gJ3RlbmFudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1dG9tYXRpYyBhY3RBcyBvbmx5IHdvcmtzIGluIHZlcnNpb25zID49OS41XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0QXMoe2lkOiB0aGlzLmluamVjdG9yLmdldChTRVNTSU9OX09SR19JRCl9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIFNFU1NJT05fT1JHX0lEIHNldCBpbiBjb250YWluZXIuIEF1dG9tYXRpYyBhY3RBcyBpcyBkaXNhYmxlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRhcChzZXNzaW9uID0+IHRoaXMuX3Nlc3Npb24ubmV4dChzZXNzaW9uKSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYXV0aGVudGljYXRpb24gdG9rZW4gdG8gdXNlIGZvciB0aGUgVmNkQXBpQ2xpZW50LlxuICAgICAqXG4gICAgICogQWZ0ZXIgc2V0dGluZyB0aGUgdG9rZW4sIHRoZSBjbGllbnQgd2lsbCBnZXQgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXV0aGVudGljYXRlZCB0b2tlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhdXRoZW50aWNhdGlvbiB0aGUgYXV0aGVudGljYXRpb24gc3RyaW5nICh0byBiZSB1c2VkIGluIGVpdGhlciB0aGUgJ0F1dGhvcml6YXRpb24nXG4gICAgICogIG9yICd4LXZjbG91ZC1hdXRob3JpemF0aW9uJyBoZWFkZXIpXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBzZXNzaW9uIG9ic2VydmFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdXRoZW50aWNhdGlvbiB0b2tlblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDbG91ZEFwaUF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlc3Npb24+IHtcbiAgICAgICAgdGhpcy5vbkJlZm9yZUNsb3VkQXBpQXV0aGVudGljYXRpb24oKTtcblxuICAgICAgICByZXR1cm4gb2YodHJ1ZSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgYXV0aGVudGljYXRpb24gYXMgcGFydCBvZiB0aGUgb2JzZXJ2YWJsZSBpbiBvcmRlciB0byBlbnN1cmUgdGhlIGNhbGxlciBoYXMgc3Vic2NyaWJlZCB0byB0aGUgb2JzZXJ2YWJsZVxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hdXRoZW50aWNhdGlvbiA9IGF1dGhlbnRpY2F0aW9uKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5odHRwLmdldDxTZXNzaW9uPihgJHt0aGlzLl9iYXNlVXJsfS9jbG91ZGFwaS8xLjAuMC9zZXNzaW9ucy9jdXJyZW50YCwgeyBvYnNlcnZlOiAncmVzcG9uc2UnIH0pKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRoaXMub25DbG91ZEFwaUF1dGhlbnRpY2F0aW9uKClcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGVuYWJsZUxvZ2dpbmcoKTogVmNkQXBpQ2xpZW50IHtcbiAgICAgICAgdGhpcy5odHRwLmxvZ2dpbmdJbnRlcmNlcHRvci5lbmFibGVkID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFZjZEFwaUNsaWVudCNjbG91ZEFwaUxvZ2lufVxuICAgICAqXG4gICAgICogQ3JlYXRlcyBhbiBhdXRoZW50aWNhdGVkIHNlc3Npb24gZm9yIHRoZSBzcGVjaWZpZWQgY3JlZGVudGlhbCBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJuYW1lIHRoZSBuYW1lIG9mIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZVxuICAgICAqIEBwYXJhbSB0ZW5hbnQgdGhlIG9yZ2FuaXphdGlvbiB0aGUgdXNlciBiZWxvbmdzIHRvXG4gICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXJcbiAgICAgKiBAcmV0dXJucyBhbiBhdXRoZW50aWNhdGVkIHNlc3Npb24gZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFsc1xuICAgICAqL1xuICAgIHB1YmxpYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCB0ZW5hbnQ6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ2xvdWRBcGlMb2dpbikge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ09ubHkgY2xvdWQgYXBpIGF1dGggaXMgYWxsb3dlZCBzaW5jZSBpdCB3YXMgYWxyZWFkeSB1c2VkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXV0aFN0cmluZzogc3RyaW5nID0gYnRvYShgJHt1c2VybmFtZX1AJHt0ZW5hbnR9OiR7cGFzc3dvcmR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFNlc3Npb25UeXBlPihcbiAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9zZXNzaW9uc2AsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7YXV0aFN0cmluZ31gfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRhcCgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+KSA9PlxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hdXRoZW50aWNhdGlvbiA9IGAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtdG9rZW4tdHlwZScpfSAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtYWNjZXNzLXRva2VuJyl9YFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZS5ib2R5KSxcbiAgICAgICAgICAgIHRhcChzZXNzaW9uID0+IHRoaXMuX3Nlc3Npb24ubmV4dChzZXNzaW9uKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGF1dGhlbnRpY2F0ZWQgc2Vzc2lvbiBmb3IgdGhlIHNwZWNpZmllZCBjcmVkZW50aWFsIGRhdGEgdXNpbmcgY2xvdWQgYXBpIGVuZHBvaW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJuYW1lIHRoZSBuYW1lIG9mIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZVxuICAgICAqIEBwYXJhbSB0ZW5hbnQgdGhlIG9yZ2FuaXphdGlvbiB0aGUgdXNlciBiZWxvbmdzIHRvXG4gICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXJcbiAgICAgKiBAcmV0dXJucyBhbiBhdXRoZW50aWNhdGVkIHNlc3Npb24gZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFsc1xuICAgICAqL1xuICAgIHB1YmxpYyBjbG91ZEFwaUxvZ2luKHVzZXJuYW1lOiBzdHJpbmcsIHRlbmFudDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZXNzaW9uPiB7XG4gICAgICAgIHRoaXMub25CZWZvcmVDbG91ZEFwaUF1dGhlbnRpY2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgYXV0aFN0cmluZzogc3RyaW5nID0gYnRvYShgJHt1c2VybmFtZX1AJHt0ZW5hbnR9OiR7cGFzc3dvcmR9YCk7XG4gICAgICAgIGxldCB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jbG91ZGFwaS8xLjAuMC9zZXNzaW9uc2A7XG4gICAgICAgIGlmICh0ZW5hbnQudG9Mb3dlckNhc2UoKSA9PT0gJ3N5c3RlbScpIHtcbiAgICAgICAgICAgIHVybCArPSAnL3Byb3ZpZGVyJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8U2Vzc2lvbj4oXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgW0hUVFBfSEVBREVSUy5BdXRob3JpemF0aW9uXTogYEJhc2ljICR7YXV0aFN0cmluZ31gIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICkucGlwZShcbiAgICAgICAgICAgIHRhcCgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxTZXNzaW9uPikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IGAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtdG9rZW4tdHlwZScpfSAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtYWNjZXNzLXRva2VuJyl9YDtcbiAgICAgICAgICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hdXRoZW50aWNhdGlvbiA9IHRva2VuO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLm9uQ2xvdWRBcGlBdXRoZW50aWNhdGlvbigpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXQgaXMgbmVjZXNzYXJ5IHRvIGtub3cgaWYgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGF1dGggcmVxdWVzdCB3YXMgZG9uZS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGZsYWdzLCBwcm9wZXJ0aWVzIGV0Yy5cbiAgICAgKi9cbiAgICBwcml2YXRlIG9uQmVmb3JlQ2xvdWRBcGlBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBleHBsaWNpdCBjbG91ZCBhcGkgYXV0aCByZXF1ZXN0OlxuICAgICAgICAvLyBTZXQgdGhlIGZsYWcgX2lzQ2xvdWRBcGlMb2dpbiBpbiBvcmRlciB0byBrbm93IHRoYXQgZXhwbGljaXQgY2xvdWQgYXBpIGF1dGhlbnRpY2F0aW9uIGlzIGRvbmVcbiAgICAgICAgLy8gVGhpcyB3aWxsIGhlbHAgdXMgc2tpcCBjb2RlIHJlbGF0ZWQgdG8gdGhlIG9sZCBhcGksIGkuZS4gd2Ugc2hvdWxkIG5vdCBhbGxvdyBleHBsaWNpdCBtaXggb2YgYm90aCB0aGUgYXBpLXNcbiAgICAgICAgdGhpcy5faXNDbG91ZEFwaUxvZ2luID0gdHJ1ZTtcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBleHBsaWNpdCBjbG91ZCBhcGkgYXV0aCByZXF1ZXN0OlxuICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIG9mIF9nZXRDbG91ZEFwaVNlc3Npb24gb2JzZXJ2YWJsZSB3aGljaCBpcyBuZWVkZWQgaW4gdGhlIGF1dG9tYXRpYyBsb2dpbiBkdXJpbmcgdGhlIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uLlxuICAgICAgICAvLyBUaGUgZXhwbGljaXQgY2xvdWQgYXBpIGF1dGggcmVxdWVzdCB3aWxsIHJldHJpZXZlIHRoZSBzZXNzaW9uLlxuICAgICAgICB0aGlzLl9nZXRDbG91ZEFwaVNlc3Npb24gPSBvZihudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgYXV0aGVudGljYXRpb24uXG4gICAgICogVGhpcyBpbmNsdWRlcyBnZXR0aW5nIEhBVEVPQVMgbGlua3MsIHNldHRpbmcgdGhlIHNlc3Npb24sIGhhbmRsaW5nIGVycm9ycyBldGMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBvbkNsb3VkQXBpQXV0aGVudGljYXRpb24oKTogKHNvdXJjZTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8U2Vzc2lvbj4+KSA9PiBPYnNlcnZhYmxlPFNlc3Npb24+IHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5waXBlKFxuICAgICAgICAgICAgdGFwKChyZXNwOiBIdHRwUmVzcG9uc2U8U2Vzc2lvbj4pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgSEFURU9BUyBsaW5rc1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2xvdWRBcGlTZXNzaW9uTGlua3MocGFyc2VIZWFkZXJIYXRlb2FzTGlua3MocmVzcC5oZWFkZXJzLmdldChIQVRFT0FTX0hFQURFUikpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGVuIHBhcnNpbmcgc2Vzc2lvbiBIQVRFT0FTIGxpbmtzOicsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKHJlc3AgPT4gcmVzcC5ib2R5KSxcbiAgICAgICAgICAgIHRhcCgoc2Vzc2lvbjogU2Vzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzIGFjdEFzXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RBcyhudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHNldCBhY3RBcyBmb3IgcHJvdmlkZXIgaW4gdGVuYW50IHNjb3BlXG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24ub3JnICYmIHNlc3Npb24ub3JnLm5hbWUgPT09ICdTeXN0ZW0nICYmIHRoaXMuaW5qZWN0b3IuZ2V0KFNFU1NJT05fU0NPUEUpID09PSAndGVuYW50Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdXRvbWF0aWMgYWN0QXMgb25seSB3b3JrcyBpbiB2ZXJzaW9ucyA+PTkuNVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RBcyh7IGlkOiB0aGlzLmluamVjdG9yLmdldChTRVNTSU9OX09SR19JRCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gU0VTU0lPTl9PUkdfSUQgc2V0IGluIGNvbnRhaW5lci4gQXV0b21hdGljIGFjdEFzIGlzIGRpc2FibGVkLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAoKHNlc3Npb246IFNlc3Npb24pID0+IHRoaXMuX2Nsb3VkQXBpU2Vzc2lvbi5uZXh0KHNlc3Npb24pKSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvdWRBcGlBdXRoZW50aWNhdGlvbkVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DbG91ZEFwaUF1dGhlbnRpY2F0aW9uRXJyb3IoKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSBhdXRoZW50aWNhdGlvbiBzbyB0aGF0IGFueSBzdWJzZXF1ZW50IGJhY2tlbmQgY2FsbHMgYXJlIG5vdCBhdXRoZW50aWNhdGVkXG4gICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLmF1dGhlbnRpY2F0aW9uID0gJyc7XG4gICAgICAgIC8vIF9nZXRDbG91ZEFwaVNlc3Npb24gaXMgaW4gdGhlIGNlbnRlciBvZiBhbnkgYmFja2VuZCBjYWxsLCBudWxsaWZ5IGl0IGluIG9yZGVyIG5vdCB0byBwcmV2ZW50IHRob3NlIGNhbGxzXG4gICAgICAgIC8vIHNpbmNlIGl0IGlzIGVhc2llciB0byB0cm91Ymxlc2hvb3QgZmFpbGluZyBiYWNrZW5kIHJhdGhlciB0aGFuIG5vIGNhbGxcbiAgICAgICAgdGhpcy5fZ2V0Q2xvdWRBcGlTZXNzaW9uID0gb2YobnVsbCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBsaW5rc1xuICAgICAgICB0aGlzLl9jbG91ZEFwaVNlc3Npb25MaW5rcy5uZXh0KFtdKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIHNlc3Npb25cbiAgICAgICAgdGhpcy5fY2xvdWRBcGlTZXNzaW9uLm5leHQobnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDbG91ZEFwaVNlc3Npb25MaW5rcyhsaW5rczogTGlua1R5cGVbXSkge1xuICAgICAgICB0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnMgPSBudWxsO1xuICAgICAgICB0aGlzLl9jbG91ZEFwaVNlc3Npb25MaW5rcy5uZXh0KGxpbmtzIHx8IFtdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KGVuZHBvaW50OiBzdHJpbmcsICBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZ2V0PFQ+KHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksIHsuLi5vcHRpb25zfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Q8VD4oZW5kcG9pbnQ6IHN0cmluZywgcXVlcnlCdWlsZGVyPzogUXVlcnkuQnVpbGRlciwgbXVsdGlzaXRlPzogYm9vbGVhbiB8IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pIHtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCk7XG5cbiAgICAgICAgaWYgKHF1ZXJ5QnVpbGRlcikge1xuICAgICAgICAgICAgdXJsID0gYCR7dXJsfSR7cXVlcnlCdWlsZGVyLmdldENsb3VkQVBJKCl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtdWx0aXNpdGUpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KHVybCwgeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyBfbXVsdGlzaXRlOiB0aGlzLnBhcnNlTXVsdGlzaXRlVmFsdWUobXVsdGlzaXRlKSB9KSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uaGVhZGVycykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVycy5hcHBlbmQoXCJfbXVsdGlzaXRlXCIsIHRoaXMucGFyc2VNdWx0aXNpdGVWYWx1ZShtdWx0aXNpdGUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih1cmwsIHsgLi4ub3B0aW9ucyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5nZXQ8VD4odXJsLCB7IC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZVN5bmM8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLnBvc3Q8VD4oXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSxcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlQXN5bmM8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5wb3N0KFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICB7IC4uLm9wdGlvbnMsIG9ic2VydmU6ICdyZXNwb25zZScgfVxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICBjb25jYXRNYXAocmVzcG9uc2UgPT4gdGhpcy5tYXBSZXNwb25zZVRvVGFzayhyZXNwb25zZSwgJ1BPU1QnKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJhbnNmZXJMaW5rPFQ+KGVuZHBvaW50OiBzdHJpbmcsIGl0ZW06IFQsIHRyYW5zZmVyUmVsOiBzdHJpbmcgPSBUUkFOU0ZFUl9MSU5LX1JFTCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wb3N0KHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksIGl0ZW0sIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChyZXM6IEh0dHBSZXNwb25zZTxUICYgTmF2aWdhYmxlPikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJMaW5rczogTGlua1R5cGVbXSA9IHJlcy5oZWFkZXJzLmhhcyhIQVRFT0FTX0hFQURFUilcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VIZWFkZXJIYXRlb2FzTGlua3MocmVzLmhlYWRlcnMuZ2V0KEhBVEVPQVNfSEVBREVSKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtzOiBMaW5rVHlwZVtdID0gcmVzLmJvZHkgPyAocmVzLmJvZHkubGluayB8fCBbXSkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluayA9IFsuLi5oZWFkZXJMaW5rcywgLi4ubGlua3NdXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgobCkgPT4gbC5yZWwgPT09IHRyYW5zZmVyUmVsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBSZXNwb25zZSBmcm9tICR7ZW5kcG9pbnR9IGRpZCBub3QgY29udGFpbiBhIHRyYW5zZmVyIGxpbmtgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRFcnJvclR5cGUuSGF0ZW9hc0xpbmtNaXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5rLmhyZWY7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0VHJhbnNmZXI8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgdHJhbnNmZXJSZWw6IHN0cmluZyA9IFRSQU5TRkVSX0xJTktfUkVMKTogT2JzZXJ2YWJsZTxWY2RUcmFuc2ZlckNsaWVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2ZlckxpbmsoZW5kcG9pbnQsIGl0ZW0sIHRyYW5zZmVyUmVsKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCh0cmFuc2ZlclVybCkgPT4gbmV3IFZjZFRyYW5zZmVyQ2xpZW50KHRoaXMuaHR0cCwgdHJhbnNmZXJVcmwpKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlU3luYzxUPihlbmRwb2ludDogc3RyaW5nLCBpdGVtOiBULCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAucHV0PFQ+KFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICB7IC4uLm9wdGlvbnMgfVxuICAgICAgICAgICAgKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQXN5bmM8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLnB1dChcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQpLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgeyAuLi5vcHRpb25zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH1cbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgY29uY2F0TWFwKHJlc3BvbnNlID0+IHRoaXMubWFwUmVzcG9uc2VUb1Rhc2socmVzcG9uc2UsICdQVVQnKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlU3luYyhlbmRwb2ludDogc3RyaW5nLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZGVsZXRlPHZvaWQ+KHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksIHsgLi4ub3B0aW9ucyB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlQXN5bmMoZW5kcG9pbnQ6IHN0cmluZywgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5kZWxldGUodGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSwgeyAuLi5vcHRpb25zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pKSxcbiAgICAgICAgICAgIGNvbmNhdE1hcChyZXNwb25zZSA9PiB0aGlzLm1hcFJlc3BvbnNlVG9UYXNrKHJlc3BvbnNlLCAnREVMRVRFJykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXBSZXNwb25zZVRvVGFzayhyZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT4sIGh0dHBWZXJiOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG5cbiAgICAgICAgLy9QT1NUIC0gVGFzayBsaW5rIGlzIHJldHVybmVkIGluICdMb2NhdGlvbicgaGVhZGVyXG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmhhcygnTG9jYXRpb24nKSAmJiByZXNwb25zZS5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VGFza1R5cGU+KHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdMb2NhdGlvbicpKTtcbiAgICAgICAgLy9QVVQgLSBUYXNrIGxpbmsgaXMgcmV0dXJuZWQgaW4gJ3gtdm13YXJlLXZjbG91ZC10YXNrLWxvY2F0aW9uJyBoZWFkZXJcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5oZWFkZXJzLmhhcygneC12bXdhcmUtdmNsb3VkLXRhc2stbG9jYXRpb24nKSAmJiByZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VGFza1R5cGU+KHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtdGFzay1sb2NhdGlvbicpKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5ib2R5ICYmIHJlc3BvbnNlLmJvZHkudHlwZS5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi92bmQudm13YXJlLnZjbG91ZC50YXNrKycpKSB7XG4gICAgICAgICAgICBjb25zdCB0YXNrOiBUYXNrVHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IFRhc2tUeXBlKCksIHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRhc2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgIGBBbiBhc3luY2hyb25vdXMgcmVxdWVzdCB3YXMgbWFkZSB0byBbJHtodHRwVmVyYn0gJHtyZXNwb25zZS51cmx9XSwgYnV0IG5vIHRhc2sgd2FzIHJldHVybmVkLiAgVGhlIG9wZXJhdGlvbiBtYXkgc3RpbGwgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWwuYCxcbiAgICAgICAgICAgIENsaWVudEVycm9yVHlwZS5UYXNrTGlua01pc3NpbmdcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEVudGl0eTxUIGV4dGVuZHMgRW50aXR5UmVmZXJlbmNlVHlwZT4oZW50aXR5UmVmOiBFbnRpdHlSZWZlcmVuY2VUeXBlKTogT2JzZXJ2YWJsZTxUPjtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIGdldEVudGl0eTxUIGV4dGVuZHMgRW50aXR5UmVmZXJlbmNlVHlwZT4odXJuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+O1xuICAgIHB1YmxpYyBnZXRFbnRpdHk8VCBleHRlbmRzIEVudGl0eVJlZmVyZW5jZVR5cGU+KGVudGl0eVJlZk9yVXJuOiBFbnRpdHlSZWZlcmVuY2VUeXBlIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVJlc29sdmVyOiBPYnNlcnZhYmxlPEVudGl0eVR5cGU+ID0gdHlwZW9mIGVudGl0eVJlZk9yVXJuID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEVudGl0eVR5cGU+KGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9lbnRpdHkvJHtlbnRpdHlSZWZPclVybn1gKSA6XG4gICAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEVudGl0eVR5cGU+KGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9lbnRpdHkvdXJuOnZjbG91ZDoke2VudGl0eVJlZk9yVXJuLnR5cGV9OiR7ZW50aXR5UmVmT3JVcm4uaWR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gZW50aXR5UmVzb2x2ZXIpLFxuICAgICAgICAgICAgY29uY2F0TWFwKGVudGl0eSA9PiB0aGlzLmh0dHAuZ2V0PFQ+KGAke2VudGl0eS5saW5rWzBdLmhyZWZ9YCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVRhc2sodGFzazogVGFza1R5cGUsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUYXNrVHlwZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZ2V0PFRhc2tUeXBlPih0YXNrLmhyZWYsIHsgLi4ub3B0aW9ucyB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNUYXNrQ29tcGxldGUodGFzazogVGFza1R5cGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFsnc3VjY2VzcycsICdlcnJvcicsICdjYW5jZWxlZCcsICdhYm9ydGVkJ10uaW5kZXhPZih0YXNrLnN0YXR1cykgPiAtMTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlSXRlbShpdGVtOiBOYXZpZ2FibGUsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUYXNrVHlwZT4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsoaXRlbSwgJ3JlbW92ZScsIG51bGwpO1xuICAgICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBDbGllbnRFcnJvcihcbiAgICAgICAgICAgICAgYE5vICdyZW1vdmUnIGxpbmsgZm9yIHNwZWNpZmllZCByZXNvdXJjZS5gLFxuICAgICAgICAgICAgICBDbGllbnRFcnJvclR5cGUuSGF0ZW9hc0xpbmtNaXNzaW5nXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5kZWxldGU8VGFza1R5cGU+KGxpbmsuaHJlZiwgeyAuLi5vcHRpb25zIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBRdWVyeS5CdWlsZGVyIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1aWxkZXIgQW4gZGVmaW5pdGlvbiBvZiB0aGUgcXVlcnkgdG8gY29uc3RydWN0ICh0eXBlLCBmaWx0ZXIsIHBhZ2Ugc2l6ZSwgZXRjLilcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyBhIHF1ZXJ5IHJlc3VsdCBmb3IgdGhlIHNwZWNpZmllZCBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBxdWVyeTxUPihidWlsZGVyOiBRdWVyeS5CdWlsZGVyLCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIFF1ZXJ5LkJ1aWxkZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnVpbGRlciBBbiBkZWZpbml0aW9uIG9mIHRoZSBxdWVyeSB0byBjb25zdHJ1Y3QgKHR5cGUsIGZpbHRlciwgcGFnZSBzaXplLCBldGMuKVxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyBhIHF1ZXJ5IHJlc3VsdCBmb3IgdGhlIHNwZWNpZmllZCBxdWVyeVxuICAgICAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1bmlmaWVkLXNpZ25hdHVyZXNcbiAgICBwdWJsaWMgcXVlcnk8VD4oYnVpbGRlcjogUXVlcnkuQnVpbGRlciwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIHF1ZXJ5PFQ+KGJ1aWxkZXI6IFF1ZXJ5LkJ1aWxkZXIsIG11bHRpc2l0ZT86IGFueSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlQYWdlKGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9xdWVyeSR7YnVpbGRlci5nZXQoKX1gLCBtdWx0aXNpdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBwcm92aWRlZCByZXN1bHQgc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCB0aGUgcmVzdWx0IHNldCB0byByZXRyaWV2ZSB0aGUgZmlyc3QgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gZmFuIHRoZSBxdWVyeSBvdXQgdG8gYWxsIGF2YWlsYWJsZSBzaXRlc1xuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlyc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYm9vbGVhbiwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+O1xuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBwcm92aWRlZCByZXN1bHQgc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCB0aGUgcmVzdWx0IHNldCB0byByZXRyaWV2ZSB0aGUgZmlyc3QgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnVuaWZpZWQtc2lnbmF0dXJlc1xuICAgIHB1YmxpYyBmaXJzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBBdXRob3JpemVkTG9jYXRpb25UeXBlW10sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICBwdWJsaWMgZmlyc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsocmVzdWx0LCAnZmlyc3RQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBDbGllbnRFcnJvcihcbiAgICAgICAgICAgICAgYE5vICdmaXJzdFBhZ2UnIGxpbmsgZm9yIHNwZWNpZmllZCBxdWVyeS5gLFxuICAgICAgICAgICAgICBDbGllbnRFcnJvclR5cGUuSGF0ZW9hc0xpbmtNaXNzaW5nXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5UGFnZShsaW5rLmhyZWYsIG11bHRpc2l0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0ZpcnN0UGFnZTxUPihyZXN1bHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5maW5kTGluayhyZXN1bHQsICdmaXJzdFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBwcmV2aW91cyBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBmYW4gdGhlIHF1ZXJ5IG91dCB0byBhbGwgYXZhaWxhYmxlIHNpdGVzXG4gICAgICogQHJldHVybnMgdGhlIHJlY29yZHMgZm9yIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2aW91c1BhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBwcmV2aW91cyBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSB0aGUgc2V0IG9mIHNpdGUgbG9jYXRpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHF1ZXJ5IGZhbm91dFxuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIHByZXZpb3VzUGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+O1xuICAgIHB1YmxpYyBwcmV2aW91c1BhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBhbnksIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IGxpbms6IExpbmtUeXBlID0gdGhpcy5maW5kTGluayhyZXN1bHQsICdwcmV2aW91c1BhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgICAgICBgTm8gJ3ByZXZpb3VzUGFnZScgbGluayBmb3Igc3BlY2lmaWVkIHF1ZXJ5LmAsXG4gICAgICAgICAgICAgIENsaWVudEVycm9yVHlwZS5IYXRlb2FzTGlua01pc3NpbmdcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVBhZ2UobGluay5ocmVmLCBtdWx0aXNpdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNQcmV2aW91c1BhZ2U8VD4ocmVzdWx0OiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmluZExpbmsocmVzdWx0LCAncHJldmlvdXNQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBuZXh0IHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIG5leHQgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIG5leHRQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIG5leHRQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsocmVzdWx0LCAnbmV4dFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgICAgICBgTm8gJ25leHRQYWdlJyBsaW5rIGZvciBzcGVjaWZpZWQgcXVlcnkuYCxcbiAgICAgICAgICAgICAgQ2xpZW50RXJyb3JUeXBlLkhhdGVvYXNMaW5rTWlzc2luZ1xuICAgICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5UGFnZTxUPihsaW5rLmhyZWYsIG11bHRpc2l0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc05leHRQYWdlPFQ+KHJlc3VsdDogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbmRMaW5rKHJlc3VsdCwgJ25leHRQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBsYXN0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBsYXN0IHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIGxhc3QgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGFzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIGxhc3QgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIGxhc3QgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIGxhc3QgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIGxhc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIGxhc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsocmVzdWx0LCAnbGFzdFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgICAgICBgTm8gJ2xhc3RQYWdlJyBsaW5rIGZvciBzcGVjaWZpZWQgcXVlcnkuYCxcbiAgICAgICAgICAgICAgQ2xpZW50RXJyb3JUeXBlLkhhdGVvYXNMaW5rTWlzc2luZ1xuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVBhZ2UobGluay5ocmVmLCBtdWx0aXNpdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNMYXN0UGFnZTxUPihyZXN1bHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5maW5kTGluayhyZXN1bHQsICdsYXN0UGFnZScsIChyZXN1bHQgYXMgUmVzb3VyY2VUeXBlKS50eXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFF1ZXJ5UGFnZTxUPihocmVmOiBzdHJpbmcsIG11bHRpc2l0ZT86IGFueSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgaWYgKG11bHRpc2l0ZSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4oaHJlZiwgeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyBfbXVsdGlzaXRlOiB0aGlzLnBhcnNlTXVsdGlzaXRlVmFsdWUobXVsdGlzaXRlKSB9KSB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzLmFwcGVuZChcIl9tdWx0aXNpdGVcIiwgdGhpcy5wYXJzZU11bHRpc2l0ZVZhbHVlKG11bHRpc2l0ZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KGhyZWYsIHsgLi4ub3B0aW9ucyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLmdldDxUPihocmVmLCB7IC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdG8gcGVyZm9ybSBhY3Rpb24gYXZhaWxhYmlsaXR5IGNoZWNrIGJlZm9yZSBjYWxsaW5nIHRoZSBBUElcbiAgICogQHBhcmFtIGl0ZW0gLSB0aGUgbmF2aWdhYmxlIGl0ZW0gKGNvbnRhaW5pbmcgbGluayBjb2xsZWN0aW9uKVxuICAgKiBAcGFyYW0gbGlua1JlbFR5cGUgLSB0aGUgbGluayByZWwgdHlwZSwgcGFzcyBlaXRoZXIgTGlua1JlbFR5cGUgb3Igc3RyaW5nXG4gICAqIEBwYXJhbSBlbnRpdHlSZWZUeXBlIC0gdGhlIGVudGl0eSByZWZlcmVuY2UgdHlwZVxuICAgKi9cbiAgICBwdWJsaWMgY2FuUGVyZm9ybUFjdGlvbihpdGVtOiBOYXZpZ2FibGUsIGxpbmtSZWxUeXBlOiBMaW5rUmVsVHlwZSB8IHN0cmluZywgZW50aXR5UmVmVHlwZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbmRMaW5rKGl0ZW0sIGxpbmtSZWxUeXBlLCBlbnRpdHlSZWZUeXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRMaW5rKGl0ZW06IE5hdmlnYWJsZSwgcmVsOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IExpbmtUeXBlIHtcbiAgICAgICAgaWYgKCFpdGVtIHx8ICFpdGVtLmxpbmspIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbS5saW5rLmZpbmQoKGxpbmspID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmsucmVsLmluY2x1ZGVzKHJlbCkgJiYgbGluay50eXBlID09PSB0eXBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbGluay5yZWwuaW5jbHVkZXMocmVsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZU11bHRpc2l0ZVZhbHVlKG11bHRpc2l0ZTogYm9vbGVhbiB8IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbXVsdGlzaXRlID09PSAnYm9vbGVhbicgPyAobXVsdGlzaXRlID8gJ2dsb2JhbCcgOiAnbG9jYWwnKSA6IG11bHRpc2l0ZS5tYXAoc2l0ZSA9PiBzaXRlLmxvY2F0aW9uSWQpLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgY2xvdWRBcGlTZXNzaW9uXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZXNzaW9uKCk6IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5fc2Vzc2lvbk9ic2VydmFibGUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IFNlc3Npb24gb2JzZXJ2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2xvdWRBcGlTZXNzaW9uKCk6IE9ic2VydmFibGU8U2Vzc2lvbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0Q2xvdWRBcGlPbmx5KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLl9jbG91ZEFwaVNlc3Npb25PYnNlcnZhYmxlKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXNlcm5hbWUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICAgICAgICAgIHRoaXMuY2xvdWRBcGlTZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pc0Nsb3VkQXBpTG9naW4pLFxuICAgICAgICAgICAgICAgICAgICBtYXAoc2Vzc2lvbiA9PiBzZXNzaW9uICYmIHNlc3Npb24udXNlciAmJiBzZXNzaW9uLnVzZXIubmFtZSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuX2lzQ2xvdWRBcGlMb2dpbiksXG4gICAgICAgICAgICAgICAgICAgIG1hcChzZXNzaW9uID0+IHNlc3Npb24gJiYgc2Vzc2lvbi51c2VyKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvcmdhbml6YXRpb24oKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICAgICAgdGhpcy5jbG91ZEFwaVNlc3Npb24ucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faXNDbG91ZEFwaUxvZ2luKSxcbiAgICAgICAgICAgICAgICBtYXAoc2Vzc2lvbiA9PiBzZXNzaW9uICYmIHNlc3Npb24ub3JnICYmIHNlc3Npb24ub3JnLm5hbWUpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLl9pc0Nsb3VkQXBpTG9naW4pLFxuICAgICAgICAgICAgICAgIG1hcChzZXNzaW9uID0+IHNlc3Npb24gJiYgc2Vzc2lvbi5vcmcpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGNsb3VkQXBpTG9jYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxvY2F0aW9uKCk6IE9ic2VydmFibGU8QXV0aG9yaXplZExvY2F0aW9uVHlwZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICBtYXAoc2Vzc2lvbiA9PiBzZXNzaW9uLmF1dGhvcml6ZWRMb2NhdGlvbnMubG9jYXRpb24uZmluZChsb2NhdGlvbiA9PiBsb2NhdGlvbi5sb2NhdGlvbklkID09PSBzZXNzaW9uLmxvY2F0aW9uSWQpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2xvdWRBcGlMb2NhdGlvbigpOiBPYnNlcnZhYmxlPEFjY2Vzc2libGVMb2NhdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG91ZEFwaVNlc3Npb24ucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIGNhY2hpbmcgZm9yIGdldHRpbmcgQWNjZXNzaWJsZUxvY2F0aW9uc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnMgPSB0aGlzLl9jbG91ZEFwaVNlc3Npb25MaW5rc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBBY2Nlc3NpYmxlTG9jYXRpb25zIGxpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKGxpbmtzKSA9PiB0aGlzLmZpbmRMaW5rKHsgbGluazogbGlua3MgfSwgJ2Rvd24nLCAnQWNjZXNzaWJsZUxvY2F0aW9ucycpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGZXRjaCBBY2Nlc3NpYmxlTG9jYXRpb25zIGZyb20gdGhlIGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGxpbms6IExpbmtUeXBlKSA9PiBsaW5rID8gdGhpcy5odHRwLmdldDxBY2Nlc3NpYmxlTG9jYXRpb25zPihsaW5rLmhyZWYpIDogb2YobnVsbCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgYXJyYXkgd2l0aCBhbGwgbG9jYXRpb25zICh3aGF0IGlmIHRoZXJlIGFyZSBtYW55IHBhZ2VzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoYWNjZXNzaWJsZUxvY2F0aW9uczogQWNjZXNzaWJsZUxvY2F0aW9ucykgPT4gYWNjZXNzaWJsZUxvY2F0aW9ucyAmJiBhY2Nlc3NpYmxlTG9jYXRpb25zLnZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSwgcmVzZXRPbkVycm9yOiBmYWxzZSwgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSwgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnM7XG4gICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgLy8gTmVlZCB0byBoYXZlIHRoZSBzZXNzaW9uIGluIG9yZGVyIHRvIGdldCBpdHMgbG9jYXRpb25cbiAgICAgICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuY2xvdWRBcGlTZXNzaW9uKSxcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGxvY2F0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBzZXNzaW9uXG4gICAgICAgICAgICBtYXAoKFthY2Nlc3NpYmxlTG9jYXRpb25zLCBzZXNzaW9uXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghYWNjZXNzaWJsZUxvY2F0aW9ucyB8fCAhc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbkxvY2F0aW9uID0gc2Vzc2lvbi5sb2NhdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb25Mb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc2libGVMb2NhdGlvbnMuZmluZChsb2NhdGlvbiA9PiBsb2NhdGlvbi5sb2NhdGlvbklkID09PSBzZXNzaW9uTG9jYXRpb24pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExvY2F0aW9uKHNlc3Npb246IFNlc3Npb25UeXBlKTogQXV0aG9yaXplZExvY2F0aW9uVHlwZSB7XG4gICAgICAgIHJldHVybiBzZXNzaW9uLmF1dGhvcml6ZWRMb2NhdGlvbnMubG9jYXRpb24uZmluZChsb2NhdGlvbiA9PiBsb2NhdGlvbi5sb2NhdGlvbklkID09PSBzZXNzaW9uLmxvY2F0aW9uSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIHRoZSBlbmRwb2ludCB1cmwuIElmIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBhbHJlYWR5IGFuIGFic29sdXRlIFVSTCwgdGhlbiByZXR1cm4gaXQgYXMgaXQgaXMgd2l0aG91dFxuICAgICAqIGFueSBtb2RpZmljYXRpb25zLCBvdGhlcndpc2UgY29uc2lkZXIgaXQgYXMgYSByZWxhdGl2ZSBvbmUgYW5kIHByZXBlbmQgdGhlIGJhc2VVcmwgYXMgZGVmaW5lZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBlbmRwb2ludC5pbmRleE9mKCc6Ly8nKSA+IC0xID8gZW5kcG9pbnQgOiBgJHt0aGlzLl9iYXNlVXJsfS8ke2VuZHBvaW50fWA7XG4gICAgfVxuXG59XG4iXX0=
@@ -1322,8 +1322,13 @@ class VcdApiClient {
1322
1322
  return this.validateRequestContext().pipe(concatMap(() => this.http.delete(this.buildEndpointUrl(endpoint), { ...options, observe: 'response' })), concatMap(response => this.mapResponseToTask(response, 'DELETE')));
1323
1323
  }
1324
1324
  mapResponseToTask(response, httpVerb) {
1325
+ //POST - Task link is returned in 'Location' header
1325
1326
  if (response.headers.has('Location') && response.status === 202) {
1326
1327
  return this.http.get(response.headers.get('Location'));
1328
+ //PUT - Task link is returned in 'x-vmware-vcloud-task-location' header
1329
+ }
1330
+ else if (response.headers.has('x-vmware-vcloud-task-location') && response.status === 200) {
1331
+ return this.http.get(response.headers.get('x-vmware-vcloud-task-location'));
1327
1332
  }
1328
1333
  else if (response.body && response.body.type.startsWith('application/vnd.vmware.vcloud.task+')) {
1329
1334
  const task = Object.assign(new TaskType(), response.body);
@@ -1 +1 @@
1
- {"version":3,"file":"vcd-sdk.mjs","sources":["../../../../projects/vcd/sdk/src/client/query/query.builder.ts","../../../../projects/vcd/sdk/src/client/query/filter.builder.ts","../../../../projects/vcd/sdk/src/client/client/api.result.service.ts","../../../../projects/vcd/sdk/src/common/container-hooks.ts","../../../../projects/vcd/sdk/src/core/plugin.module.ts","../../../../projects/vcd/sdk/src/client/client/logging.interceptor.ts","../../../../projects/vcd/sdk/src/client/client/constants.ts","../../../../projects/vcd/sdk/src/client/jwt/decoded-jwt.ts","../../../../projects/vcd/sdk/src/client/client/request.headers.interceptor.ts","../../../../projects/vcd/sdk/src/client/client/response.normalization.interceptor.ts","../../../../projects/vcd/sdk/src/client/client/vcd.http.client.ts","../../../../projects/vcd/sdk/src/client/client/vcd.transfer.client.ts","../../../../projects/vcd/sdk/src/client/client/types.ts","../../../../projects/vcd/sdk/src/client/client/vcd.api.client.ts","../../../../projects/vcd/sdk/src/main.ts","../../../../projects/vcd/sdk/src/public-api.ts","../../../../projects/vcd/sdk/src/vcd-sdk.ts"],"sourcesContent":["import { Filter } from './filter.builder';\n\n// tslint:disable:variable-name\n// tslint:disable-next-line:no-namespace\nexport namespace Query {\n export class Builder {\n private _type: string;\n private _format: Format = Format.ID_RECORDS;\n private _links = true;\n private _pageSize = 25;\n private _fields: string[];\n private _filter: string;\n private _sort: { field: string, reverse?: boolean }[];\n\n private constructor() { }\n\n public static getBuilder(): Builder {\n return new Builder();\n }\n\n public static ofType(type: string): Builder {\n const qb = new Builder();\n qb._type = type;\n return qb;\n }\n\n public format(format: Query.Format): Builder {\n this._format = format;\n return this;\n }\n\n public links(links: boolean): Builder {\n this._links = links;\n return this;\n }\n\n public pageSize(pageSize: number): Builder {\n this._pageSize = pageSize;\n return this;\n }\n\n public fields(...fields: string[]): Builder {\n this._fields = fields;\n return this;\n }\n\n public filter(filter: string): Builder {\n this._filter = filter;\n return this;\n }\n\n public sort(...sort: { field: string, reverse?: boolean }[]): Builder {\n this._sort = sort;\n return this;\n }\n\n public get(): string {\n let query = `?type=${this._type}&format=${this._format}&links=${this._links}&pageSize=${this._pageSize}`;\n if (this._fields && this._fields.length > 0) {\n query += `&fields=${this._fields.join(',')}`;\n }\n\n if (this._filter) {\n query += `&filter=${this._filter}`;\n }\n\n if (this._sort) {\n this._sort.forEach(s => {\n query += `&${s.reverse ? 'sortDesc' : 'sortAsc'}=${s.field}`;\n });\n }\n\n return query;\n }\n\n public getCloudAPI(): string {\n let query = `?pageSize=${this._pageSize}`;\n\n if (this._filter) {\n query += `&filter=${this._filter}`;\n }\n\n if (this._sort) {\n this._sort.forEach(s => {\n query += `&${s.reverse ? 'sortDesc' : 'sortAsc'}=${s.field}`;\n });\n }\n\n return query;\n }\n }\n\n export class Format {\n static readonly ID_RECORDS: string = 'idrecords';\n static readonly RECORDS: string = 'records';\n static readonly REFERENCES: string = 'references';\n }\n}\n","// tslint:disable-next-line:no-namespace\nexport namespace Filter {\n class Operators {\n public static readonly OR: string = ',';\n public static readonly AND: string = ';';\n public static readonly GT: string = '=gt=';\n public static readonly GE: string = '=ge=';\n public static readonly LT: string = '=lt=';\n public static readonly LE: string = '=le=';\n public static readonly EQ: string = '==';\n public static readonly NEQ: string = '!=';\n }\n\n /**\n * Collection of strategies for wilcard string matching.\n */\n export class MatchMode {\n /**\n * Match the start of a string.\n */\n public static readonly START: string = 'START';\n\n /**\n * Match the end of a string.\n */\n public static readonly END: string = 'END';\n\n /**\n * Match anywhere in the string.\n */\n public static readonly ANYWHERE: string = 'ANYWHERE';\n }\n\n /**\n * A filter item that can define a comparison/condition.\n */\n export interface Property {\n /**\n * Create a filter condition to evaluate whether the property is equal to the specified value.\n *\n * @param value the pattern to evaluate\n * @param moreValues optional additional patterns to evaluate that will be treated as an OR condition\n * @returns an evaluatable filter condition\n */\n equalTo(value: (boolean | number | string), ...moreValues: (boolean | number | string)[]): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is not equal to the specified value.\n *\n * @param value the pattern to evaluate\n * @returns an evaluatable filter condition\n */\n notEqualTo(value: (boolean | number | string)): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is less than the specified value.\n *\n * @param value the pattern to evaluate\n * @returns an evaluatable filter condition\n */\n lessThan(value: number): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is less than or equal to the specified value.\n *\n * @param value the pattern to evaluate\n * @returns an evaluatable filter condition\n */\n lessOrEqualTo(value: number): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is greater than the specified value.\n *\n * @param value the pattern to evaluate\n * @returns an evaluatable filter condition\n */\n greaterThan(value: number): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is greater than or equal to the specified value.\n *\n * @param value the pattern to evaluate\n * @returns an evaluatable filter condition\n */\n greaterOrEqualTo(value: number): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is a wildcard match with the specified value.\n *\n * @param value the pattern to evaluate\n * @param mode the type of wildcard evaluation to perform\n * @returns an evaluatable filter condition\n */\n like(value: string, mode: MatchMode): CompleteCondition;\n }\n\n /**\n * A representation of a condition that is incomplete by itself, like an empty condition, aggregation wrapper, or junction.\n */\n export interface PartialCondition {\n /**\n * Create a simple property to be evaulated as a filter condition.\n *\n * @param property the name of the property\n * @returns a Property instance for defining a filter condition\n */\n is(property: string): Property;\n\n /**\n * Create a conjunction (AND) condition from existing conditions.\n *\n * @param condition1 first condition\n * @param condition2 second condition\n * @param conditionN any additional conditions\n * @returns an evaluatable filter condition\n */\n and(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;\n\n /**\n * Create a disjunction (OR) condition from existing conditions.\n *\n * @param condition1 first condition\n * @param condition2 second condition\n * @param conditionN any additional conditions\n * @returns an evaluatable filter condition\n */\n or(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;\n }\n\n /**\n * An evaluatable filter condition.\n */\n export interface CompleteCondition {\n /**\n * Add a condtion to this condition.\n *\n * This new condition will be ANDed to the existing condition.\n *\n * @returns an incomplete (empty) condition\n */\n and(): PartialCondition;\n\n /**\n * Add a condtion to this condition.\n *\n * This new condition will be ORed to the existing condition.\n *\n * @returns an incomplete (empty) condition\n */\n or(): PartialCondition;\n\n /**\n * Build the FIQL representation of the condition.\n *\n * @returns a FIQL string\n */\n query(): string;\n }\n\n class BuilderChain implements CompleteCondition, PartialCondition, Property {\n private result = '';\n private parent: BuilderChain;\n private currentCompositeOp: string;\n\n constructor(parent?: BuilderChain) {\n this.parent = parent;\n }\n\n public query(): string {\n return this.buildPartial();\n }\n\n public and(): PartialCondition;\n public and(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;\n // tslint:disable-next-line:max-line-length\n public and(condition1?: CompleteCondition, condition2?: CompleteCondition, conditionN?: CompleteCondition[]): PartialCondition | CompleteCondition {\n if (!condition1) {\n return this.simpleAnd();\n }\n\n this.result += '(' + (condition1 as BuilderChain).buildPartial() + Operators.AND + (condition2 as BuilderChain).buildPartial();\n if (conditionN && conditionN.length) {\n conditionN.forEach((condition) => {\n this.result += Operators.AND + (condition as BuilderChain).buildPartial();\n });\n }\n\n this.result += ')';\n return this;\n }\n\n private simpleAnd(): PartialCondition {\n if (this.currentCompositeOp === Operators.OR || this.parent && this.parent.currentCompositeOp === Operators.OR) {\n if (this.parent) {\n this.parent.result = '(' + this.parent.result;\n this.result += ')';\n } else {\n this.wrap();\n }\n\n this.currentCompositeOp = Operators.AND;\n }\n\n this.result += Operators.AND;\n return this;\n }\n\n public or(): PartialCondition;\n public or(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;\n // tslint:disable-next-line:max-line-length\n public or(condition1?: CompleteCondition, condition2?: CompleteCondition, conditionN?: CompleteCondition[]): PartialCondition | CompleteCondition {\n if (!condition1) {\n return this.simpleOr();\n }\n\n this.result += '(' + (condition1 as BuilderChain).buildPartial() + Operators.OR + (condition2 as BuilderChain).buildPartial();\n if (conditionN && conditionN.length) {\n conditionN.forEach((condition) => {\n this.result += Operators.OR + (condition as BuilderChain).buildPartial();\n });\n }\n\n this.result += ')';\n return this;\n }\n\n private simpleOr(): PartialCondition {\n if (this.currentCompositeOp === Operators.AND || (this.parent && this.parent.currentCompositeOp === Operators.AND)) {\n if (this.parent) {\n this.parent.result = '(' + this.parent.result;\n this.result += ')';\n } else {\n this.wrap();\n }\n\n this.currentCompositeOp = Operators.OR;\n }\n\n this.result += Operators.OR;\n return this;\n }\n\n private wrap(): CompleteCondition {\n this.result = '(' + this.result + ')';\n this.currentCompositeOp = null;\n return this;\n }\n\n private buildPartial(): string {\n return (this.parent) ? this.parent.buildPartial() + this.result : this.result;\n }\n\n public is(property: string): Property {\n const builder: BuilderChain = new BuilderChain(this);\n builder.result = property;\n return builder;\n }\n\n public equalTo(value: (boolean | number | string), ...moreValues: (boolean | number | string)[]): CompleteCondition {\n return this.condition(Operators.EQ, value, ...moreValues);\n }\n\n public notEqualTo(value: (boolean | number | string)): CompleteCondition {\n return this.condition(Operators.NEQ, value);\n }\n\n public lessThan(value: number): CompleteCondition {\n return this.condition(Operators.LT, value);\n }\n\n public lessOrEqualTo(value: number): CompleteCondition {\n return this.condition(Operators.LE, value);\n }\n\n public greaterThan(value: number): CompleteCondition {\n return this.condition(Operators.GT, value);\n }\n\n public greaterOrEqualTo(value: number): CompleteCondition {\n return this.condition(Operators.GE, value);\n }\n\n public like(value: string, mode: MatchMode = MatchMode.START): CompleteCondition {\n let wildcardValue: string;\n switch (mode) {\n case MatchMode.START:\n wildcardValue = `${value}*`;\n break;\n case MatchMode.END:\n wildcardValue = `*${value}`;\n break;\n case MatchMode.ANYWHERE:\n wildcardValue = `*${value}*`;\n break;\n default:\n wildcardValue = value;\n break;\n }\n\n return this.condition(Operators.EQ, wildcardValue);\n }\n\n private condition(operator: string, value: any, ...moreValues: any[]): CompleteCondition {\n const name = this.result;\n this.result += operator + encodeURI(value as string);\n if (moreValues.length) {\n moreValues.forEach((next) => {\n this.result += ',' + name + operator + encodeURI(next as string);\n });\n\n this.currentCompositeOp = Operators.OR;\n }\n\n return this;\n }\n }\n\n /**\n * Builds a FIQL search condition using a fluent interface.\n */\n export class Builder implements PartialCondition {\n /**\n * Create a simple property to be evaulated as a filter condition.\n *\n * @param property the name of the property\n * @returns a Property instance for defining a filter condition\n */\n is(property: string): Property {\n return new BuilderChain().is(property);\n }\n\n /**\n * Create a conjunction (AND) condition from existing conditions.\n *\n * @param condition1 first condition\n * @param condition2 second condition\n * @param conditionN any additional conditions\n * @returns an evaluatable filter condition\n */\n and(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition {\n return new BuilderChain().and(condition1, condition2, conditionN);\n }\n\n /**\n * Create a disjunction (OR) condition from existing conditions.\n *\n * @param condition1 first condition\n * @param condition2 second condition\n * @param conditionN any additional conditions\n * @returns an evaluatable filter condition\n */\n or(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition {\n return new BuilderChain().or(condition1, condition2, conditionN);\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n// tslint:disable:variable-name\n@Injectable()\nexport class ApiResultService {\n private _results: ApiResult[] = [];\n public get results(): ApiResult[] {\n return this._results;\n }\n\n add(result: ApiResult) {\n this._results = [result, ...this._results.slice(0, 99)];\n }\n\n clear() {\n this._results = [];\n }\n}\n\nexport class ApiResult {\n private _message: string;\n public get message(): string {\n return this._message;\n }\n\n private _succeeded: boolean;\n public get succeeded(): boolean {\n return this._succeeded;\n }\n\n private _started: Date;\n public get started(): Date {\n return this._started;\n }\n\n private _finished: Date;\n public get finished(): Date {\n return this._finished;\n }\n\n constructor(message: string, succeeded: boolean, started: Date, finished: Date) {\n this._message = message;\n this._succeeded = succeeded;\n this._started = started;\n this._finished = finished;\n }\n}\n","/**\n * This is the currently supported - albeit very minimal - public SDK.\n */\nimport {InjectionToken} from '@angular/core';\nimport {Observable} from 'rxjs';\n\n// Bind straight into the hooks provided by the container.\nif (!(window as any).System || !(window as any).System.registry || !(window as any).System.registry.get) {\n throw new Error('SystemJS registry not found');\n}\n\nlet containerHooks: any = (window as any).System.registry.get('@vcd/common');\nif (!containerHooks) {\n containerHooks = (window as any).System.registry.get('@vcd-ui/common');\n}\n\nif (!containerHooks) {\n throw new Error('VCD UI container hooks not present in SystemJS registry');\n}\n\n/**\n * Wire in as a string. Gives the root URL for API access (for example, the load balancer URL\n * or the single-cell URL).\n */\nexport const API_ROOT_URL: InjectionToken<string> = containerHooks.API_ROOT_URL;\n\n/**\n * Wire in as a string. Gives the root URL for the legacy Flex application.\n */\nexport const FLEX_APP_URL: InjectionToken<string> = containerHooks.API_ROOT_URL;\n\n/**\n * Wire in as a string. Gives the current scope of the VCD-UI. As of current, this will be\n * either 'tenant' for the tenant portal, or 'service-provider' for the service-provider portal.\n */\nexport const SESSION_SCOPE: InjectionToken<string> = containerHooks.SESSION_SCOPE;\n\n/**\n * Wire in as a string. Gives the unique name (not the display name) of the current tenant\n * organization that the VCD-UI is being used for.\n */\nexport const SESSION_ORGANIZATION: InjectionToken<string> = containerHooks.SESSION_ORGANIZATION;\n\n/**\n * Wire in as a string. Gives the UUID identifier of the current tenant\n * organization that the VCD-UI is being used for.\n */\nexport const SESSION_ORG_ID: InjectionToken<string> = containerHooks.SESSION_ORG_ID ? containerHooks.SESSION_ORG_ID : '';\n\n/**\n * Wire in as a string. Gives the full root path for module assets (e.g. images, scripts, text files)\n *\n * ATTENTION!\n * Add || new InjectionToken to workaround the Angular security mechanics which prevent use of injection tokens\n * which potentially are not defiend. The same fix can be applied for the rest tokens if needed.\n */\nexport const EXTENSION_ASSET_URL: InjectionToken<string> = containerHooks.EXTENSION_ASSET_URL || new InjectionToken('EXTENSION_ASSET_URL');\n\n/**\n * Wire in as a string. Gives the Angular 2 route that the module is registered under.\n */\nexport const EXTENSION_ROUTE: InjectionToken<string> = containerHooks.EXTENSION_ROUTE;\n\n/**\n * Wire in as a boolean. True if running under the SDK, false if running in production.\n */\nexport const SDK_MODE: InjectionToken<boolean> = containerHooks.SDK_MODE;\n\n/**\n * Payload for registering a navigation menu entry.\n */\nexport interface ExtensionNavRegistration {\n /**\n * The router path to navigate to when selected.\n */\n path: string;\n\n /**\n * i18 key for name of extension, to be used as text for links\n */\n nameCode: string;\n\n /**\n * i18n key for description of extension, to be used on hover for links\n */\n descriptionCode: string;\n}\n\n/**\n * Dispatch this to the redux store to register a navigation menu.\n */\nexport interface ExtensionNavRegistrationAction {\n payload: ExtensionNavRegistration;\n readonly type: string;\n}\n\nexport type ExtensionNavRegistrationActionCtor = new(payload: ExtensionNavRegistration) => ExtensionNavRegistrationAction;\n\nexport const ExtensionNavRegistrationAction: ExtensionNavRegistrationActionCtor = containerHooks.ExtensionNavRegistrationAction;\n\n/**\n * Inject this to access the authentication token.\n */\nexport interface AuthTokenHolderService {\n /**\n * The authentication token.\n */\n token: string;\n\n /**\n * JWT token\n */\n jwt?: string;\n\n /**\n * JWT token async.\n * \n * This method tracks JWT for changes and emits the latest JWT value.\n * The main use case is when the JWT need to refreshed at runtime,\n * this is handled by Refresh-Access-Token feature.\n * \n * If the JWT needs to be renewed all users of it must obtain the last JWT token.\n */\n jwtAsync?: Observable<string>;\n}\n\nexport const AuthTokenHolderService: AuthTokenHolderService = containerHooks.AuthTokenHolderService;\n\n/**\n * This represents a menu item that can be clicked to perform an action on an entity (e.g. VM).\n */\nexport interface EntityActionExtensionMenuItem {\n /**\n * This is a unique URN identifying the action. This is so the component can be notified which action was requested.\n */\n urn: string;\n\n /**\n * This is the label for the menu item. It is not automatically translated.\n */\n text: string;\n\n /**\n * This is the enabled state for the menu item.\n */\n enabled: boolean;\n\n /**\n * This is the busy state for the menu item.\n */\n busy: boolean;\n}\n\n/**\n * This represents a sub-menu that contains other sub-menus or menu actions.\n */\nexport interface EntityActionExtensionSubmenu {\n /**\n * This is the label for the sub-menu. It is not automatically translated.\n */\n text: string;\n\n /**\n * This is an arbitrary, ordered list of EntityActionMenuItem.\n */\n children: EntityActionExtensionMenuItem[];\n}\n\n/**\n * This represents menu information for an entity action.\n */\nexport type EntityActionExtensionMenuEntry = EntityActionExtensionMenuItem | EntityActionExtensionSubmenu;\n\n/**\n * Every component referenced by an entity action extension point must inherit from this.\n */\n// tslint:disable-next-line:class-name\nexport abstract class _EntityActionExtensionComponent {\n /**\n * This returns is an Observable that defines the menu entry for this component. This is actively bound -\n * the component is able to change it in order to have the menu change (for example, to change busy\n * or enabled states).\n */\n abstract getMenuEntry(entityUrn: string): Observable<EntityActionExtensionMenuEntry>;\n\n /**\n * This field is a method that is called if a menu item is clicked while enabled. It will be called with the menu\n * item's URN and the URN of the entity that the action is being called for (e.g. the URN of the VM being edited).\n * It must return a single-shot (e.g. of, fromPromise or .first) Observable on completion. This Observable returns\n * a single value, refreshRequested. If this is true, the entity being edited will be immediately refreshed.\n * @param menuItemUrn the URN of the clicked menu item\n * @param entityUrnThe URN of the entity that the action is being called for\n */\n abstract performAction(menuItemUrn: string, entityUrn: string): Observable<{ refreshRequested: boolean }>;\n}\nexport const EntityActionExtensionComponent: typeof _EntityActionExtensionComponent = containerHooks.EntityActionExtensionComponent;\n\n// tslint:disable-next-line:class-name\nexport abstract class _WizardExtensionComponent<P, R, E> {\n /**\n * Define method which will be executed by the Extension Point Orchestrator,\n * when certain event is triggered.\n * @param payload - the payload of the request triggered by the Core UI.\n * @param response - the response from the request triggered by the Core UI.\n * @param error - the Core UI will reprot any error that may appear during execution.\n */\n abstract performAction(payload: P, response: R, error: E): void;\n}\n\nexport const WizardExtensionComponent: typeof _WizardExtensionComponent = containerHooks.WizardExtensionComponent;\n\nexport interface WizardExtensionState {\n isValid: boolean;\n}\n\n// tslint:disable-next-line:class-name\nexport abstract class _WizardExtensionWithValidationComponent<P, R, E> extends _WizardExtensionComponent<P, R, E> {\n /**\n * Get extension point state.\n */\n abstract getState(): Observable<WizardExtensionState>;\n}\n\n// tslint:disable-next-line:max-line-length\nexport const WizardExtensionWithValidationComponent: typeof _WizardExtensionWithValidationComponent = containerHooks.WizardExtensionWithValidationComponent;\n\n/**\n * Every component-based Extension Point that is renderd in Cloud Director UI Entity Details\n * must extend that class to obtain context about the Entity.\n * \n * See comments of the methods of the abstract class for more information.\n */\n// tslint:disable-next-line:class-name\nexport abstract class _WizardExtensionWithContextComponent<P, R, E> extends _WizardExtensionComponent<P, R, E> {\n /**\n * Define method which will be executed on init and information\n * about context object will be passed to the Extension Point.\n * \n * @param context reference to the context object.\n */\n abstract onContext(context: string): void;\n}\n\n// tslint:disable-next-line:max-line-length\nexport const WizardExtensionWithContextComponent: typeof _WizardExtensionWithContextComponent = containerHooks.WizardExtensionWithContextComponent;\n","import { Store } from '@ngrx/store';\nimport { ExtensionNavRegistration, ExtensionNavRegistrationAction } from '../common';\nimport {InjectionToken} from \"@angular/core\";\nimport {HttpInterceptor} from \"@angular/common/http\";\n\nexport class PluginModule {\n\n constructor(private appStore: Store<any>) {\n }\n\n protected registerExtension(extension: ExtensionNavRegistration): void {\n this.appStore.dispatch(new ExtensionNavRegistrationAction(extension));\n }\n}\n\n/**\n * Config object that is passed on VcdSdkModule init\n * using .forRoot() method. It can be used to store\n * configutration properties that are later used by the Services\n * provided.\n */\nexport class VcdSdkConfig {\n apiVersion: string;\n}\n\n/**\n * Use this token for injecting custom HttpInterceptor implementations inside the HttpClient\n */\nexport const VCD_HTTP_INTERCEPTORS = new InjectionToken<HttpInterceptor[]>(\"VCD_HTTP_INTERCEPTORS\")\n","import { Injectable, Optional } from '@angular/core';\nimport {\n HttpEvent, HttpInterceptor, HttpHandler,\n HttpRequest, HttpResponse\n} from '@angular/common/http';\n\nimport { Observable } from 'rxjs';\nimport { finalize, tap } from 'rxjs/operators';\nimport { ApiResultService, ApiResult } from './api.result.service';\n\n// tslint:disable:variable-name\n@Injectable()\nexport class LoggingInterceptor implements HttpInterceptor {\n private _outputToConsole: boolean;\n private _enabled = false;\n set enabled(enabled: boolean) {\n this._enabled = enabled;\n if (this._enabled && this._outputToConsole) {\n console.warn('API logging enabled but no provider found for ApiResultService. Results will be output to the console.');\n }\n }\n\n constructor(@Optional() private apiResultService: ApiResultService) {\n this._outputToConsole = !this.apiResultService;\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n if (!this._enabled) {\n return next.handle(req);\n }\n\n const started = new Date();\n let succeeded: boolean;\n\n return next.handle(req)\n .pipe(\n tap(\n event => succeeded = event instanceof HttpResponse ? true : false,\n error => succeeded = false\n ),\n finalize(() => {\n if (this._outputToConsole) {\n console.log(`${req.method} ${req.urlWithParams} completed in ${Date.now() - started.getTime()} ms. Success: ${succeeded}`);\n } else {\n this.apiResultService.add(new ApiResult(`${req.method} ${req.urlWithParams}`, succeeded, started, new Date()));\n }\n })\n );\n }\n}\n","/**\n * HTTP Headers\n */\nexport const HTTP_HEADERS = Object.freeze({\n\n Authorization: 'Authorization',\n\n etag: 'etag',\n\n // Angular is dealing with case sensitive links despite the specification\n // https://github.com/angular/angular/issues/6142\n link: 'link',\n Link: 'Link',\n\n x_vcloud_authorization: 'x-vcloud-authorization'\n});\n","/*\n * Copyright (c) 2025-2025 Broadcom. All Rights Reserved. Broadcom Confidential. The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n */\n\nexport class DecodedJwt {\n header: Record<string, any>;\n payload: Record<string, any>;\n signature: string;\n\n constructor(private rawToken: string) {\n const parts = rawToken.split(\".\");\n if (parts.length !== 3) {\n throw new Error(`Invalid JWT format: '${rawToken}'`);\n }\n\n this.header = this.decodeBase64Url(parts[0]);\n this.payload = this.decodeBase64Url(parts[1]);\n this.signature = parts[2];\n }\n\n private decodeBase64Url(base64Url: string): Record<string, any> {\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const json = decodeURIComponent(Array.prototype.map.call(atob(base64), escapeMultibyteCharacter).join(\"\"));\n return JSON.parse(json);\n }\n\n isExpired(): boolean {\n const OFFSET_SECONDS = 60;\n const exp = this.payload[\"exp\"] || 0;\n const current = Math.floor(Date.now() / 1000) + OFFSET_SECONDS;\n return current >= exp;\n }\n\n toJSON(): Record<string, any> {\n return {\n header: this.header,\n payload: this.payload,\n signature: this.signature,\n };\n }\n}\n\nfunction escapeMultibyteCharacter(c: string): string {\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n}\n","import { Injectable } from '@angular/core';\nimport { HttpHandler, HttpInterceptor, HttpRequest, HttpEvent, HttpHeaders, HttpResponse } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { filter, first, map, switchMap } from 'rxjs/operators';\nimport { parseHeaderHateoasLinks } from '.';\nimport { HTTP_HEADERS } from './constants';\nimport { AuthTokenHolderService } from \"../../common\";\nimport { DecodedJwt } from \"../jwt/decoded-jwt\";\n\n// tslint:disable:variable-name\n@Injectable()\nexport class RequestHeadersInterceptor implements HttpInterceptor {\n private _enabled = true;\n set enabled(_enabled: boolean) {\n this._enabled = _enabled;\n }\n\n private _actAs: string;\n set actAs(_actAs: string) {\n this._actAs = _actAs;\n }\n \n private _actAsOrgName: string;\n set actAsOrgName(_actAsOrgName: string) {\n this._actAsOrgName = _actAsOrgName;\n }\n\n private _version = '';\n get version(): string {\n return this._version;\n }\n set version(_version: string) {\n this._version = _version;\n }\n\n private _authenticationHeader: string = HTTP_HEADERS.Authorization;\n private _authentication: string;\n set authentication(_authentication: string) {\n this._authentication = _authentication;\n this._authenticationHeader = (this._authentication && this._authentication.length > 32) ?\n HTTP_HEADERS.Authorization : HTTP_HEADERS.x_vcloud_authorization;\n }\n\n constructor(\n private authTokenHolderService: AuthTokenHolderService,\n ) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n let headers = req.headers;\n\n if (!headers.has('Accept')) {\n headers = this.setAcceptHeader(headers);\n }\n\n if (!headers.has('Content-Type')) {\n headers = this.setContentTypeHeader(headers, req.url);\n }\n\n if (this._authentication && !headers.has(HTTP_HEADERS.Authorization)) {\n headers = headers.set(this._authenticationHeader, this._authentication);\n }\n\n /**\n * Covers the case where the User set the ActAs token himself\n */\n if (!headers.has('X-VMWARE-VCLOUD-TENANT-CONTEXT') && this._actAs) {\n headers = headers.set('X-VMWARE-VCLOUD-TENANT-CONTEXT', this._actAs);\n }\n\n /**\n * Covers the case where the User set the ActAs token himself\n */\n if (!headers.has('X-VMWARE-VCLOUD-AUTH-CONTEXT') && this._actAsOrgName) {\n headers = headers.set('X-VMWARE-VCLOUD-AUTH-CONTEXT', this._actAsOrgName);\n }\n\n const customReq: HttpRequest<any> = req.clone({\n headers\n });\n return this.updateToken().pipe(\n map((jwt) => {\n const doesItUseJWT = (this._authentication && this._authentication.length > 32);\n if (doesItUseJWT) {\n this._authentication = `Bearer ${jwt}`;\n }\n return customReq.clone({ setHeaders: { [this._authenticationHeader]: this._authentication } });\n }),\n switchMap((clonedRequest) => this.handleRequest(next, clonedRequest)),\n );\n }\n\n private handleRequest(next: HttpHandler, clonedRequest: HttpRequest<any>) {\n return next.handle(clonedRequest).pipe(\n map((res: HttpEvent<any>) => {\n if (res instanceof HttpResponse) {\n if (!res.body || !res.headers) {\n return res;\n }\n\n if (res.headers.has(HTTP_HEADERS.link)) {\n res.body.link = parseHeaderHateoasLinks(res.headers.get(HTTP_HEADERS.link));\n }\n\n if (res.headers.has(HTTP_HEADERS.Link)) {\n res.body.link = parseHeaderHateoasLinks(res.headers.get(HTTP_HEADERS.Link));\n }\n\n if (res.headers.has(HTTP_HEADERS.etag)) {\n res.body.etag = res.headers.get(HTTP_HEADERS.etag);\n }\n }\n return res;\n })\n );\n }\n\n private setAcceptHeader(headers: HttpHeaders): HttpHeaders {\n const value = headers.get('_multisite');\n headers = headers.delete('_multisite');\n\n return headers.set(\n 'Accept', [\n `application/*+json;version=${this._version}${value ? `;multisite=${value}` : ''}`,\n `application/json;version=${this._version}${value ? `;multisite=${value}` : ''}`\n ]\n );\n }\n\n private setContentTypeHeader(headers: HttpHeaders, url: string): HttpHeaders {\n if (url.indexOf('cloudapi') > -1) {\n return headers.set('Content-Type', 'application/json');\n } else {\n return headers.set('Content-Type', 'application/*+json');\n }\n }\n\n private updateToken(): Observable<string> {\n if (!this.authTokenHolderService.jwtAsync) {\n return of(this.authTokenHolderService.jwt);\n }\n\n return this.authTokenHolderService.jwtAsync.pipe(\n filter((jwt) => !this.isExpired(jwt)),\n first(),\n )\n }\n\n private isExpired(jwt: string): boolean {\n const decodedJwt = new DecodedJwt(jwt);\n return decodedJwt.isExpired();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http';\n\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n// tslint:disable:jsdoc-format\n/**\n * An interceptor on the response chain that normalizes differences in\n * JSON payloads between vCloud Director version 9.1 and versions\n * greater than 9.1.\n *\n * In 9.1 (API version 30.0) the server serializes JSON and nests the payload in a value field:\n * ```\n {\n \"name\" : \"{http://www.vmware.com/vcloud/versions}SupportedVersions\",\n \"declaredType\" : \"com.vmware.vcloud.api.rest.schema.versioning.SupportedVersionsType\",\n \"scope\" : \"javax.xml.bind.JAXBElement$GlobalScope\",\n \"value\" : {\n \"versionInfo\" : [],\n \"any\" : [],\n \"otherAttributes\" : {}\n }\n }\n ```\n *\n * That same request in API versions 31.0 and above is represented as:\n * ```\n {\n \"versionInfo\" : [],\n \"any\" : [],\n \"otherAttributes\" : {}\n }\n ```\n * This interceptor should process responses before any other interceptors that rely\n * on consistent API information.\n */\n@Injectable()\nexport class ResponseNormalizationInterceptor implements HttpInterceptor {\n private static readonly QUERY_RESULT_TYPE = 'com.vmware.vcloud.api.rest.schema_v1_5.QueryResultRecordsType';\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n return next.handle(req).pipe(\n map(response => {\n // While this condition seems awfully specific, the alternative option of examining the 'Content-Type'\n // response header for 'version=30.0' proved to be an unreliable condition in at least one case;\n // returning the same JSON payload as API versions >= 31.0.\n if (response instanceof HttpResponse && response.body && response.body.value && response.body.declaredType && response.body.scope) {\n const body = response.body.value;\n if (response.body.declaredType === ResponseNormalizationInterceptor.QUERY_RESULT_TYPE) {\n body.record = body.record.map(record => record.value);\n }\n\n return response.clone({ body });\n }\n\n return response;\n })\n );\n }\n}\n","import {HttpBackend, HttpClient, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {Inject, Injectable, Optional} from '@angular/core';\nimport {Observable} from 'rxjs';\nimport {LoggingInterceptor} from './logging.interceptor';\nimport {RequestHeadersInterceptor} from './request.headers.interceptor';\nimport {ResponseNormalizationInterceptor} from './response.normalization.interceptor';\nimport {VCD_HTTP_INTERCEPTORS} from \"../../core\";\n\n/**\n * Angular's HttpInterceptorHandler is not publicly exposed. This is a clone of it.\n */\nclass VcdHttpInterceptorHandler implements HttpHandler {\n constructor(private next: HttpHandler, private interceptor: HttpInterceptor) {}\n\n handle(req: HttpRequest<any>): Observable<HttpEvent<any>> {\n return this.interceptor.intercept(req, this.next);\n }\n}\n\n/**\n * This is a specialist subclass of HttpClient. The HttpClient that is defined/imported\n * by HttpClientModule is a singleton from the container, meaning that all extensions would\n * get the same one. We sub-class it so that each extension gets their own instance.\n * Extension consumers should inject this.\n * @see HttpClient\n */\n@Injectable()\nexport class VcdHttpClient extends HttpClient {\n /**\n * Provide access to the logging interceptor for enabling/disabling and configuring.\n */\n readonly loggingInterceptor: LoggingInterceptor;\n\n /**\n * Provide access to the headers interceptor for enabling/disabling and configuring.\n */\n readonly requestHeadersInterceptor: RequestHeadersInterceptor;\n\n /**\n * Create an HttpClient with the logging and header interceptors in the chain.\n * @param httpBackend backend (likely injected from HttpClientModule)\n * @param loggingInterceptor the logging interceptor\n * @param requestHeadersInterceptor the request header interceptor\n * @param responseNormalizationInterceptor\n * @param customInterceptors\n */\n constructor(httpBackend: HttpBackend,\n loggingInterceptor: LoggingInterceptor,\n requestHeadersInterceptor: RequestHeadersInterceptor,\n responseNormalizationInterceptor: ResponseNormalizationInterceptor,\n @Optional() @Inject(VCD_HTTP_INTERCEPTORS) private customInterceptors: HttpInterceptor[],\n ) {\n const interceptors: HttpInterceptor[] = [\n loggingInterceptor,\n requestHeadersInterceptor,\n responseNormalizationInterceptor,\n ...(customInterceptors ?? []),\n ];\n const chain = interceptors.reduceRight(\n (next, interceptor) => new VcdHttpInterceptorHandler(next, interceptor),\n httpBackend\n );\n super(chain);\n this.loggingInterceptor = loggingInterceptor;\n this.requestHeadersInterceptor = requestHeadersInterceptor;\n }\n}\n","import {HttpHeaders, HttpResponse} from '@angular/common/http';\nimport {Observable, Observer, throwError} from 'rxjs';\nimport {catchError, expand, flatMap, last, map, reduce, retry, switchMap, tap} from 'rxjs/operators';\nimport {VcdHttpClient} from './vcd.http.client';\n\n/**\n * Default chunk size is 50MiB. This is equal to the chunk size the VCD UI uses for library uploads.\n */\nexport const MAX_CHUNK_SIZE = 50 * 1024 * 1024;\n\n/**\n * How many times to retry a chunk upload.\n */\nexport const MAX_CHUNK_RETRY_COUNT = 5;\n\n/**\n * Details about a completed file transfer.\n */\nexport interface TransferResult {\n /**\n * Filename being transferred.\n */\n filename: string|'<blob>';\n\n /**\n * URL being used for the transfer.\n */\n transferUrl: string;\n\n /**\n * How many retries in total were required\n */\n retryCount: number;\n\n /**\n * The number of chunks that have been sent.\n */\n chunksSent: number;\n\n /**\n * How many bytes have been sent.\n */\n bytesSent: number;\n\n /**\n * How many milliseconds that have elapsed since starting the transfer.\n */\n timeTakenMs: number;\n}\n\n/**\n * Details about a file transfer in progress.\n */\nexport interface TransferProgress {\n /**\n * Filename being transferred.\n */\n filename: string|'<blob>';\n\n /**\n * URL being used for the transfer.\n */\n transferUrl: string;\n\n /**\n * The current retry number for the current chunk.\n */\n retryNumber: number;\n\n /**\n * The number of retries in total.\n */\n retryCount: number;\n\n /**\n * The number of chunks that have been sent.\n */\n chunksSent: number;\n\n /**\n * The number of chunks remaining.\n */\n chunksRemaining: number;\n\n /**\n * How many bytes have been sent.\n */\n bytesSent: number;\n\n /**\n * How many bytes remaining to be sent.\n */\n bytesRemaining: number;\n\n /**\n * Percentage completion.\n */\n percent: number;\n\n /**\n * How many milliseconds that have elapsed since starting the transfer.\n */\n timeTakenMs: number;\n\n /**\n * Naive estimate of time remaining. This is not scientific at all - a simple linear extrapolation.\n */\n estimatedTimeRemainingMs: number;\n}\n\n/**\n * A special error thrown by the transfer client. It gives access to the causing error, and the final progress\n * before the error occurred.\n */\nexport class TransferError extends Error {\n constructor(message: string, readonly originalError: any, readonly lastProgress: TransferProgress) {\n super(message);\n }\n}\n\n/**\n * This is used to upload files to a VCD API transfer URL. It is not suggested to create this class - instead\n * use the startTransfer method in VcdApiClient.\n */\nexport class VcdTransferClient {\n /**\n * Create a transfer client.\n * @param httpClient the http client to be used\n * @param transferUrl the URL to upload to\n */\n constructor(public httpClient: VcdHttpClient, public transferUrl: string,\n public maxChunkSize = MAX_CHUNK_SIZE, public maxChunkRetryCount = MAX_CHUNK_RETRY_COUNT) {\n }\n\n /**\n * Upload data, optionally listening for progress updates.\n * @param source what to upload.\n * @param progressObserver (optional) this will get progress notifications during the upload\n * @returns fetails of the finished upload.\n * @throws TransferError when a chunk upload fails.\n */\n upload(source: Blob|File, progressObserver?: Observer<TransferProgress>): Observable<TransferResult> {\n // Cache the client and url so they don't change from under us.\n const {httpClient, transferUrl, maxChunkSize, maxChunkRetryCount} = this;\n\n // Compute static information used through the upload.\n const filename = (source as File).name || '<blob>';\n const totalChunks = Math.ceil(source.size / maxChunkSize);\n const totalBytes = source.size;\n const startTimeMs = new Date().getTime();\n let retryCount = 0;\n\n // This helper function creates a TransferProgress object for sending to the progressObserver.\n // It relies on the above static information, hence being nested.\n function createTransferProgress(retryNumber: number, rtryCount: number, chunksSent: number): TransferProgress {\n const chunksRemaining = totalChunks - chunksSent;\n const bytesSent = Math.min(chunksSent * maxChunkSize, totalBytes);\n const bytesRemaining = totalBytes - bytesSent;\n const percent = bytesSent / totalBytes * 100;\n const timeTakenMs = new Date().getTime() - startTimeMs;\n const estimatedTotalTimeMs = (bytesSent / bytesRemaining) * timeTakenMs;\n const estimatedTimeRemainingMs = Math.max(estimatedTotalTimeMs - timeTakenMs, 0);\n return {\n filename, transferUrl, retryNumber, retryCount: rtryCount,\n chunksSent, chunksRemaining, bytesSent, bytesRemaining,\n percent, timeTakenMs, estimatedTimeRemainingMs\n };\n }\n\n // This is the main chunk upload function\n function transferChunk(chunkIndex: number): Observable<HttpResponse<any>> {\n // Calculate chunk details.\n const chunkStart = chunkIndex * maxChunkSize;\n const chunkEnd = Math.min(chunkStart + maxChunkSize, totalBytes);\n const contentRangeHeader = `bytes ${chunkStart}-${chunkEnd - 1}/${totalBytes}`;\n\n // Dispatch progress\n if (progressObserver) {\n const progress = createTransferProgress(0, retryCount, chunkIndex);\n progressObserver.next(progress);\n }\n\n // Read in the chunk\n return Observable.create(observer => {\n const chunkSlice: Blob = source.slice(chunkStart, chunkEnd);\n const fileReader = new FileReader();\n fileReader.onerror = err => {\n observer.error(err);\n };\n fileReader.onabort = err => {\n observer.error(err);\n };\n fileReader.onload = () => {\n };\n fileReader.onloadend = () => {\n observer.next(fileReader.result);\n observer.complete();\n };\n\n return fileReader.readAsArrayBuffer(chunkSlice);\n\n // Transfer the chunk\n }).pipe(\n // Upon read error, abort the upload process. No point retrying read failures.\n catchError((e) => {\n // Abandon the upload and propagate a consumable error.\n const progress = createTransferProgress(0, retryCount, chunkIndex);\n return throwError(() => new TransferError('Read error', e, progress));\n }),\n\n // Upon successful read, transfer the chunk.\n switchMap((data) => {\n let retryNumber = 0;\n return httpClient.put(\n transferUrl, data,\n {\n headers: new HttpHeaders({\n 'Content-Range': contentRangeHeader\n }),\n responseType: 'text'\n }\n ).pipe(\n // This is called upon any chunk upload failure.\n catchError((e) => {\n // Increase the total retry count.\n retryCount++;\n\n // Increase the current chunk retry number.\n retryNumber++;\n\n // Dispatch progress (the retry information has changed).\n if (progressObserver) {\n const progress = createTransferProgress(retryNumber, retryCount, chunkIndex);\n progressObserver.next(progress);\n }\n\n // Rethrow the error so that the \"retry\" call handles it.\n return throwError(() => e);\n }),\n\n // Retry the chunk upload up to the limit - this will run the entire chain again.\n retry(maxChunkRetryCount),\n\n // This is called when all retries for the chunk are exhausted.\n catchError((e) => {\n // Abandon the upload and propagate a consumable error.\n const progress = createTransferProgress(retryNumber, retryCount, chunkIndex);\n return throwError(() => new TransferError('Transfer error', e, progress));\n })\n );\n })\n );\n }\n\n // This creates the final transfer progress, dispatches it, and returns the transfer result.\n function finishUpload(): TransferResult {\n const transferProgress = createTransferProgress(0, retryCount, totalChunks);\n if (progressObserver) {\n progressObserver.next(transferProgress);\n progressObserver.complete();\n }\n\n const transferResult: TransferResult = {\n filename: transferProgress.filename,\n transferUrl: transferProgress.transferUrl,\n retryCount: transferProgress.retryCount,\n chunksSent: transferProgress.chunksSent,\n bytesSent: transferProgress.bytesSent,\n timeTakenMs: transferProgress.timeTakenMs\n };\n return transferResult;\n }\n\n // Upload all of the chunks\n let chain = transferChunk(0);\n for (let currentChunk = 1; currentChunk < totalChunks; currentChunk++) {\n chain = chain.pipe(\n flatMap(() => transferChunk(currentChunk))\n );\n }\n\n // Finish transfer\n return chain.pipe(map(finishUpload));\n }\n}\n","export class ClientError extends Error {\n constructor(\n public override message: string,\n public type: ClientErrorType) {\n super(message);\n }\n}\n\nexport enum ClientErrorType{\n HateoasLinkMissing = \"HateoasLinkMissing\",\n TaskLinkMissing = \"TaskLinkMissing\",\n}\n","import {Injectable, Injector, Optional} from '@angular/core';\nimport {HttpHeaders, HttpResponse} from '@angular/common/http';\nimport {BehaviorSubject, merge, Observable, of, ReplaySubject, throwError} from 'rxjs';\nimport {catchError, concatMap, filter, map, share, skipWhile, switchMap, tap, withLatestFrom} from 'rxjs/operators';\nimport {\n AuthorizedLocationType,\n EntityReferenceType,\n EntityType,\n LinkType,\n ResourceType,\n SessionType,\n TaskType\n} from '@vcd/bindings/vcloud/api/rest/schema_v1_5';\nimport {SupportedVersionsType} from '@vcd/bindings/vcloud/api/rest/schema/versioning';\nimport {AccessibleLocation, AccessibleLocations, Session} from '../openapi';\nimport {Query} from '../query/index';\nimport {API_ROOT_URL, AuthTokenHolderService, SESSION_ORG_ID, SESSION_SCOPE} from '../../common/container-hooks';\nimport {VcdHttpClient} from './vcd.http.client';\nimport {VcdTransferClient} from './vcd.transfer.client';\nimport {HTTP_HEADERS} from './constants';\nimport {VcdSdkConfig} from \"../../core/plugin.module\";\nimport {ClientError, ClientErrorType} from \"./types\";\n\nexport const TRANSFER_LINK_REL = 'upload:default';\nexport type Navigable = ResourceType | { link?: LinkType[] };\n\nexport const HATEOAS_HEADER = 'Link';\n\n// tslint:disable:variable-name\n\n/**\n * Parse out Link headers using a very lazily implemented pull parser\n * @param header '<url1>;name1=\"value1\",name2=\"value2\",<url2>;name3=\"value3,value4\"'\n * @returns parsed link headers\n */\nexport function parseHeaderHateoasLinks(header: string): LinkType[] {\n const results: LinkType[] = [];\n\n if (!header) {\n return results;\n }\n\n const headerFieldMappings: {[key: string]: keyof LinkType} = {\n href: 'href',\n model: 'type',\n title: 'id',\n rel: 'rel'\n };\n let tokenIndex = -1;\n\n function peek(token: string) {\n return header.indexOf(token, tokenIndex + 1);\n }\n\n function next(token: string) {\n const nextIndex = peek(token);\n if (nextIndex === -1) {\n throw new Error(JSON.stringify({header, token, tokenIndex}));\n }\n tokenIndex = nextIndex;\n return tokenIndex;\n }\n\n while (peek('<') > -1) {\n try {\n const hrefStart = next('<');\n const hrefEnd = next('>');\n const href = header.substring(hrefStart + 1, hrefEnd);\n const result: LinkType = {href, type: null, id: null, rel: null, vCloudExtension: []};\n let comma = peek(',');\n let semicolon = peek(';');\n while ((semicolon > -1 && comma > -1 && semicolon < comma) || (semicolon > -1 && comma === -1)) {\n const nameStart = next(';');\n const nameEnd = next('=');\n const name = header.substring(nameStart + 1, nameEnd).trim().toLowerCase();\n const valueStart = next('\"');\n const valueEnd = next('\"');\n const value = header.substring(valueStart + 1, valueEnd);\n const mappedName = headerFieldMappings[name];\n if (mappedName) {\n // @ts-ignore\n result[mappedName] = decodeURIComponent(value) as any;\n }\n comma = peek(',');\n semicolon = peek(';');\n }\n results.push(result);\n } catch (error) { // We will try the next one...\n console.log(error);\n }\n }\n\n return results;\n}\n\nexport enum LinkRelType {\n add = 'add',\n remove = 'remove',\n edit = 'edit',\n}\n\n/**\n * A basic client for interacting with the VMware Cloud Director APIs.\n *\n * A VMware Cloud Director plugin can get a reference to this client by using angular injection.\n * ```\n * constructor(private vcdApi: VcdApiClient) {}\n * ```\n *\n * VcdApiClient reuses the authentication from the VCD platform so in general there is\n * no need of an explicit authentication/login.\n *\n * When dealing with the session management there are two APIs:\n * 1. Deprecated legacy API that is using the `api/session` endpoint and the corresponding models\n * 2. Newly added API that is using the `cloudapi` endpoint and the corresponding models\n *\n * Note that if a plugin performs an explicit cloud api authentication call through\n * {@link VcdApiClient#setCloudApiAuthentication} or {@link VcdApiClient#cloudApiLogin}\n * from that moment on the VcdApiClient uses only cloud api session management.\n * This means calls to {@link VcdApiClient#setAuthentication} or {@link VcdApiClient#login} have no effect.\n */\n@Injectable()\nexport class VcdApiClient {\n set baseUrl(_baseUrl: string) {\n this._baseUrl = _baseUrl;\n }\n\n get version(): string {\n return this.http.requestHeadersInterceptor.version;\n }\n\n private _negotiateVersion: Observable<string>;\n private _baseUrl: string;\n\n /**\n * @deprecated Use {@link VcdApiClient#_cloudApiSession}\n */\n private _session: BehaviorSubject<SessionType> = new BehaviorSubject<SessionType>(null);\n private _sessionObservable: Observable<SessionType> = this._session.asObservable()\n .pipe(\n skipWhile(session => !session)\n );\n private _getSession: Observable<SessionType>;\n\n /**\n * CloudApi Session\n */\n private _cloudApiSession: BehaviorSubject<Session> = new BehaviorSubject<Session>(null);\n private _cloudApiSessionObservable: Observable<Session> = this._cloudApiSession.asObservable()\n .pipe(\n skipWhile(session => !session)\n );\n /**\n * This observable has a special purpose when doing automatic login during the constructor initialization.\n * It allows backend call only after an API version is set.\n * It also ensures that a backend call to get the current session is done once prior to any other calls.\n *\n * In case of an explicit cloud api auth request there is no need of this observable\n * since this auth request will retrieve the session itself\n */\n private _getCloudApiSession: Observable<Session>;\n\n private _cloudApiSessionLinks: BehaviorSubject<LinkType[]> = new BehaviorSubject<LinkType[]>([]);\n\n /**\n * Cached, lazy loaded observable of the AccessibleLocation array\n */\n private _cloudApiAccessibleLocations: Observable<AccessibleLocation[]>;\n\n /**\n * This property determines if it is an explicit cloud api login.\n * In this case the old API (/api/session) should not be used at all.\n */\n private _isCloudApiLogin = false;\n\n constructor(\n private http: VcdHttpClient,\n private injector: Injector,\n @Optional() private config?: VcdSdkConfig,\n ) {\n this._baseUrl = this.injector.get(API_ROOT_URL);\n\n let negotiatedVersion: Observable<string>;\n if (this.config?.apiVersion) {\n negotiatedVersion = of(this.config.apiVersion).pipe(\n map((version) => {\n this.setVersion(version);\n return version;\n })\n );\n } else {\n negotiatedVersion = this.http.get<SupportedVersionsType>(`${this._baseUrl}/api/versions`).pipe(\n map(versions => this.negotiateVersion(versions)),\n tap(version => this.setVersion(version))\n );\n }\n this._negotiateVersion = negotiatedVersion.pipe(\n share({ connector: () => new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })\n );\n\n const tokenHolder: AuthTokenHolderService = this.injector.get(AuthTokenHolderService, { token: '' });\n const token = tokenHolder.jwt ? `Bearer ${tokenHolder.jwt}` : tokenHolder.token;\n this._getSession = this.setAuthentication(token)\n .pipe(\n share({ connector: () => new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })\n );\n\n this._getCloudApiSession = this.setCloudApiAuthentication(token)\n .pipe(\n share({ connector: () => new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })\n );\n // This is not an explicit cloud api login\n this._isCloudApiLogin = false;\n }\n\n private negotiateVersion(serverVersions: SupportedVersionsType): string {\n const supportedVersions: string[] = serverVersions.versionInfo.map(versionInfo => versionInfo.version);\n\n // Default API Version used is the Latest API Version in VMware Cloud Director\n return supportedVersions[supportedVersions.length - 1];\n }\n\n /**\n * The purpose of this function is to ensure that prior to sending any call to the backend\n * the version has been set and the current session has been retrieved.\n * Note that this is important during the automatic authentication that is done during the\n * constructor initialization, when the plugin is not required to perform its own explicit authentication\n * but rather the ones from the underlying framework is used.\n */\n private validateRequestContext(): Observable<true> {\n return (this.version ? of(this.version) : this._negotiateVersion)\n .pipe(\n // In case of a cloud api login we are not interested in the /api/session session\n concatMap(() => this._isCloudApiLogin ? of(null) : this._getSession),\n concatMap(() => this._getCloudApiSession\n // In case of cloud api failure we do not want to prevent further execution\n // for backward compatibility considerations since this may be a case\n // when cloud api is not supported at all for the specified version\n .pipe(catchError((e) => of(true)))\n ),\n map(() => true)\n );\n }\n\n /**\n *\n * For use cases wich solely depends on cloudapi without any backward compatibility\n * there should be no dependence on the old /api endpoint at all\n */\n private validateRequestContextCloudApiOnly(): Observable<Session> {\n return (this.version ? of(this.version) : this._negotiateVersion).pipe(\n concatMap(() => this._getCloudApiSession)\n );\n }\n\n public setVersion(_version: string): VcdApiClient {\n this.http.requestHeadersInterceptor.version = _version;\n return this;\n }\n\n /**\n * Global configuration for the service, that allows a provider user to execute API requests\n * in the scope of a specific tenant.\n *\n * If you want to execute single API request in scope of specific tenant you can do it\n * by passing \"X-VMWARE-VCLOUD-TENANT-CONTEXT\" header to the specific API Request.\n *\n * This scoping is available to query-based API calls and to bulk GET calls in the\n * /cloudapi space.\n *\n * @param actAs an entityRef of the tenant (organization) to scope subsequent calls to in\n * the VcdApiClient, or null/no parameter to remove tenant-specific scoping\n * @returns the current VcdApiClient instance (for chaining)\n */\n public actAs(actAs: EntityReferenceType = null): VcdApiClient {\n this.http.requestHeadersInterceptor.actAs = !actAs ? null : actAs.id;\n this.http.requestHeadersInterceptor.actAsOrgName = !actAs ? null : actAs.name;\n return this;\n }\n\n /**\n * @deprecated Use {@link VcdApiClient#setCloudApiAuthentication}\n *\n * Sets the authentication token to use for the VcdApiClient.\n *\n * After setting the token, the client will get the current session\n * information associated with the authenticated token.\n *\n * @param authentication the authentication string (to be used in either the 'Authorization'\n * or 'x-vcloud-authorization' header)\n * @returns the session associated with the authentication token\n */\n public setAuthentication(authentication: string): Observable<SessionType> {\n if (this._isCloudApiLogin) {\n return throwError('Only cloud api auth is allowed since it was already used');\n }\n\n this.http.requestHeadersInterceptor.authentication = authentication;\n return this.http.get<SessionType>(`${this._baseUrl}/api/session`).pipe(\n tap(session => {\n // automatically set actAs for provider in tenant scope\n if (session.org === 'System' && this.injector.get(SESSION_SCOPE) === 'tenant') {\n // Automatic actAs only works in versions >=9.5\n try {\n this.actAs({id: this.injector.get(SESSION_ORG_ID)});\n } catch (e) {\n console.warn('No SESSION_ORG_ID set in container. Automatic actAs is disabled.');\n }\n }\n }),\n tap(session => this._session.next(session))\n );\n }\n\n /**\n * Sets the authentication token to use for the VcdApiClient.\n *\n * After setting the token, the client will get the current session\n * information associated with the authenticated token.\n *\n * @param authentication the authentication string (to be used in either the 'Authorization'\n * or 'x-vcloud-authorization' header)\n *\n * @returns session observable associated with the authentication token\n */\n public setCloudApiAuthentication(authentication: string): Observable<Session> {\n this.onBeforeCloudApiAuthentication();\n\n return of(true)\n .pipe(\n // Set the authentication as part of the observable in order to ensure the caller has subscribed to the observable\n tap(() => this.http.requestHeadersInterceptor.authentication = authentication),\n switchMap(() => this.http.get<Session>(`${this._baseUrl}/cloudapi/1.0.0/sessions/current`, { observe: 'response' })),\n )\n .pipe(\n this.onCloudApiAuthentication()\n );\n }\n\n public enableLogging(): VcdApiClient {\n this.http.loggingInterceptor.enabled = true;\n\n return this;\n }\n\n /**\n * @deprecated Use {@link VcdApiClient#cloudApiLogin}\n *\n * Creates an authenticated session for the specified credential data.\n *\n * @param username the name of the user to authenticate\n * @param tenant the organization the user belongs to\n * @param password the password for the user\n * @returns an authenticated session for the given credentials\n */\n public login(username: string, tenant: string, password: string): Observable<SessionType> {\n if (this._isCloudApiLogin) {\n return throwError('Only cloud api auth is allowed since it was already used');\n }\n const authString: string = btoa(`${username}@${tenant}:${password}`);\n\n return this.http.post<SessionType>(\n `${this._baseUrl}/api/sessions`,\n null,\n {\n observe: 'response',\n headers: new HttpHeaders({ Authorization: `Basic ${authString}`})\n }\n )\n .pipe(\n tap((response: HttpResponse<any>) =>\n // tslint:disable-next-line:max-line-length\n this.http.requestHeadersInterceptor.authentication = `${response.headers.get('x-vmware-vcloud-token-type')} ${response.headers.get('x-vmware-vcloud-access-token')}`\n ),\n map(response => response.body),\n tap(session => this._session.next(session))\n );\n }\n\n /**\n * Creates an authenticated session for the specified credential data using cloud api endpoint.\n *\n * @param username the name of the user to authenticate\n * @param tenant the organization the user belongs to\n * @param password the password for the user\n * @returns an authenticated session for the given credentials\n */\n public cloudApiLogin(username: string, tenant: string, password: string): Observable<Session> {\n this.onBeforeCloudApiAuthentication();\n\n const authString: string = btoa(`${username}@${tenant}:${password}`);\n let url = `${this._baseUrl}/cloudapi/1.0.0/sessions`;\n if (tenant.toLowerCase() === 'system') {\n url += '/provider';\n }\n return this.http.post<Session>(\n url,\n null,\n {\n observe: 'response',\n headers: new HttpHeaders({ [HTTP_HEADERS.Authorization]: `Basic ${authString}` })\n }\n ).pipe(\n tap((response: HttpResponse<Session>) => {\n // tslint:disable-next-line:max-line-length\n const token = `${response.headers.get('x-vmware-vcloud-token-type')} ${response.headers.get('x-vmware-vcloud-access-token')}`;\n this.http.requestHeadersInterceptor.authentication = token;\n }),\n this.onCloudApiAuthentication()\n );\n }\n\n /**\n * It is necessary to know if an explicit cloud api auth request was done.\n * This function handles this by setting the corresponding flags, properties etc.\n */\n private onBeforeCloudApiAuthentication() {\n // In case of an explicit cloud api auth request:\n // Set the flag _isCloudApiLogin in order to know that explicit cloud api authentication is done\n // This will help us skip code related to the old api, i.e. we should not allow explicit mix of both the api-s\n this._isCloudApiLogin = true;\n // In case of an explicit cloud api auth request:\n // There is no need of _getCloudApiSession observable which is needed in the automatic login during the constructor initialization.\n // The explicit cloud api auth request will retrieve the session.\n this._getCloudApiSession = of(null);\n }\n\n /**\n * Handle authentication.\n * This includes getting HATEOAS links, setting the session, handling errors etc.\n */\n private onCloudApiAuthentication(): (source: Observable<HttpResponse<Session>>) => Observable<Session> {\n return (source) => source.pipe(\n tap((resp: HttpResponse<Session>) => {\n // Get HATEOAS links\n try {\n this.setCloudApiSessionLinks(parseHeaderHateoasLinks(resp.headers.get(HATEOAS_HEADER)));\n } catch (e) {\n console.log('Error when parsing session HATEOAS links:', e);\n }\n }),\n map(resp => resp.body),\n tap((session: Session) => {\n // Clear previous actAs\n this.actAs(null);\n // automatically set actAs for provider in tenant scope\n if (session.org && session.org.name === 'System' && this.injector.get(SESSION_SCOPE) === 'tenant') {\n // Automatic actAs only works in versions >=9.5\n try {\n this.actAs({ id: this.injector.get(SESSION_ORG_ID) });\n } catch (e) {\n console.warn('No SESSION_ORG_ID set in container. Automatic actAs is disabled.');\n }\n }\n }),\n tap((session: Session) => this._cloudApiSession.next(session)),\n catchError((e) => {\n this.onCloudApiAuthenticationError();\n return throwError(e);\n })\n );\n }\n\n private onCloudApiAuthenticationError() {\n // Clear the authentication so that any subsequent backend calls are not authenticated\n this.http.requestHeadersInterceptor.authentication = '';\n // _getCloudApiSession is in the center of any backend call, nullify it in order not to prevent those calls\n // since it is easier to troubleshoot failing backend rather than no call\n this._getCloudApiSession = of(null);\n // Clear the links\n this._cloudApiSessionLinks.next([]);\n // Clear the session\n this._cloudApiSession.next(null);\n }\n\n private setCloudApiSessionLinks(links: LinkType[]) {\n this._cloudApiAccessibleLocations = null;\n this._cloudApiSessionLinks.next(links || []);\n }\n\n public get<T>(endpoint: string, options?: { headers?: HttpHeaders }): Observable<T> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.get<T>(this.buildEndpointUrl(endpoint), {...options}))\n );\n }\n\n public list<T>(endpoint: string, queryBuilder?: Query.Builder, multisite?: boolean | AuthorizedLocationType[], options?: { headers?: HttpHeaders }) {\n let url = this.buildEndpointUrl(endpoint);\n\n if (queryBuilder) {\n url = `${url}${queryBuilder.getCloudAPI()}`;\n }\n\n if (multisite) {\n if (!options) {\n return this.http.get<T>(url, { headers: new HttpHeaders({ _multisite: this.parseMultisiteValue(multisite) }) });\n } else if (options?.headers) {\n options.headers.append(\"_multisite\", this.parseMultisiteValue(multisite));\n return this.http.get<T>(url, { ...options });\n }\n }\n\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.get<T>(url, { ...options }))\n );\n }\n\n public createSync<T>(endpoint: string, item: T, options?: { headers?: HttpHeaders }): Observable<T> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.post<T>(\n this.buildEndpointUrl(endpoint),\n item,\n {...options}\n ))\n );\n }\n\n public createAsync<T>(endpoint: string, item: T, options?: { headers?: HttpHeaders }): Observable<TaskType> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.post(\n this.buildEndpointUrl(endpoint),\n item,\n { ...options, observe: 'response' }\n )),\n concatMap(response => this.mapResponseToTask(response, 'POST'))\n );\n }\n\n public getTransferLink<T>(endpoint: string, item: T, transferRel: string = TRANSFER_LINK_REL): Observable<string> {\n return this.http\n .post(this.buildEndpointUrl(endpoint), item, { observe: 'response' })\n .pipe(\n map((res: HttpResponse<T & Navigable>) => {\n const headerLinks: LinkType[] = res.headers.has(HATEOAS_HEADER)\n ? parseHeaderHateoasLinks(res.headers.get(HATEOAS_HEADER))\n : [];\n const links: LinkType[] = res.body ? (res.body.link || []) : [];\n const link = [...headerLinks, ...links]\n .find((l) => l.rel === transferRel);\n if (!link) {\n throw new ClientError(\n `Response from ${endpoint} did not contain a transfer link`,\n ClientErrorType.HateoasLinkMissing\n );\n }\n return link.href;\n })\n );\n }\n\n public startTransfer<T>(endpoint: string, item: T, transferRel: string = TRANSFER_LINK_REL): Observable<VcdTransferClient> {\n return this.getTransferLink(endpoint, item, transferRel)\n .pipe(\n map((transferUrl) => new VcdTransferClient(this.http, transferUrl))\n );\n }\n\n public updateSync<T>(endpoint: string, item: T, options?: { headers?: HttpHeaders }): Observable<T> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.put<T>(\n this.buildEndpointUrl(endpoint),\n item,\n { ...options }\n ))\n );\n }\n\n public updateAsync<T>(endpoint: string, item: T, options?: { headers?: HttpHeaders }): Observable<TaskType> {\n\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.put(\n this.buildEndpointUrl(endpoint),\n item,\n { ...options, observe: 'response' }\n )),\n concatMap(response => this.mapResponseToTask(response, 'PUT'))\n );\n }\n\n public deleteSync(endpoint: string, options?: { headers?: HttpHeaders }): Observable<void> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.delete<void>(this.buildEndpointUrl(endpoint), { ...options }))\n );\n }\n\n public deleteAsync(endpoint: string, options?: { headers?: HttpHeaders }): Observable<TaskType> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.delete(this.buildEndpointUrl(endpoint), { ...options, observe: 'response' })),\n concatMap(response => this.mapResponseToTask(response, 'DELETE'))\n );\n }\n\n private mapResponseToTask(response: HttpResponse<any>, httpVerb: string): Observable<TaskType> {\n if (response.headers.has('Location') && response.status === 202) {\n return this.http.get<TaskType>(response.headers.get('Location'));\n } else if (response.body && response.body.type.startsWith('application/vnd.vmware.vcloud.task+')) {\n const task: TaskType = Object.assign(new TaskType(), response.body);\n return of(task);\n }\n\n return throwError(() => new ClientError(\n `An asynchronous request was made to [${httpVerb} ${response.url}], but no task was returned. The operation may still have been successful.`,\n ClientErrorType.TaskLinkMissing\n ));\n }\n\n public getEntity<T extends EntityReferenceType>(entityRef: EntityReferenceType): Observable<T>;\n // tslint:disable-next-line:unified-signatures\n public getEntity<T extends EntityReferenceType>(urn: string): Observable<T>;\n public getEntity<T extends EntityReferenceType>(entityRefOrUrn: EntityReferenceType | string): Observable<T> {\n const entityResolver: Observable<EntityType> = typeof entityRefOrUrn === 'string' ?\n this.http.get<EntityType>(`${this._baseUrl}/api/entity/${entityRefOrUrn}`) :\n this.http.get<EntityType>(`${this._baseUrl}/api/entity/urn:vcloud:${entityRefOrUrn.type}:${entityRefOrUrn.id}`);\n\n return this.validateRequestContext().pipe(\n concatMap(() => entityResolver),\n concatMap(entity => this.http.get<T>(`${entity.link[0].href}`))\n );\n }\n\n public updateTask(task: TaskType, options?: { headers?: HttpHeaders }): Observable<TaskType> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.get<TaskType>(task.href, { ...options }))\n );\n }\n\n public isTaskComplete(task: TaskType): boolean {\n return ['success', 'error', 'canceled', 'aborted'].indexOf(task.status) > -1;\n }\n\n public removeItem(item: Navigable, options?: { headers?: HttpHeaders }): Observable<TaskType> {\n const link: LinkType = this.findLink(item, 'remove', null);\n if (!link) {\n return throwError(() => new ClientError(\n `No 'remove' link for specified resource.`,\n ClientErrorType.HateoasLinkMissing\n ));\n }\n\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.delete<TaskType>(link.href, { ...options }))\n );\n }\n\n /**\n * Queries the VMware Cloud Director API based on the specified Query.Builder instance.\n *\n * @param builder An definition of the query to construct (type, filter, page size, etc.)\n * @param multisite a flag indicating whether or not to fan the query out to all available sites\n * @returns a query result for the specified query\n */\n public query<T>(builder: Query.Builder, multisite?: boolean, options?: { headers?: HttpHeaders }): Observable<T>;\n /**\n * Queries the VMware Cloud Director API based on the specified Query.Builder instance.\n *\n * @param builder An definition of the query to construct (type, filter, page size, etc.)\n * @param multisite the set of site locations to include in the query fanout\n * @returns a query result for the specified query\n */\n // tslint:disable-next-line:unified-signatures\n public query<T>(builder: Query.Builder, multisite?: AuthorizedLocationType[], options?: { headers?: HttpHeaders }): Observable<T>;\n public query<T>(builder: Query.Builder, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n return this.getQueryPage(`${this._baseUrl}/api/query${builder.get()}`, multisite, options);\n }\n\n /**\n * Queries the VMware Cloud Director API for the first page of the provided result set.\n *\n * @param result the result set to retrieve the first page of records for\n * @param multisite a flag indicating whether or not to fan the query out to all available sites\n * @returns the records for the first page of the query\n */\n public firstPage<T>(result: T, multisite?: boolean, options?: { headers?: HttpHeaders }): Observable<T>;\n /**\n * Queries the VMware Cloud Director API for the first page of the provided result set.\n *\n * @param result the result set to retrieve the first page of records for\n * @param multisite the set of site locations to include in the query fanout\n * @returns the records for the first page of the query\n */\n // tslint:disable-next-line:unified-signatures\n public firstPage<T>(result: T, multisite?: AuthorizedLocationType[], options?: { headers?: HttpHeaders }): Observable<T>;\n public firstPage<T>(result: T, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n const link: LinkType = this.findLink(result, 'firstPage', (result as ResourceType).type);\n if (!link) {\n return throwError(() => new ClientError(\n `No 'firstPage' link for specified query.`,\n ClientErrorType.HateoasLinkMissing\n ));\n }\n\n return this.getQueryPage(link.href, multisite, options);\n }\n\n public hasFirstPage<T>(result: T): boolean {\n return !!this.findLink(result, 'firstPage', (result as ResourceType).type);\n }\n\n /**\n * Queries the VMware Cloud Director API for the previous page of the provided result set.\n *\n * @param result the result set to retrieve the previous page of records for\n * @param multisite a flag indicating whether or not to fan the query out to all available sites\n * @returns the records for the previous page of the query\n */\n public previousPage<T>(result: T, multisite?: boolean, options?: { headers?: HttpHeaders }): Observable<T>;\n /**\n * Queries the VMware Cloud Director API for the previous page of the provided result set.\n *\n * @param result the result set to retrieve the previous page of records for\n * @param multisite the set of site locations to include in the query fanout\n * @returns the records for the previous page of the query\n */\n // tslint:disable-next-line:unified-signatures\n public previousPage<T>(result: T, multisite?: AuthorizedLocationType[], options?: { headers?: HttpHeaders }): Observable<T>;\n public previousPage<T>(result: T, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n const link: LinkType = this.findLink(result, 'previousPage', (result as ResourceType).type);\n if (!link) {\n return throwError(() => new ClientError(\n `No 'previousPage' link for specified query.`,\n ClientErrorType.HateoasLinkMissing\n ));\n }\n\n return this.getQueryPage(link.href, multisite, options);\n }\n\n public hasPreviousPage<T>(result: T): boolean {\n return !!this.findLink(result, 'previousPage', (result as ResourceType).type);\n }\n\n /**\n * Queries the VMware Cloud Director API for the next page of the provided result set.\n *\n * @param result the result set to retrieve the next page of records for\n * @param multisite a flag indicating whether or not to fan the query out to all available sites\n * @returns the records for the next page of the query\n */\n public nextPage<T>(result: T, multisite?: boolean, options?: { headers?: HttpHeaders }): Observable<T>;\n /**\n * Queries the VMware Cloud Director API for the next page of the provided result set.\n *\n * @param result the result set to retrieve the next page of records for\n * @param multisite the set of site locations to include in the query fanout\n * @returns the records for the next page of the query\n */\n // tslint:disable-next-line:unified-signatures\n public nextPage<T>(result: T, multisite?: AuthorizedLocationType[], options?: { headers?: HttpHeaders }): Observable<T>;\n public nextPage<T>(result: T, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n const link: LinkType = this.findLink(result, 'nextPage', (result as ResourceType).type);\n if (!link) {\n return throwError(() => new ClientError(\n `No 'nextPage' link for specified query.`,\n ClientErrorType.HateoasLinkMissing\n ));\n }\n\n return this.getQueryPage<T>(link.href, multisite, options);\n }\n\n public hasNextPage<T>(result: T): boolean {\n return !!this.findLink(result, 'nextPage', (result as ResourceType).type);\n }\n\n /**\n * Queries the VMware Cloud Director API for the last page of the provided result set.\n *\n * @param result the result set to retrieve the last page of records for\n * @param multisite a flag indicating whether or not to fan the query out to all available sites\n * @returns the records for the last page of the query\n */\n public lastPage<T>(result: T, multisite?: boolean, options?: { headers?: HttpHeaders }): Observable<T>;\n /**\n * Queries the VMware Cloud Director API for the last page of the provided result set.\n *\n * @param result the result set to retrieve the last page of records for\n * @param multisite the set of site locations to include in the query fanout\n * @returns the records for the last page of the query\n */\n // tslint:disable-next-line:unified-signatures\n public lastPage<T>(result: T, multisite?: AuthorizedLocationType[], options?: { headers?: HttpHeaders }): Observable<T>;\n public lastPage<T>(result: T, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n const link: LinkType = this.findLink(result, 'lastPage', (result as ResourceType).type);\n if (!link) {\n return throwError(() => new ClientError(\n `No 'lastPage' link for specified query.`,\n ClientErrorType.HateoasLinkMissing\n ));\n }\n\n return this.getQueryPage(link.href, multisite, options);\n }\n\n public hasLastPage<T>(result: T): boolean {\n return !!this.findLink(result, 'lastPage', (result as ResourceType).type);\n }\n\n private getQueryPage<T>(href: string, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n if (multisite) {\n if (!options) {\n return this.http.get<T>(href, { headers: new HttpHeaders({ _multisite: this.parseMultisiteValue(multisite) }) })\n } else if (options?.headers) {\n options.headers.append(\"_multisite\", this.parseMultisiteValue(multisite));\n return this.http.get<T>(href, { ...options })\n }\n }\n\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.get<T>(href, { ...options }))\n );\n }\n\n /**\n * Use to perform action availability check before calling the API\n * @param item - the navigable item (containing link collection)\n * @param linkRelType - the link rel type, pass either LinkRelType or string\n * @param entityRefType - the entity reference type\n */\n public canPerformAction(item: Navigable, linkRelType: LinkRelType | string, entityRefType?: string): boolean {\n return !!this.findLink(item, linkRelType, entityRefType);\n }\n\n private findLink(item: Navigable, rel: string, type: string): LinkType {\n if (!item || !item.link) {\n return undefined;\n }\n\n return item.link.find((link) => {\n if (type) {\n return link.rel.includes(rel) && link.type === type;\n }\n\n return link.rel.includes(rel);\n });\n }\n\n private parseMultisiteValue(multisite: boolean | AuthorizedLocationType[]): string {\n return typeof multisite === 'boolean' ? (multisite ? 'global' : 'local') : multisite.map(site => site.locationId).join(',');\n }\n\n /**\n * @deprecated Use cloudApiSession\n */\n public get session(): Observable<SessionType> {\n return this.validateRequestContext().pipe(\n concatMap(() => this._sessionObservable)\n );\n }\n\n /**\n * Get Session observable\n */\n public get cloudApiSession(): Observable<Session> {\n return this.validateRequestContextCloudApiOnly().pipe(\n concatMap(() => this._cloudApiSessionObservable)\n );\n }\n\n public get username(): Observable<string> {\n return merge(\n this.cloudApiSession.pipe(\n filter(() => this._isCloudApiLogin),\n map(session => session && session.user && session.user.name)\n ),\n this.session.pipe(\n filter(() => !this._isCloudApiLogin),\n map(session => session && session.user)\n )\n );\n }\n\n public get organization(): Observable<string> {\n return merge(\n this.cloudApiSession.pipe(\n filter(() => this._isCloudApiLogin),\n map(session => session && session.org && session.org.name)\n ),\n this.session.pipe(\n filter(() => !this._isCloudApiLogin),\n map(session => session && session.org)\n )\n );\n }\n\n /**\n * @deprecated Use cloudApiLocation\n */\n public get location(): Observable<AuthorizedLocationType> {\n return this.session.pipe(\n map(session => session.authorizedLocations.location.find(location => location.locationId === session.locationId))\n );\n }\n\n /**\n * Gets the location corresponding to the current session\n */\n public get cloudApiLocation(): Observable<AccessibleLocation> {\n return this.cloudApiSession.pipe(\n switchMap(() => {\n if (!this._cloudApiAccessibleLocations) {\n // Ensure caching for getting AccessibleLocations\n this._cloudApiAccessibleLocations = this._cloudApiSessionLinks\n .pipe(\n // Get the AccessibleLocations link\n map((links) => this.findLink({ link: links }, 'down', 'AccessibleLocations')),\n // Fetch AccessibleLocations from the backend\n switchMap((link: LinkType) => link ? this.http.get<AccessibleLocations>(link.href) : of(null)),\n // Get the array with all locations (what if there are many pages)\n map((accessibleLocations: AccessibleLocations) => accessibleLocations && accessibleLocations.values)\n )\n .pipe(\n share({ connector: () => new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })\n );\n }\n return this._cloudApiAccessibleLocations;\n }),\n\n // Need to have the session in order to get its location\n withLatestFrom(this.cloudApiSession),\n // Find the location that corresponds to this session\n map(([accessibleLocations, session]) => {\n if (!accessibleLocations || !session) {\n return null;\n }\n const sessionLocation = session.location;\n if (!sessionLocation) {\n return null;\n }\n return accessibleLocations.find(location => location.locationId === sessionLocation);\n }),\n );\n }\n\n public getLocation(session: SessionType): AuthorizedLocationType {\n return session.authorizedLocations.location.find(location => location.locationId === session.locationId);\n }\n\n /**\n * Build the endpoint url. If the provided endpoint is already an absolute URL, then return it as it is without\n * any modifications, otherwise consider it as a relative one and prepend the baseUrl as defined by the host application.\n */\n private buildEndpointUrl(endpoint: string): string {\n return endpoint.indexOf('://') > -1 ? endpoint : `${this._baseUrl}/${endpoint}`;\n }\n\n}\n","import { HttpClientModule } from '@angular/common/http';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport * as client from './client';\nimport {VcdSdkConfig} from \"./core\";\n/**\n * Extensions should import this module.\n * They can then wire in SDK components as desired.\n */\n@NgModule({\n imports: [\n HttpClientModule,\n CommonModule,\n ],\n declarations: [],\n exports: [],\n})\nexport class VcdSdkModule {\n static forRoot(config?: VcdSdkConfig): ModuleWithProviders<VcdSdkModule> {\n return {\n ngModule: VcdSdkModule,\n providers: [\n client.RequestHeadersInterceptor,\n client.LoggingInterceptor,\n client.ResponseNormalizationInterceptor,\n client.VcdHttpClient,\n client.VcdApiClient,\n {\n provide: VcdSdkConfig,\n useValue: config || {}\n },\n ]\n };\n }\n}\n","/*\n * Public API Surface of sdk\n */\n\nexport * from './main';\nexport * from './common';\nexport * from './core';\nexport * from './client';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ApiResultService","i1.AuthTokenHolderService","i1.VcdHttpClient","i2.VcdSdkConfig","client.RequestHeadersInterceptor","client.LoggingInterceptor","client.ResponseNormalizationInterceptor","client.VcdHttpClient","client.VcdApiClient"],"mappings":";;;;;;;;;AAEA;AACA;AACM,IAAW,MA6FhB;AA7FD,CAAA,UAAiB,KAAK,EAAA;AAClB,IAAA,MAAa,OAAO,CAAA;AAShB,QAAA,WAAA,GAAA;AAPQ,YAAA,IAAA,CAAA,OAAO,GAAW,MAAM,CAAC,UAAU,CAAC;YACpC,IAAM,CAAA,MAAA,GAAG,IAAI,CAAC;YACd,IAAS,CAAA,SAAA,GAAG,EAAE,CAAC;SAKE;AAElB,QAAA,OAAO,UAAU,GAAA;YACpB,OAAO,IAAI,OAAO,EAAE,CAAC;SACxB;QAEM,OAAO,MAAM,CAAC,IAAY,EAAA;AAC7B,YAAA,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;AACzB,YAAA,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;AAChB,YAAA,OAAO,EAAE,CAAC;SACb;AAEM,QAAA,MAAM,CAAC,MAAoB,EAAA;AAC9B,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;AACtB,YAAA,OAAO,IAAI,CAAC;SACf;AAEM,QAAA,KAAK,CAAC,KAAc,EAAA;AACvB,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACpB,YAAA,OAAO,IAAI,CAAC;SACf;AAEM,QAAA,QAAQ,CAAC,QAAgB,EAAA;AAC5B,YAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;AAC1B,YAAA,OAAO,IAAI,CAAC;SACf;QAEM,MAAM,CAAC,GAAG,MAAgB,EAAA;AAC7B,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;AACtB,YAAA,OAAO,IAAI,CAAC;SACf;AAEM,QAAA,MAAM,CAAC,MAAc,EAAA;AACxB,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;AACtB,YAAA,OAAO,IAAI,CAAC;SACf;QAEM,IAAI,CAAC,GAAG,IAA4C,EAAA;AACvD,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AAClB,YAAA,OAAO,IAAI,CAAC;SACf;QAEM,GAAG,GAAA;AACN,YAAA,IAAI,KAAK,GAAG,CAAA,MAAA,EAAS,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,OAAO,CAAU,OAAA,EAAA,IAAI,CAAC,MAAM,CAAA,UAAA,EAAa,IAAI,CAAC,SAAS,EAAE,CAAC;AACzG,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzC,KAAK,IAAI,CAAW,QAAA,EAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC;aAChD;AAED,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AACd,gBAAA,KAAK,IAAI,CAAW,QAAA,EAAA,IAAI,CAAC,OAAO,EAAE,CAAC;aACtC;AAED,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACZ,gBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAG;AACnB,oBAAA,KAAK,IAAI,CAAI,CAAA,EAAA,CAAC,CAAC,OAAO,GAAG,UAAU,GAAG,SAAS,CAAA,CAAA,EAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AACjE,iBAAC,CAAC,CAAC;aACN;AAED,YAAA,OAAO,KAAK,CAAC;SAChB;QAEM,WAAW,GAAA;AACd,YAAA,IAAI,KAAK,GAAG,CAAA,UAAA,EAAa,IAAI,CAAC,SAAS,EAAE,CAAC;AAE1C,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AACd,gBAAA,KAAK,IAAI,CAAW,QAAA,EAAA,IAAI,CAAC,OAAO,EAAE,CAAC;aACtC;AAED,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACZ,gBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAG;AACnB,oBAAA,KAAK,IAAI,CAAI,CAAA,EAAA,CAAC,CAAC,OAAO,GAAG,UAAU,GAAG,SAAS,CAAA,CAAA,EAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AACjE,iBAAC,CAAC,CAAC;aACN;AAED,YAAA,OAAO,KAAK,CAAC;SAChB;AACJ,KAAA;AArFY,IAAA,KAAA,CAAA,OAAO,UAqFnB,CAAA;AAED,IAAA,MAAa,MAAM,CAAA;iBACC,IAAU,CAAA,UAAA,GAAW,WAAW,CAAC,EAAA;iBACjC,IAAO,CAAA,OAAA,GAAW,SAAS,CAAC,EAAA;iBAC5B,IAAU,CAAA,UAAA,GAAW,YAAY,CAAC,EAAA;;AAHzC,IAAA,KAAA,CAAA,MAAM,SAIlB,CAAA;AACL,CAAC,EA7FgB,KAAK,KAAL,KAAK,GA6FrB,EAAA,CAAA,CAAA;;ACjGD;AACM,IAAW,OAkWhB;AAlWD,CAAA,UAAiB,MAAM,EAAA;AACnB,IAAA,MAAM,SAAS,CAAA;iBACY,IAAE,CAAA,EAAA,GAAW,GAAG,CAAC,EAAA;iBACjB,IAAG,CAAA,GAAA,GAAW,GAAG,CAAC,EAAA;iBAClB,IAAE,CAAA,EAAA,GAAW,MAAM,CAAC,EAAA;iBACpB,IAAE,CAAA,EAAA,GAAW,MAAM,CAAC,EAAA;iBACpB,IAAE,CAAA,EAAA,GAAW,MAAM,CAAC,EAAA;iBACpB,IAAE,CAAA,EAAA,GAAW,MAAM,CAAC,EAAA;iBACpB,IAAE,CAAA,EAAA,GAAW,IAAI,CAAC,EAAA;iBAClB,IAAG,CAAA,GAAA,GAAW,IAAI,CAAC,EAAA;;AAG9C;;AAEG;AACH,IAAA,MAAa,SAAS,CAAA;AAClB;;AAEG;iBACoB,IAAK,CAAA,KAAA,GAAW,OAAO,CAAC,EAAA;AAE/C;;AAEG;iBACoB,IAAG,CAAA,GAAA,GAAW,KAAK,CAAC,EAAA;AAE3C;;AAEG;iBACoB,IAAQ,CAAA,QAAA,GAAW,UAAU,CAAC,EAAA;;AAd5C,IAAA,MAAA,CAAA,SAAS,YAerB,CAAA;AAgID,IAAA,MAAM,YAAY,CAAA;AAKd,QAAA,WAAA,CAAY,MAAqB,EAAA;YAJzB,IAAM,CAAA,MAAA,GAAG,EAAE,CAAC;AAKhB,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;SACxB;QAEM,KAAK,GAAA;AACR,YAAA,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;SAC9B;;AAKM,QAAA,GAAG,CAAC,UAA8B,EAAE,UAA8B,EAAE,UAAgC,EAAA;YACvG,IAAI,CAAC,UAAU,EAAE;AACb,gBAAA,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;aAC3B;AAED,YAAA,IAAI,CAAC,MAAM,IAAI,GAAG,GAAI,UAA2B,CAAC,YAAY,EAAE,GAAG,SAAS,CAAC,GAAG,GAAI,UAA2B,CAAC,YAAY,EAAE,CAAC;AAC/H,YAAA,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE;AACjC,gBAAA,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,KAAI;oBAC7B,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,GAAG,GAAI,SAA0B,CAAC,YAAY,EAAE,CAAC;AAC9E,iBAAC,CAAC,CAAC;aACN;AAED,YAAA,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;AACnB,YAAA,OAAO,IAAI,CAAC;SACf;QAEO,SAAS,GAAA;YACb,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,KAAK,SAAS,CAAC,EAAE,EAAE;AAC5G,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACb,oBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AAC9C,oBAAA,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;iBACtB;qBAAM;oBACH,IAAI,CAAC,IAAI,EAAE,CAAC;iBACf;AAED,gBAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,GAAG,CAAC;aAC3C;AAED,YAAA,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC;AAC7B,YAAA,OAAO,IAAI,CAAC;SACf;;AAKM,QAAA,EAAE,CAAC,UAA8B,EAAE,UAA8B,EAAE,UAAgC,EAAA;YACtG,IAAI,CAAC,UAAU,EAAE;AACb,gBAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;aAC1B;AAED,YAAA,IAAI,CAAC,MAAM,IAAI,GAAG,GAAI,UAA2B,CAAC,YAAY,EAAE,GAAG,SAAS,CAAC,EAAE,GAAI,UAA2B,CAAC,YAAY,EAAE,CAAC;AAC9H,YAAA,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE;AACjC,gBAAA,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,KAAI;oBAC7B,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,EAAE,GAAI,SAA0B,CAAC,YAAY,EAAE,CAAC;AAC7E,iBAAC,CAAC,CAAC;aACN;AAED,YAAA,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;AACnB,YAAA,OAAO,IAAI,CAAC;SACf;QAEO,QAAQ,GAAA;YACZ,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,KAAK,SAAS,CAAC,GAAG,CAAC,EAAE;AAChH,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACb,oBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AAC9C,oBAAA,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;iBACtB;qBAAM;oBACH,IAAI,CAAC,IAAI,EAAE,CAAC;iBACf;AAED,gBAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,EAAE,CAAC;aAC1C;AAED,YAAA,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,EAAE,CAAC;AAC5B,YAAA,OAAO,IAAI,CAAC;SACf;QAEO,IAAI,GAAA;YACR,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;AACtC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAC/B,YAAA,OAAO,IAAI,CAAC;SACf;QAEO,YAAY,GAAA;YAChB,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;SACjF;AAEM,QAAA,EAAE,CAAC,QAAgB,EAAA;AACtB,YAAA,MAAM,OAAO,GAAiB,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;AACrD,YAAA,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;AAC1B,YAAA,OAAO,OAAO,CAAC;SAClB;AAEM,QAAA,OAAO,CAAC,KAAkC,EAAE,GAAG,UAAyC,EAAA;AAC3F,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC;SAC7D;AAEM,QAAA,UAAU,CAAC,KAAkC,EAAA;YAChD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAC/C;AAEM,QAAA,QAAQ,CAAC,KAAa,EAAA;YACzB,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;SAC9C;AAEM,QAAA,aAAa,CAAC,KAAa,EAAA;YAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;SAC9C;AAEM,QAAA,WAAW,CAAC,KAAa,EAAA;YAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;SAC9C;AAEM,QAAA,gBAAgB,CAAC,KAAa,EAAA;YACjC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;SAC9C;AAEM,QAAA,IAAI,CAAC,KAAa,EAAE,IAAkB,GAAA,SAAS,CAAC,KAAK,EAAA;AACxD,YAAA,IAAI,aAAqB,CAAC;YAC1B,QAAQ,IAAI;gBACR,KAAK,SAAS,CAAC,KAAK;AAChB,oBAAA,aAAa,GAAG,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,CAAC;oBAC5B,MAAM;gBACV,KAAK,SAAS,CAAC,GAAG;AACd,oBAAA,aAAa,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAC;oBAC5B,MAAM;gBACV,KAAK,SAAS,CAAC,QAAQ;AACnB,oBAAA,aAAa,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAC;oBAC7B,MAAM;AACV,gBAAA;oBACI,aAAa,GAAG,KAAK,CAAC;oBACtB,MAAM;aACb;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;SACtD;AAEO,QAAA,SAAS,CAAC,QAAgB,EAAE,KAAU,EAAE,GAAG,UAAiB,EAAA;AAChE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;YACzB,IAAI,CAAC,MAAM,IAAI,QAAQ,GAAG,SAAS,CAAC,KAAe,CAAC,CAAC;AACrD,YAAA,IAAI,UAAU,CAAC,MAAM,EAAE;AACnB,gBAAA,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACxB,oBAAA,IAAI,CAAC,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC,IAAc,CAAC,CAAC;AACrE,iBAAC,CAAC,CAAC;AAEH,gBAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,EAAE,CAAC;aAC1C;AAED,YAAA,OAAO,IAAI,CAAC;SACf;AACJ,KAAA;AAED;;AAEG;AACH,IAAA,MAAa,OAAO,CAAA;AAChB;;;;;AAKG;AACH,QAAA,EAAE,CAAC,QAAgB,EAAA;YACf,OAAO,IAAI,YAAY,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;SAC1C;AAED;;;;;;;AAOG;AACH,QAAA,GAAG,CAAC,UAA6B,EAAE,UAA6B,EAAE,UAAgC,EAAA;AAC9F,YAAA,OAAO,IAAI,YAAY,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;SACrE;AAED;;;;;;;AAOG;AACH,QAAA,EAAE,CAAC,UAA6B,EAAE,UAA6B,EAAE,UAAgC,EAAA;AAC7F,YAAA,OAAO,IAAI,YAAY,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;SACpE;AACJ,KAAA;AAlCY,IAAA,MAAA,CAAA,OAAO,UAkCnB,CAAA;AACL,CAAC,EAlWgB,MAAM,KAAN,MAAM,GAkWtB,EAAA,CAAA,CAAA;;ACjWD;MAEa,gBAAgB,CAAA;AAD7B,IAAA,WAAA,GAAA;QAEY,IAAQ,CAAA,QAAA,GAAgB,EAAE,CAAC;AAYtC,KAAA;AAXG,IAAA,IAAW,OAAO,GAAA;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;KACxB;AAED,IAAA,GAAG,CAAC,MAAiB,EAAA;AACjB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;KAC3D;IAED,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;KACtB;8GAZQ,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAAhB,gBAAgB,EAAA,CAAA,CAAA,EAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;;MAgBE,SAAS,CAAA;AAElB,IAAA,IAAW,OAAO,GAAA;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;KACxB;AAGD,IAAA,IAAW,SAAS,GAAA;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;KAC1B;AAGD,IAAA,IAAW,OAAO,GAAA;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;KACxB;AAGD,IAAA,IAAW,QAAQ,GAAA;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;KACzB;AAED,IAAA,WAAA,CAAY,OAAe,EAAE,SAAkB,EAAE,OAAa,EAAE,QAAc,EAAA;AAC1E,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;KAC7B;AACJ;;AC9CD;;AAEG;AAIH;AACA,IAAI,CAAE,MAAc,CAAC,MAAM,IAAI,CAAE,MAAc,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAE,MAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE;AACrG,IAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACnD,CAAC;AAED,IAAI,cAAc,GAAS,MAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC7E,IAAI,CAAC,cAAc,EAAE;IACjB,cAAc,GAAI,MAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC3E,CAAC;AAED,IAAI,CAAC,cAAc,EAAE;AACjB,IAAA,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;AAC/E,CAAC;AAED;;;AAGG;AACU,MAAA,YAAY,GAA2B,cAAc,CAAC,aAAa;AAEhF;;AAEG;AACU,MAAA,YAAY,GAA2B,cAAc,CAAC,aAAa;AAEhF;;;AAGG;AACU,MAAA,aAAa,GAA2B,cAAc,CAAC,cAAc;AAElF;;;AAGG;AACU,MAAA,oBAAoB,GAA2B,cAAc,CAAC,qBAAqB;AAEhG;;;AAGG;AACU,MAAA,cAAc,GAA2B,cAAc,CAAC,cAAc,GAAG,cAAc,CAAC,cAAc,GAAG,GAAG;AAEzH;;;;;;AAMG;AACI,MAAM,mBAAmB,GAA2B,cAAc,CAAC,mBAAmB,IAAI,IAAI,cAAc,CAAC,qBAAqB,EAAE;AAE3I;;AAEG;AACU,MAAA,eAAe,GAA2B,cAAc,CAAC,gBAAgB;AAEtF;;AAEG;AACU,MAAA,QAAQ,GAA4B,cAAc,CAAC,SAAS;AAgC5D,MAAA,8BAA8B,GAAuC,cAAc,CAAC,+BAA+B;AA4BnH,MAAA,sBAAsB,GAA2B,cAAc,CAAC,uBAAuB;AA+CpG;;AAEG;AACH;MACsB,+BAA+B,CAAA;AAiBpD,CAAA;AACY,MAAA,8BAA8B,GAA2C,cAAc,CAAC,+BAA+B;AAEpI;MACsB,yBAAyB,CAAA;AAS9C,CAAA;AAEY,MAAA,wBAAwB,GAAqC,cAAc,CAAC,yBAAyB;AAMlH;AACM,MAAgB,uCAAiD,SAAQ,yBAAkC,CAAA;AAKhH,CAAA;AAED;AACa,MAAA,sCAAsC,GAAmD,cAAc,CAAC,uCAAuC;AAE5J;;;;;AAKG;AACH;AACM,MAAgB,oCAA8C,SAAQ,yBAAkC,CAAA;AAQ7G,CAAA;AAED;AACa,MAAA,mCAAmC,GAAgD,cAAc,CAAC;;MC/OlG,YAAY,CAAA;AAErB,IAAA,WAAA,CAAoB,QAAoB,EAAA;QAApB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAY;KACvC;AAES,IAAA,iBAAiB,CAAC,SAAmC,EAAA;QAC3D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,8BAA8B,CAAC,SAAS,CAAC,CAAC,CAAC;KACzE;AACJ,CAAA;AAED;;;;;AAKG;MACU,YAAY,CAAA;AAExB,CAAA;AAED;;AAEG;MACU,qBAAqB,GAAG,IAAI,cAAc,CAAoB,uBAAuB;;AClBlG;MAEa,kBAAkB,CAAA;IAG7B,IAAI,OAAO,CAAC,OAAgB,EAAA;AAC1B,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC1C,YAAA,OAAO,CAAC,IAAI,CAAC,yGAAyG,CAAC,CAAC;SACzH;KACF;AAED,IAAA,WAAA,CAAgC,gBAAkC,EAAA;QAAlC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAR1D,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAC;AASvB,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;KAChD;IAED,SAAS,CAAC,GAAqB,EAAE,IAAiB,EAAA;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SACzB;AAED,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;AAC3B,QAAA,IAAI,SAAkB,CAAC;AAEvB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACpB,aAAA,IAAI,CACH,GAAG,CACD,KAAK,IAAI,SAAS,GAAG,KAAK,YAAY,YAAY,GAAG,IAAI,GAAG,KAAK,EACjE,KAAK,IAAI,SAAS,GAAG,KAAK,CAC3B,EACD,QAAQ,CAAC,MAAK;AACZ,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBACzB,OAAO,CAAC,GAAG,CAAC,CAAG,EAAA,GAAG,CAAC,MAAM,CAAA,CAAA,EAAI,GAAG,CAAC,aAAa,CAAA,cAAA,EAAiB,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAkB,eAAA,EAAA,SAAS,CAAE,CAAA,CAAC,CAAC;aAC7H;iBAAM;gBACL,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAA,EAAG,GAAG,CAAC,MAAM,CAAA,CAAA,EAAI,GAAG,CAAC,aAAa,CAAA,CAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;aAChH;SACF,CAAC,CACH,CAAC;KACL;8GApCU,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAAlB,kBAAkB,EAAA,CAAA,CAAA,EAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;;0BAWI,QAAQ;;;ACtBvB;;AAEG;AACI,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;AAEtC,IAAA,aAAa,EAAE,eAAe;AAE9B,IAAA,IAAI,EAAE,MAAM;;;AAIZ,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,IAAI,EAAE,MAAM;AAEZ,IAAA,sBAAsB,EAAE,wBAAwB;AACnD,CAAA,CAAC;;ACfF;;AAEG;MAEU,UAAU,CAAA;AAKnB,IAAA,WAAA,CAAoB,QAAgB,EAAA;QAAhB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAQ;QAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAClC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAA,CAAA,CAAG,CAAC,CAAC;SACxD;AAED,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;KAC7B;AAEO,IAAA,eAAe,CAAC,SAAiB,EAAA;AACrC,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,wBAAwB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3G,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KAC3B;IAED,SAAS,GAAA;QACL,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,cAAc,CAAC;QAC/D,OAAO,OAAO,IAAI,GAAG,CAAC;KACzB;IAED,MAAM,GAAA;QACF,OAAO;YACH,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC5B,CAAC;KACL;AACJ,CAAA;AAED,SAAS,wBAAwB,CAAC,CAAS,EAAA;IACvC,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE;;ACnCA;MAEa,yBAAyB,CAAA;IAElC,IAAI,OAAO,CAAC,QAAiB,EAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;KAC5B;IAGD,IAAI,KAAK,CAAC,MAAc,EAAA;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;KACxB;IAGD,IAAI,YAAY,CAAC,aAAqB,EAAA;AAClC,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;KACtC;AAGD,IAAA,IAAI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;KACxB;IACD,IAAI,OAAO,CAAC,QAAgB,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;KAC5B;IAID,IAAI,cAAc,CAAC,eAAuB,EAAA;AACtC,QAAA,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;AACvC,QAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,EAAE;YAClF,YAAY,CAAC,aAAa,GAAG,YAAY,CAAC,sBAAsB,CAAC;KACxE;AAED,IAAA,WAAA,CACY,sBAA8C,EAAA;QAA9C,IAAsB,CAAA,sBAAA,GAAtB,sBAAsB,CAAwB;QAhClD,IAAQ,CAAA,QAAA,GAAG,IAAI,CAAC;QAehB,IAAQ,CAAA,QAAA,GAAG,EAAE,CAAC;AAQd,QAAA,IAAA,CAAA,qBAAqB,GAAW,YAAY,CAAC,aAAa,CAAC;KAU/D;IAEJ,SAAS,CAAC,GAAqB,EAAE,IAAiB,EAAA;AAC9C,QAAA,IAAI,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAE1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AACxB,YAAA,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;SAC3C;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;YAC9B,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;SACzD;AAED,QAAA,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE;AAClE,YAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;SAC3E;AAED;;AAEG;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;YAC/D,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SACxE;AAED;;AAEG;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;YACpE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;SAC7E;AAED,QAAA,MAAM,SAAS,GAAqB,GAAG,CAAC,KAAK,CAAC;YAC1C,OAAO;AACV,SAAA,CAAC,CAAC;AACH,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAC1B,GAAG,CAAC,CAAC,GAAG,KAAI;AACR,YAAA,MAAM,YAAY,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;YAChF,IAAI,YAAY,EAAE;AACd,gBAAA,IAAI,CAAC,eAAe,GAAG,CAAU,OAAA,EAAA,GAAG,EAAE,CAAC;aAC1C;YACD,OAAO,SAAS,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;AACnG,SAAC,CAAC,EACF,SAAS,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CACxE,CAAC;KACL;IAEO,aAAa,CAAC,IAAiB,EAAE,aAA+B,EAAA;AACpE,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAClC,GAAG,CAAC,CAAC,GAAmB,KAAI;AACxB,YAAA,IAAI,GAAG,YAAY,YAAY,EAAE;gBAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;AAC3B,oBAAA,OAAO,GAAG,CAAC;iBACd;gBAED,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;AACpC,oBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;iBAC/E;gBAED,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;AACpC,oBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;iBAC/E;gBAED,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;AACpC,oBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;iBACtD;aACJ;AACD,YAAA,OAAO,GAAG,CAAC;SACd,CAAC,CACL,CAAC;KACL;AAEO,IAAA,eAAe,CAAC,OAAoB,EAAA;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACxC,QAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AAEvC,QAAA,OAAO,OAAO,CAAC,GAAG,CACd,QAAQ,EAAE;AACN,YAAA,CAAA,2BAAA,EAA8B,IAAI,CAAC,QAAQ,CAAA,EAAG,KAAK,GAAG,CAAA,WAAA,EAAc,KAAK,CAAE,CAAA,GAAG,EAAE,CAAE,CAAA;AAClF,YAAA,CAAA,yBAAA,EAA4B,IAAI,CAAC,QAAQ,CAAA,EAAG,KAAK,GAAG,CAAA,WAAA,EAAc,KAAK,CAAE,CAAA,GAAG,EAAE,CAAE,CAAA;AACnF,SAAA,CACJ,CAAC;KACL;IAEO,oBAAoB,CAAC,OAAoB,EAAE,GAAW,EAAA;QAC1D,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE;YAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;SAC1D;aAAM;YACH,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;SAC5D;KACJ;IAEO,WAAW,GAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE;YACvC,OAAO,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;SAC9C;QAED,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAC5C,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EACrC,KAAK,EAAE,CACV,CAAA;KACJ;AAEO,IAAA,SAAS,CAAC,GAAW,EAAA;AACzB,QAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;AACvC,QAAA,OAAO,UAAU,CAAC,SAAS,EAAE,CAAC;KACjC;8GA3IQ,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,sBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAAzB,yBAAyB,EAAA,CAAA,CAAA,EAAA;;2FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;;;ACJX;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;MAEU,gCAAgC,CAAA;aACnB,IAAiB,CAAA,iBAAA,GAAG,+DAAH,CAAmE,EAAA;IAE5G,SAAS,CAAC,GAAqB,EAAE,IAAiB,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAC1B,GAAG,CAAC,QAAQ,IAAG;;;;YAIb,IAAI,QAAQ,YAAY,YAAY,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE;AACjI,gBAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,KAAK,gCAAgC,CAAC,iBAAiB,EAAE;AACrF,oBAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;iBACvD;gBAED,OAAO,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;aACjC;AAED,YAAA,OAAO,QAAQ,CAAC;SACjB,CAAC,CACH,CAAC;KACH;8GArBU,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAAhC,gCAAgC,EAAA,CAAA,CAAA,EAAA;;2FAAhC,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAD5C,UAAU;;;AC7BX;;AAEG;AACH,MAAM,yBAAyB,CAAA;IAC3B,WAAoB,CAAA,IAAiB,EAAU,WAA4B,EAAA;QAAvD,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAa;QAAU,IAAW,CAAA,WAAA,GAAX,WAAW,CAAiB;KAAI;AAE/E,IAAA,MAAM,CAAC,GAAqB,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;KACrD;AACJ,CAAA;AAED;;;;;;AAMG;AAEG,MAAO,aAAc,SAAQ,UAAU,CAAA;AAWzC;;;;;;;AAOG;IACH,WAAY,CAAA,WAAwB,EACxB,kBAAsC,EACtC,yBAAoD,EACpD,gCAAkE,EACf,kBAAqC,EAAA;AAEhG,QAAA,MAAM,YAAY,GAAsB;YACpC,kBAAkB;YAClB,yBAAyB;YACzB,gCAAgC;AAChC,YAAA,IAAI,kBAAkB,IAAI,EAAE;SAC/B,CAAC;QACF,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAClC,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,yBAAyB,CAAC,IAAI,EAAE,WAAW,CAAC,EACvE,WAAW,CACd,CAAC;QACF,KAAK,CAAC,KAAK,CAAC,CAAC;QAZ8C,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAmB;AAahG,QAAA,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;AAC7C,QAAA,IAAI,CAAC,yBAAyB,GAAG,yBAAyB,CAAC;KAC9D;AAtCQ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,+JAuBU,qBAAqB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAvB5C,aAAa,EAAA,CAAA,CAAA,EAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;;0BAwBM,QAAQ;;0BAAI,MAAM;2BAAC,qBAAqB,CAAA;;;AC7CzD;;AAEG;MACU,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,KAAK;AAE/C;;AAEG;AACI,MAAM,qBAAqB,GAAG,EAAE;AAiGvC;;;AAGG;AACG,MAAO,aAAc,SAAQ,KAAK,CAAA;AACpC,IAAA,WAAA,CAAY,OAAe,EAAW,aAAkB,EAAW,YAA8B,EAAA;QAC7F,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,IAAa,CAAA,aAAA,GAAb,aAAa,CAAK;QAAW,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAkB;KAEhG;AACJ,CAAA;AAED;;;AAGG;MACU,iBAAiB,CAAA;AAC1B;;;;AAIG;IACH,WAAmB,CAAA,UAAyB,EAAS,WAAmB,EACrD,eAAe,cAAc,EAAS,qBAAqB,qBAAqB,EAAA;QADhF,IAAU,CAAA,UAAA,GAAV,UAAU,CAAe;QAAS,IAAW,CAAA,WAAA,GAAX,WAAW,CAAQ;QACrD,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAiB;QAAS,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAwB;KAClG;AAED;;;;;;AAMG;IACH,MAAM,CAAC,MAAiB,EAAE,gBAA6C,EAAA;;QAEnE,MAAM,EAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAC,GAAG,IAAI,CAAC;;AAGzE,QAAA,MAAM,QAAQ,GAAI,MAAe,CAAC,IAAI,IAAI,QAAQ,CAAC;AACnD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;AAC1D,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,UAAU,GAAG,CAAC,CAAC;;;AAInB,QAAA,SAAS,sBAAsB,CAAC,WAAmB,EAAE,SAAiB,EAAE,UAAkB,EAAA;AACtF,YAAA,MAAM,eAAe,GAAG,WAAW,GAAG,UAAU,CAAC;AACjD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,EAAE,UAAU,CAAC,CAAC;AAClE,YAAA,MAAM,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC;AAC9C,YAAA,MAAM,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,GAAG,CAAC;YAC7C,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC;YACvD,MAAM,oBAAoB,GAAG,CAAC,SAAS,GAAG,cAAc,IAAI,WAAW,CAAC;AACxE,YAAA,MAAM,wBAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAoB,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC;YACjF,OAAO;AACH,gBAAA,QAAQ,EAAG,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS;AAC1D,gBAAA,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc;gBACtD,OAAO,EAAE,WAAW,EAAE,wBAAwB;aACjD,CAAC;SACL;;QAGD,SAAS,aAAa,CAAC,UAAkB,EAAA;;AAErC,YAAA,MAAM,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAC7C,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,EAAE,UAAU,CAAC,CAAC;YACjE,MAAM,kBAAkB,GAAG,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAC;;YAG/E,IAAI,gBAAgB,EAAE;gBAClB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AACnE,gBAAA,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aACnC;;AAGD,YAAA,OAAO,UAAU,CAAC,MAAM,CAAC,QAAQ,IAAG;gBAChC,MAAM,UAAU,GAAS,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC5D,gBAAA,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;AACpC,gBAAA,UAAU,CAAC,OAAO,GAAG,GAAG,IAAG;AACvB,oBAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACxB,iBAAC,CAAC;AACF,gBAAA,UAAU,CAAC,OAAO,GAAG,GAAG,IAAG;AACvB,oBAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACxB,iBAAC,CAAC;AACF,gBAAA,UAAU,CAAC,MAAM,GAAG,MAAK;AACzB,iBAAC,CAAC;AACF,gBAAA,UAAU,CAAC,SAAS,GAAG,MAAK;AACxB,oBAAA,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBACjC,QAAQ,CAAC,QAAQ,EAAE,CAAC;AACxB,iBAAC,CAAC;AAEF,gBAAA,OAAO,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;;aAGnD,CAAC,CAAC,IAAI;;AAEH,YAAA,UAAU,CAAC,CAAC,CAAC,KAAI;;gBAEb,MAAM,QAAQ,GAAG,sBAAsB,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AACnE,gBAAA,OAAO,UAAU,CAAC,MAAM,IAAI,aAAa,CAAC,YAAY,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC1E,aAAC,CAAC;;AAGF,YAAA,SAAS,CAAC,CAAC,IAAI,KAAI;gBACf,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,gBAAA,OAAO,UAAU,CAAC,GAAG,CACjB,WAAW,EAAE,IAAI,EACjB;oBACI,OAAO,EAAE,IAAI,WAAW,CAAC;AACrB,wBAAA,eAAe,EAAE,kBAAkB;qBACtC,CAAC;AACF,oBAAA,YAAY,EAAE,MAAM;AACvB,iBAAA,CACJ,CAAC,IAAI;;AAEF,gBAAA,UAAU,CAAC,CAAC,CAAC,KAAI;;AAEb,oBAAA,UAAU,EAAE,CAAC;;AAGb,oBAAA,WAAW,EAAE,CAAC;;oBAGd,IAAI,gBAAgB,EAAE;wBAClB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC7E,wBAAA,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;qBACnC;;AAGD,oBAAA,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/B,iBAAC,CAAC;;gBAGF,KAAK,CAAC,kBAAkB,CAAC;;AAGzB,gBAAA,UAAU,CAAC,CAAC,CAAC,KAAI;;oBAEb,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC7E,oBAAA,OAAO,UAAU,CAAC,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;iBAC7E,CAAC,CACL,CAAC;aACL,CAAC,CACL,CAAC;SACL;;AAGD,QAAA,SAAS,YAAY,GAAA;YACjB,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;YAC5E,IAAI,gBAAgB,EAAE;AAClB,gBAAA,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACxC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;aAC/B;AAED,YAAA,MAAM,cAAc,GAAmB;gBACnC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;gBACnC,WAAW,EAAE,gBAAgB,CAAC,WAAW;gBACzC,UAAU,EAAE,gBAAgB,CAAC,UAAU;gBACvC,UAAU,EAAE,gBAAgB,CAAC,UAAU;gBACvC,SAAS,EAAE,gBAAgB,CAAC,SAAS;gBACrC,WAAW,EAAE,gBAAgB,CAAC,WAAW;aAC5C,CAAC;AACF,YAAA,OAAO,cAAc,CAAC;SACzB;;AAGD,QAAA,IAAI,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAC7B,QAAA,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,YAAY,GAAG,WAAW,EAAE,YAAY,EAAE,EAAE;AACnE,YAAA,KAAK,GAAG,KAAK,CAAC,IAAI,CACd,OAAO,CAAC,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC,CAC7C,CAAC;SACL;;QAGD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;KACxC;AACJ;;AC5RK,MAAO,WAAY,SAAQ,KAAK,CAAA;IACpC,WACkB,CAAA,OAAe,EACxB,IAAqB,EAAA;QAC5B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,IAAO,CAAA,OAAA,GAAP,OAAO,CAAQ;QACxB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAiB;KAE7B;AACF,CAAA;IAEW,gBAGX;AAHD,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,oBAAA,CAAA,GAAA,oBAAyC,CAAA;AACzC,IAAA,eAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC,CAAA;AACrC,CAAC,EAHW,eAAe,KAAf,eAAe,GAG1B,EAAA,CAAA,CAAA;;ACYM,MAAM,iBAAiB,GAAG,iBAAiB;AAG3C,MAAM,cAAc,GAAG,OAAO;AAErC;AAEA;;;;AAIG;AACG,SAAU,uBAAuB,CAAC,MAAc,EAAA;IAClD,MAAM,OAAO,GAAe,EAAE,CAAC;IAE/B,IAAI,CAAC,MAAM,EAAE;AACT,QAAA,OAAO,OAAO,CAAC;KAClB;AAED,IAAA,MAAM,mBAAmB,GAAoC;AACzD,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,GAAG,EAAE,KAAK;KACb,CAAC;AACF,IAAA,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;IAEpB,SAAS,IAAI,CAAC,KAAa,EAAA;QACvB,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;KAChD;IAED,SAAS,IAAI,CAAC,KAAa,EAAA;AACvB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9B,QAAA,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;AAClB,YAAA,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAC,CAAC,CAAC,CAAC;SAChE;QACD,UAAU,GAAG,SAAS,CAAC;AACvB,QAAA,OAAO,UAAU,CAAC;KACrB;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;AACnB,QAAA,IAAI;AACA,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,MAAM,GAAa,EAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAC,CAAC;AACtF,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACtB,YAAA,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,YAAA,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE;AAC5F,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,gBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAC3E,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7B,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzD,gBAAA,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC7C,IAAI,UAAU,EAAE;;oBAEZ,MAAM,CAAC,UAAU,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAQ,CAAC;iBACzD;AACD,gBAAA,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAClB,gBAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;aACzB;AACD,YAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACxB;AAAC,QAAA,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SACtB;KACJ;AAED,IAAA,OAAO,OAAO,CAAC;AACnB,CAAC;IAEW,YAIX;AAJD,CAAA,UAAY,WAAW,EAAA;AACnB,IAAA,WAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,WAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,WAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACjB,CAAC,EAJW,WAAW,KAAX,WAAW,GAItB,EAAA,CAAA,CAAA,CAAA;AAED;;;;;;;;;;;;;;;;;;;AAmBG;MAEU,YAAY,CAAA;IACrB,IAAI,OAAO,CAAC,QAAgB,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;KAC5B;AAED,IAAA,IAAI,OAAO,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC;KACtD;AA8CD,IAAA,WAAA,CACgB,IAAmB,EACnB,QAAkB,EACN,MAAqB,EAAA;QAFjC,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAe;QACnB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAU;QACN,IAAM,CAAA,MAAA,GAAN,MAAM,CAAe;AA5CjD;;AAEG;AACK,QAAA,IAAA,CAAA,QAAQ,GAAiC,IAAI,eAAe,CAAc,IAAI,CAAC,CAAC;AAChF,QAAA,IAAA,CAAA,kBAAkB,GAA4B,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;aAC7E,IAAI,CACD,SAAS,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,CACjC,CAAC;AAGN;;AAEG;AACK,QAAA,IAAA,CAAA,gBAAgB,GAA6B,IAAI,eAAe,CAAU,IAAI,CAAC,CAAC;AAChF,QAAA,IAAA,CAAA,0BAA0B,GAAwB,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE;aACzF,IAAI,CACD,SAAS,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,CACjC,CAAC;AAWE,QAAA,IAAA,CAAA,qBAAqB,GAAgC,IAAI,eAAe,CAAa,EAAE,CAAC,CAAC;AAOjG;;;AAGG;QACK,IAAgB,CAAA,gBAAA,GAAG,KAAK,CAAC;QAO7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAEhD,QAAA,IAAI,iBAAqC,CAAC;AAC1C,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE;AACzB,YAAA,iBAAiB,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAC/C,GAAG,CAAC,CAAC,OAAO,KAAI;AACZ,gBAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACzB,gBAAA,OAAO,OAAO,CAAC;aAClB,CAAC,CACL,CAAC;SACL;aAAM;YACH,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAwB,GAAG,IAAI,CAAC,QAAQ,CAAe,aAAA,CAAA,CAAC,CAAC,IAAI,CAC1F,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,EAChD,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAC3C,CAAC;SACL;AACD,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,CAC3C,KAAK,CAAC,EAAE,SAAS,EAAE,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAC5H,CAAC;AAEF,QAAA,MAAM,WAAW,GAA2B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AACrG,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,GAAG,CAAA,OAAA,EAAU,WAAW,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC;QAChF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAC3C,aAAA,IAAI,CACD,KAAK,CAAC,EAAE,SAAS,EAAE,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAC5H,CAAC;QAEN,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;AAC3D,aAAA,IAAI,CACD,KAAK,CAAC,EAAE,SAAS,EAAE,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAC5H,CAAC;;AAEN,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;KACjC;AAEO,IAAA,gBAAgB,CAAC,cAAqC,EAAA;AAC1D,QAAA,MAAM,iBAAiB,GAAa,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;;QAGvG,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KAC1D;AAED;;;;;;AAMG;IACK,sBAAsB,GAAA;AAC1B,QAAA,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,iBAAiB;aAC3D,IAAI;;AAED,QAAA,SAAS,CAAC,MAAM,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,EACpE,SAAS,CAAC,MAAM,IAAI,CAAC,mBAAmB;;;;aAInC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CACrC,EACD,GAAG,CAAC,MAAM,IAAI,CAAC,CAClB,CAAC;KACL;AAEL;;;;AAIG;IACK,kCAAkC,GAAA;AACtC,QAAA,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAClE,SAAS,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,CAC5C,CAAC;KACL;AAEM,IAAA,UAAU,CAAC,QAAgB,EAAA;QAC9B,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,OAAO,GAAG,QAAQ,CAAC;AACvD,QAAA,OAAO,IAAI,CAAC;KACf;AAED;;;;;;;;;;;;;AAaG;IACI,KAAK,CAAC,QAA6B,IAAI,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;AACrE,QAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,YAAY,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;AAC9E,QAAA,OAAO,IAAI,CAAC;KACf;AAED;;;;;;;;;;;AAWG;AACI,IAAA,iBAAiB,CAAC,cAAsB,EAAA;AAC3C,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,OAAO,UAAU,CAAC,0DAA0D,CAAC,CAAC;SACjF;QAED,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,cAAc,GAAG,cAAc,CAAC;AACpE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAc,GAAG,IAAI,CAAC,QAAQ,CAAc,YAAA,CAAA,CAAC,CAAC,IAAI,CAC9D,GAAG,CAAC,OAAO,IAAG;;AAEV,YAAA,IAAI,OAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,QAAQ,EAAE;;AAE3E,gBAAA,IAAI;AACA,oBAAA,IAAI,CAAC,KAAK,CAAC,EAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,EAAC,CAAC,CAAC;iBACvD;gBAAC,OAAO,CAAC,EAAE;AACR,oBAAA,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;iBACpF;aACJ;AACL,SAAC,CAAC,EACF,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAC9C,CAAC;KACT;AAED;;;;;;;;;;AAUG;AACI,IAAA,yBAAyB,CAAC,cAAsB,EAAA;QACnD,IAAI,CAAC,8BAA8B,EAAE,CAAC;QAEtC,OAAO,EAAE,CAAC,IAAI,CAAC;aACV,IAAI;;AAED,QAAA,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,cAAc,GAAG,cAAc,CAAC,EAC9E,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAU,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAkC,gCAAA,CAAA,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CACvH;AACA,aAAA,IAAI,CACD,IAAI,CAAC,wBAAwB,EAAE,CAClC,CAAC;KACT;IAEM,aAAa,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;AAE5C,QAAA,OAAO,IAAI,CAAC;KACf;AAED;;;;;;;;;AASG;AACI,IAAA,KAAK,CAAC,QAAgB,EAAE,MAAc,EAAE,QAAgB,EAAA;AAC3D,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,OAAO,UAAU,CAAC,0DAA0D,CAAC,CAAC;SACjF;AACD,QAAA,MAAM,UAAU,GAAW,IAAI,CAAC,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,MAAM,CAAI,CAAA,EAAA,QAAQ,CAAE,CAAA,CAAC,CAAC;AAErE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACjB,CAAG,EAAA,IAAI,CAAC,QAAQ,CAAe,aAAA,CAAA,EAC/B,IAAI,EACJ;AACI,YAAA,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,IAAI,WAAW,CAAC,EAAE,aAAa,EAAE,CAAS,MAAA,EAAA,UAAU,CAAE,CAAA,EAAC,CAAC;SACpE,CACJ;AACA,aAAA,IAAI,CACD,GAAG,CAAC,CAAC,QAA2B;;QAE5B,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,cAAc,GAAG,CAAA,EAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAE,CAAA,CACvK,EACD,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,EAC9B,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAC9C,CAAC;KACL;AAED;;;;;;;AAOG;AACI,IAAA,aAAa,CAAC,QAAgB,EAAE,MAAc,EAAE,QAAgB,EAAA;QACnE,IAAI,CAAC,8BAA8B,EAAE,CAAC;AAEtC,QAAA,MAAM,UAAU,GAAW,IAAI,CAAC,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,MAAM,CAAI,CAAA,EAAA,QAAQ,CAAE,CAAA,CAAC,CAAC;AACrE,QAAA,IAAI,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,QAAQ,0BAA0B,CAAC;AACrD,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE;YACnC,GAAG,IAAI,WAAW,CAAC;SACtB;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACjB,GAAG,EACH,IAAI,EACJ;AACI,YAAA,OAAO,EAAE,UAAU;AACnB,YAAA,OAAO,EAAE,IAAI,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,GAAG,CAAA,MAAA,EAAS,UAAU,CAAA,CAAE,EAAE,CAAC;SACpF,CACJ,CAAC,IAAI,CACF,GAAG,CAAC,CAAC,QAA+B,KAAI;;YAEpC,MAAM,KAAK,GAAG,CAAG,EAAA,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA,CAAE,CAAC;YAC9H,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,cAAc,GAAG,KAAK,CAAC;AAC/D,SAAC,CAAC,EACF,IAAI,CAAC,wBAAwB,EAAE,CAClC,CAAC;KACL;AAED;;;AAGG;IACK,8BAA8B,GAAA;;;;AAIlC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;;;;AAI7B,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;KACvC;AAED;;;AAGG;IACK,wBAAwB,GAAA;AAC5B,QAAA,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAC1B,GAAG,CAAC,CAAC,IAA2B,KAAI;;AAEhC,YAAA,IAAI;AACA,gBAAA,IAAI,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;aAC3F;YAAC,OAAO,CAAC,EAAE;AACR,gBAAA,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,CAAC,CAAC,CAAC;aAC/D;AACL,SAAC,CAAC,EACF,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EACtB,GAAG,CAAC,CAAC,OAAgB,KAAI;;AAErB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;YAEjB,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,QAAQ,EAAE;;AAE/F,gBAAA,IAAI;AACA,oBAAA,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;iBACzD;gBAAC,OAAO,CAAC,EAAE;AACR,oBAAA,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;iBACpF;aACJ;SACJ,CAAC,EACF,GAAG,CAAC,CAAC,OAAgB,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAC9D,UAAU,CAAC,CAAC,CAAC,KAAI;YACb,IAAI,CAAC,6BAA6B,EAAE,CAAC;AACrC,YAAA,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;SACxB,CAAC,CACL,CAAC;KACL;IAEO,6BAA6B,GAAA;;QAEjC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,cAAc,GAAG,EAAE,CAAC;;;AAGxD,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;;AAEpC,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;AAEpC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACpC;AAEO,IAAA,uBAAuB,CAAC,KAAiB,EAAA;AAC7C,QAAA,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QACzC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;KAChD;IAEM,GAAG,CAAI,QAAgB,EAAG,OAAmC,EAAA;AAChE,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAC,GAAG,OAAO,EAAC,CAAC,CAAC,CACnF,CAAC;KACL;AAEM,IAAA,IAAI,CAAI,QAAgB,EAAE,YAA4B,EAAE,SAA8C,EAAE,OAAmC,EAAA;QAC9I,IAAI,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,YAAY,EAAE;YACd,GAAG,GAAG,GAAG,GAAG,CAAA,EAAG,YAAY,CAAC,WAAW,EAAE,CAAA,CAAE,CAAC;SAC/C;QAED,IAAI,SAAS,EAAE;YACX,IAAI,CAAC,OAAO,EAAE;gBACV,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aACnH;AAAM,iBAAA,IAAI,OAAO,EAAE,OAAO,EAAE;AACzB,gBAAA,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1E,gBAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;aAChD;SACJ;QAED,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CACzD,CAAC;KACL;AAEM,IAAA,UAAU,CAAI,QAAgB,EAAE,IAAO,EAAE,OAAmC,EAAA;AAC/E,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAC1B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAC/B,IAAI,EACJ,EAAC,GAAG,OAAO,EAAC,CACf,CAAC,CACL,CAAC;KACL;AAEM,IAAA,WAAW,CAAI,QAAgB,EAAE,IAAO,EAAE,OAAmC,EAAA;QAChF,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAC1B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAC/B,IAAI,EACJ,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CACtC,CAAC,EACF,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAClE,CAAC;KACL;AAEM,IAAA,eAAe,CAAI,QAAgB,EAAE,IAAO,EAAE,cAAsB,iBAAiB,EAAA;QACxF,OAAO,IAAI,CAAC,IAAI;AACX,aAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACpE,aAAA,IAAI,CACD,GAAG,CAAC,CAAC,GAAgC,KAAI;YACrC,MAAM,WAAW,GAAe,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;kBACzD,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;kBACxD,EAAE,CAAC;YACT,MAAM,KAAK,GAAe,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,KAAK,CAAC;AAClC,iBAAA,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,EAAE;gBACP,MAAM,IAAI,WAAW,CACnB,CAAiB,cAAA,EAAA,QAAQ,CAAkC,gCAAA,CAAA,EAC3D,eAAe,CAAC,kBAAkB,CACnC,CAAC;aACL;YACD,OAAO,IAAI,CAAC,IAAI,CAAC;SACpB,CAAC,CACL,CAAC;KACT;AAEM,IAAA,aAAa,CAAI,QAAgB,EAAE,IAAO,EAAE,cAAsB,iBAAiB,EAAA;QACtF,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC;AACnD,aAAA,IAAI,CACD,GAAG,CAAC,CAAC,WAAW,KAAK,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CACtE,CAAC;KACT;AAEM,IAAA,UAAU,CAAI,QAAgB,EAAE,IAAO,EAAE,OAAmC,EAAA;AAC/E,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CACzB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAC/B,IAAI,EACJ,EAAE,GAAG,OAAO,EAAE,CACjB,CAAC,CACL,CAAC;KACL;AAEM,IAAA,WAAW,CAAI,QAAgB,EAAE,IAAO,EAAE,OAAmC,EAAA;QAEhF,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CACzB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAC/B,IAAI,EACJ,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CACtC,CAAC,EACF,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CACjE,CAAC;KACL;IAEM,UAAU,CAAC,QAAgB,EAAE,OAAmC,EAAA;AACnE,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAC3F,CAAC;KACL;IAEM,WAAW,CAAC,QAAgB,EAAE,OAAmC,EAAA;QACpE,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,EACvG,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CACpE,CAAC;KACL;IAEO,iBAAiB,CAAC,QAA2B,EAAE,QAAgB,EAAA;AACnE,QAAA,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;AAC7D,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAW,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;SACpE;AAAM,aAAA,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,qCAAqC,CAAC,EAAE;AAC9F,YAAA,MAAM,IAAI,GAAa,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AACpE,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;SACnB;QAED,OAAO,UAAU,CAAC,MAAM,IAAI,WAAW,CACrC,CAAwC,qCAAA,EAAA,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAA6E,2EAAA,CAAA,EAC3I,eAAe,CAAC,eAAe,CAClC,CAAC,CAAC;KACN;AAKM,IAAA,SAAS,CAAgC,cAA4C,EAAA;AACxF,QAAA,MAAM,cAAc,GAA2B,OAAO,cAAc,KAAK,QAAQ;AAC7E,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAa,CAAG,EAAA,IAAI,CAAC,QAAQ,CAAe,YAAA,EAAA,cAAc,CAAE,CAAA,CAAC;AAC1E,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAa,CAAA,EAAG,IAAI,CAAC,QAAQ,0BAA0B,cAAc,CAAC,IAAI,CAAI,CAAA,EAAA,cAAc,CAAC,EAAE,CAAA,CAAE,CAAC,CAAC;AAEpH,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,cAAc,CAAC,EAC/B,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,CAAA,EAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAClE,CAAC;KACL;IAEM,UAAU,CAAC,IAAc,EAAE,OAAmC,EAAA;AACjE,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAW,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CACtE,CAAC;KACL;AAEM,IAAA,cAAc,CAAC,IAAc,EAAA;AAChC,QAAA,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;KAChF;IAEM,UAAU,CAAC,IAAe,EAAE,OAAmC,EAAA;AAClE,QAAA,MAAM,IAAI,GAAa,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,OAAO,UAAU,CAAC,MAAM,IAAI,WAAW,CACrC,CAAA,wCAAA,CAA0C,EAC1C,eAAe,CAAC,kBAAkB,CACnC,CAAC,CAAC;SACN;AAED,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAW,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CACzE,CAAC;KACL;AAmBM,IAAA,KAAK,CAAI,OAAsB,EAAE,SAAe,EAAE,OAAmC,EAAA;AACxF,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,CAAG,EAAA,IAAI,CAAC,QAAQ,CAAA,UAAA,EAAa,OAAO,CAAC,GAAG,EAAE,CAAE,CAAA,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;KAC9F;AAmBM,IAAA,SAAS,CAAI,MAAS,EAAE,SAAe,EAAE,OAAmC,EAAA;AAC/E,QAAA,MAAM,IAAI,GAAa,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAG,MAAuB,CAAC,IAAI,CAAC,CAAC;QACzF,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,OAAO,UAAU,CAAC,MAAM,IAAI,WAAW,CACrC,CAAA,wCAAA,CAA0C,EAC1C,eAAe,CAAC,kBAAkB,CACnC,CAAC,CAAC;SACN;AAED,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;KAC3D;AAEM,IAAA,YAAY,CAAI,MAAS,EAAA;AAC5B,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAG,MAAuB,CAAC,IAAI,CAAC,CAAC;KAC9E;AAmBM,IAAA,YAAY,CAAI,MAAS,EAAE,SAAe,EAAE,OAAmC,EAAA;AAClF,QAAA,MAAM,IAAI,GAAa,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAG,MAAuB,CAAC,IAAI,CAAC,CAAC;QAC5F,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,OAAO,UAAU,CAAC,MAAM,IAAI,WAAW,CACrC,CAAA,2CAAA,CAA6C,EAC7C,eAAe,CAAC,kBAAkB,CACjC,CAAC,CAAC;SACR;AAED,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;KAC3D;AAEM,IAAA,eAAe,CAAI,MAAS,EAAA;AAC/B,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAG,MAAuB,CAAC,IAAI,CAAC,CAAC;KACjF;AAmBM,IAAA,QAAQ,CAAI,MAAS,EAAE,SAAe,EAAE,OAAmC,EAAA;AAC9E,QAAA,MAAM,IAAI,GAAa,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAG,MAAuB,CAAC,IAAI,CAAC,CAAC;QACxF,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,OAAO,UAAU,CAAC,MAAM,IAAI,WAAW,CACrC,CAAA,uCAAA,CAAyC,EACzC,eAAe,CAAC,kBAAkB,CACjC,CAAC,CAAC;SACR;AAED,QAAA,OAAO,IAAI,CAAC,YAAY,CAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;KAC9D;AAEM,IAAA,WAAW,CAAI,MAAS,EAAA;AAC3B,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAG,MAAuB,CAAC,IAAI,CAAC,CAAC;KAC7E;AAmBM,IAAA,QAAQ,CAAI,MAAS,EAAE,SAAe,EAAE,OAAmC,EAAA;AAC9E,QAAA,MAAM,IAAI,GAAa,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAG,MAAuB,CAAC,IAAI,CAAC,CAAC;QACxF,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,OAAO,UAAU,CAAC,MAAM,IAAI,WAAW,CACrC,CAAA,uCAAA,CAAyC,EACzC,eAAe,CAAC,kBAAkB,CACnC,CAAC,CAAC;SACN;AAED,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;KAC3D;AAEM,IAAA,WAAW,CAAI,MAAS,EAAA;AAC3B,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAG,MAAuB,CAAC,IAAI,CAAC,CAAC;KAC7E;AAEO,IAAA,YAAY,CAAI,IAAY,EAAE,SAAe,EAAE,OAAmC,EAAA;QACtF,IAAI,SAAS,EAAE;YACX,IAAI,CAAC,OAAO,EAAE;gBACV,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;aACnH;AAAM,iBAAA,IAAI,OAAO,EAAE,OAAO,EAAE;AACzB,gBAAA,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1E,gBAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;aAChD;SACJ;QAED,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAC1D,CAAC;KACL;AAEH;;;;;AAKG;AACM,IAAA,gBAAgB,CAAC,IAAe,EAAE,WAAiC,EAAE,aAAsB,EAAA;AAC9F,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;KAC5D;AAEO,IAAA,QAAQ,CAAC,IAAe,EAAE,GAAW,EAAE,IAAY,EAAA;QACvD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACrB,YAAA,OAAO,SAAS,CAAC;SACpB;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;YAC3B,IAAI,IAAI,EAAE;AACN,gBAAA,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;aACvD;YAED,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAClC,SAAC,CAAC,CAAC;KACN;AAEO,IAAA,mBAAmB,CAAC,SAA6C,EAAA;AACrE,QAAA,OAAO,OAAO,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,QAAQ,GAAG,OAAO,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC/H;AAED;;AAEG;AACH,IAAA,IAAW,OAAO,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACrC,SAAS,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,CAC3C,CAAC;KACL;AAED;;AAEG;AACH,IAAA,IAAW,eAAe,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,kCAAkC,EAAE,CAAC,IAAI,CACjD,SAAS,CAAC,MAAM,IAAI,CAAC,0BAA0B,CAAC,CACnD,CAAC;KACL;AAED,IAAA,IAAW,QAAQ,GAAA;AACf,QAAA,OAAO,KAAK,CACJ,IAAI,CAAC,eAAe,CAAC,IAAI,CACrB,MAAM,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,EACnC,GAAG,CAAC,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/D,EACD,IAAI,CAAC,OAAO,CAAC,IAAI,CACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EACpC,GAAG,CAAC,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAC1C,CACJ,CAAC;KACT;AAED,IAAA,IAAW,YAAY,GAAA;AACnB,QAAA,OAAO,KAAK,CACR,IAAI,CAAC,eAAe,CAAC,IAAI,CACrB,MAAM,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,EACnC,GAAG,CAAC,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAC7D,EACD,IAAI,CAAC,OAAO,CAAC,IAAI,CACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EACpC,GAAG,CAAC,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CACzC,CACJ,CAAC;KACL;AAED;;AAEG;AACH,IAAA,IAAW,QAAQ,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CACpB,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CACpH,CAAC;KACL;AAED;;AAEG;AACH,IAAA,IAAW,gBAAgB,GAAA;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAC5B,SAAS,CAAC,MAAK;AACX,YAAA,IAAI,CAAC,IAAI,CAAC,4BAA4B,EAAE;;AAEpC,gBAAA,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,qBAAqB;qBACzD,IAAI;;gBAED,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC;;gBAE7E,SAAS,CAAC,CAAC,IAAc,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAsB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;;AAE9F,gBAAA,GAAG,CAAC,CAAC,mBAAwC,KAAK,mBAAmB,IAAI,mBAAmB,CAAC,MAAM,CAAC,CACvG;AACA,qBAAA,IAAI,CACD,KAAK,CAAC,EAAE,SAAS,EAAE,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAC5H,CAAC;aACT;YACD,OAAO,IAAI,CAAC,4BAA4B,CAAC;AAC7C,SAAC,CAAC;;AAGF,QAAA,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC;;QAEpC,GAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE,OAAO,CAAC,KAAI;AACnC,YAAA,IAAI,CAAC,mBAAmB,IAAI,CAAC,OAAO,EAAE;AAClC,gBAAA,OAAO,IAAI,CAAC;aACf;AACD,YAAA,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;YACzC,IAAI,CAAC,eAAe,EAAE;AAClB,gBAAA,OAAO,IAAI,CAAC;aACf;AACD,YAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,eAAe,CAAC,CAAC;SACxF,CAAC,CACL,CAAC;KACL;AAEM,IAAA,WAAW,CAAC,OAAoB,EAAA;QACnC,OAAO,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;KAC5G;AAED;;;AAGG;AACK,IAAA,gBAAgB,CAAC,QAAgB,EAAA;QACrC,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAG,EAAA,IAAI,CAAC,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAC;KACnF;8GArzBQ,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAAZ,YAAY,EAAA,CAAA,CAAA,EAAA;;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,UAAU;;0BAyDE,QAAQ;;;AC7KrB;;;AAGG;MASU,YAAY,CAAA;IACvB,OAAO,OAAO,CAAC,MAAqB,EAAA;QAClC,OAAO;AACL,YAAA,QAAQ,EAAE,YAAY;AACtB,YAAA,SAAS,EAAE;AACT,gBAAAC,yBAAgC;AAChC,gBAAAC,kBAAyB;AACzB,gBAAAC,gCAAuC;AACvC,gBAAAC,aAAoB;AACpB,gBAAAC,YAAmB;AACnB,gBAAA;AACE,oBAAA,OAAO,EAAE,YAAY;oBACrB,QAAQ,EAAE,MAAM,IAAI,EAAE;AACvB,iBAAA;AACF,aAAA;SACF,CAAC;KACH;8GAhBU,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,YANrB,gBAAgB;YAChB,YAAY,CAAA,EAAA,CAAA,CAAA,EAAA;AAKH,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,YANrB,gBAAgB;YAChB,YAAY,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAKH,YAAY,EAAA,UAAA,EAAA,CAAA;kBARxB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,gBAAgB;wBAChB,YAAY;AACb,qBAAA;AACD,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE,EAAE;AACZ,iBAAA,CAAA;;;AChBD;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"vcd-sdk.mjs","sources":["../../../../projects/vcd/sdk/src/client/query/query.builder.ts","../../../../projects/vcd/sdk/src/client/query/filter.builder.ts","../../../../projects/vcd/sdk/src/client/client/api.result.service.ts","../../../../projects/vcd/sdk/src/common/container-hooks.ts","../../../../projects/vcd/sdk/src/core/plugin.module.ts","../../../../projects/vcd/sdk/src/client/client/logging.interceptor.ts","../../../../projects/vcd/sdk/src/client/client/constants.ts","../../../../projects/vcd/sdk/src/client/jwt/decoded-jwt.ts","../../../../projects/vcd/sdk/src/client/client/request.headers.interceptor.ts","../../../../projects/vcd/sdk/src/client/client/response.normalization.interceptor.ts","../../../../projects/vcd/sdk/src/client/client/vcd.http.client.ts","../../../../projects/vcd/sdk/src/client/client/vcd.transfer.client.ts","../../../../projects/vcd/sdk/src/client/client/types.ts","../../../../projects/vcd/sdk/src/client/client/vcd.api.client.ts","../../../../projects/vcd/sdk/src/main.ts","../../../../projects/vcd/sdk/src/public-api.ts","../../../../projects/vcd/sdk/src/vcd-sdk.ts"],"sourcesContent":["import { Filter } from './filter.builder';\n\n// tslint:disable:variable-name\n// tslint:disable-next-line:no-namespace\nexport namespace Query {\n export class Builder {\n private _type: string;\n private _format: Format = Format.ID_RECORDS;\n private _links = true;\n private _pageSize = 25;\n private _fields: string[];\n private _filter: string;\n private _sort: { field: string, reverse?: boolean }[];\n\n private constructor() { }\n\n public static getBuilder(): Builder {\n return new Builder();\n }\n\n public static ofType(type: string): Builder {\n const qb = new Builder();\n qb._type = type;\n return qb;\n }\n\n public format(format: Query.Format): Builder {\n this._format = format;\n return this;\n }\n\n public links(links: boolean): Builder {\n this._links = links;\n return this;\n }\n\n public pageSize(pageSize: number): Builder {\n this._pageSize = pageSize;\n return this;\n }\n\n public fields(...fields: string[]): Builder {\n this._fields = fields;\n return this;\n }\n\n public filter(filter: string): Builder {\n this._filter = filter;\n return this;\n }\n\n public sort(...sort: { field: string, reverse?: boolean }[]): Builder {\n this._sort = sort;\n return this;\n }\n\n public get(): string {\n let query = `?type=${this._type}&format=${this._format}&links=${this._links}&pageSize=${this._pageSize}`;\n if (this._fields && this._fields.length > 0) {\n query += `&fields=${this._fields.join(',')}`;\n }\n\n if (this._filter) {\n query += `&filter=${this._filter}`;\n }\n\n if (this._sort) {\n this._sort.forEach(s => {\n query += `&${s.reverse ? 'sortDesc' : 'sortAsc'}=${s.field}`;\n });\n }\n\n return query;\n }\n\n public getCloudAPI(): string {\n let query = `?pageSize=${this._pageSize}`;\n\n if (this._filter) {\n query += `&filter=${this._filter}`;\n }\n\n if (this._sort) {\n this._sort.forEach(s => {\n query += `&${s.reverse ? 'sortDesc' : 'sortAsc'}=${s.field}`;\n });\n }\n\n return query;\n }\n }\n\n export class Format {\n static readonly ID_RECORDS: string = 'idrecords';\n static readonly RECORDS: string = 'records';\n static readonly REFERENCES: string = 'references';\n }\n}\n","// tslint:disable-next-line:no-namespace\nexport namespace Filter {\n class Operators {\n public static readonly OR: string = ',';\n public static readonly AND: string = ';';\n public static readonly GT: string = '=gt=';\n public static readonly GE: string = '=ge=';\n public static readonly LT: string = '=lt=';\n public static readonly LE: string = '=le=';\n public static readonly EQ: string = '==';\n public static readonly NEQ: string = '!=';\n }\n\n /**\n * Collection of strategies for wilcard string matching.\n */\n export class MatchMode {\n /**\n * Match the start of a string.\n */\n public static readonly START: string = 'START';\n\n /**\n * Match the end of a string.\n */\n public static readonly END: string = 'END';\n\n /**\n * Match anywhere in the string.\n */\n public static readonly ANYWHERE: string = 'ANYWHERE';\n }\n\n /**\n * A filter item that can define a comparison/condition.\n */\n export interface Property {\n /**\n * Create a filter condition to evaluate whether the property is equal to the specified value.\n *\n * @param value the pattern to evaluate\n * @param moreValues optional additional patterns to evaluate that will be treated as an OR condition\n * @returns an evaluatable filter condition\n */\n equalTo(value: (boolean | number | string), ...moreValues: (boolean | number | string)[]): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is not equal to the specified value.\n *\n * @param value the pattern to evaluate\n * @returns an evaluatable filter condition\n */\n notEqualTo(value: (boolean | number | string)): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is less than the specified value.\n *\n * @param value the pattern to evaluate\n * @returns an evaluatable filter condition\n */\n lessThan(value: number): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is less than or equal to the specified value.\n *\n * @param value the pattern to evaluate\n * @returns an evaluatable filter condition\n */\n lessOrEqualTo(value: number): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is greater than the specified value.\n *\n * @param value the pattern to evaluate\n * @returns an evaluatable filter condition\n */\n greaterThan(value: number): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is greater than or equal to the specified value.\n *\n * @param value the pattern to evaluate\n * @returns an evaluatable filter condition\n */\n greaterOrEqualTo(value: number): CompleteCondition;\n\n /**\n * Create a filter condition to evaluate whether the property is a wildcard match with the specified value.\n *\n * @param value the pattern to evaluate\n * @param mode the type of wildcard evaluation to perform\n * @returns an evaluatable filter condition\n */\n like(value: string, mode: MatchMode): CompleteCondition;\n }\n\n /**\n * A representation of a condition that is incomplete by itself, like an empty condition, aggregation wrapper, or junction.\n */\n export interface PartialCondition {\n /**\n * Create a simple property to be evaulated as a filter condition.\n *\n * @param property the name of the property\n * @returns a Property instance for defining a filter condition\n */\n is(property: string): Property;\n\n /**\n * Create a conjunction (AND) condition from existing conditions.\n *\n * @param condition1 first condition\n * @param condition2 second condition\n * @param conditionN any additional conditions\n * @returns an evaluatable filter condition\n */\n and(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;\n\n /**\n * Create a disjunction (OR) condition from existing conditions.\n *\n * @param condition1 first condition\n * @param condition2 second condition\n * @param conditionN any additional conditions\n * @returns an evaluatable filter condition\n */\n or(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;\n }\n\n /**\n * An evaluatable filter condition.\n */\n export interface CompleteCondition {\n /**\n * Add a condtion to this condition.\n *\n * This new condition will be ANDed to the existing condition.\n *\n * @returns an incomplete (empty) condition\n */\n and(): PartialCondition;\n\n /**\n * Add a condtion to this condition.\n *\n * This new condition will be ORed to the existing condition.\n *\n * @returns an incomplete (empty) condition\n */\n or(): PartialCondition;\n\n /**\n * Build the FIQL representation of the condition.\n *\n * @returns a FIQL string\n */\n query(): string;\n }\n\n class BuilderChain implements CompleteCondition, PartialCondition, Property {\n private result = '';\n private parent: BuilderChain;\n private currentCompositeOp: string;\n\n constructor(parent?: BuilderChain) {\n this.parent = parent;\n }\n\n public query(): string {\n return this.buildPartial();\n }\n\n public and(): PartialCondition;\n public and(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;\n // tslint:disable-next-line:max-line-length\n public and(condition1?: CompleteCondition, condition2?: CompleteCondition, conditionN?: CompleteCondition[]): PartialCondition | CompleteCondition {\n if (!condition1) {\n return this.simpleAnd();\n }\n\n this.result += '(' + (condition1 as BuilderChain).buildPartial() + Operators.AND + (condition2 as BuilderChain).buildPartial();\n if (conditionN && conditionN.length) {\n conditionN.forEach((condition) => {\n this.result += Operators.AND + (condition as BuilderChain).buildPartial();\n });\n }\n\n this.result += ')';\n return this;\n }\n\n private simpleAnd(): PartialCondition {\n if (this.currentCompositeOp === Operators.OR || this.parent && this.parent.currentCompositeOp === Operators.OR) {\n if (this.parent) {\n this.parent.result = '(' + this.parent.result;\n this.result += ')';\n } else {\n this.wrap();\n }\n\n this.currentCompositeOp = Operators.AND;\n }\n\n this.result += Operators.AND;\n return this;\n }\n\n public or(): PartialCondition;\n public or(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;\n // tslint:disable-next-line:max-line-length\n public or(condition1?: CompleteCondition, condition2?: CompleteCondition, conditionN?: CompleteCondition[]): PartialCondition | CompleteCondition {\n if (!condition1) {\n return this.simpleOr();\n }\n\n this.result += '(' + (condition1 as BuilderChain).buildPartial() + Operators.OR + (condition2 as BuilderChain).buildPartial();\n if (conditionN && conditionN.length) {\n conditionN.forEach((condition) => {\n this.result += Operators.OR + (condition as BuilderChain).buildPartial();\n });\n }\n\n this.result += ')';\n return this;\n }\n\n private simpleOr(): PartialCondition {\n if (this.currentCompositeOp === Operators.AND || (this.parent && this.parent.currentCompositeOp === Operators.AND)) {\n if (this.parent) {\n this.parent.result = '(' + this.parent.result;\n this.result += ')';\n } else {\n this.wrap();\n }\n\n this.currentCompositeOp = Operators.OR;\n }\n\n this.result += Operators.OR;\n return this;\n }\n\n private wrap(): CompleteCondition {\n this.result = '(' + this.result + ')';\n this.currentCompositeOp = null;\n return this;\n }\n\n private buildPartial(): string {\n return (this.parent) ? this.parent.buildPartial() + this.result : this.result;\n }\n\n public is(property: string): Property {\n const builder: BuilderChain = new BuilderChain(this);\n builder.result = property;\n return builder;\n }\n\n public equalTo(value: (boolean | number | string), ...moreValues: (boolean | number | string)[]): CompleteCondition {\n return this.condition(Operators.EQ, value, ...moreValues);\n }\n\n public notEqualTo(value: (boolean | number | string)): CompleteCondition {\n return this.condition(Operators.NEQ, value);\n }\n\n public lessThan(value: number): CompleteCondition {\n return this.condition(Operators.LT, value);\n }\n\n public lessOrEqualTo(value: number): CompleteCondition {\n return this.condition(Operators.LE, value);\n }\n\n public greaterThan(value: number): CompleteCondition {\n return this.condition(Operators.GT, value);\n }\n\n public greaterOrEqualTo(value: number): CompleteCondition {\n return this.condition(Operators.GE, value);\n }\n\n public like(value: string, mode: MatchMode = MatchMode.START): CompleteCondition {\n let wildcardValue: string;\n switch (mode) {\n case MatchMode.START:\n wildcardValue = `${value}*`;\n break;\n case MatchMode.END:\n wildcardValue = `*${value}`;\n break;\n case MatchMode.ANYWHERE:\n wildcardValue = `*${value}*`;\n break;\n default:\n wildcardValue = value;\n break;\n }\n\n return this.condition(Operators.EQ, wildcardValue);\n }\n\n private condition(operator: string, value: any, ...moreValues: any[]): CompleteCondition {\n const name = this.result;\n this.result += operator + encodeURI(value as string);\n if (moreValues.length) {\n moreValues.forEach((next) => {\n this.result += ',' + name + operator + encodeURI(next as string);\n });\n\n this.currentCompositeOp = Operators.OR;\n }\n\n return this;\n }\n }\n\n /**\n * Builds a FIQL search condition using a fluent interface.\n */\n export class Builder implements PartialCondition {\n /**\n * Create a simple property to be evaulated as a filter condition.\n *\n * @param property the name of the property\n * @returns a Property instance for defining a filter condition\n */\n is(property: string): Property {\n return new BuilderChain().is(property);\n }\n\n /**\n * Create a conjunction (AND) condition from existing conditions.\n *\n * @param condition1 first condition\n * @param condition2 second condition\n * @param conditionN any additional conditions\n * @returns an evaluatable filter condition\n */\n and(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition {\n return new BuilderChain().and(condition1, condition2, conditionN);\n }\n\n /**\n * Create a disjunction (OR) condition from existing conditions.\n *\n * @param condition1 first condition\n * @param condition2 second condition\n * @param conditionN any additional conditions\n * @returns an evaluatable filter condition\n */\n or(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition {\n return new BuilderChain().or(condition1, condition2, conditionN);\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n// tslint:disable:variable-name\n@Injectable()\nexport class ApiResultService {\n private _results: ApiResult[] = [];\n public get results(): ApiResult[] {\n return this._results;\n }\n\n add(result: ApiResult) {\n this._results = [result, ...this._results.slice(0, 99)];\n }\n\n clear() {\n this._results = [];\n }\n}\n\nexport class ApiResult {\n private _message: string;\n public get message(): string {\n return this._message;\n }\n\n private _succeeded: boolean;\n public get succeeded(): boolean {\n return this._succeeded;\n }\n\n private _started: Date;\n public get started(): Date {\n return this._started;\n }\n\n private _finished: Date;\n public get finished(): Date {\n return this._finished;\n }\n\n constructor(message: string, succeeded: boolean, started: Date, finished: Date) {\n this._message = message;\n this._succeeded = succeeded;\n this._started = started;\n this._finished = finished;\n }\n}\n","/**\n * This is the currently supported - albeit very minimal - public SDK.\n */\nimport {InjectionToken} from '@angular/core';\nimport {Observable} from 'rxjs';\n\n// Bind straight into the hooks provided by the container.\nif (!(window as any).System || !(window as any).System.registry || !(window as any).System.registry.get) {\n throw new Error('SystemJS registry not found');\n}\n\nlet containerHooks: any = (window as any).System.registry.get('@vcd/common');\nif (!containerHooks) {\n containerHooks = (window as any).System.registry.get('@vcd-ui/common');\n}\n\nif (!containerHooks) {\n throw new Error('VCD UI container hooks not present in SystemJS registry');\n}\n\n/**\n * Wire in as a string. Gives the root URL for API access (for example, the load balancer URL\n * or the single-cell URL).\n */\nexport const API_ROOT_URL: InjectionToken<string> = containerHooks.API_ROOT_URL;\n\n/**\n * Wire in as a string. Gives the root URL for the legacy Flex application.\n */\nexport const FLEX_APP_URL: InjectionToken<string> = containerHooks.API_ROOT_URL;\n\n/**\n * Wire in as a string. Gives the current scope of the VCD-UI. As of current, this will be\n * either 'tenant' for the tenant portal, or 'service-provider' for the service-provider portal.\n */\nexport const SESSION_SCOPE: InjectionToken<string> = containerHooks.SESSION_SCOPE;\n\n/**\n * Wire in as a string. Gives the unique name (not the display name) of the current tenant\n * organization that the VCD-UI is being used for.\n */\nexport const SESSION_ORGANIZATION: InjectionToken<string> = containerHooks.SESSION_ORGANIZATION;\n\n/**\n * Wire in as a string. Gives the UUID identifier of the current tenant\n * organization that the VCD-UI is being used for.\n */\nexport const SESSION_ORG_ID: InjectionToken<string> = containerHooks.SESSION_ORG_ID ? containerHooks.SESSION_ORG_ID : '';\n\n/**\n * Wire in as a string. Gives the full root path for module assets (e.g. images, scripts, text files)\n *\n * ATTENTION!\n * Add || new InjectionToken to workaround the Angular security mechanics which prevent use of injection tokens\n * which potentially are not defiend. The same fix can be applied for the rest tokens if needed.\n */\nexport const EXTENSION_ASSET_URL: InjectionToken<string> = containerHooks.EXTENSION_ASSET_URL || new InjectionToken('EXTENSION_ASSET_URL');\n\n/**\n * Wire in as a string. Gives the Angular 2 route that the module is registered under.\n */\nexport const EXTENSION_ROUTE: InjectionToken<string> = containerHooks.EXTENSION_ROUTE;\n\n/**\n * Wire in as a boolean. True if running under the SDK, false if running in production.\n */\nexport const SDK_MODE: InjectionToken<boolean> = containerHooks.SDK_MODE;\n\n/**\n * Payload for registering a navigation menu entry.\n */\nexport interface ExtensionNavRegistration {\n /**\n * The router path to navigate to when selected.\n */\n path: string;\n\n /**\n * i18 key for name of extension, to be used as text for links\n */\n nameCode: string;\n\n /**\n * i18n key for description of extension, to be used on hover for links\n */\n descriptionCode: string;\n}\n\n/**\n * Dispatch this to the redux store to register a navigation menu.\n */\nexport interface ExtensionNavRegistrationAction {\n payload: ExtensionNavRegistration;\n readonly type: string;\n}\n\nexport type ExtensionNavRegistrationActionCtor = new(payload: ExtensionNavRegistration) => ExtensionNavRegistrationAction;\n\nexport const ExtensionNavRegistrationAction: ExtensionNavRegistrationActionCtor = containerHooks.ExtensionNavRegistrationAction;\n\n/**\n * Inject this to access the authentication token.\n */\nexport interface AuthTokenHolderService {\n /**\n * The authentication token.\n */\n token: string;\n\n /**\n * JWT token\n */\n jwt?: string;\n\n /**\n * JWT token async.\n * \n * This method tracks JWT for changes and emits the latest JWT value.\n * The main use case is when the JWT need to refreshed at runtime,\n * this is handled by Refresh-Access-Token feature.\n * \n * If the JWT needs to be renewed all users of it must obtain the last JWT token.\n */\n jwtAsync?: Observable<string>;\n}\n\nexport const AuthTokenHolderService: AuthTokenHolderService = containerHooks.AuthTokenHolderService;\n\n/**\n * This represents a menu item that can be clicked to perform an action on an entity (e.g. VM).\n */\nexport interface EntityActionExtensionMenuItem {\n /**\n * This is a unique URN identifying the action. This is so the component can be notified which action was requested.\n */\n urn: string;\n\n /**\n * This is the label for the menu item. It is not automatically translated.\n */\n text: string;\n\n /**\n * This is the enabled state for the menu item.\n */\n enabled: boolean;\n\n /**\n * This is the busy state for the menu item.\n */\n busy: boolean;\n}\n\n/**\n * This represents a sub-menu that contains other sub-menus or menu actions.\n */\nexport interface EntityActionExtensionSubmenu {\n /**\n * This is the label for the sub-menu. It is not automatically translated.\n */\n text: string;\n\n /**\n * This is an arbitrary, ordered list of EntityActionMenuItem.\n */\n children: EntityActionExtensionMenuItem[];\n}\n\n/**\n * This represents menu information for an entity action.\n */\nexport type EntityActionExtensionMenuEntry = EntityActionExtensionMenuItem | EntityActionExtensionSubmenu;\n\n/**\n * Every component referenced by an entity action extension point must inherit from this.\n */\n// tslint:disable-next-line:class-name\nexport abstract class _EntityActionExtensionComponent {\n /**\n * This returns is an Observable that defines the menu entry for this component. This is actively bound -\n * the component is able to change it in order to have the menu change (for example, to change busy\n * or enabled states).\n */\n abstract getMenuEntry(entityUrn: string): Observable<EntityActionExtensionMenuEntry>;\n\n /**\n * This field is a method that is called if a menu item is clicked while enabled. It will be called with the menu\n * item's URN and the URN of the entity that the action is being called for (e.g. the URN of the VM being edited).\n * It must return a single-shot (e.g. of, fromPromise or .first) Observable on completion. This Observable returns\n * a single value, refreshRequested. If this is true, the entity being edited will be immediately refreshed.\n * @param menuItemUrn the URN of the clicked menu item\n * @param entityUrnThe URN of the entity that the action is being called for\n */\n abstract performAction(menuItemUrn: string, entityUrn: string): Observable<{ refreshRequested: boolean }>;\n}\nexport const EntityActionExtensionComponent: typeof _EntityActionExtensionComponent = containerHooks.EntityActionExtensionComponent;\n\n// tslint:disable-next-line:class-name\nexport abstract class _WizardExtensionComponent<P, R, E> {\n /**\n * Define method which will be executed by the Extension Point Orchestrator,\n * when certain event is triggered.\n * @param payload - the payload of the request triggered by the Core UI.\n * @param response - the response from the request triggered by the Core UI.\n * @param error - the Core UI will reprot any error that may appear during execution.\n */\n abstract performAction(payload: P, response: R, error: E): void;\n}\n\nexport const WizardExtensionComponent: typeof _WizardExtensionComponent = containerHooks.WizardExtensionComponent;\n\nexport interface WizardExtensionState {\n isValid: boolean;\n}\n\n// tslint:disable-next-line:class-name\nexport abstract class _WizardExtensionWithValidationComponent<P, R, E> extends _WizardExtensionComponent<P, R, E> {\n /**\n * Get extension point state.\n */\n abstract getState(): Observable<WizardExtensionState>;\n}\n\n// tslint:disable-next-line:max-line-length\nexport const WizardExtensionWithValidationComponent: typeof _WizardExtensionWithValidationComponent = containerHooks.WizardExtensionWithValidationComponent;\n\n/**\n * Every component-based Extension Point that is renderd in Cloud Director UI Entity Details\n * must extend that class to obtain context about the Entity.\n * \n * See comments of the methods of the abstract class for more information.\n */\n// tslint:disable-next-line:class-name\nexport abstract class _WizardExtensionWithContextComponent<P, R, E> extends _WizardExtensionComponent<P, R, E> {\n /**\n * Define method which will be executed on init and information\n * about context object will be passed to the Extension Point.\n * \n * @param context reference to the context object.\n */\n abstract onContext(context: string): void;\n}\n\n// tslint:disable-next-line:max-line-length\nexport const WizardExtensionWithContextComponent: typeof _WizardExtensionWithContextComponent = containerHooks.WizardExtensionWithContextComponent;\n","import { Store } from '@ngrx/store';\nimport { ExtensionNavRegistration, ExtensionNavRegistrationAction } from '../common';\nimport {InjectionToken} from \"@angular/core\";\nimport {HttpInterceptor} from \"@angular/common/http\";\n\nexport class PluginModule {\n\n constructor(private appStore: Store<any>) {\n }\n\n protected registerExtension(extension: ExtensionNavRegistration): void {\n this.appStore.dispatch(new ExtensionNavRegistrationAction(extension));\n }\n}\n\n/**\n * Config object that is passed on VcdSdkModule init\n * using .forRoot() method. It can be used to store\n * configutration properties that are later used by the Services\n * provided.\n */\nexport class VcdSdkConfig {\n apiVersion: string;\n}\n\n/**\n * Use this token for injecting custom HttpInterceptor implementations inside the HttpClient\n */\nexport const VCD_HTTP_INTERCEPTORS = new InjectionToken<HttpInterceptor[]>(\"VCD_HTTP_INTERCEPTORS\")\n","import { Injectable, Optional } from '@angular/core';\nimport {\n HttpEvent, HttpInterceptor, HttpHandler,\n HttpRequest, HttpResponse\n} from '@angular/common/http';\n\nimport { Observable } from 'rxjs';\nimport { finalize, tap } from 'rxjs/operators';\nimport { ApiResultService, ApiResult } from './api.result.service';\n\n// tslint:disable:variable-name\n@Injectable()\nexport class LoggingInterceptor implements HttpInterceptor {\n private _outputToConsole: boolean;\n private _enabled = false;\n set enabled(enabled: boolean) {\n this._enabled = enabled;\n if (this._enabled && this._outputToConsole) {\n console.warn('API logging enabled but no provider found for ApiResultService. Results will be output to the console.');\n }\n }\n\n constructor(@Optional() private apiResultService: ApiResultService) {\n this._outputToConsole = !this.apiResultService;\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n if (!this._enabled) {\n return next.handle(req);\n }\n\n const started = new Date();\n let succeeded: boolean;\n\n return next.handle(req)\n .pipe(\n tap(\n event => succeeded = event instanceof HttpResponse ? true : false,\n error => succeeded = false\n ),\n finalize(() => {\n if (this._outputToConsole) {\n console.log(`${req.method} ${req.urlWithParams} completed in ${Date.now() - started.getTime()} ms. Success: ${succeeded}`);\n } else {\n this.apiResultService.add(new ApiResult(`${req.method} ${req.urlWithParams}`, succeeded, started, new Date()));\n }\n })\n );\n }\n}\n","/**\n * HTTP Headers\n */\nexport const HTTP_HEADERS = Object.freeze({\n\n Authorization: 'Authorization',\n\n etag: 'etag',\n\n // Angular is dealing with case sensitive links despite the specification\n // https://github.com/angular/angular/issues/6142\n link: 'link',\n Link: 'Link',\n\n x_vcloud_authorization: 'x-vcloud-authorization'\n});\n","/*\n * Copyright (c) 2025-2025 Broadcom. All Rights Reserved. Broadcom Confidential. The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n */\n\nexport class DecodedJwt {\n header: Record<string, any>;\n payload: Record<string, any>;\n signature: string;\n\n constructor(private rawToken: string) {\n const parts = rawToken.split(\".\");\n if (parts.length !== 3) {\n throw new Error(`Invalid JWT format: '${rawToken}'`);\n }\n\n this.header = this.decodeBase64Url(parts[0]);\n this.payload = this.decodeBase64Url(parts[1]);\n this.signature = parts[2];\n }\n\n private decodeBase64Url(base64Url: string): Record<string, any> {\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const json = decodeURIComponent(Array.prototype.map.call(atob(base64), escapeMultibyteCharacter).join(\"\"));\n return JSON.parse(json);\n }\n\n isExpired(): boolean {\n const OFFSET_SECONDS = 60;\n const exp = this.payload[\"exp\"] || 0;\n const current = Math.floor(Date.now() / 1000) + OFFSET_SECONDS;\n return current >= exp;\n }\n\n toJSON(): Record<string, any> {\n return {\n header: this.header,\n payload: this.payload,\n signature: this.signature,\n };\n }\n}\n\nfunction escapeMultibyteCharacter(c: string): string {\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n}\n","import { Injectable } from '@angular/core';\nimport { HttpHandler, HttpInterceptor, HttpRequest, HttpEvent, HttpHeaders, HttpResponse } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { filter, first, map, switchMap } from 'rxjs/operators';\nimport { parseHeaderHateoasLinks } from '.';\nimport { HTTP_HEADERS } from './constants';\nimport { AuthTokenHolderService } from \"../../common\";\nimport { DecodedJwt } from \"../jwt/decoded-jwt\";\n\n// tslint:disable:variable-name\n@Injectable()\nexport class RequestHeadersInterceptor implements HttpInterceptor {\n private _enabled = true;\n set enabled(_enabled: boolean) {\n this._enabled = _enabled;\n }\n\n private _actAs: string;\n set actAs(_actAs: string) {\n this._actAs = _actAs;\n }\n \n private _actAsOrgName: string;\n set actAsOrgName(_actAsOrgName: string) {\n this._actAsOrgName = _actAsOrgName;\n }\n\n private _version = '';\n get version(): string {\n return this._version;\n }\n set version(_version: string) {\n this._version = _version;\n }\n\n private _authenticationHeader: string = HTTP_HEADERS.Authorization;\n private _authentication: string;\n set authentication(_authentication: string) {\n this._authentication = _authentication;\n this._authenticationHeader = (this._authentication && this._authentication.length > 32) ?\n HTTP_HEADERS.Authorization : HTTP_HEADERS.x_vcloud_authorization;\n }\n\n constructor(\n private authTokenHolderService: AuthTokenHolderService,\n ) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n let headers = req.headers;\n\n if (!headers.has('Accept')) {\n headers = this.setAcceptHeader(headers);\n }\n\n if (!headers.has('Content-Type')) {\n headers = this.setContentTypeHeader(headers, req.url);\n }\n\n if (this._authentication && !headers.has(HTTP_HEADERS.Authorization)) {\n headers = headers.set(this._authenticationHeader, this._authentication);\n }\n\n /**\n * Covers the case where the User set the ActAs token himself\n */\n if (!headers.has('X-VMWARE-VCLOUD-TENANT-CONTEXT') && this._actAs) {\n headers = headers.set('X-VMWARE-VCLOUD-TENANT-CONTEXT', this._actAs);\n }\n\n /**\n * Covers the case where the User set the ActAs token himself\n */\n if (!headers.has('X-VMWARE-VCLOUD-AUTH-CONTEXT') && this._actAsOrgName) {\n headers = headers.set('X-VMWARE-VCLOUD-AUTH-CONTEXT', this._actAsOrgName);\n }\n\n const customReq: HttpRequest<any> = req.clone({\n headers\n });\n return this.updateToken().pipe(\n map((jwt) => {\n const doesItUseJWT = (this._authentication && this._authentication.length > 32);\n if (doesItUseJWT) {\n this._authentication = `Bearer ${jwt}`;\n }\n return customReq.clone({ setHeaders: { [this._authenticationHeader]: this._authentication } });\n }),\n switchMap((clonedRequest) => this.handleRequest(next, clonedRequest)),\n );\n }\n\n private handleRequest(next: HttpHandler, clonedRequest: HttpRequest<any>) {\n return next.handle(clonedRequest).pipe(\n map((res: HttpEvent<any>) => {\n if (res instanceof HttpResponse) {\n if (!res.body || !res.headers) {\n return res;\n }\n\n if (res.headers.has(HTTP_HEADERS.link)) {\n res.body.link = parseHeaderHateoasLinks(res.headers.get(HTTP_HEADERS.link));\n }\n\n if (res.headers.has(HTTP_HEADERS.Link)) {\n res.body.link = parseHeaderHateoasLinks(res.headers.get(HTTP_HEADERS.Link));\n }\n\n if (res.headers.has(HTTP_HEADERS.etag)) {\n res.body.etag = res.headers.get(HTTP_HEADERS.etag);\n }\n }\n return res;\n })\n );\n }\n\n private setAcceptHeader(headers: HttpHeaders): HttpHeaders {\n const value = headers.get('_multisite');\n headers = headers.delete('_multisite');\n\n return headers.set(\n 'Accept', [\n `application/*+json;version=${this._version}${value ? `;multisite=${value}` : ''}`,\n `application/json;version=${this._version}${value ? `;multisite=${value}` : ''}`\n ]\n );\n }\n\n private setContentTypeHeader(headers: HttpHeaders, url: string): HttpHeaders {\n if (url.indexOf('cloudapi') > -1) {\n return headers.set('Content-Type', 'application/json');\n } else {\n return headers.set('Content-Type', 'application/*+json');\n }\n }\n\n private updateToken(): Observable<string> {\n if (!this.authTokenHolderService.jwtAsync) {\n return of(this.authTokenHolderService.jwt);\n }\n\n return this.authTokenHolderService.jwtAsync.pipe(\n filter((jwt) => !this.isExpired(jwt)),\n first(),\n )\n }\n\n private isExpired(jwt: string): boolean {\n const decodedJwt = new DecodedJwt(jwt);\n return decodedJwt.isExpired();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http';\n\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n// tslint:disable:jsdoc-format\n/**\n * An interceptor on the response chain that normalizes differences in\n * JSON payloads between vCloud Director version 9.1 and versions\n * greater than 9.1.\n *\n * In 9.1 (API version 30.0) the server serializes JSON and nests the payload in a value field:\n * ```\n {\n \"name\" : \"{http://www.vmware.com/vcloud/versions}SupportedVersions\",\n \"declaredType\" : \"com.vmware.vcloud.api.rest.schema.versioning.SupportedVersionsType\",\n \"scope\" : \"javax.xml.bind.JAXBElement$GlobalScope\",\n \"value\" : {\n \"versionInfo\" : [],\n \"any\" : [],\n \"otherAttributes\" : {}\n }\n }\n ```\n *\n * That same request in API versions 31.0 and above is represented as:\n * ```\n {\n \"versionInfo\" : [],\n \"any\" : [],\n \"otherAttributes\" : {}\n }\n ```\n * This interceptor should process responses before any other interceptors that rely\n * on consistent API information.\n */\n@Injectable()\nexport class ResponseNormalizationInterceptor implements HttpInterceptor {\n private static readonly QUERY_RESULT_TYPE = 'com.vmware.vcloud.api.rest.schema_v1_5.QueryResultRecordsType';\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n return next.handle(req).pipe(\n map(response => {\n // While this condition seems awfully specific, the alternative option of examining the 'Content-Type'\n // response header for 'version=30.0' proved to be an unreliable condition in at least one case;\n // returning the same JSON payload as API versions >= 31.0.\n if (response instanceof HttpResponse && response.body && response.body.value && response.body.declaredType && response.body.scope) {\n const body = response.body.value;\n if (response.body.declaredType === ResponseNormalizationInterceptor.QUERY_RESULT_TYPE) {\n body.record = body.record.map(record => record.value);\n }\n\n return response.clone({ body });\n }\n\n return response;\n })\n );\n }\n}\n","import {HttpBackend, HttpClient, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {Inject, Injectable, Optional} from '@angular/core';\nimport {Observable} from 'rxjs';\nimport {LoggingInterceptor} from './logging.interceptor';\nimport {RequestHeadersInterceptor} from './request.headers.interceptor';\nimport {ResponseNormalizationInterceptor} from './response.normalization.interceptor';\nimport {VCD_HTTP_INTERCEPTORS} from \"../../core\";\n\n/**\n * Angular's HttpInterceptorHandler is not publicly exposed. This is a clone of it.\n */\nclass VcdHttpInterceptorHandler implements HttpHandler {\n constructor(private next: HttpHandler, private interceptor: HttpInterceptor) {}\n\n handle(req: HttpRequest<any>): Observable<HttpEvent<any>> {\n return this.interceptor.intercept(req, this.next);\n }\n}\n\n/**\n * This is a specialist subclass of HttpClient. The HttpClient that is defined/imported\n * by HttpClientModule is a singleton from the container, meaning that all extensions would\n * get the same one. We sub-class it so that each extension gets their own instance.\n * Extension consumers should inject this.\n * @see HttpClient\n */\n@Injectable()\nexport class VcdHttpClient extends HttpClient {\n /**\n * Provide access to the logging interceptor for enabling/disabling and configuring.\n */\n readonly loggingInterceptor: LoggingInterceptor;\n\n /**\n * Provide access to the headers interceptor for enabling/disabling and configuring.\n */\n readonly requestHeadersInterceptor: RequestHeadersInterceptor;\n\n /**\n * Create an HttpClient with the logging and header interceptors in the chain.\n * @param httpBackend backend (likely injected from HttpClientModule)\n * @param loggingInterceptor the logging interceptor\n * @param requestHeadersInterceptor the request header interceptor\n * @param responseNormalizationInterceptor\n * @param customInterceptors\n */\n constructor(httpBackend: HttpBackend,\n loggingInterceptor: LoggingInterceptor,\n requestHeadersInterceptor: RequestHeadersInterceptor,\n responseNormalizationInterceptor: ResponseNormalizationInterceptor,\n @Optional() @Inject(VCD_HTTP_INTERCEPTORS) private customInterceptors: HttpInterceptor[],\n ) {\n const interceptors: HttpInterceptor[] = [\n loggingInterceptor,\n requestHeadersInterceptor,\n responseNormalizationInterceptor,\n ...(customInterceptors ?? []),\n ];\n const chain = interceptors.reduceRight(\n (next, interceptor) => new VcdHttpInterceptorHandler(next, interceptor),\n httpBackend\n );\n super(chain);\n this.loggingInterceptor = loggingInterceptor;\n this.requestHeadersInterceptor = requestHeadersInterceptor;\n }\n}\n","import {HttpHeaders, HttpResponse} from '@angular/common/http';\nimport {Observable, Observer, throwError} from 'rxjs';\nimport {catchError, expand, flatMap, last, map, reduce, retry, switchMap, tap} from 'rxjs/operators';\nimport {VcdHttpClient} from './vcd.http.client';\n\n/**\n * Default chunk size is 50MiB. This is equal to the chunk size the VCD UI uses for library uploads.\n */\nexport const MAX_CHUNK_SIZE = 50 * 1024 * 1024;\n\n/**\n * How many times to retry a chunk upload.\n */\nexport const MAX_CHUNK_RETRY_COUNT = 5;\n\n/**\n * Details about a completed file transfer.\n */\nexport interface TransferResult {\n /**\n * Filename being transferred.\n */\n filename: string|'<blob>';\n\n /**\n * URL being used for the transfer.\n */\n transferUrl: string;\n\n /**\n * How many retries in total were required\n */\n retryCount: number;\n\n /**\n * The number of chunks that have been sent.\n */\n chunksSent: number;\n\n /**\n * How many bytes have been sent.\n */\n bytesSent: number;\n\n /**\n * How many milliseconds that have elapsed since starting the transfer.\n */\n timeTakenMs: number;\n}\n\n/**\n * Details about a file transfer in progress.\n */\nexport interface TransferProgress {\n /**\n * Filename being transferred.\n */\n filename: string|'<blob>';\n\n /**\n * URL being used for the transfer.\n */\n transferUrl: string;\n\n /**\n * The current retry number for the current chunk.\n */\n retryNumber: number;\n\n /**\n * The number of retries in total.\n */\n retryCount: number;\n\n /**\n * The number of chunks that have been sent.\n */\n chunksSent: number;\n\n /**\n * The number of chunks remaining.\n */\n chunksRemaining: number;\n\n /**\n * How many bytes have been sent.\n */\n bytesSent: number;\n\n /**\n * How many bytes remaining to be sent.\n */\n bytesRemaining: number;\n\n /**\n * Percentage completion.\n */\n percent: number;\n\n /**\n * How many milliseconds that have elapsed since starting the transfer.\n */\n timeTakenMs: number;\n\n /**\n * Naive estimate of time remaining. This is not scientific at all - a simple linear extrapolation.\n */\n estimatedTimeRemainingMs: number;\n}\n\n/**\n * A special error thrown by the transfer client. It gives access to the causing error, and the final progress\n * before the error occurred.\n */\nexport class TransferError extends Error {\n constructor(message: string, readonly originalError: any, readonly lastProgress: TransferProgress) {\n super(message);\n }\n}\n\n/**\n * This is used to upload files to a VCD API transfer URL. It is not suggested to create this class - instead\n * use the startTransfer method in VcdApiClient.\n */\nexport class VcdTransferClient {\n /**\n * Create a transfer client.\n * @param httpClient the http client to be used\n * @param transferUrl the URL to upload to\n */\n constructor(public httpClient: VcdHttpClient, public transferUrl: string,\n public maxChunkSize = MAX_CHUNK_SIZE, public maxChunkRetryCount = MAX_CHUNK_RETRY_COUNT) {\n }\n\n /**\n * Upload data, optionally listening for progress updates.\n * @param source what to upload.\n * @param progressObserver (optional) this will get progress notifications during the upload\n * @returns fetails of the finished upload.\n * @throws TransferError when a chunk upload fails.\n */\n upload(source: Blob|File, progressObserver?: Observer<TransferProgress>): Observable<TransferResult> {\n // Cache the client and url so they don't change from under us.\n const {httpClient, transferUrl, maxChunkSize, maxChunkRetryCount} = this;\n\n // Compute static information used through the upload.\n const filename = (source as File).name || '<blob>';\n const totalChunks = Math.ceil(source.size / maxChunkSize);\n const totalBytes = source.size;\n const startTimeMs = new Date().getTime();\n let retryCount = 0;\n\n // This helper function creates a TransferProgress object for sending to the progressObserver.\n // It relies on the above static information, hence being nested.\n function createTransferProgress(retryNumber: number, rtryCount: number, chunksSent: number): TransferProgress {\n const chunksRemaining = totalChunks - chunksSent;\n const bytesSent = Math.min(chunksSent * maxChunkSize, totalBytes);\n const bytesRemaining = totalBytes - bytesSent;\n const percent = bytesSent / totalBytes * 100;\n const timeTakenMs = new Date().getTime() - startTimeMs;\n const estimatedTotalTimeMs = (bytesSent / bytesRemaining) * timeTakenMs;\n const estimatedTimeRemainingMs = Math.max(estimatedTotalTimeMs - timeTakenMs, 0);\n return {\n filename, transferUrl, retryNumber, retryCount: rtryCount,\n chunksSent, chunksRemaining, bytesSent, bytesRemaining,\n percent, timeTakenMs, estimatedTimeRemainingMs\n };\n }\n\n // This is the main chunk upload function\n function transferChunk(chunkIndex: number): Observable<HttpResponse<any>> {\n // Calculate chunk details.\n const chunkStart = chunkIndex * maxChunkSize;\n const chunkEnd = Math.min(chunkStart + maxChunkSize, totalBytes);\n const contentRangeHeader = `bytes ${chunkStart}-${chunkEnd - 1}/${totalBytes}`;\n\n // Dispatch progress\n if (progressObserver) {\n const progress = createTransferProgress(0, retryCount, chunkIndex);\n progressObserver.next(progress);\n }\n\n // Read in the chunk\n return Observable.create(observer => {\n const chunkSlice: Blob = source.slice(chunkStart, chunkEnd);\n const fileReader = new FileReader();\n fileReader.onerror = err => {\n observer.error(err);\n };\n fileReader.onabort = err => {\n observer.error(err);\n };\n fileReader.onload = () => {\n };\n fileReader.onloadend = () => {\n observer.next(fileReader.result);\n observer.complete();\n };\n\n return fileReader.readAsArrayBuffer(chunkSlice);\n\n // Transfer the chunk\n }).pipe(\n // Upon read error, abort the upload process. No point retrying read failures.\n catchError((e) => {\n // Abandon the upload and propagate a consumable error.\n const progress = createTransferProgress(0, retryCount, chunkIndex);\n return throwError(() => new TransferError('Read error', e, progress));\n }),\n\n // Upon successful read, transfer the chunk.\n switchMap((data) => {\n let retryNumber = 0;\n return httpClient.put(\n transferUrl, data,\n {\n headers: new HttpHeaders({\n 'Content-Range': contentRangeHeader\n }),\n responseType: 'text'\n }\n ).pipe(\n // This is called upon any chunk upload failure.\n catchError((e) => {\n // Increase the total retry count.\n retryCount++;\n\n // Increase the current chunk retry number.\n retryNumber++;\n\n // Dispatch progress (the retry information has changed).\n if (progressObserver) {\n const progress = createTransferProgress(retryNumber, retryCount, chunkIndex);\n progressObserver.next(progress);\n }\n\n // Rethrow the error so that the \"retry\" call handles it.\n return throwError(() => e);\n }),\n\n // Retry the chunk upload up to the limit - this will run the entire chain again.\n retry(maxChunkRetryCount),\n\n // This is called when all retries for the chunk are exhausted.\n catchError((e) => {\n // Abandon the upload and propagate a consumable error.\n const progress = createTransferProgress(retryNumber, retryCount, chunkIndex);\n return throwError(() => new TransferError('Transfer error', e, progress));\n })\n );\n })\n );\n }\n\n // This creates the final transfer progress, dispatches it, and returns the transfer result.\n function finishUpload(): TransferResult {\n const transferProgress = createTransferProgress(0, retryCount, totalChunks);\n if (progressObserver) {\n progressObserver.next(transferProgress);\n progressObserver.complete();\n }\n\n const transferResult: TransferResult = {\n filename: transferProgress.filename,\n transferUrl: transferProgress.transferUrl,\n retryCount: transferProgress.retryCount,\n chunksSent: transferProgress.chunksSent,\n bytesSent: transferProgress.bytesSent,\n timeTakenMs: transferProgress.timeTakenMs\n };\n return transferResult;\n }\n\n // Upload all of the chunks\n let chain = transferChunk(0);\n for (let currentChunk = 1; currentChunk < totalChunks; currentChunk++) {\n chain = chain.pipe(\n flatMap(() => transferChunk(currentChunk))\n );\n }\n\n // Finish transfer\n return chain.pipe(map(finishUpload));\n }\n}\n","export class ClientError extends Error {\n constructor(\n public override message: string,\n public type: ClientErrorType) {\n super(message);\n }\n}\n\nexport enum ClientErrorType{\n HateoasLinkMissing = \"HateoasLinkMissing\",\n TaskLinkMissing = \"TaskLinkMissing\",\n}\n","import {Injectable, Injector, Optional} from '@angular/core';\nimport {HttpHeaders, HttpResponse} from '@angular/common/http';\nimport {BehaviorSubject, merge, Observable, of, ReplaySubject, throwError} from 'rxjs';\nimport {catchError, concatMap, filter, map, share, skipWhile, switchMap, tap, withLatestFrom} from 'rxjs/operators';\nimport {\n AuthorizedLocationType,\n EntityReferenceType,\n EntityType,\n LinkType,\n ResourceType,\n SessionType,\n TaskType\n} from '@vcd/bindings/vcloud/api/rest/schema_v1_5';\nimport {SupportedVersionsType} from '@vcd/bindings/vcloud/api/rest/schema/versioning';\nimport {AccessibleLocation, AccessibleLocations, Session} from '../openapi';\nimport {Query} from '../query/index';\nimport {API_ROOT_URL, AuthTokenHolderService, SESSION_ORG_ID, SESSION_SCOPE} from '../../common/container-hooks';\nimport {VcdHttpClient} from './vcd.http.client';\nimport {VcdTransferClient} from './vcd.transfer.client';\nimport {HTTP_HEADERS} from './constants';\nimport {VcdSdkConfig} from \"../../core/plugin.module\";\nimport {ClientError, ClientErrorType} from \"./types\";\n\nexport const TRANSFER_LINK_REL = 'upload:default';\nexport type Navigable = ResourceType | { link?: LinkType[] };\n\nexport const HATEOAS_HEADER = 'Link';\n\n// tslint:disable:variable-name\n\n/**\n * Parse out Link headers using a very lazily implemented pull parser\n * @param header '<url1>;name1=\"value1\",name2=\"value2\",<url2>;name3=\"value3,value4\"'\n * @returns parsed link headers\n */\nexport function parseHeaderHateoasLinks(header: string): LinkType[] {\n const results: LinkType[] = [];\n\n if (!header) {\n return results;\n }\n\n const headerFieldMappings: {[key: string]: keyof LinkType} = {\n href: 'href',\n model: 'type',\n title: 'id',\n rel: 'rel'\n };\n let tokenIndex = -1;\n\n function peek(token: string) {\n return header.indexOf(token, tokenIndex + 1);\n }\n\n function next(token: string) {\n const nextIndex = peek(token);\n if (nextIndex === -1) {\n throw new Error(JSON.stringify({header, token, tokenIndex}));\n }\n tokenIndex = nextIndex;\n return tokenIndex;\n }\n\n while (peek('<') > -1) {\n try {\n const hrefStart = next('<');\n const hrefEnd = next('>');\n const href = header.substring(hrefStart + 1, hrefEnd);\n const result: LinkType = {href, type: null, id: null, rel: null, vCloudExtension: []};\n let comma = peek(',');\n let semicolon = peek(';');\n while ((semicolon > -1 && comma > -1 && semicolon < comma) || (semicolon > -1 && comma === -1)) {\n const nameStart = next(';');\n const nameEnd = next('=');\n const name = header.substring(nameStart + 1, nameEnd).trim().toLowerCase();\n const valueStart = next('\"');\n const valueEnd = next('\"');\n const value = header.substring(valueStart + 1, valueEnd);\n const mappedName = headerFieldMappings[name];\n if (mappedName) {\n // @ts-ignore\n result[mappedName] = decodeURIComponent(value) as any;\n }\n comma = peek(',');\n semicolon = peek(';');\n }\n results.push(result);\n } catch (error) { // We will try the next one...\n console.log(error);\n }\n }\n\n return results;\n}\n\nexport enum LinkRelType {\n add = 'add',\n remove = 'remove',\n edit = 'edit',\n}\n\n/**\n * A basic client for interacting with the VMware Cloud Director APIs.\n *\n * A VMware Cloud Director plugin can get a reference to this client by using angular injection.\n * ```\n * constructor(private vcdApi: VcdApiClient) {}\n * ```\n *\n * VcdApiClient reuses the authentication from the VCD platform so in general there is\n * no need of an explicit authentication/login.\n *\n * When dealing with the session management there are two APIs:\n * 1. Deprecated legacy API that is using the `api/session` endpoint and the corresponding models\n * 2. Newly added API that is using the `cloudapi` endpoint and the corresponding models\n *\n * Note that if a plugin performs an explicit cloud api authentication call through\n * {@link VcdApiClient#setCloudApiAuthentication} or {@link VcdApiClient#cloudApiLogin}\n * from that moment on the VcdApiClient uses only cloud api session management.\n * This means calls to {@link VcdApiClient#setAuthentication} or {@link VcdApiClient#login} have no effect.\n */\n@Injectable()\nexport class VcdApiClient {\n set baseUrl(_baseUrl: string) {\n this._baseUrl = _baseUrl;\n }\n\n get version(): string {\n return this.http.requestHeadersInterceptor.version;\n }\n\n private _negotiateVersion: Observable<string>;\n private _baseUrl: string;\n\n /**\n * @deprecated Use {@link VcdApiClient#_cloudApiSession}\n */\n private _session: BehaviorSubject<SessionType> = new BehaviorSubject<SessionType>(null);\n private _sessionObservable: Observable<SessionType> = this._session.asObservable()\n .pipe(\n skipWhile(session => !session)\n );\n private _getSession: Observable<SessionType>;\n\n /**\n * CloudApi Session\n */\n private _cloudApiSession: BehaviorSubject<Session> = new BehaviorSubject<Session>(null);\n private _cloudApiSessionObservable: Observable<Session> = this._cloudApiSession.asObservable()\n .pipe(\n skipWhile(session => !session)\n );\n /**\n * This observable has a special purpose when doing automatic login during the constructor initialization.\n * It allows backend call only after an API version is set.\n * It also ensures that a backend call to get the current session is done once prior to any other calls.\n *\n * In case of an explicit cloud api auth request there is no need of this observable\n * since this auth request will retrieve the session itself\n */\n private _getCloudApiSession: Observable<Session>;\n\n private _cloudApiSessionLinks: BehaviorSubject<LinkType[]> = new BehaviorSubject<LinkType[]>([]);\n\n /**\n * Cached, lazy loaded observable of the AccessibleLocation array\n */\n private _cloudApiAccessibleLocations: Observable<AccessibleLocation[]>;\n\n /**\n * This property determines if it is an explicit cloud api login.\n * In this case the old API (/api/session) should not be used at all.\n */\n private _isCloudApiLogin = false;\n\n constructor(\n private http: VcdHttpClient,\n private injector: Injector,\n @Optional() private config?: VcdSdkConfig,\n ) {\n this._baseUrl = this.injector.get(API_ROOT_URL);\n\n let negotiatedVersion: Observable<string>;\n if (this.config?.apiVersion) {\n negotiatedVersion = of(this.config.apiVersion).pipe(\n map((version) => {\n this.setVersion(version);\n return version;\n })\n );\n } else {\n negotiatedVersion = this.http.get<SupportedVersionsType>(`${this._baseUrl}/api/versions`).pipe(\n map(versions => this.negotiateVersion(versions)),\n tap(version => this.setVersion(version))\n );\n }\n this._negotiateVersion = negotiatedVersion.pipe(\n share({ connector: () => new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })\n );\n\n const tokenHolder: AuthTokenHolderService = this.injector.get(AuthTokenHolderService, { token: '' });\n const token = tokenHolder.jwt ? `Bearer ${tokenHolder.jwt}` : tokenHolder.token;\n this._getSession = this.setAuthentication(token)\n .pipe(\n share({ connector: () => new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })\n );\n\n this._getCloudApiSession = this.setCloudApiAuthentication(token)\n .pipe(\n share({ connector: () => new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })\n );\n // This is not an explicit cloud api login\n this._isCloudApiLogin = false;\n }\n\n private negotiateVersion(serverVersions: SupportedVersionsType): string {\n const supportedVersions: string[] = serverVersions.versionInfo.map(versionInfo => versionInfo.version);\n\n // Default API Version used is the Latest API Version in VMware Cloud Director\n return supportedVersions[supportedVersions.length - 1];\n }\n\n /**\n * The purpose of this function is to ensure that prior to sending any call to the backend\n * the version has been set and the current session has been retrieved.\n * Note that this is important during the automatic authentication that is done during the\n * constructor initialization, when the plugin is not required to perform its own explicit authentication\n * but rather the ones from the underlying framework is used.\n */\n private validateRequestContext(): Observable<true> {\n return (this.version ? of(this.version) : this._negotiateVersion)\n .pipe(\n // In case of a cloud api login we are not interested in the /api/session session\n concatMap(() => this._isCloudApiLogin ? of(null) : this._getSession),\n concatMap(() => this._getCloudApiSession\n // In case of cloud api failure we do not want to prevent further execution\n // for backward compatibility considerations since this may be a case\n // when cloud api is not supported at all for the specified version\n .pipe(catchError((e) => of(true)))\n ),\n map(() => true)\n );\n }\n\n /**\n *\n * For use cases wich solely depends on cloudapi without any backward compatibility\n * there should be no dependence on the old /api endpoint at all\n */\n private validateRequestContextCloudApiOnly(): Observable<Session> {\n return (this.version ? of(this.version) : this._negotiateVersion).pipe(\n concatMap(() => this._getCloudApiSession)\n );\n }\n\n public setVersion(_version: string): VcdApiClient {\n this.http.requestHeadersInterceptor.version = _version;\n return this;\n }\n\n /**\n * Global configuration for the service, that allows a provider user to execute API requests\n * in the scope of a specific tenant.\n *\n * If you want to execute single API request in scope of specific tenant you can do it\n * by passing \"X-VMWARE-VCLOUD-TENANT-CONTEXT\" header to the specific API Request.\n *\n * This scoping is available to query-based API calls and to bulk GET calls in the\n * /cloudapi space.\n *\n * @param actAs an entityRef of the tenant (organization) to scope subsequent calls to in\n * the VcdApiClient, or null/no parameter to remove tenant-specific scoping\n * @returns the current VcdApiClient instance (for chaining)\n */\n public actAs(actAs: EntityReferenceType = null): VcdApiClient {\n this.http.requestHeadersInterceptor.actAs = !actAs ? null : actAs.id;\n this.http.requestHeadersInterceptor.actAsOrgName = !actAs ? null : actAs.name;\n return this;\n }\n\n /**\n * @deprecated Use {@link VcdApiClient#setCloudApiAuthentication}\n *\n * Sets the authentication token to use for the VcdApiClient.\n *\n * After setting the token, the client will get the current session\n * information associated with the authenticated token.\n *\n * @param authentication the authentication string (to be used in either the 'Authorization'\n * or 'x-vcloud-authorization' header)\n * @returns the session associated with the authentication token\n */\n public setAuthentication(authentication: string): Observable<SessionType> {\n if (this._isCloudApiLogin) {\n return throwError('Only cloud api auth is allowed since it was already used');\n }\n\n this.http.requestHeadersInterceptor.authentication = authentication;\n return this.http.get<SessionType>(`${this._baseUrl}/api/session`).pipe(\n tap(session => {\n // automatically set actAs for provider in tenant scope\n if (session.org === 'System' && this.injector.get(SESSION_SCOPE) === 'tenant') {\n // Automatic actAs only works in versions >=9.5\n try {\n this.actAs({id: this.injector.get(SESSION_ORG_ID)});\n } catch (e) {\n console.warn('No SESSION_ORG_ID set in container. Automatic actAs is disabled.');\n }\n }\n }),\n tap(session => this._session.next(session))\n );\n }\n\n /**\n * Sets the authentication token to use for the VcdApiClient.\n *\n * After setting the token, the client will get the current session\n * information associated with the authenticated token.\n *\n * @param authentication the authentication string (to be used in either the 'Authorization'\n * or 'x-vcloud-authorization' header)\n *\n * @returns session observable associated with the authentication token\n */\n public setCloudApiAuthentication(authentication: string): Observable<Session> {\n this.onBeforeCloudApiAuthentication();\n\n return of(true)\n .pipe(\n // Set the authentication as part of the observable in order to ensure the caller has subscribed to the observable\n tap(() => this.http.requestHeadersInterceptor.authentication = authentication),\n switchMap(() => this.http.get<Session>(`${this._baseUrl}/cloudapi/1.0.0/sessions/current`, { observe: 'response' })),\n )\n .pipe(\n this.onCloudApiAuthentication()\n );\n }\n\n public enableLogging(): VcdApiClient {\n this.http.loggingInterceptor.enabled = true;\n\n return this;\n }\n\n /**\n * @deprecated Use {@link VcdApiClient#cloudApiLogin}\n *\n * Creates an authenticated session for the specified credential data.\n *\n * @param username the name of the user to authenticate\n * @param tenant the organization the user belongs to\n * @param password the password for the user\n * @returns an authenticated session for the given credentials\n */\n public login(username: string, tenant: string, password: string): Observable<SessionType> {\n if (this._isCloudApiLogin) {\n return throwError('Only cloud api auth is allowed since it was already used');\n }\n const authString: string = btoa(`${username}@${tenant}:${password}`);\n\n return this.http.post<SessionType>(\n `${this._baseUrl}/api/sessions`,\n null,\n {\n observe: 'response',\n headers: new HttpHeaders({ Authorization: `Basic ${authString}`})\n }\n )\n .pipe(\n tap((response: HttpResponse<any>) =>\n // tslint:disable-next-line:max-line-length\n this.http.requestHeadersInterceptor.authentication = `${response.headers.get('x-vmware-vcloud-token-type')} ${response.headers.get('x-vmware-vcloud-access-token')}`\n ),\n map(response => response.body),\n tap(session => this._session.next(session))\n );\n }\n\n /**\n * Creates an authenticated session for the specified credential data using cloud api endpoint.\n *\n * @param username the name of the user to authenticate\n * @param tenant the organization the user belongs to\n * @param password the password for the user\n * @returns an authenticated session for the given credentials\n */\n public cloudApiLogin(username: string, tenant: string, password: string): Observable<Session> {\n this.onBeforeCloudApiAuthentication();\n\n const authString: string = btoa(`${username}@${tenant}:${password}`);\n let url = `${this._baseUrl}/cloudapi/1.0.0/sessions`;\n if (tenant.toLowerCase() === 'system') {\n url += '/provider';\n }\n return this.http.post<Session>(\n url,\n null,\n {\n observe: 'response',\n headers: new HttpHeaders({ [HTTP_HEADERS.Authorization]: `Basic ${authString}` })\n }\n ).pipe(\n tap((response: HttpResponse<Session>) => {\n // tslint:disable-next-line:max-line-length\n const token = `${response.headers.get('x-vmware-vcloud-token-type')} ${response.headers.get('x-vmware-vcloud-access-token')}`;\n this.http.requestHeadersInterceptor.authentication = token;\n }),\n this.onCloudApiAuthentication()\n );\n }\n\n /**\n * It is necessary to know if an explicit cloud api auth request was done.\n * This function handles this by setting the corresponding flags, properties etc.\n */\n private onBeforeCloudApiAuthentication() {\n // In case of an explicit cloud api auth request:\n // Set the flag _isCloudApiLogin in order to know that explicit cloud api authentication is done\n // This will help us skip code related to the old api, i.e. we should not allow explicit mix of both the api-s\n this._isCloudApiLogin = true;\n // In case of an explicit cloud api auth request:\n // There is no need of _getCloudApiSession observable which is needed in the automatic login during the constructor initialization.\n // The explicit cloud api auth request will retrieve the session.\n this._getCloudApiSession = of(null);\n }\n\n /**\n * Handle authentication.\n * This includes getting HATEOAS links, setting the session, handling errors etc.\n */\n private onCloudApiAuthentication(): (source: Observable<HttpResponse<Session>>) => Observable<Session> {\n return (source) => source.pipe(\n tap((resp: HttpResponse<Session>) => {\n // Get HATEOAS links\n try {\n this.setCloudApiSessionLinks(parseHeaderHateoasLinks(resp.headers.get(HATEOAS_HEADER)));\n } catch (e) {\n console.log('Error when parsing session HATEOAS links:', e);\n }\n }),\n map(resp => resp.body),\n tap((session: Session) => {\n // Clear previous actAs\n this.actAs(null);\n // automatically set actAs for provider in tenant scope\n if (session.org && session.org.name === 'System' && this.injector.get(SESSION_SCOPE) === 'tenant') {\n // Automatic actAs only works in versions >=9.5\n try {\n this.actAs({ id: this.injector.get(SESSION_ORG_ID) });\n } catch (e) {\n console.warn('No SESSION_ORG_ID set in container. Automatic actAs is disabled.');\n }\n }\n }),\n tap((session: Session) => this._cloudApiSession.next(session)),\n catchError((e) => {\n this.onCloudApiAuthenticationError();\n return throwError(e);\n })\n );\n }\n\n private onCloudApiAuthenticationError() {\n // Clear the authentication so that any subsequent backend calls are not authenticated\n this.http.requestHeadersInterceptor.authentication = '';\n // _getCloudApiSession is in the center of any backend call, nullify it in order not to prevent those calls\n // since it is easier to troubleshoot failing backend rather than no call\n this._getCloudApiSession = of(null);\n // Clear the links\n this._cloudApiSessionLinks.next([]);\n // Clear the session\n this._cloudApiSession.next(null);\n }\n\n private setCloudApiSessionLinks(links: LinkType[]) {\n this._cloudApiAccessibleLocations = null;\n this._cloudApiSessionLinks.next(links || []);\n }\n\n public get<T>(endpoint: string, options?: { headers?: HttpHeaders }): Observable<T> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.get<T>(this.buildEndpointUrl(endpoint), {...options}))\n );\n }\n\n public list<T>(endpoint: string, queryBuilder?: Query.Builder, multisite?: boolean | AuthorizedLocationType[], options?: { headers?: HttpHeaders }) {\n let url = this.buildEndpointUrl(endpoint);\n\n if (queryBuilder) {\n url = `${url}${queryBuilder.getCloudAPI()}`;\n }\n\n if (multisite) {\n if (!options) {\n return this.http.get<T>(url, { headers: new HttpHeaders({ _multisite: this.parseMultisiteValue(multisite) }) });\n } else if (options?.headers) {\n options.headers.append(\"_multisite\", this.parseMultisiteValue(multisite));\n return this.http.get<T>(url, { ...options });\n }\n }\n\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.get<T>(url, { ...options }))\n );\n }\n\n public createSync<T>(endpoint: string, item: T, options?: { headers?: HttpHeaders }): Observable<T> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.post<T>(\n this.buildEndpointUrl(endpoint),\n item,\n {...options}\n ))\n );\n }\n\n public createAsync<T>(endpoint: string, item: T, options?: { headers?: HttpHeaders }): Observable<TaskType> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.post(\n this.buildEndpointUrl(endpoint),\n item,\n { ...options, observe: 'response' }\n )),\n concatMap(response => this.mapResponseToTask(response, 'POST'))\n );\n }\n\n public getTransferLink<T>(endpoint: string, item: T, transferRel: string = TRANSFER_LINK_REL): Observable<string> {\n return this.http\n .post(this.buildEndpointUrl(endpoint), item, { observe: 'response' })\n .pipe(\n map((res: HttpResponse<T & Navigable>) => {\n const headerLinks: LinkType[] = res.headers.has(HATEOAS_HEADER)\n ? parseHeaderHateoasLinks(res.headers.get(HATEOAS_HEADER))\n : [];\n const links: LinkType[] = res.body ? (res.body.link || []) : [];\n const link = [...headerLinks, ...links]\n .find((l) => l.rel === transferRel);\n if (!link) {\n throw new ClientError(\n `Response from ${endpoint} did not contain a transfer link`,\n ClientErrorType.HateoasLinkMissing\n );\n }\n return link.href;\n })\n );\n }\n\n public startTransfer<T>(endpoint: string, item: T, transferRel: string = TRANSFER_LINK_REL): Observable<VcdTransferClient> {\n return this.getTransferLink(endpoint, item, transferRel)\n .pipe(\n map((transferUrl) => new VcdTransferClient(this.http, transferUrl))\n );\n }\n\n public updateSync<T>(endpoint: string, item: T, options?: { headers?: HttpHeaders }): Observable<T> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.put<T>(\n this.buildEndpointUrl(endpoint),\n item,\n { ...options }\n ))\n );\n }\n\n public updateAsync<T>(endpoint: string, item: T, options?: { headers?: HttpHeaders }): Observable<TaskType> {\n\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.put(\n this.buildEndpointUrl(endpoint),\n item,\n { ...options, observe: 'response' }\n )),\n concatMap(response => this.mapResponseToTask(response, 'PUT'))\n );\n }\n\n public deleteSync(endpoint: string, options?: { headers?: HttpHeaders }): Observable<void> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.delete<void>(this.buildEndpointUrl(endpoint), { ...options }))\n );\n }\n\n public deleteAsync(endpoint: string, options?: { headers?: HttpHeaders }): Observable<TaskType> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.delete(this.buildEndpointUrl(endpoint), { ...options, observe: 'response' })),\n concatMap(response => this.mapResponseToTask(response, 'DELETE'))\n );\n }\n\n private mapResponseToTask(response: HttpResponse<any>, httpVerb: string): Observable<TaskType> {\n\n //POST - Task link is returned in 'Location' header\n if (response.headers.has('Location') && response.status === 202) {\n return this.http.get<TaskType>(response.headers.get('Location'));\n //PUT - Task link is returned in 'x-vmware-vcloud-task-location' header\n } else if (response.headers.has('x-vmware-vcloud-task-location') && response.status === 200) {\n return this.http.get<TaskType>(response.headers.get('x-vmware-vcloud-task-location'));\n } else if (response.body && response.body.type.startsWith('application/vnd.vmware.vcloud.task+')) {\n const task: TaskType = Object.assign(new TaskType(), response.body);\n return of(task);\n }\n\n return throwError(() => new ClientError(\n `An asynchronous request was made to [${httpVerb} ${response.url}], but no task was returned. The operation may still have been successful.`,\n ClientErrorType.TaskLinkMissing\n ));\n }\n\n public getEntity<T extends EntityReferenceType>(entityRef: EntityReferenceType): Observable<T>;\n // tslint:disable-next-line:unified-signatures\n public getEntity<T extends EntityReferenceType>(urn: string): Observable<T>;\n public getEntity<T extends EntityReferenceType>(entityRefOrUrn: EntityReferenceType | string): Observable<T> {\n const entityResolver: Observable<EntityType> = typeof entityRefOrUrn === 'string' ?\n this.http.get<EntityType>(`${this._baseUrl}/api/entity/${entityRefOrUrn}`) :\n this.http.get<EntityType>(`${this._baseUrl}/api/entity/urn:vcloud:${entityRefOrUrn.type}:${entityRefOrUrn.id}`);\n\n return this.validateRequestContext().pipe(\n concatMap(() => entityResolver),\n concatMap(entity => this.http.get<T>(`${entity.link[0].href}`))\n );\n }\n\n public updateTask(task: TaskType, options?: { headers?: HttpHeaders }): Observable<TaskType> {\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.get<TaskType>(task.href, { ...options }))\n );\n }\n\n public isTaskComplete(task: TaskType): boolean {\n return ['success', 'error', 'canceled', 'aborted'].indexOf(task.status) > -1;\n }\n\n public removeItem(item: Navigable, options?: { headers?: HttpHeaders }): Observable<TaskType> {\n const link: LinkType = this.findLink(item, 'remove', null);\n if (!link) {\n return throwError(() => new ClientError(\n `No 'remove' link for specified resource.`,\n ClientErrorType.HateoasLinkMissing\n ));\n }\n\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.delete<TaskType>(link.href, { ...options }))\n );\n }\n\n /**\n * Queries the VMware Cloud Director API based on the specified Query.Builder instance.\n *\n * @param builder An definition of the query to construct (type, filter, page size, etc.)\n * @param multisite a flag indicating whether or not to fan the query out to all available sites\n * @returns a query result for the specified query\n */\n public query<T>(builder: Query.Builder, multisite?: boolean, options?: { headers?: HttpHeaders }): Observable<T>;\n /**\n * Queries the VMware Cloud Director API based on the specified Query.Builder instance.\n *\n * @param builder An definition of the query to construct (type, filter, page size, etc.)\n * @param multisite the set of site locations to include in the query fanout\n * @returns a query result for the specified query\n */\n // tslint:disable-next-line:unified-signatures\n public query<T>(builder: Query.Builder, multisite?: AuthorizedLocationType[], options?: { headers?: HttpHeaders }): Observable<T>;\n public query<T>(builder: Query.Builder, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n return this.getQueryPage(`${this._baseUrl}/api/query${builder.get()}`, multisite, options);\n }\n\n /**\n * Queries the VMware Cloud Director API for the first page of the provided result set.\n *\n * @param result the result set to retrieve the first page of records for\n * @param multisite a flag indicating whether or not to fan the query out to all available sites\n * @returns the records for the first page of the query\n */\n public firstPage<T>(result: T, multisite?: boolean, options?: { headers?: HttpHeaders }): Observable<T>;\n /**\n * Queries the VMware Cloud Director API for the first page of the provided result set.\n *\n * @param result the result set to retrieve the first page of records for\n * @param multisite the set of site locations to include in the query fanout\n * @returns the records for the first page of the query\n */\n // tslint:disable-next-line:unified-signatures\n public firstPage<T>(result: T, multisite?: AuthorizedLocationType[], options?: { headers?: HttpHeaders }): Observable<T>;\n public firstPage<T>(result: T, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n const link: LinkType = this.findLink(result, 'firstPage', (result as ResourceType).type);\n if (!link) {\n return throwError(() => new ClientError(\n `No 'firstPage' link for specified query.`,\n ClientErrorType.HateoasLinkMissing\n ));\n }\n\n return this.getQueryPage(link.href, multisite, options);\n }\n\n public hasFirstPage<T>(result: T): boolean {\n return !!this.findLink(result, 'firstPage', (result as ResourceType).type);\n }\n\n /**\n * Queries the VMware Cloud Director API for the previous page of the provided result set.\n *\n * @param result the result set to retrieve the previous page of records for\n * @param multisite a flag indicating whether or not to fan the query out to all available sites\n * @returns the records for the previous page of the query\n */\n public previousPage<T>(result: T, multisite?: boolean, options?: { headers?: HttpHeaders }): Observable<T>;\n /**\n * Queries the VMware Cloud Director API for the previous page of the provided result set.\n *\n * @param result the result set to retrieve the previous page of records for\n * @param multisite the set of site locations to include in the query fanout\n * @returns the records for the previous page of the query\n */\n // tslint:disable-next-line:unified-signatures\n public previousPage<T>(result: T, multisite?: AuthorizedLocationType[], options?: { headers?: HttpHeaders }): Observable<T>;\n public previousPage<T>(result: T, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n const link: LinkType = this.findLink(result, 'previousPage', (result as ResourceType).type);\n if (!link) {\n return throwError(() => new ClientError(\n `No 'previousPage' link for specified query.`,\n ClientErrorType.HateoasLinkMissing\n ));\n }\n\n return this.getQueryPage(link.href, multisite, options);\n }\n\n public hasPreviousPage<T>(result: T): boolean {\n return !!this.findLink(result, 'previousPage', (result as ResourceType).type);\n }\n\n /**\n * Queries the VMware Cloud Director API for the next page of the provided result set.\n *\n * @param result the result set to retrieve the next page of records for\n * @param multisite a flag indicating whether or not to fan the query out to all available sites\n * @returns the records for the next page of the query\n */\n public nextPage<T>(result: T, multisite?: boolean, options?: { headers?: HttpHeaders }): Observable<T>;\n /**\n * Queries the VMware Cloud Director API for the next page of the provided result set.\n *\n * @param result the result set to retrieve the next page of records for\n * @param multisite the set of site locations to include in the query fanout\n * @returns the records for the next page of the query\n */\n // tslint:disable-next-line:unified-signatures\n public nextPage<T>(result: T, multisite?: AuthorizedLocationType[], options?: { headers?: HttpHeaders }): Observable<T>;\n public nextPage<T>(result: T, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n const link: LinkType = this.findLink(result, 'nextPage', (result as ResourceType).type);\n if (!link) {\n return throwError(() => new ClientError(\n `No 'nextPage' link for specified query.`,\n ClientErrorType.HateoasLinkMissing\n ));\n }\n\n return this.getQueryPage<T>(link.href, multisite, options);\n }\n\n public hasNextPage<T>(result: T): boolean {\n return !!this.findLink(result, 'nextPage', (result as ResourceType).type);\n }\n\n /**\n * Queries the VMware Cloud Director API for the last page of the provided result set.\n *\n * @param result the result set to retrieve the last page of records for\n * @param multisite a flag indicating whether or not to fan the query out to all available sites\n * @returns the records for the last page of the query\n */\n public lastPage<T>(result: T, multisite?: boolean, options?: { headers?: HttpHeaders }): Observable<T>;\n /**\n * Queries the VMware Cloud Director API for the last page of the provided result set.\n *\n * @param result the result set to retrieve the last page of records for\n * @param multisite the set of site locations to include in the query fanout\n * @returns the records for the last page of the query\n */\n // tslint:disable-next-line:unified-signatures\n public lastPage<T>(result: T, multisite?: AuthorizedLocationType[], options?: { headers?: HttpHeaders }): Observable<T>;\n public lastPage<T>(result: T, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n const link: LinkType = this.findLink(result, 'lastPage', (result as ResourceType).type);\n if (!link) {\n return throwError(() => new ClientError(\n `No 'lastPage' link for specified query.`,\n ClientErrorType.HateoasLinkMissing\n ));\n }\n\n return this.getQueryPage(link.href, multisite, options);\n }\n\n public hasLastPage<T>(result: T): boolean {\n return !!this.findLink(result, 'lastPage', (result as ResourceType).type);\n }\n\n private getQueryPage<T>(href: string, multisite?: any, options?: { headers?: HttpHeaders }): Observable<T> {\n if (multisite) {\n if (!options) {\n return this.http.get<T>(href, { headers: new HttpHeaders({ _multisite: this.parseMultisiteValue(multisite) }) })\n } else if (options?.headers) {\n options.headers.append(\"_multisite\", this.parseMultisiteValue(multisite));\n return this.http.get<T>(href, { ...options })\n }\n }\n\n return this.validateRequestContext().pipe(\n concatMap(() => this.http.get<T>(href, { ...options }))\n );\n }\n\n /**\n * Use to perform action availability check before calling the API\n * @param item - the navigable item (containing link collection)\n * @param linkRelType - the link rel type, pass either LinkRelType or string\n * @param entityRefType - the entity reference type\n */\n public canPerformAction(item: Navigable, linkRelType: LinkRelType | string, entityRefType?: string): boolean {\n return !!this.findLink(item, linkRelType, entityRefType);\n }\n\n private findLink(item: Navigable, rel: string, type: string): LinkType {\n if (!item || !item.link) {\n return undefined;\n }\n\n return item.link.find((link) => {\n if (type) {\n return link.rel.includes(rel) && link.type === type;\n }\n\n return link.rel.includes(rel);\n });\n }\n\n private parseMultisiteValue(multisite: boolean | AuthorizedLocationType[]): string {\n return typeof multisite === 'boolean' ? (multisite ? 'global' : 'local') : multisite.map(site => site.locationId).join(',');\n }\n\n /**\n * @deprecated Use cloudApiSession\n */\n public get session(): Observable<SessionType> {\n return this.validateRequestContext().pipe(\n concatMap(() => this._sessionObservable)\n );\n }\n\n /**\n * Get Session observable\n */\n public get cloudApiSession(): Observable<Session> {\n return this.validateRequestContextCloudApiOnly().pipe(\n concatMap(() => this._cloudApiSessionObservable)\n );\n }\n\n public get username(): Observable<string> {\n return merge(\n this.cloudApiSession.pipe(\n filter(() => this._isCloudApiLogin),\n map(session => session && session.user && session.user.name)\n ),\n this.session.pipe(\n filter(() => !this._isCloudApiLogin),\n map(session => session && session.user)\n )\n );\n }\n\n public get organization(): Observable<string> {\n return merge(\n this.cloudApiSession.pipe(\n filter(() => this._isCloudApiLogin),\n map(session => session && session.org && session.org.name)\n ),\n this.session.pipe(\n filter(() => !this._isCloudApiLogin),\n map(session => session && session.org)\n )\n );\n }\n\n /**\n * @deprecated Use cloudApiLocation\n */\n public get location(): Observable<AuthorizedLocationType> {\n return this.session.pipe(\n map(session => session.authorizedLocations.location.find(location => location.locationId === session.locationId))\n );\n }\n\n /**\n * Gets the location corresponding to the current session\n */\n public get cloudApiLocation(): Observable<AccessibleLocation> {\n return this.cloudApiSession.pipe(\n switchMap(() => {\n if (!this._cloudApiAccessibleLocations) {\n // Ensure caching for getting AccessibleLocations\n this._cloudApiAccessibleLocations = this._cloudApiSessionLinks\n .pipe(\n // Get the AccessibleLocations link\n map((links) => this.findLink({ link: links }, 'down', 'AccessibleLocations')),\n // Fetch AccessibleLocations from the backend\n switchMap((link: LinkType) => link ? this.http.get<AccessibleLocations>(link.href) : of(null)),\n // Get the array with all locations (what if there are many pages)\n map((accessibleLocations: AccessibleLocations) => accessibleLocations && accessibleLocations.values)\n )\n .pipe(\n share({ connector: () => new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })\n );\n }\n return this._cloudApiAccessibleLocations;\n }),\n\n // Need to have the session in order to get its location\n withLatestFrom(this.cloudApiSession),\n // Find the location that corresponds to this session\n map(([accessibleLocations, session]) => {\n if (!accessibleLocations || !session) {\n return null;\n }\n const sessionLocation = session.location;\n if (!sessionLocation) {\n return null;\n }\n return accessibleLocations.find(location => location.locationId === sessionLocation);\n }),\n );\n }\n\n public getLocation(session: SessionType): AuthorizedLocationType {\n return session.authorizedLocations.location.find(location => location.locationId === session.locationId);\n }\n\n /**\n * Build the endpoint url. If the provided endpoint is already an absolute URL, then return it as it is without\n * any modifications, otherwise consider it as a relative one and prepend the baseUrl as defined by the host application.\n */\n private buildEndpointUrl(endpoint: string): string {\n return endpoint.indexOf('://') > -1 ? endpoint : `${this._baseUrl}/${endpoint}`;\n }\n\n}\n","import { HttpClientModule } from '@angular/common/http';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport * as client from './client';\nimport {VcdSdkConfig} from \"./core\";\n/**\n * Extensions should import this module.\n * They can then wire in SDK components as desired.\n */\n@NgModule({\n imports: [\n HttpClientModule,\n CommonModule,\n ],\n declarations: [],\n exports: [],\n})\nexport class VcdSdkModule {\n static forRoot(config?: VcdSdkConfig): ModuleWithProviders<VcdSdkModule> {\n return {\n ngModule: VcdSdkModule,\n providers: [\n client.RequestHeadersInterceptor,\n client.LoggingInterceptor,\n client.ResponseNormalizationInterceptor,\n client.VcdHttpClient,\n client.VcdApiClient,\n {\n provide: VcdSdkConfig,\n useValue: config || {}\n },\n ]\n };\n }\n}\n","/*\n * Public API Surface of sdk\n */\n\nexport * from './main';\nexport * from './common';\nexport * from './core';\nexport * from './client';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ApiResultService","i1.AuthTokenHolderService","i1.VcdHttpClient","i2.VcdSdkConfig","client.RequestHeadersInterceptor","client.LoggingInterceptor","client.ResponseNormalizationInterceptor","client.VcdHttpClient","client.VcdApiClient"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  open_source_license.txt
2
2
 
3
- vcd_ui_sdk 17.0.2 GA
3
+ vcd_ui_sdk 17.0.3 GA
4
4
  ======================================================================
5
5
 
6
6
  The following copyright statements and licenses apply to open source
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vcd/sdk",
3
- "version": "17.0.2",
4
- "license": "BSD-2-Clause",
3
+ "version": "17.0.3",
4
+ "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "17.1.2",
7
7
  "@angular/core": "17.1.2",