nsrtm-gestionarchivo-npm-prueba2
Version:
Proyecto de Libreria Frontend para la Gestión de Archivos
1,829 lines • 260 kB
JavaScript
/* tslint:disable */
/* eslint-disable */
import { Injectable } from '@angular/core';
import { HttpResponse } from '@angular/common/http';
import { BaseService } from '../base-service';
import { RequestBuilder } from '../request-builder';
import { map, filter } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "../api-configuration";
import * as i2 from "@angular/common/http";
export class ComunesRegistroControllerService extends BaseService {
constructor(config, http) {
super(config, http);
}
/**
* Permite listar los datos comunes.
*
* Permite listar los datos comunes de la tabla de catálogo de registro
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listar()` instead.
*
* This method doesn't expect any request body.
*/
listar$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarPath, 'get');
if (params) {
rb.path('codigo', params.codigo, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los datos comunes.
*
* Permite listar los datos comunes de la tabla de catálogo de registro
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listar$Response()` instead.
*
* This method doesn't expect any request body.
*/
listar(params) {
return this.listar$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de zona urbana.
*
* Devuelve la lista de los tipos zona urbana por tipo de predio
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoZonaUrbana()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoZonaUrbana$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoZonaUrbanaPath, 'get');
if (params) {
rb.path('tipo_predio_id', params.tipo_predio_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de zona urbana.
*
* Devuelve la lista de los tipos zona urbana por tipo de predio
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoZonaUrbana$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoZonaUrbana(params) {
return this.listarTipoZonaUrbana$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los tipos zona influencia.
*
* Permite listar los tipos zona influencia
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarZonaInfluenciaTipo()` instead.
*
* This method doesn't expect any request body.
*/
listarZonaInfluenciaTipo$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarZonaInfluenciaTipoPath, 'get');
if (params) {
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los tipos zona influencia.
*
* Permite listar los tipos zona influencia
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarZonaInfluenciaTipo$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarZonaInfluenciaTipo(params) {
return this.listarZonaInfluenciaTipo$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de vía.
*
* Devuelve la lista de los tipos vía por tipo de predio
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoVia()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoVia$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoViaPath, 'get');
if (params) {
rb.path('tipo_predio_id', params.tipo_predio_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de vía.
*
* Devuelve la lista de los tipos vía por tipo de predio
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoVia$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoVia(params) {
return this.listarTipoVia$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los tipos de uso de arbitrios.
*
* Permite listar los tipos de uso de arbitrios
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoUsoArbitrio()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoUsoArbitrio$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoUsoArbitrioPath, 'get');
if (params) {
rb.path('anio', params.anio, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los tipos de uso de arbitrios.
*
* Permite listar los tipos de uso de arbitrios
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoUsoArbitrio$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoUsoArbitrio(params) {
return this.listarTipoUsoArbitrio$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de subzona urbana.
*
* Devuelve la lista de los tipos subzona urbana por tipo de predio
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoSubZonaUrbana()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoSubZonaUrbana$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoSubZonaUrbanaPath, 'get');
if (params) {
rb.path('tipo_predio_id', params.tipo_predio_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de subzona urbana.
*
* Devuelve la lista de los tipos subzona urbana por tipo de predio
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoSubZonaUrbana$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoSubZonaUrbana(params) {
return this.listarTipoSubZonaUrbana$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los documentos de identidad según el tipo de relacionado.
*
* Devuelve una lista de los documentos de identidad según el tipo de relacionado
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoRelacionadoPorTipoPersona()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoRelacionadoPorTipoPersona$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoRelacionadoPorTipoPersonaPath, 'get');
if (params) {
rb.path('tipo_persona_id', params.tipo_persona_id, {});
rb.path('fallecido', params.fallecido, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los documentos de identidad según el tipo de relacionado.
*
* Devuelve una lista de los documentos de identidad según el tipo de relacionado
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoRelacionadoPorTipoPersona$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoRelacionadoPorTipoPersona(params) {
return this.listarTipoRelacionadoPorTipoPersona$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de propiedad por concepto de recaudación.
*
* Devuelve la lista de tipos de propiedad por concepto de recaudación
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoPropiedad()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoPropiedad$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoPropiedadPath, 'get');
if (params) {
rb.path('con_recaudacion_id', params.con_recaudacion_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de propiedad por concepto de recaudación.
*
* Devuelve la lista de tipos de propiedad por concepto de recaudación
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoPropiedad$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoPropiedad(params) {
return this.listarTipoPropiedad$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los tipos nivel de afluencia.
*
* Permite listar los tipos nivel de afluencia
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarNivelAfluenciaTipo()` instead.
*
* This method doesn't expect any request body.
*/
listarNivelAfluenciaTipo$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarNivelAfluenciaTipoPath, 'get');
if (params) {
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los tipos nivel de afluencia.
*
* Permite listar los tipos nivel de afluencia
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarNivelAfluenciaTipo$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarNivelAfluenciaTipo(params) {
return this.listarNivelAfluenciaTipo$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los tipos de juegos por concepto de recaudación.
*
* Devuelve la lista de tipos de juegos por concepto de recaudación
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoJuegoRecaudacion()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoJuegoRecaudacion$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoJuegoRecaudacionPath, 'get');
if (params) {
rb.path('con_recaudacion_id', params.con_recaudacion_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los tipos de juegos por concepto de recaudación.
*
* Devuelve la lista de tipos de juegos por concepto de recaudación
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoJuegoRecaudacion$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoJuegoRecaudacion(params) {
return this.listarTipoJuegoRecaudacion$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de interior.
*
* Devuelve la lista de los tipos interior por tipo de predio
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoInterior()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoInterior$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoInteriorPath, 'get');
if (params) {
rb.path('tipo_predio_id', params.tipo_predio_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de interior.
*
* Devuelve la lista de los tipos interior por tipo de predio
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoInterior$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoInterior(params) {
return this.listarTipoInterior$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de edificación.
*
* Devuelve la lista de los tipos edificación por tipo de predio
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoEdificacion()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoEdificacion$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoEdificacionPath, 'get');
if (params) {
rb.path('tipo_predio_id', params.tipo_predio_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de edificación.
*
* Devuelve la lista de los tipos edificación por tipo de predio
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoEdificacion$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoEdificacion(params) {
return this.listarTipoEdificacion$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de documentos en registro por municipalidad.
*
* Permite listar tipos de documentos en registro por municipalidad
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarDocumentoTipo()` instead.
*
* This method doesn't expect any request body.
*/
listarDocumentoTipo$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarDocumentoTipoPath, 'get');
if (params) {
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de documentos en registro por municipalidad.
*
* Permite listar tipos de documentos en registro por municipalidad
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarDocumentoTipo$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarDocumentoTipo(params) {
return this.listarDocumentoTipo$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de documento de sustento por concepto de recaudación.
*
* Devuelve la lista de documentos de sustento por concepto de recaudación y tipo de transferencia
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoDocumentoSustentoRecaudacion()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocumentoSustentoRecaudacion$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoDocumentoSustentoRecaudacionPath, 'get');
if (params) {
rb.path('con_recaudacion_id', params.con_recaudacion_id, {});
rb.path('tipo_transferencia_id', params.tipo_transferencia_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de documento de sustento por concepto de recaudación.
*
* Devuelve la lista de documentos de sustento por concepto de recaudación y tipo de transferencia
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoDocumentoSustentoRecaudacion$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocumentoSustentoRecaudacion(params) {
return this.listarTipoDocumentoSustentoRecaudacion$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de documento de primera venta.
*
* Devuelve la lista de documentos de sustento por primera venta
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoDocumentoSustentoMotivoPrimeraVenta()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocumentoSustentoMotivoPrimeraVenta$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoDocumentoSustentoMotivoPrimeraVentaPath, 'get');
if (params) {
rb.path('con_recaudacion_id', params.con_recaudacion_id, {});
rb.path('tipo_transferencia_id', params.tipo_transferencia_id, {});
rb.path('motivo-primera_venta_id', params['motivo-primera_venta_id'], {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de documento de primera venta.
*
* Devuelve la lista de documentos de sustento por primera venta
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoDocumentoSustentoMotivoPrimeraVenta$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocumentoSustentoMotivoPrimeraVenta(params) {
return this.listarTipoDocumentoSustentoMotivoPrimeraVenta$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de documento de sustento por condición de inafectación.
*
* Devuelve la lista de documentos de sustento por condición de inafectación del Contribuyente
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoDocumentoSustentoCondicionInafectacion()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocumentoSustentoCondicionInafectacion$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoDocumentoSustentoCondicionInafectacionPath, 'get');
if (params) {
rb.path('tipo_con_inafeccion_id', params.tipo_con_inafeccion_id, {});
rb.path('tipo_con_concursal_id', params.tipo_con_concursal_id, {});
rb.path('principal', params.principal, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de documento de sustento por condición de inafectación.
*
* Devuelve la lista de documentos de sustento por condición de inafectación del Contribuyente
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoDocumentoSustentoCondicionInafectacion$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocumentoSustentoCondicionInafectacion(params) {
return this.listarTipoDocumentoSustentoCondicionInafectacion$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar las condiciones según el tipo de predio.
*
* Devuelve una lista de las condiciones según el tipo de predio
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoDocumentoPorCondicion()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocumentoPorCondicion$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoDocumentoPorCondicionPath, 'get');
if (params) {
rb.path('tipo_con_inafectacion_id', params.tipo_con_inafectacion_id, {});
rb.path('tip_con_concursal_id', params.tip_con_concursal_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar las condiciones según el tipo de predio.
*
* Devuelve una lista de las condiciones según el tipo de predio
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoDocumentoPorCondicion$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocumentoPorCondicion(params) {
return this.listarTipoDocumentoPorCondicion$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los documentos de sustento por condición de Predio.
*
* Permite listar los documentos de sustento por condición de Predio
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarDocumentoTipoPorCondicionPredio()` instead.
*
* This method doesn't expect any request body.
*/
listarDocumentoTipoPorCondicionPredio$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarDocumentoTipoPorCondicionPredioPath, 'get');
if (params) {
rb.path('tip_con_predio_id', params.tip_con_predio_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los documentos de sustento por condición de Predio.
*
* Permite listar los documentos de sustento por condición de Predio
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarDocumentoTipoPorCondicionPredio$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarDocumentoTipoPorCondicionPredio(params) {
return this.listarDocumentoTipoPorCondicionPredio$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los tipos de juegos por concepto de recaudación.
*
* Devuelve la lista de tipos de juegos por concepto de recaudación
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarDocSusConVehiculoTipo()` instead.
*
* This method doesn't expect any request body.
*/
listarDocSusConVehiculoTipo$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarDocSusConVehiculoTipoPath, 'get');
if (params) {
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los tipos de juegos por concepto de recaudación.
*
* Devuelve la lista de tipos de juegos por concepto de recaudación
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarDocSusConVehiculoTipo$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarDocSusConVehiculoTipo(params) {
return this.listarDocSusConVehiculoTipo$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los documentos de identidad.
*
* Devuelve una lista de los documentos de identidad
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoDocIdentidad()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocIdentidad$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoDocIdentidadPath, 'get');
if (params) {
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los documentos de identidad.
*
* Devuelve una lista de los documentos de identidad
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoDocIdentidad$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocIdentidad(params) {
return this.listarTipoDocIdentidad$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los documentos de identidad según el tipo de relacionado.
*
* Devuelve una lista de los documentos de identidad según el tipo de relacionado
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoDocIdentidadPorTipoRelacionado()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocIdentidadPorTipoRelacionado$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoDocIdentidadPorTipoRelacionadoPath, 'get');
if (params) {
rb.path('tipo_relacionado_id', params.tipo_relacionado_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los documentos de identidad según el tipo de relacionado.
*
* Devuelve una lista de los documentos de identidad según el tipo de relacionado
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoDocIdentidadPorTipoRelacionado$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocIdentidadPorTipoRelacionado(params) {
return this.listarTipoDocIdentidadPorTipoRelacionado$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los documentos de identidad según el tipo de persona.
*
* Devuelve una lista de los documentos de identidad según el tipo de persona
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoDocIdentidadPorTipoPersona()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocIdentidadPorTipoPersona$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoDocIdentidadPorTipoPersonaPath, 'get');
if (params) {
rb.path('tipo_persona_id', params.tipo_persona_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los documentos de identidad según el tipo de persona.
*
* Devuelve una lista de los documentos de identidad según el tipo de persona
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoDocIdentidadPorTipoPersona$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoDocIdentidadPorTipoPersona(params) {
return this.listarTipoDocIdentidadPorTipoPersona$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los tipos de consulta para contribuyente.
*
* Permite listar los tipos de consulta para contribuyente
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoBusquedaContribuyente()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoBusquedaContribuyente$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoBusquedaContribuyentePath, 'get');
if (params) {
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los tipos de consulta para contribuyente.
*
* Permite listar los tipos de consulta para contribuyente
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoBusquedaContribuyente$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoBusquedaContribuyente(params) {
return this.listarTipoBusquedaContribuyente$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar las condiciones según el tipo de predio.
*
* Devuelve una lista de las condiciones según el tipo de predio
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoCondicionPorTipoPredio()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoCondicionPorTipoPredio$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoCondicionPorTipoPredioPath, 'get');
if (params) {
rb.path('tipo_predio_id', params.tipo_predio_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar las condiciones según el tipo de predio.
*
* Devuelve una lista de las condiciones según el tipo de predio
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoCondicionPorTipoPredio$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoCondicionPorTipoPredio(params) {
return this.listarTipoCondicionPorTipoPredio$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de condición de inafectación.
*
* Devuelve la lista de condición de inafectación por tipo de persona
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoCondicionInafectacion()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoCondicionInafectacion$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoCondicionInafectacionPath, 'get');
if (params) {
rb.path('tipo_persona_id', params.tipo_persona_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de condición de inafectación.
*
* Devuelve la lista de condición de inafectación por tipo de persona
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoCondicionInafectacion$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoCondicionInafectacion(params) {
return this.listarTipoCondicionInafectacion$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de condición concursal por tipo de persona.
*
* Devuelve la lista de condición concursal por tipo de persona
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoCondicionConcursal()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoCondicionConcursal$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoCondicionConcursalPath, 'get');
if (params) {
rb.path('tipo_persona_id', params.tipo_persona_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de condición concursal por tipo de persona.
*
* Devuelve la lista de condición concursal por tipo de persona
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoCondicionConcursal$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoCondicionConcursal(params) {
return this.listarTipoCondicionConcursal$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipo area verde.
*
* Permite listar tipo area verde
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarAreaVerdeTipo()` instead.
*
* This method doesn't expect any request body.
*/
listarAreaVerdeTipo$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarAreaVerdeTipoPath, 'get');
if (params) {
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipo area verde.
*
* Permite listar tipo area verde
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarAreaVerdeTipo$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarAreaVerdeTipo(params) {
return this.listarAreaVerdeTipo$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de adquisición.
*
* Permite listar tipos de adquisición
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarTipoAdquisicion()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoAdquisicion$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarTipoAdquisicionPath, 'get');
if (params) {
rb.path('con_recaudacion_id', params.con_recaudacion_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de adquisición.
*
* Permite listar tipos de adquisición
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarTipoAdquisicion$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarTipoAdquisicion(params) {
return this.listarTipoAdquisicion$Response(params).pipe(map((r) => r.body));
}
/**
* Permite obtener la descripcion de un domicilio urbano.
*
* Permite obtener la descripcion de un domicilio urbano
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `obtenerDesDomicilioUrbano()` instead.
*
* This method doesn't expect any request body.
*/
obtenerDesDomicilioUrbano$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ObtenerDesDomicilioUrbanoPath, 'get');
if (params) {
rb.path('departamento', params.departamento, {});
rb.path('provincia', params.provincia, {});
rb.path('distrito', params.distrito, {});
rb.query('request', params.request, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite obtener la descripcion de un domicilio urbano.
*
* Permite obtener la descripcion de un domicilio urbano
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `obtenerDesDomicilioUrbano$Response()` instead.
*
* This method doesn't expect any request body.
*/
obtenerDesDomicilioUrbano(params) {
return this.obtenerDesDomicilioUrbano$Response(params).pipe(map((r) => r.body));
}
/**
* Permite obtener la descripcion de un domicilio rustico.
*
* Permite obtener la descripcion de un domicilio rustico
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `obtenerDesDomicilioRustico()` instead.
*
* This method doesn't expect any request body.
*/
obtenerDesDomicilioRustico$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ObtenerDesDomicilioRusticoPath, 'get');
if (params) {
rb.path('departamento', params.departamento, {});
rb.path('provincia', params.provincia, {});
rb.path('distrito', params.distrito, {});
rb.query('request', params.request, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite obtener la descripcion de un domicilio rustico.
*
* Permite obtener la descripcion de un domicilio rustico
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `obtenerDesDomicilioRustico$Response()` instead.
*
* This method doesn't expect any request body.
*/
obtenerDesDomicilioRustico(params) {
return this.obtenerDesDomicilioRustico$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar Notarias por municipalidad.
*
* Permite listar Notarias por municipalidad
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarNotarias()` instead.
*
* This method doesn't expect any request body.
*/
listarNotarias$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarNotariasPath, 'get');
if (params) {
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar Notarias por municipalidad.
*
* Permite listar Notarias por municipalidad
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarNotarias$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarNotarias(params) {
return this.listarNotarias$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar modelos por marca de vehiculos.
*
* Permite listar modelos por marca de vehiculos
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarModeloMarca()` instead.
*
* This method doesn't expect any request body.
*/
listarModeloMarca$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarModeloMarcaPath, 'get');
if (params) {
rb.path('cod_marca', params.cod_marca, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar modelos por marca de vehiculos.
*
* Permite listar modelos por marca de vehiculos
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarModeloMarca$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarModeloMarca(params) {
return this.listarModeloMarca$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de modelo oficial de vehiculos.
*
* Permite listar tipos de modelo oficial de vehiculos por Marca y Año
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarModeloOficialVehiculo()` instead.
*
* This method doesn't expect any request body.
*/
listarModeloOficialVehiculo$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarModeloOficialVehiculoPath, 'get');
if (params) {
rb.path('marca_vehiculo', params.marca_vehiculo, {});
rb.path('anio_fabricacion', params.anio_fabricacion, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de modelo oficial de vehiculos.
*
* Permite listar tipos de modelo oficial de vehiculos por Marca y Año
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarModeloOficialVehiculo$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarModeloOficialVehiculo(params) {
return this.listarModeloOficialVehiculo$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de modelo equivalente de vehiculos.
*
* Permite listar tipos de modelo equivalente de vehiculos por Marca y Año. Datos de MTC
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarModeloEquivalenteVehiculo()` instead.
*
* This method doesn't expect any request body.
*/
listarModeloEquivalenteVehiculo$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarModeloEquivalenteVehiculoPath, 'get');
if (params) {
rb.path('marca_vehiculo', params.marca_vehiculo, {});
rb.path('otra_marca', params.otra_marca, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de modelo equivalente de vehiculos.
*
* Permite listar tipos de modelo equivalente de vehiculos por Marca y Año. Datos de MTC
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarModeloEquivalenteVehiculo$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarModeloEquivalenteVehiculo(params) {
return this.listarModeloEquivalenteVehiculo$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los medios de Determinación.
*
* Devuelve una lista de los medios de determinación según el medio de presentación
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarMedioDeterminacionPorMedioPresentacion()` instead.
*
* This method doesn't expect any request body.
*/
listarMedioDeterminacionPorMedioPresentacion$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarMedioDeterminacionPorMedioPresentacionPath, 'get');
if (params) {
rb.path('tipo_medio_determina_id', params.tipo_medio_determina_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los medios de Determinación.
*
* Devuelve una lista de los medios de determinación según el medio de presentación
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarMedioDeterminacionPorMedioPresentacion$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarMedioDeterminacionPorMedioPresentacion(params) {
return this.listarMedioDeterminacionPorMedioPresentacion$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de marca oficial de vehiculos.
*
* Permite listar tipos de marca oficial de vehiculos por Marca y Año
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarMarcaOficialVehiculo()` instead.
*
* This method doesn't expect any request body.
*/
listarMarcaOficialVehiculo$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarMarcaOficialVehiculoPath, 'get');
if (params) {
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de marca oficial de vehiculos.
*
* Permite listar tipos de marca oficial de vehiculos por Marca y Año
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarMarcaOficialVehiculo$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarMarcaOficialVehiculo(params) {
return this.listarMarcaOficialVehiculo$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de marca equivalente de vehiculos.
*
* Permite listar tipos de marca equivalente de vehiculos por Marca y Año, Datos de MTC
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarMarcaEquivalenteVehiculo()` instead.
*
* This method doesn't expect any request body.
*/
listarMarcaEquivalenteVehiculo$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarMarcaEquivalenteVehiculoPath, 'get');
if (params) {
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de marca equivalente de vehiculos.
*
* Permite listar tipos de marca equivalente de vehiculos por Marca y Año, Datos de MTC
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarMarcaEquivalenteVehiculo$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarMarcaEquivalenteVehiculo(params) {
return this.listarMarcaEquivalenteVehiculo$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los documentos de sustento por condición de Vehículo.
*
* Permite listar los documentos de sustento por condición de Vehículo
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarDocSustentoPorCondicionVehiculo()` instead.
*
* This method doesn't expect any request body.
*/
listarDocSustentoPorCondicionVehiculo$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarDocSustentoPorCondicionVehiculoPath, 'get');
if (params) {
rb.path('tip_con_vehiculo_id', params.tip_con_vehiculo_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los documentos de sustento por condición de Vehículo.
*
* Permite listar los documentos de sustento por condición de Vehículo
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarDocSustentoPorCondicionVehiculo$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarDocSustentoPorCondicionVehiculo(params) {
return this.listarDocSustentoPorCondicionVehiculo$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar categoria vehiculos.
*
* Permite listar categoria vehiculos
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarCategoria()` instead.
*
* This method doesn't expect any request body.
*/
listarCategoria$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarCategoriaPath, 'get');
if (params) {
rb.path('cod_categoria', params.cod_categoria, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar categoria vehiculos.
*
* Permite listar categoria vehiculos
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarCategoria$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarCategoria(params) {
return this.listarCategoria$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar los documentos de sustento por listado de ids.
*
* Permite listar los documentos de sustento por condición de Predio
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarDocSustentoTipo()` instead.
*
* This method doesn't expect any request body.
*/
listarDocSustentoTipo$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarDocSustentoTipoPath, 'get');
if (params) {
rb.path('arr_tip_doc_sustento_id', params.arr_tip_doc_sustento_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar los documentos de sustento por listado de ids.
*
* Permite listar los documentos de sustento por condición de Predio
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarDocSustentoTipo$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarDocSustentoTipo(params) {
return this.listarDocSustentoTipo$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar condición de propiedad.
*
* Permite listar condición de propiedad
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarCondicionPropiedad()` instead.
*
* This method doesn't expect any request body.
*/
listarCondicionPropiedad$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarCondicionPropiedadPath, 'get');
if (params) {
rb.path('con_recaudacion_id', params.con_recaudacion_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar condición de propiedad.
*
* Permite listar condición de propiedad
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarCondicionPropiedad$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarCondicionPropiedad(params) {
return this.listarCondicionPropiedad$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar las condiciones activas del contribuyente.
*
* Permite listar las condiciones activas del contribuyente
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarConContribuyente()` instead.
*
* This method doesn't expect any request body.
*/
listarConContribuyente$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarConContribuyentePath, 'get');
if (params) {
rb.path('contribuyente_numero', params.contribuyente_numero, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar las condiciones activas del contribuyente.
*
* Permite listar las condiciones activas del contribuyente
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarConContribuyente$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarConContribuyente(params) {
return this.listarConContribuyente$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de Clase por el codigo de carroceria de vehiculos.
*
* Permite listar tipos de Clase por el codigo de carroceria de vehiculos
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarClasePorCarroceria()` instead.
*
* This method doesn't expect any request body.
*/
listarClasePorCarroceria$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarClasePorCarroceriaPath, 'get');
if (params) {
rb.path('carroceria_id', params.carroceria_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de Clase por el codigo de carroceria de vehiculos.
*
* Permite listar tipos de Clase por el codigo de carroceria de vehiculos
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarClasePorCarroceria$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarClasePorCarroceria(params) {
return this.listarClasePorCarroceria$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar tipos de Categoria MEF por el codigo de clase de vehiculos.
*
* Permite listar tipos de Categoria por el codigo de clase de vehiculos
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarCategoriaPorClase()` instead.
*
* This method doesn't expect any request body.
*/
listarCategoriaPorClase$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarCategoriaPorClasePath, 'get');
if (params) {
rb.path('clase_id', params.clase_id, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar tipos de Categoria MEF por el codigo de clase de vehiculos.
*
* Permite listar tipos de Categoria por el codigo de clase de vehiculos
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarCategoriaPorClase$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarCategoriaPorClase(params) {
return this.listarCategoriaPorClase$Response(params).pipe(map((r) => r.body));
}
/**
* Permite listar area verde.
*
* Permite listar area verde
*
* This method provides access to the full `HttpResponse`, allowing access to response headers.
* To access only the response body, use `listarAreaVerde()` instead.
*
* This method doesn't expect any request body.
*/
listarAreaVerde$Response(params) {
const rb = new RequestBuilder(this.rootUrl, ComunesRegistroControllerService.ListarAreaVerdePath, 'get');
if (params) {
rb.path('tipo_area_verde', params.tipo_area_verde, {});
}
return this.http.request(rb.build({
responseType: 'json',
accept: 'application/json',
context: params?.context
})).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
return r;
}));
}
/**
* Permite listar area verde.
*
* Permite listar area verde
*
* This method provides access to only to the response body.
* To access the full response (for headers, for example), `listarAreaVerde$Response()` instead.
*
* This method doesn't expect any request body.
*/
listarAreaVerde(params) {
return this.listarAreaVerde$Response(params).pipe(map((r) => r.body));
}
}
/**
* Path part for operation listar
*/
ComunesRegistroControllerService.ListarPath = '/comunesregistro/{codigo}';
/**
* Path part for operation listarTipoZonaUrbana
*/
ComunesRegistroControllerService.ListarTipoZonaUrbanaPath = '/comunesregistro/tipo-zona-urbana/{tipo_predio_id}';
/**
* Path part for operation listarZonaInfluenciaTipo
*/
ComunesRegistroControllerService.ListarZonaInfluenciaTipoPath = '/comunesregistro/tipo-zona-influencia';
/**
* Path part for operation listarTipoVia
*/
ComunesRegistroControllerService.ListarTipoViaPath = '/comunesregistro/tipo-via/{tipo_predio_id}';
/**
* Path part for operation listarTipoUsoArbitrio
*/
ComunesRegistroControllerService.ListarTipoUsoArbitrioPath = '/comunesregistro/tipo-uso-arbitrio/{anio}';
/**
* Path part for operation listarTipoSubZonaUrbana
*/
ComunesRegistroControllerService.ListarTipoSubZonaUrbanaPath = '/comunesregistro/tipo-subzona-urbana/{tipo_predio_id}';
/**
* Path part for operation listarTipoRelacionadoPorTipoPersona
*/
ComunesRegistroControllerService.ListarTipoRelacionadoPorTipoPersonaPath = '/comunesregistro/tipo-relacionado-por-tipo-persona/{tipo_persona_id}/{fallecido}';
/**
* Path part for operation listarTipoPropiedad
*/
ComunesRegistroControllerService.ListarTipoPropiedadPath = '/comunesregistro/tipo-propiedad/{con_recaudacion_id}';
/**
* Path part for operation listarNivelAfluenciaTipo
*/
ComunesRegistroControllerService.ListarNivelAfluenciaTipoPath = '/comunesregistro/tipo-nivel-afluencia';
/**
* Path part for operation listarTipoJuegoRecaudacion
*/
ComunesRegistroControllerService.ListarTipoJuegoRecaudacionPath = '/comunesregistro/tipo-juego-recaudacion/{con_recaudacion_id}';
/**
* Path part for operation listarTipoInterior
*/
ComunesRegistroControllerService.ListarTipoInteriorPath = '/comunesregistro/tipo-interior/{tipo_predio_id}';
/**
* Path part for operation listarTipoEdificacion
*/
ComunesRegistroControllerService.ListarTipoEdificacionPath = '/comunesregistro/tipo-edificacion/{tipo_predio_id}';
/**
* Path part for operation listarDocumentoTipo
*/
ComunesRegistroControllerService.ListarDocumentoTipoPath = '/comunesregistro/tipo-documento';
/**
* Path part for operation listarTipoDocumentoSustentoRecaudacion
*/
ComunesRegistroControllerService.ListarTipoDocumentoSustentoRecaudacionPath = '/comunesregistro/tipo-documento-sustento-recaudacion/{con_recaudacion_id}/{tipo_transferencia_id}';
/**
* Path part for operation listarTipoDocumentoSustentoMotivoPrimeraVenta
*/
ComunesRegistroControllerService.ListarTipoDocumentoSustentoMotivoPrimeraVentaPath = '/comunesregistro/tipo-documento-sustento-motivo-primera-venta/{con_recaudacion_id}/{tipo_transferencia_id}/{motivo-primera_venta_id}';
/**
* Path part for operation listarTipoDocumentoSustentoCondicionInafectacion
*/
ComunesRegistroControllerService.ListarTipoDocumentoSustentoCondicionInafectacionPath = '/comunesregistro/tipo-documento-sustento-condicion-inafectacion/{tipo_con_inafeccion_id}/{tipo_con_concursal_id}/{principal}';
/**
* Path part for operation listarTipoDocumentoPorCondicion
*/
ComunesRegistroControllerService.ListarTipoDocumentoPorCondicionPath = '/comunesregistro/tipo-documento-por-condicion/{tipo_con_inafectacion_id}/{tip_con_concursal_id}';
/**
* Path part for operation listarDocumentoTipoPorCondicionPredio
*/
ComunesRegistroControllerService.ListarDocumentoTipoPorCondicionPredioPath = '/comunesregistro/tipo-documento-por-condicion-predio/{tip_con_predio_id}';
/**
* Path part for operation listarDocSusConVehiculoTipo
*/
ComunesRegistroControllerService.ListarDocSusConVehiculoTipoPath = '/comunesregistro/tipo-doc-sus-vehiculo/{con_recaudacion_id}';
/**
* Path part for operation listarTipoDocIdentidad
*/
ComunesRegistroControllerService.ListarTipoDocIdentidadPath = '/comunesregistro/tipo-doc-identidad';
/**
* Path part for operation listarTipoDocIdentidadPorTipoRelacionado
*/
ComunesRegistroControllerService.ListarTipoDocIdentidadPorTipoRelacionadoPath = '/comunesregistro/tipo-doc-identidad-por-tipo-relacionado/{tipo_relacionado_id}';
/**
* Path part for operation listarTipoDocIdentidadPorTipoPersona
*/
ComunesRegistroControllerService.ListarTipoDocIdentidadPorTipoPersonaPath = '/comunesregistro/tipo-doc-identidad-por-tipo-persona/{tipo_persona_id}';
/**
* Path part for operation listarTipoBusquedaContribuyente
*/
ComunesRegistroControllerService.ListarTipoBusquedaContribuyentePath = '/comunesregistro/tipo-consulta-contribuyente';
/**
* Path part for operation listarTipoCondicionPorTipoPredio
*/
ComunesRegistroControllerService.ListarTipoCondicionPorTipoPredioPath = '/comunesregistro/tipo-condicion-por-tipo-predio/{tipo_predio_id}';
/**
* Path part for operation listarTipoCondicionInafectacion
*/
ComunesRegistroControllerService.ListarTipoCondicionInafectacionPath = '/comunesregistro/tipo-condicion-inafectacion/{tipo_persona_id}';
/**
* Path part for operation listarTipoCondicionConcursal
*/
ComunesRegistroControllerService.ListarTipoCondicionConcursalPath = '/comunesregistro/tipo-condicion-concursal/{tipo_persona_id}';
/**
* Path part for operation listarAreaVerdeTipo
*/
ComunesRegistroControllerService.ListarAreaVerdeTipoPath = '/comunesregistro/tipo-area-verde';
/**
* Path part for operation listarTipoAdquisicion
*/
ComunesRegistroControllerService.ListarTipoAdquisicionPath = '/comunesregistro/tipo-adquisicion/{con_recaudacion_id}';
/**
* Path part for operation obtenerDesDomicilioUrbano
*/
ComunesRegistroControllerService.ObtenerDesDomicilioUrbanoPath = '/comunesregistro/obtener-domicilio-urbano-lineal/{departamento}/{provincia}/{distrito}';
/**
* Path part for operation obtenerDesDomicilioRustico
*/
ComunesRegistroControllerService.ObtenerDesDomicilioRusticoPath = '/comunesregistro/obtener-domicilio-rustico-lineal/{departamento}/{provincia}/{distrito}';
/**
* Path part for operation listarNotarias
*/
ComunesRegistroControllerService.ListarNotariasPath = '/comunesregistro/notarias';
/**
* Path part for operation listarModeloMarca
*/
ComunesRegistroControllerService.ListarModeloMarcaPath = '/comunesregistro/modelo-vehiculo/{cod_marca}';
/**
* Path part for operation listarModeloOficialVehiculo
*/
ComunesRegistroControllerService.ListarModeloOficialVehiculoPath = '/comunesregistro/modelo-oficial-vehiculo/{marca_vehiculo}/{anio_fabricacion}';
/**
* Path part for operation listarModeloEquivalenteVehiculo
*/
ComunesRegistroControllerService.ListarModeloEquivalenteVehiculoPath = '/comunesregistro/modelo-equivalente-vehiculo/{marca_vehiculo}/{otra_marca}';
/**
* Path part for operation listarMedioDeterminacionPorMedioPresentacion
*/
ComunesRegistroControllerService.ListarMedioDeterminacionPorMedioPresentacionPath = '/comunesregistro/medio-determinacion/{tipo_medio_determina_id}';
/**
* Path part for operation listarMarcaOficialVehiculo
*/
ComunesRegistroControllerService.ListarMarcaOficialVehiculoPath = '/comunesregistro/marca-oficial-vehiculo';
/**
* Path part for operation listarMarcaEquivalenteVehiculo
*/
ComunesRegistroControllerService.ListarMarcaEquivalenteVehiculoPath = '/comunesregistro/marca-equivalente-vehiculo';
/**
* Path part for operation listarDocSustentoPorCondicionVehiculo
*/
ComunesRegistroControllerService.ListarDocSustentoPorCondicionVehiculoPath = '/comunesregistro/listar-sustento-condicion-vehiculo/{tip_con_vehiculo_id}';
/**
* Path part for operation listarCategoria
*/
ComunesRegistroControllerService.ListarCategoriaPath = '/comunesregistro/lista-categoria-vehiculo/{cod_categoria}';
/**
* Path part for operation listarDocSustentoTipo
*/
ComunesRegistroControllerService.ListarDocSustentoTipoPath = '/comunesregistro/doc-sustento_tipo/{arr_tip_doc_sustento_id}';
/**
* Path part for operation listarCondicionPropiedad
*/
ComunesRegistroControllerService.ListarCondicionPropiedadPath = '/comunesregistro/condicion-propiedad/{con_recaudacion_id}';
/**
* Path part for operation listarConContribuyente
*/
ComunesRegistroControllerService.ListarConContribuyentePath = '/comunesregistro/condicion-contribuyente/{contribuyente_numero}';
/**
* Path part for operation listarClasePorCarroceria
*/
ComunesRegistroControllerService.ListarClasePorCarroceriaPath = '/comunesregistro/clase-vehiculo/{carroceria_id}';
/**
* Path part for operation listarCategoriaPorClase
*/
ComunesRegistroControllerService.ListarCategoriaPorClasePath = '/comunesregistro/categoria-vehiculo/{clase_id}';
/**
* Path part for operation listarAreaVerde
*/
ComunesRegistroControllerService.ListarAreaVerdePath = '/comunesregistro/area-verde/{tipo_area_verde}';
ComunesRegistroControllerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ComunesRegistroControllerService, deps: [{ token: i1.ApiConfiguration }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
ComunesRegistroControllerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ComunesRegistroControllerService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ComunesRegistroControllerService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.ApiConfiguration }, { type: i2.HttpClient }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tdW5lcy1yZWdpc3Ryby1jb250cm9sbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hcmNoaXZvL25zcnRtLWdlc3Rpb25hcmNoaXZvLW5wbS9zcmMvYXBwL2FwaS9jb211bmVzLXJlZ2lzdHJvL3NlcnZpY2VzL2NvbXVuZXMtcmVnaXN0cm8tY29udHJvbGxlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsWUFBWSxFQUFlLE1BQU0sc0JBQXNCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBdUI3QyxNQUFNLE9BQU8sZ0NBQWlDLFNBQVEsV0FBVztJQUMvRCxZQUNFLE1BQXdCLEVBQ3hCLElBQWdCO1FBRWhCLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILGVBQWUsQ0FBQyxNQUdmO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEcsSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3RDO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBdUQsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILE1BQU0sQ0FBQyxNQUdOO1FBR0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDdEMsR0FBRyxDQUFDLENBQUMsQ0FBcUQsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQXNDLENBQUMsQ0FDekcsQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCw2QkFBNkIsQ0FBQyxNQUc3QjtRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUcsSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDdEQ7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUFpRCxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsb0JBQW9CLENBQUMsTUFHcEI7UUFHQyxPQUFPLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3BELEdBQUcsQ0FBQyxDQUFDLENBQStDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFnQyxDQUFDLENBQzdGLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsaUNBQWlDLENBQUMsTUFFakM7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xILElBQUksTUFBTSxFQUFFO1NBQ1g7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUF5RCxDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsd0JBQXdCLENBQUMsTUFFeEI7UUFHQyxPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3hELEdBQUcsQ0FBQyxDQUFDLENBQXVELEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUF3QyxDQUFDLENBQzdHLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsc0JBQXNCLENBQUMsTUFHdEI7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZHLElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBaUQsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILGFBQWEsQ0FBQyxNQUdiO1FBR0MsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUErQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBZ0MsQ0FBQyxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILDhCQUE4QixDQUFDLE1BRzlCO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRyxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDbEM7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUF5RCxDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gscUJBQXFCLENBQUMsTUFHckI7UUFHQyxPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3JELEdBQUcsQ0FBQyxDQUFDLENBQXVELEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUF3QyxDQUFDLENBQzdHLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsZ0NBQWdDLENBQUMsTUFHaEM7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLDJCQUEyQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pILElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBaUQsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILHVCQUF1QixDQUFDLE1BR3ZCO1FBR0MsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUN2RCxHQUFHLENBQUMsQ0FBQyxDQUErQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBZ0MsQ0FBQyxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILDRDQUE0QyxDQUFDLE1BSTVDO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3SCxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2RCxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBeUQsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILG1DQUFtQyxDQUFDLE1BSW5DO1FBR0MsT0FBTyxJQUFJLENBQUMsNENBQTRDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUNuRSxHQUFHLENBQUMsQ0FBQyxDQUF1RCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBd0MsQ0FBQyxDQUM3RyxDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILDRCQUE0QixDQUFDLE1BRzVCO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RyxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBaUQsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILG1CQUFtQixDQUFDLE1BR25CO1FBR0MsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUErQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBZ0MsQ0FBQyxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILGlDQUFpQyxDQUFDLE1BRWpDO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsSCxJQUFJLE1BQU0sRUFBRTtTQUNYO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBeUQsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILHdCQUF3QixDQUFDLE1BRXhCO1FBR0MsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUN4RCxHQUFHLENBQUMsQ0FBQyxDQUF1RCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBd0MsQ0FBQyxDQUM3RyxDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILG1DQUFtQyxDQUFDLE1BR25DO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwSCxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBaUQsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILDBCQUEwQixDQUFDLE1BRzFCO1FBR0MsT0FBTyxJQUFJLENBQUMsbUNBQW1DLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUMxRCxHQUFHLENBQUMsQ0FBQyxDQUErQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBZ0MsQ0FBQyxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILDJCQUEyQixDQUFDLE1BRzNCO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1RyxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUN0RDtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQWlELENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxrQkFBa0IsQ0FBQyxNQUdsQjtRQUdDLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDbEQsR0FBRyxDQUFDLENBQUMsQ0FBK0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQWdDLENBQUMsQ0FDN0YsQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCw4QkFBOEIsQ0FBQyxNQUc5QjtRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0csSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDdEQ7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUFpRCxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gscUJBQXFCLENBQUMsTUFHckI7UUFHQyxPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3JELEdBQUcsQ0FBQyxDQUFDLENBQStDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFnQyxDQUFDLENBQzdGLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsNEJBQTRCLENBQUMsTUFFNUI7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdHLElBQUksTUFBTSxFQUFFO1NBQ1g7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUF1RCxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsbUJBQW1CLENBQUMsTUFFbkI7UUFHQyxPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQXFELEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFzQyxDQUFDLENBQ3pHLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsK0NBQStDLENBQUMsTUFJL0M7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLDBDQUEwQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hJLElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0QsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDcEU7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUFpRCxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsc0NBQXNDLENBQUMsTUFJdEM7UUFHQyxPQUFPLElBQUksQ0FBQywrQ0FBK0MsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3RFLEdBQUcsQ0FBQyxDQUFDLENBQStDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFnQyxDQUFDLENBQzdGLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsc0RBQXNELENBQUMsTUFLdEQ7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLGlEQUFpRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZJLElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0QsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkUsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxNQUFNLENBQUMseUJBQXlCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMzRTtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQWlELENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCw2Q0FBNkMsQ0FBQyxNQUs3QztRQUdDLE9BQU8sSUFBSSxDQUFDLHNEQUFzRCxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDN0UsR0FBRyxDQUFDLENBQUMsQ0FBK0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQWdDLENBQUMsQ0FDN0YsQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCx5REFBeUQsQ0FBQyxNQUt6RDtRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsb0RBQW9ELEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUksSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBaUQsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILGdEQUFnRCxDQUFDLE1BS2hEO1FBR0MsT0FBTyxJQUFJLENBQUMseURBQXlELENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUNoRixHQUFHLENBQUMsQ0FBQyxDQUErQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBZ0MsQ0FBQyxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILHdDQUF3QyxDQUFDLE1BSXhDO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyxtQ0FBbUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6SCxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBaUQsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILCtCQUErQixDQUFDLE1BSS9CO1FBR0MsT0FBTyxJQUFJLENBQUMsd0NBQXdDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUMvRCxHQUFHLENBQUMsQ0FBQyxDQUErQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBZ0MsQ0FBQyxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILDhDQUE4QyxDQUFDLE1BRzlDO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvSCxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzVEO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBdUQsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILHFDQUFxQyxDQUFDLE1BR3JDO1FBR0MsT0FBTyxJQUFJLENBQUMsOENBQThDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUNyRSxHQUFHLENBQUMsQ0FBQyxDQUFxRCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBc0MsQ0FBQyxDQUN6RyxDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILG9DQUFvQyxDQUFDLE1BRXBDO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQywrQkFBK0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNySCxJQUFJLE1BQU0sRUFBRTtTQUNYO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBaUQsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILDJCQUEyQixDQUFDLE1BRTNCO1FBR0MsT0FBTyxJQUFJLENBQUMsb0NBQW9DLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUMzRCxHQUFHLENBQUMsQ0FBQyxDQUErQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBZ0MsQ0FBQyxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILCtCQUErQixDQUFDLE1BRS9CO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoSCxJQUFJLE1BQU0sRUFBRTtTQUNYO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBZ0UsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILHNCQUFzQixDQUFDLE1BRXRCO1FBR0MsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUN0RCxHQUFHLENBQUMsQ0FBQyxDQUE4RCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBK0MsQ0FBQyxDQUMzSCxDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILGlEQUFpRCxDQUFDLE1BR2pEO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyw0Q0FBNEMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsSSxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBaUQsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILHdDQUF3QyxDQUFDLE1BR3hDO1FBR0MsT0FBTyxJQUFJLENBQUMsaURBQWlELENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUN4RSxHQUFHLENBQUMsQ0FBQyxDQUErQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBZ0MsQ0FBQyxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILDZDQUE2QyxDQUFDLE1BRzdDO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5SCxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUN4RDtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQWdFLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxvQ0FBb0MsQ0FBQyxNQUdwQztRQUdDLE9BQU8sSUFBSSxDQUFDLDZDQUE2QyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDcEUsR0FBRyxDQUFDLENBQUMsQ0FBOEQsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQStDLENBQUMsQ0FDM0gsQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCx3Q0FBd0MsQ0FBQyxNQUV4QztRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekgsSUFBSSxNQUFNLEVBQUU7U0FDWDtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQWdFLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCwrQkFBK0IsQ0FBQyxNQUUvQjtRQUdDLE9BQU8sSUFBSSxDQUFDLHdDQUF3QyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDL0QsR0FBRyxDQUFDLENBQUMsQ0FBOEQsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQStDLENBQUMsQ0FDM0gsQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCx5Q0FBeUMsQ0FBQyxNQUd6QztRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUgsSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDdEQ7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUFpRCxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsZ0NBQWdDLENBQUMsTUFHaEM7UUFHQyxPQUFPLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ2hFLEdBQUcsQ0FBQyxDQUFDLENBQStDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFnQyxDQUFDLENBQzdGLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsd0NBQXdDLENBQUMsTUFHeEM7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLG1DQUFtQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pILElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBaUQsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILCtCQUErQixDQUFDLE1BRy9CO1FBR0MsT0FBTyxJQUFJLENBQUMsd0NBQXdDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUMvRCxHQUFHLENBQUMsQ0FBQyxDQUErQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBZ0MsQ0FBQyxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILHFDQUFxQyxDQUFDLE1BR3JDO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0SCxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUN4RDtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQWlELENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCw0QkFBNEIsQ0FBQyxNQUc1QjtRQUdDLE9BQU8sSUFBSSxDQUFDLHFDQUFxQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDNUQsR0FBRyxDQUFDLENBQUMsQ0FBK0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQWdDLENBQUMsQ0FDN0YsQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCw0QkFBNEIsQ0FBQyxNQUU1QjtRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0csSUFBSSxNQUFNLEVBQUU7U0FDWDtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQXlELENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxtQkFBbUIsQ0FBQyxNQUVuQjtRQUdDLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDbkQsR0FBRyxDQUFDLENBQUMsQ0FBdUQsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQXdDLENBQUMsQ0FDN0csQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCw4QkFBOEIsQ0FBQyxNQUc5QjtRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0csSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM5RDtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQXlELENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxxQkFBcUIsQ0FBQyxNQUdyQjtRQUdDLE9BQU8sSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDckQsR0FBRyxDQUFDLENBQUMsQ0FBdUQsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQXdDLENBQUMsQ0FDN0csQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCxrQ0FBa0MsQ0FBQyxNQU1sQztRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkgsSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0MsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6QyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBNkMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILHlCQUF5QixDQUFDLE1BTXpCO1FBR0MsT0FBTyxJQUFJLENBQUMsa0NBQWtDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUN6RCxHQUFHLENBQUMsQ0FBQyxDQUEyQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBNEIsQ0FBQyxDQUNyRixDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILG1DQUFtQyxDQUFDLE1BTW5DO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwSCxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakQsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDekM7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUE2QyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsMEJBQTBCLENBQUMsTUFNMUI7UUFHQyxPQUFPLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQzFELEdBQUcsQ0FBQyxDQUFDLENBQTJDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUE0QixDQUFDLENBQ3JGLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsdUJBQXVCLENBQUMsTUFFdkI7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hHLElBQUksTUFBTSxFQUFFO1NBQ1g7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUFpRCxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsY0FBYyxDQUFDLE1BRWQ7UUFHQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQzlDLEdBQUcsQ0FBQyxDQUFDLENBQStDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFnQyxDQUFDLENBQzdGLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsMEJBQTBCLENBQUMsTUFHMUI7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNHLElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQWlELENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxpQkFBaUIsQ0FBQyxNQUdqQjtRQUdDLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDakQsR0FBRyxDQUFDLENBQUMsQ0FBK0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQWdDLENBQUMsQ0FDN0YsQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCxvQ0FBb0MsQ0FBQyxNQUlwQztRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsK0JBQStCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckgsSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckQsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDMUQ7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUF3RCxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsMkJBQTJCLENBQUMsTUFJM0I7UUFHQyxPQUFPLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQzNELEdBQUcsQ0FBQyxDQUFDLENBQXNELEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUF1QyxDQUFDLENBQzNHLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsd0NBQXdDLENBQUMsTUFJeEM7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLG1DQUFtQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pILElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDOUM7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUF3RCxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsK0JBQStCLENBQUMsTUFJL0I7UUFHQyxPQUFPLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQy9ELEdBQUcsQ0FBQyxDQUFDLENBQXNELEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUF1QyxDQUFDLENBQzNHLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gscURBQXFELENBQUMsTUFHckQ7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLGdEQUFnRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RJLElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxNQUFNLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDeEU7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUFpRCxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsNENBQTRDLENBQUMsTUFHNUM7UUFHQyxPQUFPLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQzVFLEdBQUcsQ0FBQyxDQUFDLENBQStDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFnQyxDQUFDLENBQzdGLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsbUNBQW1DLENBQUMsTUFFbkM7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BILElBQUksTUFBTSxFQUFFO1NBQ1g7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUF1RCxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsMEJBQTBCLENBQUMsTUFFMUI7UUFHQyxPQUFPLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQzFELEdBQUcsQ0FBQyxDQUFDLENBQXFELEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFzQyxDQUFDLENBQ3pHLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsdUNBQXVDLENBQUMsTUFFdkM7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hILElBQUksTUFBTSxFQUFFO1NBQ1g7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUF1RCxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsOEJBQThCLENBQUMsTUFFOUI7UUFHQyxPQUFPLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQzlELEdBQUcsQ0FBQyxDQUFDLENBQXFELEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFzQyxDQUFDLENBQ3pHLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsOENBQThDLENBQUMsTUFHOUM7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLHlDQUF5QyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9ILElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDaEU7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUFpRCxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gscUNBQXFDLENBQUMsTUFHckM7UUFHQyxPQUFPLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3JFLEdBQUcsQ0FBQyxDQUFDLENBQStDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFnQyxDQUFDLENBQzdGLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsd0JBQXdCLENBQUMsTUFHeEI7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pHLElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNwRDtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQWlELENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxlQUFlLENBQUMsTUFHZjtRQUdDLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDL0MsR0FBRyxDQUFDLENBQUMsQ0FBK0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQWdDLENBQUMsQ0FDN0YsQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCw4QkFBOEIsQ0FBQyxNQUc5QjtRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0csSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUN4RTtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQXVELENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxxQkFBcUIsQ0FBQyxNQUdyQjtRQUdDLE9BQU8sSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDckQsR0FBRyxDQUFDLENBQUMsQ0FBcUQsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQXNDLENBQUMsQ0FDekcsQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCxpQ0FBaUMsQ0FBQyxNQUdqQztRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEgsSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM5RDtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQXFELENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCx3QkFBd0IsQ0FBQyxNQUd4QjtRQUdDLE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDeEQsR0FBRyxDQUFDLENBQUMsQ0FBbUQsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQW9DLENBQUMsQ0FDckcsQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCwrQkFBK0IsQ0FBQyxNQUcvQjtRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEgsSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNsRTtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTztTQUN6QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQXNELENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxzQkFBc0IsQ0FBQyxNQUd0QjtRQUdDLE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDdEQsR0FBRyxDQUFDLENBQUMsQ0FBb0QsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQXFDLENBQUMsQ0FDdkcsQ0FBQztJQUNKLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCxpQ0FBaUMsQ0FBQyxNQUdqQztRQUdDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEgsSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3BEO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBdUQsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILHdCQUF3QixDQUFDLE1BR3hCO1FBR0MsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUN4RCxHQUFHLENBQUMsQ0FBQyxDQUFxRCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBc0MsQ0FBQyxDQUN6RyxDQUFDO0lBQ0osQ0FBQztJQU9EOzs7Ozs7Ozs7T0FTRztJQUNILGdDQUFnQyxDQUFDLE1BR2hDO1FBR0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQ0FBZ0MsQ0FBQywyQkFBMkIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqSCxJQUFJLE1BQU0sRUFBRTtZQUNWLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDMUM7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDM0IsT0FBTyxDQUFtRCxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsdUJBQXVCLENBQUMsTUFHdkI7UUFHQyxPQUFPLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3ZELEdBQUcsQ0FBQyxDQUFDLENBQWlELEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFrQyxDQUFDLENBQ2pHLENBQUM7SUFDSixDQUFDO0lBT0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsd0JBQXdCLENBQUMsTUFHeEI7UUFHQyxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pHLElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPO1NBQ3pCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTixNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxZQUFZLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFO1lBQzNCLE9BQU8sQ0FBeUQsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILGVBQWUsQ0FBQyxNQUdmO1FBR0MsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUF1RCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBd0MsQ0FBQyxDQUM3RyxDQUFDO0lBQ0osQ0FBQzs7QUE1bUZEOztHQUVHO0FBQ2EsMkNBQVUsR0FBRywyQkFBNEIsQ0FBQTtBQXdEekQ7O0dBRUc7QUFDYSx5REFBd0IsR0FBRyxvREFBcUQsQ0FBQTtBQXdEaEc7O0dBRUc7QUFDYSw2REFBNEIsR0FBRyx1Q0FBd0MsQ0FBQTtBQXFEdkY7O0dBRUc7QUFDYSxrREFBaUIsR0FBRyw0Q0FBNkMsQ0FBQTtBQXdEakY7O0dBRUc7QUFDYSwwREFBeUIsR0FBRywyQ0FBNEMsQ0FBQTtBQXdEeEY7O0dBRUc7QUFDYSw0REFBMkIsR0FBRyx1REFBd0QsQ0FBQTtBQXdEdEc7O0dBRUc7QUFDYSx3RUFBdUMsR0FBRyxrRkFBbUYsQ0FBQTtBQTJEN0k7O0dBRUc7QUFDYSx3REFBdUIsR0FBRyxzREFBdUQsQ0FBQTtBQXdEakc7O0dBRUc7QUFDYSw2REFBNEIsR0FBRyx1Q0FBd0MsQ0FBQTtBQXFEdkY7O0dBRUc7QUFDYSwrREFBOEIsR0FBRyw4REFBK0QsQ0FBQTtBQXdEaEg7O0dBRUc7QUFDYSx1REFBc0IsR0FBRyxpREFBa0QsQ0FBQTtBQXdEM0Y7O0dBRUc7QUFDYSwwREFBeUIsR0FBRyxvREFBcUQsQ0FBQTtBQXdEakc7O0dBRUc7QUFDYSx3REFBdUIsR0FBRyxpQ0FBa0MsQ0FBQTtBQXFENUU7O0dBRUc7QUFDYSwyRUFBMEMsR0FBRyxtR0FBb0csQ0FBQTtBQTJEaks7O0dBRUc7QUFDYSxrRkFBaUQsR0FBRyxzSUFBdUksQ0FBQTtBQThEM007O0dBRUc7QUFDYSxxRkFBb0QsR0FBRyw4SEFBK0gsQ0FBQTtBQThEdE07O0dBRUc7QUFDYSxvRUFBbUMsR0FBRyxpR0FBa0csQ0FBQTtBQTJEeEo7O0dBRUc7QUFDYSwwRUFBeUMsR0FBRywwRUFBMkUsQ0FBQTtBQXdEdkk7O0dBRUc7QUFDYSxnRUFBK0IsR0FBRyw2REFBOEQsQ0FBQTtBQXFEaEg7O0dBRUc7QUFDYSwyREFBMEIsR0FBRyxxQ0FBc0MsQ0FBQTtBQXFEbkY7O0dBRUc7QUFDYSw2RUFBNEMsR0FBRyxnRkFBaUYsQ0FBQTtBQXdEaEo7O0dBRUc7QUFDYSx5RUFBd0MsR0FBRyx3RUFBeUUsQ0FBQTtBQXdEcEk7O0dBRUc7QUFDYSxvRUFBbUMsR0FBRyw4Q0FBK0MsQ0FBQTtBQXFEckc7O0dBRUc7QUFDYSxxRUFBb0MsR0FBRyxrRUFBbUUsQ0FBQTtBQXdEMUg7O0dBRUc7QUFDYSxvRUFBbUMsR0FBRyxnRUFBaUUsQ0FBQTtBQXdEdkg7O0dBRUc7QUFDYSxpRUFBZ0MsR0FBRyw2REFBOEQsQ0FBQTtBQXdEakg7O0dBRUc7QUFDYSx3REFBdUIsR0FBRyxrQ0FBbUMsQ0FBQTtBQXFEN0U7O0dBRUc7QUFDYSwwREFBeUIsR0FBRyx3REFBeUQsQ0FBQTtBQXdEckc7O0dBRUc7QUFDYSw4REFBNkIsR0FBRyx3RkFBeUYsQ0FBQTtBQWlFekk7O0dBRUc7QUFDYSwrREFBOEIsR0FBRyx5RkFBMEYsQ0FBQTtBQWlFM0k7O0dBRUc7QUFDYSxtREFBa0IsR0FBRywyQkFBNEIsQ0FBQTtBQXFEakU7O0dBRUc7QUFDYSxzREFBcUIsR0FBRyw4Q0FBK0MsQ0FBQTtBQXdEdkY7O0dBRUc7QUFDYSxnRUFBK0IsR0FBRyw4RUFBK0UsQ0FBQTtBQTJEakk7O0dBRUc7QUFDYSxvRUFBbUMsR0FBRyw0RUFBNkUsQ0FBQTtBQTJEbkk7O0dBRUc7QUFDYSxpRkFBZ0QsR0FBRyxnRUFBaUUsQ0FBQTtBQXdEcEk7O0dBRUc7QUFDYSwrREFBOEIsR0FBRyx5Q0FBMEMsQ0FBQTtBQXFEM0Y7O0dBRUc7QUFDYSxtRUFBa0MsR0FBRyw2Q0FBOEMsQ0FBQTtBQXFEbkc7O0dBRUc7QUFDYSwwRUFBeUMsR0FBRywyRUFBNEUsQ0FBQTtBQXdEeEk7O0dBRUc7QUFDYSxvREFBbUIsR0FBRywyREFBNEQsQ0FBQTtBQXdEbEc7O0dBRUc7QUFDYSwwREFBeUIsR0FBRyw4REFBK0QsQ0FBQTtBQXdEM0c7O0dBRUc7QUFDYSw2REFBNEIsR0FBRywyREFBNEQsQ0FBQTtBQXdEM0c7O0dBRUc7QUFDYSwyREFBMEIsR0FBRyxpRUFBa0UsQ0FBQTtBQXdEL0c7O0dBRUc7QUFDYSw2REFBNEIsR0FBRyxpREFBa0QsQ0FBQTtBQXdEakc7O0dBRUc7QUFDYSw0REFBMkIsR0FBRyxnREFBaUQsQ0FBQTtBQXdEL0Y7O0dBRUc7QUFDYSxvREFBbUIsR0FBRywrQ0FBZ0QsQ0FBQTs2SEE5akYzRSxnQ0FBZ0M7aUlBQWhDLGdDQUFnQyxjQUYvQixNQUFNOzJGQUVQLGdDQUFnQztrQkFINUMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBSZXNwb25zZSwgSHR0cENvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vYmFzZS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBpQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2FwaS1jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgU3RyaWN0SHR0cFJlc3BvbnNlIH0gZnJvbSAnLi4vc3RyaWN0LWh0dHAtcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBSZXF1ZXN0QnVpbGRlciB9IGZyb20gJy4uL3JlcXVlc3QtYnVpbGRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBDYXRlZ29yaWFQcm9qZWN0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2NhdGVnb3JpYS1wcm9qZWN0aW9uJztcclxuaW1wb3J0IHsgQ2xhc2VWZWhpY3Vsb1Byb2plY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvY2xhc2UtdmVoaWN1bG8tcHJvamVjdGlvbic7XHJcbmltcG9ydCB7IENvbXVuZXNQcm9qZWN0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2NvbXVuZXMtcHJvamVjdGlvbic7XHJcbmltcG9ydCB7IENvbXVuZXNSZWdpc3Ryb1Jlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL2NvbXVuZXMtcmVnaXN0cm8tcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBDb25Db250cmlidXllbnRlRW50aXR5IH0gZnJvbSAnLi4vbW9kZWxzL2Nvbi1jb250cmlidXllbnRlLWVudGl0eSc7XHJcbmltcG9ydCB7IERlc0RvbWljaWxpb1Jlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL2Rlcy1kb21pY2lsaW8tcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBEZXNEb21pY2lsaW9SdXN0aWNvUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9kZXMtZG9taWNpbGlvLXJ1c3RpY28tcmVxdWVzdCc7XHJcbmltcG9ydCB7IERlc0RvbWljaWxpb1VyYmFub1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvZGVzLWRvbWljaWxpby11cmJhbm8tcmVxdWVzdCc7XHJcbmltcG9ydCB7IERvY3VtZW50b0lkZW50aWRhZFRpcG9Qcm9qZWN0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2RvY3VtZW50by1pZGVudGlkYWQtdGlwby1wcm9qZWN0aW9uJztcclxuaW1wb3J0IHsgRG9jdW1lbnRvVGlwb1Byb2plY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvZG9jdW1lbnRvLXRpcG8tcHJvamVjdGlvbic7XHJcbmltcG9ydCB7IE1hcmNhVmVoaWN1bG9Qcm9qZWN0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL21hcmNhLXZlaGljdWxvLXByb2plY3Rpb24nO1xyXG5pbXBvcnQgeyBNb2RlbG9WZWhpY3Vsb1Byb2plY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvbW9kZWxvLXZlaGljdWxvLXByb2plY3Rpb24nO1xyXG5pbXBvcnQgeyBOb3RhcmlhUHJvamVjdGlvbiB9IGZyb20gJy4uL21vZGVscy9ub3RhcmlhLXByb2plY3Rpb24nO1xyXG5pbXBvcnQgeyBQcm9waWVkYWRUaXBvUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcHJvcGllZGFkLXRpcG8tcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBSZWxhY2lvbmFkb1RpcG9Qcm9qZWN0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlbGFjaW9uYWRvLXRpcG8tcHJvamVjdGlvbic7XHJcbmltcG9ydCB7IFRyYW5zZmVyZW5jaWFUaXBvUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvdHJhbnNmZXJlbmNpYS10aXBvLXJlc3BvbnNlJztcclxuaW1wb3J0IHsgVXNvQXJiaXRyaW9UaXBvUHJvamVjdGlvbiB9IGZyb20gJy4uL21vZGVscy91c28tYXJiaXRyaW8tdGlwby1wcm9qZWN0aW9uJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbmZpZzogQXBpQ29uZmlndXJhdGlvbixcclxuICAgIGh0dHA6IEh0dHBDbGllbnRcclxuICApIHtcclxuICAgIHN1cGVyKGNvbmZpZywgaHR0cCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJcclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3tjb2RpZ299JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGRhdG9zIGNvbXVuZXMuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgZGF0b3MgY29tdW5lcyBkZSBsYSB0YWJsYSBkZSBjYXTDoWxvZ28gZGUgcmVnaXN0cm9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhciRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIGNvZGlnbzogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUmVnaXN0cm9SZXNwb25zZT4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJQYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ2NvZGlnbycsIHBhcmFtcy5jb2RpZ28sIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUmVnaXN0cm9SZXNwb25zZT4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyBkYXRvcyBjb211bmVzLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGRhdG9zIGNvbXVuZXMgZGUgbGEgdGFibGEgZGUgY2F0w6Fsb2dvIGRlIHJlZ2lzdHJvXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXIkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyKHBhcmFtczoge1xyXG4gICAgY29kaWdvOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8Q29tdW5lc1JlZ2lzdHJvUmVzcG9uc2U+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1JlZ2lzdHJvUmVzcG9uc2U+PikgPT4gci5ib2R5IGFzIEFycmF5PENvbXVuZXNSZWdpc3Ryb1Jlc3BvbnNlPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvWm9uYVVyYmFuYVxyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJUaXBvWm9uYVVyYmFuYVBhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby90aXBvLXpvbmEtdXJiYW5hL3t0aXBvX3ByZWRpb19pZH0nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSB6b25hIHVyYmFuYS5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIGxhIGxpc3RhIGRlIGxvcyB0aXBvcyB6b25hIHVyYmFuYSBwb3IgdGlwbyBkZSBwcmVkaW9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyVGlwb1pvbmFVcmJhbmEoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb1pvbmFVcmJhbmEkUmVzcG9uc2UocGFyYW1zOiB7XHJcbiAgICB0aXBvX3ByZWRpb19pZDogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJUaXBvWm9uYVVyYmFuYVBhdGgsICdnZXQnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgcmIucGF0aCgndGlwb19wcmVkaW9faWQnLCBwYXJhbXMudGlwb19wcmVkaW9faWQsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIHpvbmEgdXJiYW5hLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgbGEgbGlzdGEgZGUgbG9zIHRpcG9zIHpvbmEgdXJiYW5hIHBvciB0aXBvIGRlIHByZWRpb1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyVGlwb1pvbmFVcmJhbmEkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb1pvbmFVcmJhbmEocGFyYW1zOiB7XHJcbiAgICB0aXBvX3ByZWRpb19pZDogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3RhclRpcG9ab25hVXJiYW5hJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJab25hSW5mbHVlbmNpYVRpcG9cclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyWm9uYUluZmx1ZW5jaWFUaXBvUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tem9uYS1pbmZsdWVuY2lhJztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIHRpcG9zIHpvbmEgaW5mbHVlbmNpYS5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyB0aXBvcyB6b25hIGluZmx1ZW5jaWFcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyWm9uYUluZmx1ZW5jaWFUaXBvKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclpvbmFJbmZsdWVuY2lhVGlwbyRSZXNwb25zZShwYXJhbXM/OiB7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFVzb0FyYml0cmlvVGlwb1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyWm9uYUluZmx1ZW5jaWFUaXBvUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFVzb0FyYml0cmlvVGlwb1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgdGlwb3Mgem9uYSBpbmZsdWVuY2lhLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIHRpcG9zIHpvbmEgaW5mbHVlbmNpYVxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyWm9uYUluZmx1ZW5jaWFUaXBvJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclpvbmFJbmZsdWVuY2lhVGlwbyhwYXJhbXM/OiB7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8VXNvQXJiaXRyaW9UaXBvUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJab25hSW5mbHVlbmNpYVRpcG8kUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvVmlhXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhclRpcG9WaWFQYXRoID0gJy9jb211bmVzcmVnaXN0cm8vdGlwby12aWEve3RpcG9fcHJlZGlvX2lkfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIHbDrWEuXHJcbiAgICpcclxuICAgKiBEZXZ1ZWx2ZSBsYSBsaXN0YSBkZSBsb3MgdGlwb3MgdsOtYSBwb3IgdGlwbyBkZSBwcmVkaW9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyVGlwb1ZpYSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvVmlhJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgdGlwb19wcmVkaW9faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyVGlwb1ZpYVBhdGgsICdnZXQnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgcmIucGF0aCgndGlwb19wcmVkaW9faWQnLCBwYXJhbXMudGlwb19wcmVkaW9faWQsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIHbDrWEuXHJcbiAgICpcclxuICAgKiBEZXZ1ZWx2ZSBsYSBsaXN0YSBkZSBsb3MgdGlwb3MgdsOtYSBwb3IgdGlwbyBkZSBwcmVkaW9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGxpc3RhclRpcG9WaWEkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb1ZpYShwYXJhbXM6IHtcclxuICAgIHRpcG9fcHJlZGlvX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyVGlwb1ZpYSRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxDb211bmVzUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyVGlwb1Vzb0FyYml0cmlvXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhclRpcG9Vc29BcmJpdHJpb1BhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby90aXBvLXVzby1hcmJpdHJpby97YW5pb30nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgdGlwb3MgZGUgdXNvIGRlIGFyYml0cmlvcy5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyB0aXBvcyBkZSB1c28gZGUgYXJiaXRyaW9zXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhclRpcG9Vc29BcmJpdHJpbygpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvVXNvQXJiaXRyaW8kUmVzcG9uc2UocGFyYW1zOiB7XHJcbiAgICBhbmlvOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFVzb0FyYml0cmlvVGlwb1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyVGlwb1Vzb0FyYml0cmlvUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCdhbmlvJywgcGFyYW1zLmFuaW8sIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIHRpcG9zIGRlIHVzbyBkZSBhcmJpdHJpb3MuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgdGlwb3MgZGUgdXNvIGRlIGFyYml0cmlvc1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyVGlwb1Vzb0FyYml0cmlvJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9Vc29BcmJpdHJpbyhwYXJhbXM6IHtcclxuICAgIGFuaW86IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3RhclRpcG9Vc29BcmJpdHJpbyRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFVzb0FyYml0cmlvVGlwb1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PFVzb0FyYml0cmlvVGlwb1Byb2plY3Rpb24+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIGxpc3RhclRpcG9TdWJab25hVXJiYW5hXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhclRpcG9TdWJab25hVXJiYW5hUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tc3Viem9uYS11cmJhbmEve3RpcG9fcHJlZGlvX2lkfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIHN1YnpvbmEgdXJiYW5hLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgbGEgbGlzdGEgZGUgbG9zIHRpcG9zIHN1YnpvbmEgdXJiYW5hIHBvciB0aXBvIGRlIHByZWRpb1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJUaXBvU3ViWm9uYVVyYmFuYSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvU3ViWm9uYVVyYmFuYSRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIHRpcG9fcHJlZGlvX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLkxpc3RhclRpcG9TdWJab25hVXJiYW5hUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCd0aXBvX3ByZWRpb19pZCcsIHBhcmFtcy50aXBvX3ByZWRpb19pZCwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgc3Viem9uYSB1cmJhbmEuXHJcbiAgICpcclxuICAgKiBEZXZ1ZWx2ZSBsYSBsaXN0YSBkZSBsb3MgdGlwb3Mgc3Viem9uYSB1cmJhbmEgcG9yIHRpcG8gZGUgcHJlZGlvXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJUaXBvU3ViWm9uYVVyYmFuYSRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvU3ViWm9uYVVyYmFuYShwYXJhbXM6IHtcclxuICAgIHRpcG9fcHJlZGlvX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyVGlwb1N1YlpvbmFVcmJhbmEkUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+KSA9PiByLmJvZHkgYXMgQXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIGxpc3RhclRpcG9SZWxhY2lvbmFkb1BvclRpcG9QZXJzb25hXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhclRpcG9SZWxhY2lvbmFkb1BvclRpcG9QZXJzb25hUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tcmVsYWNpb25hZG8tcG9yLXRpcG8tcGVyc29uYS97dGlwb19wZXJzb25hX2lkfS97ZmFsbGVjaWRvfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyBkb2N1bWVudG9zIGRlIGlkZW50aWRhZCBzZWfDum4gZWwgdGlwbyBkZSByZWxhY2lvbmFkby5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIHVuYSBsaXN0YSBkZSBsb3MgZG9jdW1lbnRvcyBkZSBpZGVudGlkYWQgc2Vnw7puIGVsIHRpcG8gZGUgcmVsYWNpb25hZG9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyVGlwb1JlbGFjaW9uYWRvUG9yVGlwb1BlcnNvbmEoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb1JlbGFjaW9uYWRvUG9yVGlwb1BlcnNvbmEkUmVzcG9uc2UocGFyYW1zOiB7XHJcbiAgICB0aXBvX3BlcnNvbmFfaWQ6IG51bWJlcjtcclxuICAgIGZhbGxlY2lkbzogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxSZWxhY2lvbmFkb1RpcG9Qcm9qZWN0aW9uPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLkxpc3RhclRpcG9SZWxhY2lvbmFkb1BvclRpcG9QZXJzb25hUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCd0aXBvX3BlcnNvbmFfaWQnLCBwYXJhbXMudGlwb19wZXJzb25hX2lkLCB7fSk7XHJcbiAgICAgIHJiLnBhdGgoJ2ZhbGxlY2lkbycsIHBhcmFtcy5mYWxsZWNpZG8sIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxSZWxhY2lvbmFkb1RpcG9Qcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGRvY3VtZW50b3MgZGUgaWRlbnRpZGFkIHNlZ8O6biBlbCB0aXBvIGRlIHJlbGFjaW9uYWRvLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgdW5hIGxpc3RhIGRlIGxvcyBkb2N1bWVudG9zIGRlIGlkZW50aWRhZCBzZWfDum4gZWwgdGlwbyBkZSByZWxhY2lvbmFkb1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyVGlwb1JlbGFjaW9uYWRvUG9yVGlwb1BlcnNvbmEkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb1JlbGFjaW9uYWRvUG9yVGlwb1BlcnNvbmEocGFyYW1zOiB7XHJcbiAgICB0aXBvX3BlcnNvbmFfaWQ6IG51bWJlcjtcclxuICAgIGZhbGxlY2lkbzogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPEFycmF5PFJlbGFjaW9uYWRvVGlwb1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyVGlwb1JlbGFjaW9uYWRvUG9yVGlwb1BlcnNvbmEkUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxSZWxhY2lvbmFkb1RpcG9Qcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxSZWxhY2lvbmFkb1RpcG9Qcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvUHJvcGllZGFkXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhclRpcG9Qcm9waWVkYWRQYXRoID0gJy9jb211bmVzcmVnaXN0cm8vdGlwby1wcm9waWVkYWQve2Nvbl9yZWNhdWRhY2lvbl9pZH0nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBwcm9waWVkYWQgcG9yIGNvbmNlcHRvIGRlIHJlY2F1ZGFjacOzbi5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIGxhIGxpc3RhIGRlIHRpcG9zIGRlIHByb3BpZWRhZCBwb3IgY29uY2VwdG8gZGUgcmVjYXVkYWNpw7NuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhclRpcG9Qcm9waWVkYWQoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb1Byb3BpZWRhZCRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIGNvbl9yZWNhdWRhY2lvbl9pZDogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJUaXBvUHJvcGllZGFkUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCdjb25fcmVjYXVkYWNpb25faWQnLCBwYXJhbXMuY29uX3JlY2F1ZGFjaW9uX2lkLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBwcm9waWVkYWQgcG9yIGNvbmNlcHRvIGRlIHJlY2F1ZGFjacOzbi5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIGxhIGxpc3RhIGRlIHRpcG9zIGRlIHByb3BpZWRhZCBwb3IgY29uY2VwdG8gZGUgcmVjYXVkYWNpw7NuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJUaXBvUHJvcGllZGFkJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9Qcm9waWVkYWQocGFyYW1zOiB7XHJcbiAgICBjb25fcmVjYXVkYWNpb25faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJUaXBvUHJvcGllZGFkJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJOaXZlbEFmbHVlbmNpYVRpcG9cclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyTml2ZWxBZmx1ZW5jaWFUaXBvUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tbml2ZWwtYWZsdWVuY2lhJztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIHRpcG9zIG5pdmVsIGRlIGFmbHVlbmNpYS5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyB0aXBvcyBuaXZlbCBkZSBhZmx1ZW5jaWFcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyTml2ZWxBZmx1ZW5jaWFUaXBvKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3Rhck5pdmVsQWZsdWVuY2lhVGlwbyRSZXNwb25zZShwYXJhbXM/OiB7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFVzb0FyYml0cmlvVGlwb1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyTml2ZWxBZmx1ZW5jaWFUaXBvUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFVzb0FyYml0cmlvVGlwb1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgdGlwb3Mgbml2ZWwgZGUgYWZsdWVuY2lhLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIHRpcG9zIG5pdmVsIGRlIGFmbHVlbmNpYVxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyTml2ZWxBZmx1ZW5jaWFUaXBvJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3Rhck5pdmVsQWZsdWVuY2lhVGlwbyhwYXJhbXM/OiB7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8VXNvQXJiaXRyaW9UaXBvUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJOaXZlbEFmbHVlbmNpYVRpcG8kUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvSnVlZ29SZWNhdWRhY2lvblxyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJUaXBvSnVlZ29SZWNhdWRhY2lvblBhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby90aXBvLWp1ZWdvLXJlY2F1ZGFjaW9uL3tjb25fcmVjYXVkYWNpb25faWR9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIHRpcG9zIGRlIGp1ZWdvcyBwb3IgY29uY2VwdG8gZGUgcmVjYXVkYWNpw7NuLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgbGEgbGlzdGEgZGUgdGlwb3MgZGUganVlZ29zIHBvciBjb25jZXB0byBkZSByZWNhdWRhY2nDs25cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyVGlwb0p1ZWdvUmVjYXVkYWNpb24oKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb0p1ZWdvUmVjYXVkYWNpb24kUmVzcG9uc2UocGFyYW1zOiB7XHJcbiAgICBjb25fcmVjYXVkYWNpb25faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyVGlwb0p1ZWdvUmVjYXVkYWNpb25QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ2Nvbl9yZWNhdWRhY2lvbl9pZCcsIHBhcmFtcy5jb25fcmVjYXVkYWNpb25faWQsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyB0aXBvcyBkZSBqdWVnb3MgcG9yIGNvbmNlcHRvIGRlIHJlY2F1ZGFjacOzbi5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIGxhIGxpc3RhIGRlIHRpcG9zIGRlIGp1ZWdvcyBwb3IgY29uY2VwdG8gZGUgcmVjYXVkYWNpw7NuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJUaXBvSnVlZ29SZWNhdWRhY2lvbiRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvSnVlZ29SZWNhdWRhY2lvbihwYXJhbXM6IHtcclxuICAgIGNvbl9yZWNhdWRhY2lvbl9pZDogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3RhclRpcG9KdWVnb1JlY2F1ZGFjaW9uJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvSW50ZXJpb3JcclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyVGlwb0ludGVyaW9yUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8taW50ZXJpb3Ive3RpcG9fcHJlZGlvX2lkfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIGludGVyaW9yLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgbGEgbGlzdGEgZGUgbG9zIHRpcG9zIGludGVyaW9yIHBvciB0aXBvIGRlIHByZWRpb1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJUaXBvSW50ZXJpb3IoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb0ludGVyaW9yJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgdGlwb19wcmVkaW9faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyVGlwb0ludGVyaW9yUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCd0aXBvX3ByZWRpb19pZCcsIHBhcmFtcy50aXBvX3ByZWRpb19pZCwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgaW50ZXJpb3IuXHJcbiAgICpcclxuICAgKiBEZXZ1ZWx2ZSBsYSBsaXN0YSBkZSBsb3MgdGlwb3MgaW50ZXJpb3IgcG9yIHRpcG8gZGUgcHJlZGlvXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJUaXBvSW50ZXJpb3IkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb0ludGVyaW9yKHBhcmFtczoge1xyXG4gICAgdGlwb19wcmVkaW9faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJUaXBvSW50ZXJpb3IkUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+KSA9PiByLmJvZHkgYXMgQXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIGxpc3RhclRpcG9FZGlmaWNhY2lvblxyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJUaXBvRWRpZmljYWNpb25QYXRoID0gJy9jb211bmVzcmVnaXN0cm8vdGlwby1lZGlmaWNhY2lvbi97dGlwb19wcmVkaW9faWR9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgZWRpZmljYWNpw7NuLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgbGEgbGlzdGEgZGUgbG9zIHRpcG9zIGVkaWZpY2FjacOzbiBwb3IgdGlwbyBkZSBwcmVkaW9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyVGlwb0VkaWZpY2FjaW9uKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9FZGlmaWNhY2lvbiRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIHRpcG9fcHJlZGlvX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLkxpc3RhclRpcG9FZGlmaWNhY2lvblBhdGgsICdnZXQnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgcmIucGF0aCgndGlwb19wcmVkaW9faWQnLCBwYXJhbXMudGlwb19wcmVkaW9faWQsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIGVkaWZpY2FjacOzbi5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIGxhIGxpc3RhIGRlIGxvcyB0aXBvcyBlZGlmaWNhY2nDs24gcG9yIHRpcG8gZGUgcHJlZGlvXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJUaXBvRWRpZmljYWNpb24kUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb0VkaWZpY2FjaW9uKHBhcmFtczoge1xyXG4gICAgdGlwb19wcmVkaW9faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJUaXBvRWRpZmljYWNpb24kUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+KSA9PiByLmJvZHkgYXMgQXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIGxpc3RhckRvY3VtZW50b1RpcG9cclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyRG9jdW1lbnRvVGlwb1BhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby90aXBvLWRvY3VtZW50byc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIGRvY3VtZW50b3MgZW4gcmVnaXN0cm8gcG9yIG11bmljaXBhbGlkYWQuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBkb2N1bWVudG9zIGVuIHJlZ2lzdHJvIHBvciBtdW5pY2lwYWxpZGFkXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhckRvY3VtZW50b1RpcG8oKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyRG9jdW1lbnRvVGlwbyRSZXNwb25zZShwYXJhbXM/OiB7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PERvY3VtZW50b1RpcG9Qcm9qZWN0aW9uPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLkxpc3RhckRvY3VtZW50b1RpcG9QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8RG9jdW1lbnRvVGlwb1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBkb2N1bWVudG9zIGVuIHJlZ2lzdHJvIHBvciBtdW5pY2lwYWxpZGFkLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgZG9jdW1lbnRvcyBlbiByZWdpc3RybyBwb3IgbXVuaWNpcGFsaWRhZFxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyRG9jdW1lbnRvVGlwbyRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJEb2N1bWVudG9UaXBvKHBhcmFtcz86IHtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxEb2N1bWVudG9UaXBvUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJEb2N1bWVudG9UaXBvJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8RG9jdW1lbnRvVGlwb1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PERvY3VtZW50b1RpcG9Qcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvRG9jdW1lbnRvU3VzdGVudG9SZWNhdWRhY2lvblxyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJUaXBvRG9jdW1lbnRvU3VzdGVudG9SZWNhdWRhY2lvblBhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby90aXBvLWRvY3VtZW50by1zdXN0ZW50by1yZWNhdWRhY2lvbi97Y29uX3JlY2F1ZGFjaW9uX2lkfS97dGlwb190cmFuc2ZlcmVuY2lhX2lkfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIGRvY3VtZW50byBkZSBzdXN0ZW50byBwb3IgY29uY2VwdG8gZGUgcmVjYXVkYWNpw7NuLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgbGEgbGlzdGEgZGUgZG9jdW1lbnRvcyBkZSBzdXN0ZW50byBwb3IgY29uY2VwdG8gZGUgcmVjYXVkYWNpw7NuIHkgdGlwbyBkZSB0cmFuc2ZlcmVuY2lhXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhclRpcG9Eb2N1bWVudG9TdXN0ZW50b1JlY2F1ZGFjaW9uKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9Eb2N1bWVudG9TdXN0ZW50b1JlY2F1ZGFjaW9uJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgY29uX3JlY2F1ZGFjaW9uX2lkOiBudW1iZXI7XHJcbiAgICB0aXBvX3RyYW5zZmVyZW5jaWFfaWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyVGlwb0RvY3VtZW50b1N1c3RlbnRvUmVjYXVkYWNpb25QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ2Nvbl9yZWNhdWRhY2lvbl9pZCcsIHBhcmFtcy5jb25fcmVjYXVkYWNpb25faWQsIHt9KTtcclxuICAgICAgcmIucGF0aCgndGlwb190cmFuc2ZlcmVuY2lhX2lkJywgcGFyYW1zLnRpcG9fdHJhbnNmZXJlbmNpYV9pZCwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgZG9jdW1lbnRvIGRlIHN1c3RlbnRvIHBvciBjb25jZXB0byBkZSByZWNhdWRhY2nDs24uXHJcbiAgICpcclxuICAgKiBEZXZ1ZWx2ZSBsYSBsaXN0YSBkZSBkb2N1bWVudG9zIGRlIHN1c3RlbnRvIHBvciBjb25jZXB0byBkZSByZWNhdWRhY2nDs24geSB0aXBvIGRlIHRyYW5zZmVyZW5jaWFcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGxpc3RhclRpcG9Eb2N1bWVudG9TdXN0ZW50b1JlY2F1ZGFjaW9uJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9Eb2N1bWVudG9TdXN0ZW50b1JlY2F1ZGFjaW9uKHBhcmFtczoge1xyXG4gICAgY29uX3JlY2F1ZGFjaW9uX2lkOiBudW1iZXI7XHJcbiAgICB0aXBvX3RyYW5zZmVyZW5jaWFfaWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJUaXBvRG9jdW1lbnRvU3VzdGVudG9SZWNhdWRhY2lvbiRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxDb211bmVzUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyVGlwb0RvY3VtZW50b1N1c3RlbnRvTW90aXZvUHJpbWVyYVZlbnRhXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhclRpcG9Eb2N1bWVudG9TdXN0ZW50b01vdGl2b1ByaW1lcmFWZW50YVBhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby90aXBvLWRvY3VtZW50by1zdXN0ZW50by1tb3Rpdm8tcHJpbWVyYS12ZW50YS97Y29uX3JlY2F1ZGFjaW9uX2lkfS97dGlwb190cmFuc2ZlcmVuY2lhX2lkfS97bW90aXZvLXByaW1lcmFfdmVudGFfaWR9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgZG9jdW1lbnRvIGRlIHByaW1lcmEgdmVudGEuXHJcbiAgICpcclxuICAgKiBEZXZ1ZWx2ZSBsYSBsaXN0YSBkZSBkb2N1bWVudG9zIGRlIHN1c3RlbnRvIHBvciBwcmltZXJhIHZlbnRhXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhclRpcG9Eb2N1bWVudG9TdXN0ZW50b01vdGl2b1ByaW1lcmFWZW50YSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvRG9jdW1lbnRvU3VzdGVudG9Nb3Rpdm9QcmltZXJhVmVudGEkUmVzcG9uc2UocGFyYW1zOiB7XHJcbiAgICBjb25fcmVjYXVkYWNpb25faWQ6IG51bWJlcjtcclxuICAgIHRpcG9fdHJhbnNmZXJlbmNpYV9pZDogbnVtYmVyO1xyXG4gICAgJ21vdGl2by1wcmltZXJhX3ZlbnRhX2lkJzogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJUaXBvRG9jdW1lbnRvU3VzdGVudG9Nb3Rpdm9QcmltZXJhVmVudGFQYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ2Nvbl9yZWNhdWRhY2lvbl9pZCcsIHBhcmFtcy5jb25fcmVjYXVkYWNpb25faWQsIHt9KTtcclxuICAgICAgcmIucGF0aCgndGlwb190cmFuc2ZlcmVuY2lhX2lkJywgcGFyYW1zLnRpcG9fdHJhbnNmZXJlbmNpYV9pZCwge30pO1xyXG4gICAgICByYi5wYXRoKCdtb3Rpdm8tcHJpbWVyYV92ZW50YV9pZCcsIHBhcmFtc1snbW90aXZvLXByaW1lcmFfdmVudGFfaWQnXSwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgZG9jdW1lbnRvIGRlIHByaW1lcmEgdmVudGEuXHJcbiAgICpcclxuICAgKiBEZXZ1ZWx2ZSBsYSBsaXN0YSBkZSBkb2N1bWVudG9zIGRlIHN1c3RlbnRvIHBvciBwcmltZXJhIHZlbnRhXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJUaXBvRG9jdW1lbnRvU3VzdGVudG9Nb3Rpdm9QcmltZXJhVmVudGEkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb0RvY3VtZW50b1N1c3RlbnRvTW90aXZvUHJpbWVyYVZlbnRhKHBhcmFtczoge1xyXG4gICAgY29uX3JlY2F1ZGFjaW9uX2lkOiBudW1iZXI7XHJcbiAgICB0aXBvX3RyYW5zZmVyZW5jaWFfaWQ6IG51bWJlcjtcclxuICAgICdtb3Rpdm8tcHJpbWVyYV92ZW50YV9pZCc6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJUaXBvRG9jdW1lbnRvU3VzdGVudG9Nb3Rpdm9QcmltZXJhVmVudGEkUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+KSA9PiByLmJvZHkgYXMgQXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIGxpc3RhclRpcG9Eb2N1bWVudG9TdXN0ZW50b0NvbmRpY2lvbkluYWZlY3RhY2lvblxyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJUaXBvRG9jdW1lbnRvU3VzdGVudG9Db25kaWNpb25JbmFmZWN0YWNpb25QYXRoID0gJy9jb211bmVzcmVnaXN0cm8vdGlwby1kb2N1bWVudG8tc3VzdGVudG8tY29uZGljaW9uLWluYWZlY3RhY2lvbi97dGlwb19jb25faW5hZmVjY2lvbl9pZH0ve3RpcG9fY29uX2NvbmN1cnNhbF9pZH0ve3ByaW5jaXBhbH0nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBkb2N1bWVudG8gZGUgc3VzdGVudG8gcG9yIGNvbmRpY2nDs24gZGUgaW5hZmVjdGFjacOzbi5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIGxhIGxpc3RhIGRlIGRvY3VtZW50b3MgZGUgc3VzdGVudG8gcG9yIGNvbmRpY2nDs24gZGUgaW5hZmVjdGFjacOzbiBkZWwgQ29udHJpYnV5ZW50ZVxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJUaXBvRG9jdW1lbnRvU3VzdGVudG9Db25kaWNpb25JbmFmZWN0YWNpb24oKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb0RvY3VtZW50b1N1c3RlbnRvQ29uZGljaW9uSW5hZmVjdGFjaW9uJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgdGlwb19jb25faW5hZmVjY2lvbl9pZDogbnVtYmVyO1xyXG4gICAgdGlwb19jb25fY29uY3Vyc2FsX2lkOiBudW1iZXI7XHJcbiAgICBwcmluY2lwYWw6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyVGlwb0RvY3VtZW50b1N1c3RlbnRvQ29uZGljaW9uSW5hZmVjdGFjaW9uUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCd0aXBvX2Nvbl9pbmFmZWNjaW9uX2lkJywgcGFyYW1zLnRpcG9fY29uX2luYWZlY2Npb25faWQsIHt9KTtcclxuICAgICAgcmIucGF0aCgndGlwb19jb25fY29uY3Vyc2FsX2lkJywgcGFyYW1zLnRpcG9fY29uX2NvbmN1cnNhbF9pZCwge30pO1xyXG4gICAgICByYi5wYXRoKCdwcmluY2lwYWwnLCBwYXJhbXMucHJpbmNpcGFsLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBkb2N1bWVudG8gZGUgc3VzdGVudG8gcG9yIGNvbmRpY2nDs24gZGUgaW5hZmVjdGFjacOzbi5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIGxhIGxpc3RhIGRlIGRvY3VtZW50b3MgZGUgc3VzdGVudG8gcG9yIGNvbmRpY2nDs24gZGUgaW5hZmVjdGFjacOzbiBkZWwgQ29udHJpYnV5ZW50ZVxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyVGlwb0RvY3VtZW50b1N1c3RlbnRvQ29uZGljaW9uSW5hZmVjdGFjaW9uJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9Eb2N1bWVudG9TdXN0ZW50b0NvbmRpY2lvbkluYWZlY3RhY2lvbihwYXJhbXM6IHtcclxuICAgIHRpcG9fY29uX2luYWZlY2Npb25faWQ6IG51bWJlcjtcclxuICAgIHRpcG9fY29uX2NvbmN1cnNhbF9pZDogbnVtYmVyO1xyXG4gICAgcHJpbmNpcGFsOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyVGlwb0RvY3VtZW50b1N1c3RlbnRvQ29uZGljaW9uSW5hZmVjdGFjaW9uJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvRG9jdW1lbnRvUG9yQ29uZGljaW9uXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhclRpcG9Eb2N1bWVudG9Qb3JDb25kaWNpb25QYXRoID0gJy9jb211bmVzcmVnaXN0cm8vdGlwby1kb2N1bWVudG8tcG9yLWNvbmRpY2lvbi97dGlwb19jb25faW5hZmVjdGFjaW9uX2lkfS97dGlwX2Nvbl9jb25jdXJzYWxfaWR9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbGFzIGNvbmRpY2lvbmVzIHNlZ8O6biBlbCB0aXBvIGRlIHByZWRpby5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIHVuYSBsaXN0YSBkZSBsYXMgY29uZGljaW9uZXMgc2Vnw7puIGVsIHRpcG8gZGUgcHJlZGlvXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhclRpcG9Eb2N1bWVudG9Qb3JDb25kaWNpb24oKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb0RvY3VtZW50b1BvckNvbmRpY2lvbiRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIHRpcG9fY29uX2luYWZlY3RhY2lvbl9pZDogbnVtYmVyO1xyXG4gICAgdGlwX2Nvbl9jb25jdXJzYWxfaWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyVGlwb0RvY3VtZW50b1BvckNvbmRpY2lvblBhdGgsICdnZXQnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgcmIucGF0aCgndGlwb19jb25faW5hZmVjdGFjaW9uX2lkJywgcGFyYW1zLnRpcG9fY29uX2luYWZlY3RhY2lvbl9pZCwge30pO1xyXG4gICAgICByYi5wYXRoKCd0aXBfY29uX2NvbmN1cnNhbF9pZCcsIHBhcmFtcy50aXBfY29uX2NvbmN1cnNhbF9pZCwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbGFzIGNvbmRpY2lvbmVzIHNlZ8O6biBlbCB0aXBvIGRlIHByZWRpby5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIHVuYSBsaXN0YSBkZSBsYXMgY29uZGljaW9uZXMgc2Vnw7puIGVsIHRpcG8gZGUgcHJlZGlvXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJUaXBvRG9jdW1lbnRvUG9yQ29uZGljaW9uJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9Eb2N1bWVudG9Qb3JDb25kaWNpb24ocGFyYW1zOiB7XHJcbiAgICB0aXBvX2Nvbl9pbmFmZWN0YWNpb25faWQ6IG51bWJlcjtcclxuICAgIHRpcF9jb25fY29uY3Vyc2FsX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyVGlwb0RvY3VtZW50b1BvckNvbmRpY2lvbiRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxDb211bmVzUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyRG9jdW1lbnRvVGlwb1BvckNvbmRpY2lvblByZWRpb1xyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJEb2N1bWVudG9UaXBvUG9yQ29uZGljaW9uUHJlZGlvUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tZG9jdW1lbnRvLXBvci1jb25kaWNpb24tcHJlZGlvL3t0aXBfY29uX3ByZWRpb19pZH0nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgZG9jdW1lbnRvcyBkZSBzdXN0ZW50byBwb3IgY29uZGljacOzbiBkZSBQcmVkaW8uXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgZG9jdW1lbnRvcyBkZSBzdXN0ZW50byBwb3IgY29uZGljacOzbiBkZSBQcmVkaW9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyRG9jdW1lbnRvVGlwb1BvckNvbmRpY2lvblByZWRpbygpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJEb2N1bWVudG9UaXBvUG9yQ29uZGljaW9uUHJlZGlvJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgdGlwX2Nvbl9wcmVkaW9faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8RG9jdW1lbnRvVGlwb1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyRG9jdW1lbnRvVGlwb1BvckNvbmRpY2lvblByZWRpb1BhdGgsICdnZXQnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgcmIucGF0aCgndGlwX2Nvbl9wcmVkaW9faWQnLCBwYXJhbXMudGlwX2Nvbl9wcmVkaW9faWQsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxEb2N1bWVudG9UaXBvUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyBkb2N1bWVudG9zIGRlIHN1c3RlbnRvIHBvciBjb25kaWNpw7NuIGRlIFByZWRpby5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyBkb2N1bWVudG9zIGRlIHN1c3RlbnRvIHBvciBjb25kaWNpw7NuIGRlIFByZWRpb1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyRG9jdW1lbnRvVGlwb1BvckNvbmRpY2lvblByZWRpbyRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJEb2N1bWVudG9UaXBvUG9yQ29uZGljaW9uUHJlZGlvKHBhcmFtczoge1xyXG4gICAgdGlwX2Nvbl9wcmVkaW9faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxEb2N1bWVudG9UaXBvUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJEb2N1bWVudG9UaXBvUG9yQ29uZGljaW9uUHJlZGlvJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8RG9jdW1lbnRvVGlwb1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PERvY3VtZW50b1RpcG9Qcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJEb2NTdXNDb25WZWhpY3Vsb1RpcG9cclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyRG9jU3VzQ29uVmVoaWN1bG9UaXBvUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tZG9jLXN1cy12ZWhpY3Vsby97Y29uX3JlY2F1ZGFjaW9uX2lkfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyB0aXBvcyBkZSBqdWVnb3MgcG9yIGNvbmNlcHRvIGRlIHJlY2F1ZGFjacOzbi5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIGxhIGxpc3RhIGRlIHRpcG9zIGRlIGp1ZWdvcyBwb3IgY29uY2VwdG8gZGUgcmVjYXVkYWNpw7NuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhckRvY1N1c0NvblZlaGljdWxvVGlwbygpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJEb2NTdXNDb25WZWhpY3Vsb1RpcG8kUmVzcG9uc2UocGFyYW1zPzoge1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJEb2NTdXNDb25WZWhpY3Vsb1RpcG9QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgdGlwb3MgZGUganVlZ29zIHBvciBjb25jZXB0byBkZSByZWNhdWRhY2nDs24uXHJcbiAgICpcclxuICAgKiBEZXZ1ZWx2ZSBsYSBsaXN0YSBkZSB0aXBvcyBkZSBqdWVnb3MgcG9yIGNvbmNlcHRvIGRlIHJlY2F1ZGFjacOzblxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyRG9jU3VzQ29uVmVoaWN1bG9UaXBvJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhckRvY1N1c0NvblZlaGljdWxvVGlwbyhwYXJhbXM/OiB7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyRG9jU3VzQ29uVmVoaWN1bG9UaXBvJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvRG9jSWRlbnRpZGFkXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhclRpcG9Eb2NJZGVudGlkYWRQYXRoID0gJy9jb211bmVzcmVnaXN0cm8vdGlwby1kb2MtaWRlbnRpZGFkJztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGRvY3VtZW50b3MgZGUgaWRlbnRpZGFkLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgdW5hIGxpc3RhIGRlIGxvcyBkb2N1bWVudG9zIGRlIGlkZW50aWRhZFxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJUaXBvRG9jSWRlbnRpZGFkKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9Eb2NJZGVudGlkYWQkUmVzcG9uc2UocGFyYW1zPzoge1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxEb2N1bWVudG9JZGVudGlkYWRUaXBvUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJUaXBvRG9jSWRlbnRpZGFkUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PERvY3VtZW50b0lkZW50aWRhZFRpcG9Qcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGRvY3VtZW50b3MgZGUgaWRlbnRpZGFkLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgdW5hIGxpc3RhIGRlIGxvcyBkb2N1bWVudG9zIGRlIGlkZW50aWRhZFxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyVGlwb0RvY0lkZW50aWRhZCRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvRG9jSWRlbnRpZGFkKHBhcmFtcz86IHtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxEb2N1bWVudG9JZGVudGlkYWRUaXBvUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJUaXBvRG9jSWRlbnRpZGFkJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8RG9jdW1lbnRvSWRlbnRpZGFkVGlwb1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PERvY3VtZW50b0lkZW50aWRhZFRpcG9Qcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvRG9jSWRlbnRpZGFkUG9yVGlwb1JlbGFjaW9uYWRvXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhclRpcG9Eb2NJZGVudGlkYWRQb3JUaXBvUmVsYWNpb25hZG9QYXRoID0gJy9jb211bmVzcmVnaXN0cm8vdGlwby1kb2MtaWRlbnRpZGFkLXBvci10aXBvLXJlbGFjaW9uYWRvL3t0aXBvX3JlbGFjaW9uYWRvX2lkfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyBkb2N1bWVudG9zIGRlIGlkZW50aWRhZCBzZWfDum4gZWwgdGlwbyBkZSByZWxhY2lvbmFkby5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIHVuYSBsaXN0YSBkZSBsb3MgZG9jdW1lbnRvcyBkZSBpZGVudGlkYWQgc2Vnw7puIGVsIHRpcG8gZGUgcmVsYWNpb25hZG9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyVGlwb0RvY0lkZW50aWRhZFBvclRpcG9SZWxhY2lvbmFkbygpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvRG9jSWRlbnRpZGFkUG9yVGlwb1JlbGFjaW9uYWRvJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgdGlwb19yZWxhY2lvbmFkb19pZDogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJUaXBvRG9jSWRlbnRpZGFkUG9yVGlwb1JlbGFjaW9uYWRvUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCd0aXBvX3JlbGFjaW9uYWRvX2lkJywgcGFyYW1zLnRpcG9fcmVsYWNpb25hZG9faWQsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyBkb2N1bWVudG9zIGRlIGlkZW50aWRhZCBzZWfDum4gZWwgdGlwbyBkZSByZWxhY2lvbmFkby5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIHVuYSBsaXN0YSBkZSBsb3MgZG9jdW1lbnRvcyBkZSBpZGVudGlkYWQgc2Vnw7puIGVsIHRpcG8gZGUgcmVsYWNpb25hZG9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGxpc3RhclRpcG9Eb2NJZGVudGlkYWRQb3JUaXBvUmVsYWNpb25hZG8kUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb0RvY0lkZW50aWRhZFBvclRpcG9SZWxhY2lvbmFkbyhwYXJhbXM6IHtcclxuICAgIHRpcG9fcmVsYWNpb25hZG9faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJUaXBvRG9jSWRlbnRpZGFkUG9yVGlwb1JlbGFjaW9uYWRvJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvRG9jSWRlbnRpZGFkUG9yVGlwb1BlcnNvbmFcclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyVGlwb0RvY0lkZW50aWRhZFBvclRpcG9QZXJzb25hUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tZG9jLWlkZW50aWRhZC1wb3ItdGlwby1wZXJzb25hL3t0aXBvX3BlcnNvbmFfaWR9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGRvY3VtZW50b3MgZGUgaWRlbnRpZGFkIHNlZ8O6biBlbCB0aXBvIGRlIHBlcnNvbmEuXHJcbiAgICpcclxuICAgKiBEZXZ1ZWx2ZSB1bmEgbGlzdGEgZGUgbG9zIGRvY3VtZW50b3MgZGUgaWRlbnRpZGFkIHNlZ8O6biBlbCB0aXBvIGRlIHBlcnNvbmFcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyVGlwb0RvY0lkZW50aWRhZFBvclRpcG9QZXJzb25hKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9Eb2NJZGVudGlkYWRQb3JUaXBvUGVyc29uYSRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIHRpcG9fcGVyc29uYV9pZDogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxEb2N1bWVudG9JZGVudGlkYWRUaXBvUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJUaXBvRG9jSWRlbnRpZGFkUG9yVGlwb1BlcnNvbmFQYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ3RpcG9fcGVyc29uYV9pZCcsIHBhcmFtcy50aXBvX3BlcnNvbmFfaWQsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxEb2N1bWVudG9JZGVudGlkYWRUaXBvUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyBkb2N1bWVudG9zIGRlIGlkZW50aWRhZCBzZWfDum4gZWwgdGlwbyBkZSBwZXJzb25hLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgdW5hIGxpc3RhIGRlIGxvcyBkb2N1bWVudG9zIGRlIGlkZW50aWRhZCBzZWfDum4gZWwgdGlwbyBkZSBwZXJzb25hXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJUaXBvRG9jSWRlbnRpZGFkUG9yVGlwb1BlcnNvbmEkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb0RvY0lkZW50aWRhZFBvclRpcG9QZXJzb25hKHBhcmFtczoge1xyXG4gICAgdGlwb19wZXJzb25hX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8RG9jdW1lbnRvSWRlbnRpZGFkVGlwb1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyVGlwb0RvY0lkZW50aWRhZFBvclRpcG9QZXJzb25hJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8RG9jdW1lbnRvSWRlbnRpZGFkVGlwb1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PERvY3VtZW50b0lkZW50aWRhZFRpcG9Qcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvQnVzcXVlZGFDb250cmlidXllbnRlXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhclRpcG9CdXNxdWVkYUNvbnRyaWJ1eWVudGVQYXRoID0gJy9jb211bmVzcmVnaXN0cm8vdGlwby1jb25zdWx0YS1jb250cmlidXllbnRlJztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIHRpcG9zIGRlIGNvbnN1bHRhIHBhcmEgY29udHJpYnV5ZW50ZS5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyB0aXBvcyBkZSBjb25zdWx0YSBwYXJhIGNvbnRyaWJ1eWVudGVcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyVGlwb0J1c3F1ZWRhQ29udHJpYnV5ZW50ZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvQnVzcXVlZGFDb250cmlidXllbnRlJFJlc3BvbnNlKHBhcmFtcz86IHtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8RG9jdW1lbnRvSWRlbnRpZGFkVGlwb1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyVGlwb0J1c3F1ZWRhQ29udHJpYnV5ZW50ZVBhdGgsICdnZXQnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxEb2N1bWVudG9JZGVudGlkYWRUaXBvUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyB0aXBvcyBkZSBjb25zdWx0YSBwYXJhIGNvbnRyaWJ1eWVudGUuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgdGlwb3MgZGUgY29uc3VsdGEgcGFyYSBjb250cmlidXllbnRlXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJUaXBvQnVzcXVlZGFDb250cmlidXllbnRlJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9CdXNxdWVkYUNvbnRyaWJ1eWVudGUocGFyYW1zPzoge1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPEFycmF5PERvY3VtZW50b0lkZW50aWRhZFRpcG9Qcm9qZWN0aW9uPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3RhclRpcG9CdXNxdWVkYUNvbnRyaWJ1eWVudGUkUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxEb2N1bWVudG9JZGVudGlkYWRUaXBvUHJvamVjdGlvbj4+KSA9PiByLmJvZHkgYXMgQXJyYXk8RG9jdW1lbnRvSWRlbnRpZGFkVGlwb1Byb2plY3Rpb24+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIGxpc3RhclRpcG9Db25kaWNpb25Qb3JUaXBvUHJlZGlvXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhclRpcG9Db25kaWNpb25Qb3JUaXBvUHJlZGlvUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tY29uZGljaW9uLXBvci10aXBvLXByZWRpby97dGlwb19wcmVkaW9faWR9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbGFzIGNvbmRpY2lvbmVzIHNlZ8O6biBlbCB0aXBvIGRlIHByZWRpby5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIHVuYSBsaXN0YSBkZSBsYXMgY29uZGljaW9uZXMgc2Vnw7puIGVsIHRpcG8gZGUgcHJlZGlvXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhclRpcG9Db25kaWNpb25Qb3JUaXBvUHJlZGlvKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9Db25kaWNpb25Qb3JUaXBvUHJlZGlvJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgdGlwb19wcmVkaW9faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyVGlwb0NvbmRpY2lvblBvclRpcG9QcmVkaW9QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ3RpcG9fcHJlZGlvX2lkJywgcGFyYW1zLnRpcG9fcHJlZGlvX2lkLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsYXMgY29uZGljaW9uZXMgc2Vnw7puIGVsIHRpcG8gZGUgcHJlZGlvLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgdW5hIGxpc3RhIGRlIGxhcyBjb25kaWNpb25lcyBzZWfDum4gZWwgdGlwbyBkZSBwcmVkaW9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGxpc3RhclRpcG9Db25kaWNpb25Qb3JUaXBvUHJlZGlvJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9Db25kaWNpb25Qb3JUaXBvUHJlZGlvKHBhcmFtczoge1xyXG4gICAgdGlwb19wcmVkaW9faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJUaXBvQ29uZGljaW9uUG9yVGlwb1ByZWRpbyRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxDb211bmVzUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyVGlwb0NvbmRpY2lvbkluYWZlY3RhY2lvblxyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJUaXBvQ29uZGljaW9uSW5hZmVjdGFjaW9uUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tY29uZGljaW9uLWluYWZlY3RhY2lvbi97dGlwb19wZXJzb25hX2lkfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIGNvbmRpY2nDs24gZGUgaW5hZmVjdGFjacOzbi5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIGxhIGxpc3RhIGRlIGNvbmRpY2nDs24gZGUgaW5hZmVjdGFjacOzbiBwb3IgdGlwbyBkZSBwZXJzb25hXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhclRpcG9Db25kaWNpb25JbmFmZWN0YWNpb24oKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb0NvbmRpY2lvbkluYWZlY3RhY2lvbiRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIHRpcG9fcGVyc29uYV9pZDogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJUaXBvQ29uZGljaW9uSW5hZmVjdGFjaW9uUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCd0aXBvX3BlcnNvbmFfaWQnLCBwYXJhbXMudGlwb19wZXJzb25hX2lkLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBjb25kaWNpw7NuIGRlIGluYWZlY3RhY2nDs24uXHJcbiAgICpcclxuICAgKiBEZXZ1ZWx2ZSBsYSBsaXN0YSBkZSBjb25kaWNpw7NuIGRlIGluYWZlY3RhY2nDs24gcG9yIHRpcG8gZGUgcGVyc29uYVxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyVGlwb0NvbmRpY2lvbkluYWZlY3RhY2lvbiRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvQ29uZGljaW9uSW5hZmVjdGFjaW9uKHBhcmFtczoge1xyXG4gICAgdGlwb19wZXJzb25hX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyVGlwb0NvbmRpY2lvbkluYWZlY3RhY2lvbiRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxDb211bmVzUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyVGlwb0NvbmRpY2lvbkNvbmN1cnNhbFxyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJUaXBvQ29uZGljaW9uQ29uY3Vyc2FsUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tY29uZGljaW9uLWNvbmN1cnNhbC97dGlwb19wZXJzb25hX2lkfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIGNvbmRpY2nDs24gY29uY3Vyc2FsIHBvciB0aXBvIGRlIHBlcnNvbmEuXHJcbiAgICpcclxuICAgKiBEZXZ1ZWx2ZSBsYSBsaXN0YSBkZSBjb25kaWNpw7NuIGNvbmN1cnNhbCBwb3IgdGlwbyBkZSBwZXJzb25hXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhclRpcG9Db25kaWNpb25Db25jdXJzYWwoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyVGlwb0NvbmRpY2lvbkNvbmN1cnNhbCRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIHRpcG9fcGVyc29uYV9pZDogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJUaXBvQ29uZGljaW9uQ29uY3Vyc2FsUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCd0aXBvX3BlcnNvbmFfaWQnLCBwYXJhbXMudGlwb19wZXJzb25hX2lkLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBjb25kaWNpw7NuIGNvbmN1cnNhbCBwb3IgdGlwbyBkZSBwZXJzb25hLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgbGEgbGlzdGEgZGUgY29uZGljacOzbiBjb25jdXJzYWwgcG9yIHRpcG8gZGUgcGVyc29uYVxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyVGlwb0NvbmRpY2lvbkNvbmN1cnNhbCRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvQ29uZGljaW9uQ29uY3Vyc2FsKHBhcmFtczoge1xyXG4gICAgdGlwb19wZXJzb25hX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyVGlwb0NvbmRpY2lvbkNvbmN1cnNhbCRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxDb211bmVzUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyQXJlYVZlcmRlVGlwb1xyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJBcmVhVmVyZGVUaXBvUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tYXJlYS12ZXJkZSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG8gYXJlYSB2ZXJkZS5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG8gYXJlYSB2ZXJkZVxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJBcmVhVmVyZGVUaXBvKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhckFyZWFWZXJkZVRpcG8kUmVzcG9uc2UocGFyYW1zPzoge1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLkxpc3RhckFyZWFWZXJkZVRpcG9QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8VXNvQXJiaXRyaW9UaXBvUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG8gYXJlYSB2ZXJkZS5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG8gYXJlYSB2ZXJkZVxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyQXJlYVZlcmRlVGlwbyRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJBcmVhVmVyZGVUaXBvKHBhcmFtcz86IHtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3RhckFyZWFWZXJkZVRpcG8kUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJUaXBvQWRxdWlzaWNpb25cclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyVGlwb0FkcXVpc2ljaW9uUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL3RpcG8tYWRxdWlzaWNpb24ve2Nvbl9yZWNhdWRhY2lvbl9pZH0nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBhZHF1aXNpY2nDs24uXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBhZHF1aXNpY2nDs25cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyVGlwb0FkcXVpc2ljaW9uKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhclRpcG9BZHF1aXNpY2lvbiRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIGNvbl9yZWNhdWRhY2lvbl9pZDogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxUcmFuc2ZlcmVuY2lhVGlwb1Jlc3BvbnNlPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLkxpc3RhclRpcG9BZHF1aXNpY2lvblBhdGgsICdnZXQnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgcmIucGF0aCgnY29uX3JlY2F1ZGFjaW9uX2lkJywgcGFyYW1zLmNvbl9yZWNhdWRhY2lvbl9pZCwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFRyYW5zZmVyZW5jaWFUaXBvUmVzcG9uc2U+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBhZHF1aXNpY2nDs24uXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBhZHF1aXNpY2nDs25cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGxpc3RhclRpcG9BZHF1aXNpY2lvbiRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJUaXBvQWRxdWlzaWNpb24ocGFyYW1zOiB7XHJcbiAgICBjb25fcmVjYXVkYWNpb25faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxUcmFuc2ZlcmVuY2lhVGlwb1Jlc3BvbnNlPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3RhclRpcG9BZHF1aXNpY2lvbiRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFRyYW5zZmVyZW5jaWFUaXBvUmVzcG9uc2U+PikgPT4gci5ib2R5IGFzIEFycmF5PFRyYW5zZmVyZW5jaWFUaXBvUmVzcG9uc2U+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIG9idGVuZXJEZXNEb21pY2lsaW9VcmJhbm9cclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgT2J0ZW5lckRlc0RvbWljaWxpb1VyYmFub1BhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby9vYnRlbmVyLWRvbWljaWxpby11cmJhbm8tbGluZWFsL3tkZXBhcnRhbWVudG99L3twcm92aW5jaWF9L3tkaXN0cml0b30nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIG9idGVuZXIgbGEgZGVzY3JpcGNpb24gZGUgdW4gZG9taWNpbGlvIHVyYmFuby5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgb2J0ZW5lciBsYSBkZXNjcmlwY2lvbiBkZSB1biBkb21pY2lsaW8gdXJiYW5vXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYG9idGVuZXJEZXNEb21pY2lsaW9VcmJhbm8oKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgb2J0ZW5lckRlc0RvbWljaWxpb1VyYmFubyRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIGRlcGFydGFtZW50bzogbnVtYmVyO1xyXG4gICAgcHJvdmluY2lhOiBudW1iZXI7XHJcbiAgICBkaXN0cml0bzogbnVtYmVyO1xyXG4gICAgcmVxdWVzdDogRGVzRG9taWNpbGlvVXJiYW5vUmVxdWVzdDtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8RGVzRG9taWNpbGlvUmVzcG9uc2U+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5PYnRlbmVyRGVzRG9taWNpbGlvVXJiYW5vUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCdkZXBhcnRhbWVudG8nLCBwYXJhbXMuZGVwYXJ0YW1lbnRvLCB7fSk7XHJcbiAgICAgIHJiLnBhdGgoJ3Byb3ZpbmNpYScsIHBhcmFtcy5wcm92aW5jaWEsIHt9KTtcclxuICAgICAgcmIucGF0aCgnZGlzdHJpdG8nLCBwYXJhbXMuZGlzdHJpdG8sIHt9KTtcclxuICAgICAgcmIucXVlcnkoJ3JlcXVlc3QnLCBwYXJhbXMucmVxdWVzdCwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPERlc0RvbWljaWxpb1Jlc3BvbnNlPjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIG9idGVuZXIgbGEgZGVzY3JpcGNpb24gZGUgdW4gZG9taWNpbGlvIHVyYmFuby5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgb2J0ZW5lciBsYSBkZXNjcmlwY2lvbiBkZSB1biBkb21pY2lsaW8gdXJiYW5vXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBvYnRlbmVyRGVzRG9taWNpbGlvVXJiYW5vJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIG9idGVuZXJEZXNEb21pY2lsaW9VcmJhbm8ocGFyYW1zOiB7XHJcbiAgICBkZXBhcnRhbWVudG86IG51bWJlcjtcclxuICAgIHByb3ZpbmNpYTogbnVtYmVyO1xyXG4gICAgZGlzdHJpdG86IG51bWJlcjtcclxuICAgIHJlcXVlc3Q6IERlc0RvbWljaWxpb1VyYmFub1JlcXVlc3Q7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8RGVzRG9taWNpbGlvUmVzcG9uc2U+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5vYnRlbmVyRGVzRG9taWNpbGlvVXJiYW5vJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8RGVzRG9taWNpbGlvUmVzcG9uc2U+KSA9PiByLmJvZHkgYXMgRGVzRG9taWNpbGlvUmVzcG9uc2UpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gb2J0ZW5lckRlc0RvbWljaWxpb1J1c3RpY29cclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgT2J0ZW5lckRlc0RvbWljaWxpb1J1c3RpY29QYXRoID0gJy9jb211bmVzcmVnaXN0cm8vb2J0ZW5lci1kb21pY2lsaW8tcnVzdGljby1saW5lYWwve2RlcGFydGFtZW50b30ve3Byb3ZpbmNpYX0ve2Rpc3RyaXRvfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgb2J0ZW5lciBsYSBkZXNjcmlwY2lvbiBkZSB1biBkb21pY2lsaW8gcnVzdGljby5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgb2J0ZW5lciBsYSBkZXNjcmlwY2lvbiBkZSB1biBkb21pY2lsaW8gcnVzdGljb1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBvYnRlbmVyRGVzRG9taWNpbGlvUnVzdGljbygpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBvYnRlbmVyRGVzRG9taWNpbGlvUnVzdGljbyRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIGRlcGFydGFtZW50bzogbnVtYmVyO1xyXG4gICAgcHJvdmluY2lhOiBudW1iZXI7XHJcbiAgICBkaXN0cml0bzogbnVtYmVyO1xyXG4gICAgcmVxdWVzdDogRGVzRG9taWNpbGlvUnVzdGljb1JlcXVlc3Q7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPERlc0RvbWljaWxpb1Jlc3BvbnNlPj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuT2J0ZW5lckRlc0RvbWljaWxpb1J1c3RpY29QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ2RlcGFydGFtZW50bycsIHBhcmFtcy5kZXBhcnRhbWVudG8sIHt9KTtcclxuICAgICAgcmIucGF0aCgncHJvdmluY2lhJywgcGFyYW1zLnByb3ZpbmNpYSwge30pO1xyXG4gICAgICByYi5wYXRoKCdkaXN0cml0bycsIHBhcmFtcy5kaXN0cml0bywge30pO1xyXG4gICAgICByYi5xdWVyeSgncmVxdWVzdCcsIHBhcmFtcy5yZXF1ZXN0LCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8RGVzRG9taWNpbGlvUmVzcG9uc2U+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgb2J0ZW5lciBsYSBkZXNjcmlwY2lvbiBkZSB1biBkb21pY2lsaW8gcnVzdGljby5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgb2J0ZW5lciBsYSBkZXNjcmlwY2lvbiBkZSB1biBkb21pY2lsaW8gcnVzdGljb1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgb2J0ZW5lckRlc0RvbWljaWxpb1J1c3RpY28kUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgb2J0ZW5lckRlc0RvbWljaWxpb1J1c3RpY28ocGFyYW1zOiB7XHJcbiAgICBkZXBhcnRhbWVudG86IG51bWJlcjtcclxuICAgIHByb3ZpbmNpYTogbnVtYmVyO1xyXG4gICAgZGlzdHJpdG86IG51bWJlcjtcclxuICAgIHJlcXVlc3Q6IERlc0RvbWljaWxpb1J1c3RpY29SZXF1ZXN0O1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPERlc0RvbWljaWxpb1Jlc3BvbnNlPiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMub2J0ZW5lckRlc0RvbWljaWxpb1J1c3RpY28kUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxEZXNEb21pY2lsaW9SZXNwb25zZT4pID0+IHIuYm9keSBhcyBEZXNEb21pY2lsaW9SZXNwb25zZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJOb3Rhcmlhc1xyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJOb3Rhcmlhc1BhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby9ub3Rhcmlhcyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIE5vdGFyaWFzIHBvciBtdW5pY2lwYWxpZGFkLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgTm90YXJpYXMgcG9yIG11bmljaXBhbGlkYWRcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyTm90YXJpYXMoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyTm90YXJpYXMkUmVzcG9uc2UocGFyYW1zPzoge1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxOb3RhcmlhUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJOb3Rhcmlhc1BhdGgsICdnZXQnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxOb3RhcmlhUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIE5vdGFyaWFzIHBvciBtdW5pY2lwYWxpZGFkLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgTm90YXJpYXMgcG9yIG11bmljaXBhbGlkYWRcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGxpc3Rhck5vdGFyaWFzJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3Rhck5vdGFyaWFzKHBhcmFtcz86IHtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxOb3RhcmlhUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJOb3RhcmlhcyRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PE5vdGFyaWFQcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxOb3RhcmlhUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyTW9kZWxvTWFyY2FcclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyTW9kZWxvTWFyY2FQYXRoID0gJy9jb211bmVzcmVnaXN0cm8vbW9kZWxvLXZlaGljdWxvL3tjb2RfbWFyY2F9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbW9kZWxvcyBwb3IgbWFyY2EgZGUgdmVoaWN1bG9zLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbW9kZWxvcyBwb3IgbWFyY2EgZGUgdmVoaWN1bG9zXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3Rhck1vZGVsb01hcmNhKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3Rhck1vZGVsb01hcmNhJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgY29kX21hcmNhOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLkxpc3Rhck1vZGVsb01hcmNhUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCdjb2RfbWFyY2EnLCBwYXJhbXMuY29kX21hcmNhLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBtb2RlbG9zIHBvciBtYXJjYSBkZSB2ZWhpY3Vsb3MuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciBtb2RlbG9zIHBvciBtYXJjYSBkZSB2ZWhpY3Vsb3NcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGxpc3Rhck1vZGVsb01hcmNhJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3Rhck1vZGVsb01hcmNhKHBhcmFtczoge1xyXG4gICAgY29kX21hcmNhOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyTW9kZWxvTWFyY2EkUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+KSA9PiByLmJvZHkgYXMgQXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIGxpc3Rhck1vZGVsb09maWNpYWxWZWhpY3Vsb1xyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJNb2RlbG9PZmljaWFsVmVoaWN1bG9QYXRoID0gJy9jb211bmVzcmVnaXN0cm8vbW9kZWxvLW9maWNpYWwtdmVoaWN1bG8ve21hcmNhX3ZlaGljdWxvfS97YW5pb19mYWJyaWNhY2lvbn0nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBtb2RlbG8gb2ZpY2lhbCBkZSB2ZWhpY3Vsb3MuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBtb2RlbG8gb2ZpY2lhbCBkZSB2ZWhpY3Vsb3MgcG9yIE1hcmNhIHkgQcOxb1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJNb2RlbG9PZmljaWFsVmVoaWN1bG8oKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyTW9kZWxvT2ZpY2lhbFZlaGljdWxvJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgbWFyY2FfdmVoaWN1bG86IG51bWJlcjtcclxuICAgIGFuaW9fZmFicmljYWNpb246IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8TW9kZWxvVmVoaWN1bG9Qcm9qZWN0aW9uPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLkxpc3Rhck1vZGVsb09maWNpYWxWZWhpY3Vsb1BhdGgsICdnZXQnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgcmIucGF0aCgnbWFyY2FfdmVoaWN1bG8nLCBwYXJhbXMubWFyY2FfdmVoaWN1bG8sIHt9KTtcclxuICAgICAgcmIucGF0aCgnYW5pb19mYWJyaWNhY2lvbicsIHBhcmFtcy5hbmlvX2ZhYnJpY2FjaW9uLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8TW9kZWxvVmVoaWN1bG9Qcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgbW9kZWxvIG9maWNpYWwgZGUgdmVoaWN1bG9zLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgbW9kZWxvIG9maWNpYWwgZGUgdmVoaWN1bG9zIHBvciBNYXJjYSB5IEHDsW9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGxpc3Rhck1vZGVsb09maWNpYWxWZWhpY3VsbyRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJNb2RlbG9PZmljaWFsVmVoaWN1bG8ocGFyYW1zOiB7XHJcbiAgICBtYXJjYV92ZWhpY3VsbzogbnVtYmVyO1xyXG4gICAgYW5pb19mYWJyaWNhY2lvbjogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPEFycmF5PE1vZGVsb1ZlaGljdWxvUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJNb2RlbG9PZmljaWFsVmVoaWN1bG8kUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxNb2RlbG9WZWhpY3Vsb1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PE1vZGVsb1ZlaGljdWxvUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyTW9kZWxvRXF1aXZhbGVudGVWZWhpY3Vsb1xyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJNb2RlbG9FcXVpdmFsZW50ZVZlaGljdWxvUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL21vZGVsby1lcXVpdmFsZW50ZS12ZWhpY3Vsby97bWFyY2FfdmVoaWN1bG99L3tvdHJhX21hcmNhfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIG1vZGVsbyBlcXVpdmFsZW50ZSBkZSB2ZWhpY3Vsb3MuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBtb2RlbG8gZXF1aXZhbGVudGUgZGUgdmVoaWN1bG9zIHBvciBNYXJjYSB5IEHDsW8uIERhdG9zIGRlIE1UQ1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJNb2RlbG9FcXVpdmFsZW50ZVZlaGljdWxvKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3Rhck1vZGVsb0VxdWl2YWxlbnRlVmVoaWN1bG8kUmVzcG9uc2UocGFyYW1zOiB7XHJcbiAgICBtYXJjYV92ZWhpY3VsbzogbnVtYmVyO1xyXG4gICAgb3RyYV9tYXJjYTogYm9vbGVhbjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8TW9kZWxvVmVoaWN1bG9Qcm9qZWN0aW9uPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLkxpc3Rhck1vZGVsb0VxdWl2YWxlbnRlVmVoaWN1bG9QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ21hcmNhX3ZlaGljdWxvJywgcGFyYW1zLm1hcmNhX3ZlaGljdWxvLCB7fSk7XHJcbiAgICAgIHJiLnBhdGgoJ290cmFfbWFyY2EnLCBwYXJhbXMub3RyYV9tYXJjYSwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PE1vZGVsb1ZlaGljdWxvUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIG1vZGVsbyBlcXVpdmFsZW50ZSBkZSB2ZWhpY3Vsb3MuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBtb2RlbG8gZXF1aXZhbGVudGUgZGUgdmVoaWN1bG9zIHBvciBNYXJjYSB5IEHDsW8uIERhdG9zIGRlIE1UQ1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyTW9kZWxvRXF1aXZhbGVudGVWZWhpY3VsbyRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJNb2RlbG9FcXVpdmFsZW50ZVZlaGljdWxvKHBhcmFtczoge1xyXG4gICAgbWFyY2FfdmVoaWN1bG86IG51bWJlcjtcclxuICAgIG90cmFfbWFyY2E6IGJvb2xlYW47XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8TW9kZWxvVmVoaWN1bG9Qcm9qZWN0aW9uPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3Rhck1vZGVsb0VxdWl2YWxlbnRlVmVoaWN1bG8kUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxNb2RlbG9WZWhpY3Vsb1Byb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PE1vZGVsb1ZlaGljdWxvUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyTWVkaW9EZXRlcm1pbmFjaW9uUG9yTWVkaW9QcmVzZW50YWNpb25cclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyTWVkaW9EZXRlcm1pbmFjaW9uUG9yTWVkaW9QcmVzZW50YWNpb25QYXRoID0gJy9jb211bmVzcmVnaXN0cm8vbWVkaW8tZGV0ZXJtaW5hY2lvbi97dGlwb19tZWRpb19kZXRlcm1pbmFfaWR9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIG1lZGlvcyBkZSBEZXRlcm1pbmFjacOzbi5cclxuICAgKlxyXG4gICAqIERldnVlbHZlIHVuYSBsaXN0YSBkZSBsb3MgbWVkaW9zIGRlIGRldGVybWluYWNpw7NuIHNlZ8O6biBlbCBtZWRpbyBkZSBwcmVzZW50YWNpw7NuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3Rhck1lZGlvRGV0ZXJtaW5hY2lvblBvck1lZGlvUHJlc2VudGFjaW9uKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3Rhck1lZGlvRGV0ZXJtaW5hY2lvblBvck1lZGlvUHJlc2VudGFjaW9uJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgdGlwb19tZWRpb19kZXRlcm1pbmFfaWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyTWVkaW9EZXRlcm1pbmFjaW9uUG9yTWVkaW9QcmVzZW50YWNpb25QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ3RpcG9fbWVkaW9fZGV0ZXJtaW5hX2lkJywgcGFyYW1zLnRpcG9fbWVkaW9fZGV0ZXJtaW5hX2lkLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgbWVkaW9zIGRlIERldGVybWluYWNpw7NuLlxyXG4gICAqXHJcbiAgICogRGV2dWVsdmUgdW5hIGxpc3RhIGRlIGxvcyBtZWRpb3MgZGUgZGV0ZXJtaW5hY2nDs24gc2Vnw7puIGVsIG1lZGlvIGRlIHByZXNlbnRhY2nDs25cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGxpc3Rhck1lZGlvRGV0ZXJtaW5hY2lvblBvck1lZGlvUHJlc2VudGFjaW9uJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3Rhck1lZGlvRGV0ZXJtaW5hY2lvblBvck1lZGlvUHJlc2VudGFjaW9uKHBhcmFtczoge1xyXG4gICAgdGlwb19tZWRpb19kZXRlcm1pbmFfaWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJNZWRpb0RldGVybWluYWNpb25Qb3JNZWRpb1ByZXNlbnRhY2lvbiRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxDb211bmVzUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyTWFyY2FPZmljaWFsVmVoaWN1bG9cclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyTWFyY2FPZmljaWFsVmVoaWN1bG9QYXRoID0gJy9jb211bmVzcmVnaXN0cm8vbWFyY2Etb2ZpY2lhbC12ZWhpY3Vsbyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIG1hcmNhIG9maWNpYWwgZGUgdmVoaWN1bG9zLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgbWFyY2Egb2ZpY2lhbCBkZSB2ZWhpY3Vsb3MgcG9yIE1hcmNhIHkgQcOxb1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJNYXJjYU9maWNpYWxWZWhpY3VsbygpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJNYXJjYU9maWNpYWxWZWhpY3VsbyRSZXNwb25zZShwYXJhbXM/OiB7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PE1hcmNhVmVoaWN1bG9Qcm9qZWN0aW9uPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLkxpc3Rhck1hcmNhT2ZpY2lhbFZlaGljdWxvUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PE1hcmNhVmVoaWN1bG9Qcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgbWFyY2Egb2ZpY2lhbCBkZSB2ZWhpY3Vsb3MuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBtYXJjYSBvZmljaWFsIGRlIHZlaGljdWxvcyBwb3IgTWFyY2EgeSBBw7FvXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJNYXJjYU9maWNpYWxWZWhpY3VsbyRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJNYXJjYU9maWNpYWxWZWhpY3VsbyhwYXJhbXM/OiB7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8TWFyY2FWZWhpY3Vsb1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyTWFyY2FPZmljaWFsVmVoaWN1bG8kUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxNYXJjYVZlaGljdWxvUHJvamVjdGlvbj4+KSA9PiByLmJvZHkgYXMgQXJyYXk8TWFyY2FWZWhpY3Vsb1Byb2plY3Rpb24+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIGxpc3Rhck1hcmNhRXF1aXZhbGVudGVWZWhpY3Vsb1xyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJNYXJjYUVxdWl2YWxlbnRlVmVoaWN1bG9QYXRoID0gJy9jb211bmVzcmVnaXN0cm8vbWFyY2EtZXF1aXZhbGVudGUtdmVoaWN1bG8nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBtYXJjYSBlcXVpdmFsZW50ZSBkZSB2ZWhpY3Vsb3MuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBtYXJjYSBlcXVpdmFsZW50ZSBkZSB2ZWhpY3Vsb3MgcG9yIE1hcmNhIHkgQcOxbywgRGF0b3MgZGUgTVRDXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3Rhck1hcmNhRXF1aXZhbGVudGVWZWhpY3VsbygpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJNYXJjYUVxdWl2YWxlbnRlVmVoaWN1bG8kUmVzcG9uc2UocGFyYW1zPzoge1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxNYXJjYVZlaGljdWxvUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJNYXJjYUVxdWl2YWxlbnRlVmVoaWN1bG9QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8TWFyY2FWZWhpY3Vsb1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBtYXJjYSBlcXVpdmFsZW50ZSBkZSB2ZWhpY3Vsb3MuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBtYXJjYSBlcXVpdmFsZW50ZSBkZSB2ZWhpY3Vsb3MgcG9yIE1hcmNhIHkgQcOxbywgRGF0b3MgZGUgTVRDXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJNYXJjYUVxdWl2YWxlbnRlVmVoaWN1bG8kUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyTWFyY2FFcXVpdmFsZW50ZVZlaGljdWxvKHBhcmFtcz86IHtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxNYXJjYVZlaGljdWxvUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJNYXJjYUVxdWl2YWxlbnRlVmVoaWN1bG8kUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxNYXJjYVZlaGljdWxvUHJvamVjdGlvbj4+KSA9PiByLmJvZHkgYXMgQXJyYXk8TWFyY2FWZWhpY3Vsb1Byb2plY3Rpb24+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIGxpc3RhckRvY1N1c3RlbnRvUG9yQ29uZGljaW9uVmVoaWN1bG9cclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyRG9jU3VzdGVudG9Qb3JDb25kaWNpb25WZWhpY3Vsb1BhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby9saXN0YXItc3VzdGVudG8tY29uZGljaW9uLXZlaGljdWxvL3t0aXBfY29uX3ZlaGljdWxvX2lkfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyBkb2N1bWVudG9zIGRlIHN1c3RlbnRvIHBvciBjb25kaWNpw7NuIGRlIFZlaMOtY3Vsby5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyBkb2N1bWVudG9zIGRlIHN1c3RlbnRvIHBvciBjb25kaWNpw7NuIGRlIFZlaMOtY3Vsb1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJEb2NTdXN0ZW50b1BvckNvbmRpY2lvblZlaGljdWxvKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhckRvY1N1c3RlbnRvUG9yQ29uZGljaW9uVmVoaWN1bG8kUmVzcG9uc2UocGFyYW1zOiB7XHJcbiAgICB0aXBfY29uX3ZlaGljdWxvX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLkxpc3RhckRvY1N1c3RlbnRvUG9yQ29uZGljaW9uVmVoaWN1bG9QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ3RpcF9jb25fdmVoaWN1bG9faWQnLCBwYXJhbXMudGlwX2Nvbl92ZWhpY3Vsb19pZCwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGRvY3VtZW50b3MgZGUgc3VzdGVudG8gcG9yIGNvbmRpY2nDs24gZGUgVmVow61jdWxvLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGRvY3VtZW50b3MgZGUgc3VzdGVudG8gcG9yIGNvbmRpY2nDs24gZGUgVmVow61jdWxvXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJEb2NTdXN0ZW50b1BvckNvbmRpY2lvblZlaGljdWxvJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhckRvY1N1c3RlbnRvUG9yQ29uZGljaW9uVmVoaWN1bG8ocGFyYW1zOiB7XHJcbiAgICB0aXBfY29uX3ZlaGljdWxvX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyRG9jU3VzdGVudG9Qb3JDb25kaWNpb25WZWhpY3VsbyRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxDb211bmVzUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyQ2F0ZWdvcmlhXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhckNhdGVnb3JpYVBhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby9saXN0YS1jYXRlZ29yaWEtdmVoaWN1bG8ve2NvZF9jYXRlZ29yaWF9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgY2F0ZWdvcmlhIHZlaGljdWxvcy5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGNhdGVnb3JpYSB2ZWhpY3Vsb3NcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyQ2F0ZWdvcmlhKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhckNhdGVnb3JpYSRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIGNvZF9jYXRlZ29yaWE6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29tdW5lc1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyQ2F0ZWdvcmlhUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCdjb2RfY2F0ZWdvcmlhJywgcGFyYW1zLmNvZF9jYXRlZ29yaWEsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDb211bmVzUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGNhdGVnb3JpYSB2ZWhpY3Vsb3MuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciBjYXRlZ29yaWEgdmVoaWN1bG9zXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJDYXRlZ29yaWEkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyQ2F0ZWdvcmlhKHBhcmFtczoge1xyXG4gICAgY29kX2NhdGVnb3JpYTogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3RhckNhdGVnb3JpYSRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbXVuZXNQcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxDb211bmVzUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyRG9jU3VzdGVudG9UaXBvXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhckRvY1N1c3RlbnRvVGlwb1BhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby9kb2Mtc3VzdGVudG9fdGlwby97YXJyX3RpcF9kb2Nfc3VzdGVudG9faWR9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGRvY3VtZW50b3MgZGUgc3VzdGVudG8gcG9yIGxpc3RhZG8gZGUgaWRzLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGRvY3VtZW50b3MgZGUgc3VzdGVudG8gcG9yIGNvbmRpY2nDs24gZGUgUHJlZGlvXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhckRvY1N1c3RlbnRvVGlwbygpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJEb2NTdXN0ZW50b1RpcG8kUmVzcG9uc2UocGFyYW1zOiB7XHJcbiAgICBhcnJfdGlwX2RvY19zdXN0ZW50b19pZDogc3RyaW5nO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxEb2N1bWVudG9UaXBvUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJEb2NTdXN0ZW50b1RpcG9QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ2Fycl90aXBfZG9jX3N1c3RlbnRvX2lkJywgcGFyYW1zLmFycl90aXBfZG9jX3N1c3RlbnRvX2lkLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8RG9jdW1lbnRvVGlwb1Byb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgZG9jdW1lbnRvcyBkZSBzdXN0ZW50byBwb3IgbGlzdGFkbyBkZSBpZHMuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgZG9jdW1lbnRvcyBkZSBzdXN0ZW50byBwb3IgY29uZGljacOzbiBkZSBQcmVkaW9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGxpc3RhckRvY1N1c3RlbnRvVGlwbyRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJEb2NTdXN0ZW50b1RpcG8ocGFyYW1zOiB7XHJcbiAgICBhcnJfdGlwX2RvY19zdXN0ZW50b19pZDogc3RyaW5nO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPEFycmF5PERvY3VtZW50b1RpcG9Qcm9qZWN0aW9uPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3RhckRvY1N1c3RlbnRvVGlwbyRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PERvY3VtZW50b1RpcG9Qcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxEb2N1bWVudG9UaXBvUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyQ29uZGljaW9uUHJvcGllZGFkXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhckNvbmRpY2lvblByb3BpZWRhZFBhdGggPSAnL2NvbXVuZXNyZWdpc3Ryby9jb25kaWNpb24tcHJvcGllZGFkL3tjb25fcmVjYXVkYWNpb25faWR9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgY29uZGljacOzbiBkZSBwcm9waWVkYWQuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciBjb25kaWNpw7NuIGRlIHByb3BpZWRhZFxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJDb25kaWNpb25Qcm9waWVkYWQoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyQ29uZGljaW9uUHJvcGllZGFkJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgY29uX3JlY2F1ZGFjaW9uX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFByb3BpZWRhZFRpcG9SZXNwb25zZT4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJDb25kaWNpb25Qcm9waWVkYWRQYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ2Nvbl9yZWNhdWRhY2lvbl9pZCcsIHBhcmFtcy5jb25fcmVjYXVkYWNpb25faWQsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxQcm9waWVkYWRUaXBvUmVzcG9uc2U+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBjb25kaWNpw7NuIGRlIHByb3BpZWRhZC5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGNvbmRpY2nDs24gZGUgcHJvcGllZGFkXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJDb25kaWNpb25Qcm9waWVkYWQkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyQ29uZGljaW9uUHJvcGllZGFkKHBhcmFtczoge1xyXG4gICAgY29uX3JlY2F1ZGFjaW9uX2lkOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8UHJvcGllZGFkVGlwb1Jlc3BvbnNlPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3RhckNvbmRpY2lvblByb3BpZWRhZCRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFByb3BpZWRhZFRpcG9SZXNwb25zZT4+KSA9PiByLmJvZHkgYXMgQXJyYXk8UHJvcGllZGFkVGlwb1Jlc3BvbnNlPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJDb25Db250cmlidXllbnRlXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IExpc3RhckNvbkNvbnRyaWJ1eWVudGVQYXRoID0gJy9jb211bmVzcmVnaXN0cm8vY29uZGljaW9uLWNvbnRyaWJ1eWVudGUve2NvbnRyaWJ1eWVudGVfbnVtZXJvfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxhcyBjb25kaWNpb25lcyBhY3RpdmFzIGRlbCBjb250cmlidXllbnRlLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbGFzIGNvbmRpY2lvbmVzIGFjdGl2YXMgZGVsIGNvbnRyaWJ1eWVudGVcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyQ29uQ29udHJpYnV5ZW50ZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJDb25Db250cmlidXllbnRlJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgY29udHJpYnV5ZW50ZV9udW1lcm86IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q29uQ29udHJpYnV5ZW50ZUVudGl0eT4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJDb25Db250cmlidXllbnRlUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCdjb250cmlidXllbnRlX251bWVybycsIHBhcmFtcy5jb250cmlidXllbnRlX251bWVybywge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbkNvbnRyaWJ1eWVudGVFbnRpdHk+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsYXMgY29uZGljaW9uZXMgYWN0aXZhcyBkZWwgY29udHJpYnV5ZW50ZS5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxhcyBjb25kaWNpb25lcyBhY3RpdmFzIGRlbCBjb250cmlidXllbnRlXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJDb25Db250cmlidXllbnRlJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhckNvbkNvbnRyaWJ1eWVudGUocGFyYW1zOiB7XHJcbiAgICBjb250cmlidXllbnRlX251bWVybzogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPEFycmF5PENvbkNvbnRyaWJ1eWVudGVFbnRpdHk+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyQ29uQ29udHJpYnV5ZW50ZSRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENvbkNvbnRyaWJ1eWVudGVFbnRpdHk+PikgPT4gci5ib2R5IGFzIEFycmF5PENvbkNvbnRyaWJ1eWVudGVFbnRpdHk+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIGxpc3RhckNsYXNlUG9yQ2Fycm9jZXJpYVxyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJDbGFzZVBvckNhcnJvY2VyaWFQYXRoID0gJy9jb211bmVzcmVnaXN0cm8vY2xhc2UtdmVoaWN1bG8ve2NhcnJvY2VyaWFfaWR9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgQ2xhc2UgcG9yIGVsIGNvZGlnbyBkZSBjYXJyb2NlcmlhIGRlIHZlaGljdWxvcy5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIENsYXNlIHBvciBlbCBjb2RpZ28gZGUgY2Fycm9jZXJpYSBkZSB2ZWhpY3Vsb3NcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyQ2xhc2VQb3JDYXJyb2NlcmlhKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhckNsYXNlUG9yQ2Fycm9jZXJpYSRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIGNhcnJvY2VyaWFfaWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q2xhc2VWZWhpY3Vsb1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyQ2xhc2VQb3JDYXJyb2NlcmlhUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCdjYXJyb2NlcmlhX2lkJywgcGFyYW1zLmNhcnJvY2VyaWFfaWQsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDbGFzZVZlaGljdWxvUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIENsYXNlIHBvciBlbCBjb2RpZ28gZGUgY2Fycm9jZXJpYSBkZSB2ZWhpY3Vsb3MuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBDbGFzZSBwb3IgZWwgY29kaWdvIGRlIGNhcnJvY2VyaWEgZGUgdmVoaWN1bG9zXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJDbGFzZVBvckNhcnJvY2VyaWEkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyQ2xhc2VQb3JDYXJyb2NlcmlhKHBhcmFtczoge1xyXG4gICAgY2Fycm9jZXJpYV9pZDogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPEFycmF5PENsYXNlVmVoaWN1bG9Qcm9qZWN0aW9uPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3RhckNsYXNlUG9yQ2Fycm9jZXJpYSRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PENsYXNlVmVoaWN1bG9Qcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxDbGFzZVZlaGljdWxvUHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyQ2F0ZWdvcmlhUG9yQ2xhc2VcclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyQ2F0ZWdvcmlhUG9yQ2xhc2VQYXRoID0gJy9jb211bmVzcmVnaXN0cm8vY2F0ZWdvcmlhLXZlaGljdWxvL3tjbGFzZV9pZH0nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0aXBvcyBkZSBDYXRlZ29yaWEgTUVGIHBvciBlbCBjb2RpZ28gZGUgY2xhc2UgZGUgdmVoaWN1bG9zLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgQ2F0ZWdvcmlhIHBvciBlbCBjb2RpZ28gZGUgY2xhc2UgZGUgdmVoaWN1bG9zXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhckNhdGVnb3JpYVBvckNsYXNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhckNhdGVnb3JpYVBvckNsYXNlJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgY2xhc2VfaWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Q2F0ZWdvcmlhUHJvamVjdGlvbj4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBDb211bmVzUmVnaXN0cm9Db250cm9sbGVyU2VydmljZS5MaXN0YXJDYXRlZ29yaWFQb3JDbGFzZVBhdGgsICdnZXQnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgcmIucGF0aCgnY2xhc2VfaWQnLCBwYXJhbXMuY2xhc2VfaWQsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDYXRlZ29yaWFQcm9qZWN0aW9uPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdGlwb3MgZGUgQ2F0ZWdvcmlhIE1FRiBwb3IgZWwgY29kaWdvIGRlIGNsYXNlIGRlIHZlaGljdWxvcy5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRpcG9zIGRlIENhdGVnb3JpYSBwb3IgZWwgY29kaWdvIGRlIGNsYXNlIGRlIHZlaGljdWxvc1xyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIG9ubHkgdG8gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICogVG8gYWNjZXNzIHRoZSBmdWxsIHJlc3BvbnNlIChmb3IgaGVhZGVycywgZm9yIGV4YW1wbGUpLCBgbGlzdGFyQ2F0ZWdvcmlhUG9yQ2xhc2UkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyQ2F0ZWdvcmlhUG9yQ2xhc2UocGFyYW1zOiB7XHJcbiAgICBjbGFzZV9pZDogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPEFycmF5PENhdGVnb3JpYVByb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyQ2F0ZWdvcmlhUG9yQ2xhc2UkUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxDYXRlZ29yaWFQcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxDYXRlZ29yaWFQcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBsaXN0YXJBcmVhVmVyZGVcclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyQXJlYVZlcmRlUGF0aCA9ICcvY29tdW5lc3JlZ2lzdHJvL2FyZWEtdmVyZGUve3RpcG9fYXJlYV92ZXJkZX0nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBhcmVhIHZlcmRlLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgYXJlYSB2ZXJkZVxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJBcmVhVmVyZGUoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyQXJlYVZlcmRlJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgdGlwb19hcmVhX3ZlcmRlOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFVzb0FyYml0cmlvVGlwb1Byb2plY3Rpb24+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgQ29tdW5lc1JlZ2lzdHJvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyQXJlYVZlcmRlUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCd0aXBvX2FyZWFfdmVyZGUnLCBwYXJhbXMudGlwb19hcmVhX3ZlcmRlLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8VXNvQXJiaXRyaW9UaXBvUHJvamVjdGlvbj4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGFyZWEgdmVyZGUuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciBhcmVhIHZlcmRlXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJBcmVhVmVyZGUkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgbGlzdGFyQXJlYVZlcmRlKHBhcmFtczoge1xyXG4gICAgdGlwb19hcmVhX3ZlcmRlOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8VXNvQXJiaXRyaW9UaXBvUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJBcmVhVmVyZGUkUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPj4pID0+IHIuYm9keSBhcyBBcnJheTxVc29BcmJpdHJpb1RpcG9Qcm9qZWN0aW9uPilcclxuICAgICk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=