sf-reglanegociom3 1.0.12-beta98 → 1.0.12-beta99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/sf-reglanegociom3.umd.js +3 -2
- package/bundles/sf-reglanegociom3.umd.js.map +1 -1
- package/bundles/sf-reglanegociom3.umd.min.js +1 -1
- package/bundles/sf-reglanegociom3.umd.min.js.map +1 -1
- package/esm2015/lib/rnm3/Promociones/promociones.service.js +3 -2
- package/esm5/lib/rnm3/Promociones/promociones.service.js +3 -2
- package/fesm2015/sf-reglanegociom3.js +3 -2
- package/fesm2015/sf-reglanegociom3.js.map +1 -1
- package/fesm5/sf-reglanegociom3.js +3 -2
- package/fesm5/sf-reglanegociom3.js.map +1 -1
- package/package.json +1 -1
|
@@ -3461,6 +3461,7 @@ class promocionesService {
|
|
|
3461
3461
|
}
|
|
3462
3462
|
else {
|
|
3463
3463
|
//CANTIDAD POR PRODUCTO
|
|
3464
|
+
debugger;
|
|
3464
3465
|
oListEncab.forEach(prd => {
|
|
3465
3466
|
contDescAplicados = 0;
|
|
3466
3467
|
/** @type {?} */
|
|
@@ -4030,7 +4031,7 @@ class promocionesService {
|
|
|
4030
4031
|
nPrecioUnit = +enc.M3DET.find(det => det.NombreConcepto == "PUNIT").Valor;
|
|
4031
4032
|
}
|
|
4032
4033
|
for (var j = 0; j < nCantidad; j++) {
|
|
4033
|
-
lPrecios.push({ "Indice": j, "PUNITNETO": nPrecioUnit, "ID": enc.ID
|
|
4034
|
+
lPrecios.push({ "Indice": j, "PUNITNETO": nPrecioUnit, "ID": enc.ID });
|
|
4034
4035
|
}
|
|
4035
4036
|
}
|
|
4036
4037
|
return lPrecios;
|
|
@@ -12578,4 +12579,4 @@ CouchDinamByProcesos.ctorParameters = () => [];
|
|
|
12578
12579
|
|
|
12579
12580
|
export { PostServiceM3, xmlToJsonTF, M3CouchMaestro, M3Data, Filtros, M3PrdAdicionales, M3PrdGeneral, M3PRDImpuestos, TypeM3PrdGrp, TypeImpuestosPRD, M3PrdLista, M3PImpuestos, M3PDetalleItems, M3PItemsWEB, M3PDetalleCupon, M3PDinamicas, M3PEncFP, M3PEncItems, M3PEnvios, M3Procesos, M3PRecepcion, M3PerXProceso, M3OtClasificaciones, ServiceM3FE, M3ProcesoService, M3RegService, M3Trx, ServiceM3Maestro, ServiceListaPrecio, ServiceLoadListaPrecio, M3DinProcesos, M3PrdPackDet, M3UbiAdicionales, M3Ubicacion, promocionesService, M3CONDIAGRUPACION, M3CONDIPROMO, M3DETCONDIPROMO, M3ENCPROMO, PromocionProcesada, PromocionesAsociadas, PromocionCombinada, M3UbicacionService, M3RegMasivo, M3RegMasivoAKZService, M3ReversoServ, M3PDinamByActividad, M3DinByActividad, M3SaldosXCuenta, M3RegistroTrx, cuponesService, ServiceOffLine, bdOffLineLog, M3MaestroOffline, M3ProcesosOffline, M3NotifService, ModelM3Notif, M3Presentaciones, M3Consultas, TECLASRAPIDAS, CouchPRDSService, CouchConfigLPService, CouchCodsPRDSService, CouchPromocionesService, CouchUbicacionesService, M3NotificacionesAPP, MathTF, ServiceM3PackByipo, FiltrosDiarioOffLine, CouchPerxipo, CouchDinamByProcesos };
|
|
12580
12581
|
|
|
12581
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2YtcmVnbGFuZWdvY2lvbTMuanMubWFwIiwic291cmNlcyI6WyJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvQ29udmVydC94bWxUb0pTb24uY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL0RhdGEvbTMtY291Y2gtbWFlc3Ryby50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvRGF0YS9tMy1kYXRhLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL2ZpbHRyb3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vTTNQcmRBZGljaW9uYWxlcy50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL00zUHJkTGlzdGEudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZEdycC50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wLWltcHVlc3Rvcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBkaW5hbWljYXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBlbmMtZnAudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBlbmMtaXRlbXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXAtZW52aW9zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1mLXRyYWJham8udHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXByb2Nlc29zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wcmVjZXBjaW9uLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1vdC1jbGFzaWZpY2FjaW9uZXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLWZlLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXByb2Nlc28uaW50ZXJmYWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL3Byb21vY2lvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtY29uZmlnbHAuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtbG9hZC1sLXByZWNpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9NM01hZXN0cm8uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmVnLXNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXRyeC5pbnRlcmZhY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLWxpc3RhLXByZWNpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL20zLWRpbi1wcm9jZXNvcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZFBhY2tEZXQudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpQWRpY2lvbmFsZXMudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUHJvbW9jaW9uZXMvTW9kZWxzL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNDT05ESVBST01PLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNERVRDT05ESVBST01PLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNFTkNQUk9NTy5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtdWJpY2FjaW9uLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXJlZy1tYXNpdm8uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmVnLW1hc2l2by1ha3ouc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmV2ZXJzby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wZGluYW0tYnktYWN0aXZpZGFkLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL20zLWRpbi1ieS1hY3RpdmlkYWQudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXNhbGRvcy14LWN1ZW50YS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcmVnLXRyeC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvQ3Vwb25lcy9jdXBvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9iZC1vZmZsaW5lLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9iZC1vZmZsaW5lLWxvZy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL3NlcnZpY2UtbTMtbWFlc3Ryby1vZmZsaW5lLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL3NlcnZpY2UtbTMtcHJvY2Vzby1vZmZsaW5lLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1ub3RpZmljYWNpb25lcy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL05vdGlmaWNhY2lvbmVzL00zTm9maXRpY2FjaW9uZXMubW9kZWwudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vbTMtcHJlc2VudGFjaW9uZXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL0NvbnN1bHRhc00zL20zLWNvbnN1bHRhcy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL1ViaWNhY2lvbi9tMy10ZWNsYXMtcmFwaWRhcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9jb3VjaC1wcmRzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtY29kc3ByZC5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLXByb21vY2lvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtdWJpY2FjaW9uZXMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTm90aWZpY2FjaW9uZXMvbm90aWZpY2FjaW9uZXMtbTMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcGFjay1ieS10aXBvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9maWx0cm9zLWRpYXJpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLXBlcnh0aXBvLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLWRpbmFteHByb2Nlc29zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHAsIFJlcXVlc3RPcHRpb25zLCBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cCdcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCdcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cC9zcmMvc3RhdGljX3Jlc3BvbnNlJ1xyXG5pbXBvcnQgeyB0aW1lb3V0LCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBvc3RTZXJ2aWNlTTMge1xyXG4gICAgaWRrYXRpb3M6IHN0cmluZ1xyXG4gICAgc2Vydmlkb3I6IHN0cmluZztcclxuICAgIHNlcnZpZG9yUGVyc29uYXM6IHN0cmluZztcclxuICAgIHNlcnZpZG9yR2VuZXJhbGVzOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvck0zOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvckZFTVg6IHN0cmluZztcclxuICAgIHNlcnZpZG9yRG9jdW1lbnRvczogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JDb250YWJsZTogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JQcmVzdGFtbzogc3RyaW5nO1xyXG4gICAgV2ViQmFzZTogc3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwLFxyXG4gICAgICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5jYXJnYUluaWNpYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FyZ2FJbmljaWFsKCkge1xyXG5cclxuICAgICAgICB2YXIganNvbjogYW55O1xyXG4gICAgICAgIGxldCBzQ29uZmlnSlNPTiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpO1xyXG4gICAgICAgIGlmIChzQ29uZmlnSlNPTikge1xyXG4gICAgICAgICAgICBsZXQgakNvbmZpZ0pTT04gPSBKU09OLnBhcnNlKHNDb25maWdKU09OKTtcclxuICAgICAgICAgICAgaWYgKGpDb25maWdKU09OLlNlcnZpZG9yUGVyc29uYXMpIHtcclxuICAgICAgICAgICAgICAgIGpzb24gPSBqQ29uZmlnSlNPTjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQZXJzb25hcyA9IGpzb24uU2Vydmlkb3JQZXJzb25hcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yID0ganNvbi5TZXJ2aWRvcjtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzID0ganNvbi5TZXJ2aWRvckdlbmVyYWxlcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yTTMgPSBqc29uLlNlcnZpZG9yTTM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckZFTVggPSBqc29uLlNlcnZpZG9yRkVNWDtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyA9IGpzb24uU2Vydmlkb3JEb2N1bWVudG9zO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JDb250YWJsZSA9IGpzb24uU2Vydmlkb3JDb250YWJsZTtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yUHJlc3RhbW8gPSBqc29uLlNlcnZpZG9yUHJlc3RhbW87XHJcbiAgICAgICAgdGhpcy5XZWJCYXNlID0ganNvbi5XZWJCYXNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENvbmZpZ0pzb24oaWRLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwID0gYXdhaXQgdGhpcy5nZXRXaXRoQm9keUdlbmVyYWxlcygnR2VuZXJhbGVzL2dldENvbmZpZ0pzb24vJyArIGlkS2F0aW9zLCBudWxsKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgdmFyIHJlc3B1ZXN0YTogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BPa19nZXRDb25maWdKc29uKHJlc3B1ZXN0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzcE9rX2dldENvbmZpZ0pzb24oanNvbikge1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQZXJzb25hcyA9IGpzb24uU2Vydmlkb3JQZXJzb25hcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yID0ganNvbi5TZXJ2aWRvcjtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzID0ganNvbi5TZXJ2aWRvckdlbmVyYWxlcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yTTMgPSBqc29uLlNlcnZpZG9yTTM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckZFTVggPSBqc29uLlNlcnZpZG9yRkVNWDtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyA9IGpzb24uU2Vydmlkb3JEb2N1bWVudG9zO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JDb250YWJsZSA9IGpzb24uU2Vydmlkb3JDb250YWJsZTtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yUHJlc3RhbW8gPSBqc29uLlNlcnZpZG9yUHJlc3RhbW87XHJcbiAgICAgICAgdGhpcy5XZWJCYXNlID0ganNvbi5XZWJCYXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVSTFNlcnZlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWRvcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVUkxTZXJ2ZXJEb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcztcclxuICAgIH1cclxuXHJcbiAgICAvLy9odHRwR2V0XHJcbiAgICBodHRwR2V0KHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGlTZXJ2aWRvciArIHVybEdldCkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9odHRwR2V0XHJcbiAgICBodHRwR2V0V2l0aFRpbWVPdXQodXJsR2V0OiBzdHJpbmcsIGlTZXJ2aWRvcjogc3RyaW5nLCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0KS5waXBlKFxyXG4gICAgICAgICAgICB0aW1lb3V0KHRpbWVvdXRUaW1lKVxyXG4gICAgICAgICkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGh0dHBHZXRXaXRoQm9keSh1cmxHZXQ6IHN0cmluZywgaVNlcnZpZG9yOiBzdHJpbmcsIHBhcmFtZXRyb3M6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xyXG5cclxuICAgICAgICBoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuXHJcblxyXG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7aGVhZGVyczogaGVhZGVycywgYm9keToge1wiY29ycmVvXCI6IFwicGFyYW1zXCJ9LCBwYXJhbXM6bXlQYXJhbXN9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtZXRyb3NcclxuICAgICAgICAgICAgfSkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBodHRwR2V0V2l0aEJvZHlUaW1lT3V0KHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55LCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG5cclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChpU2Vydmlkb3IgKyB1cmxHZXQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRpbWVvdXQodGltZW91dFRpbWUpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaHR0cF9nZXRfYmxvYih1cmxHZXQ6IHN0cmluZywgaVNlcnZpZG9yOiBzdHJpbmcsIHBhcmFtZXRyb3M6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xyXG5cclxuICAgICAgICAvL2hlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpOyAgICAgICAgXHJcbiAgICAgICAgLy9oZWFkZXJzLmFwcGVuZCgnUmVzcG9uc2UgVHlvZScsICdibG9iJyk7XHJcblxyXG5cclxuICAgICAgICAvL2NvbnN0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoe2hlYWRlcnM6IGhlYWRlcnMsIGJvZHk6IHtcImNvcnJlb1wiOiBcInBhcmFtc1wifSwgcGFyYW1zOm15UGFyYW1zfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGlTZXJ2aWRvciArIHVybEdldCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGh0dHBfZ2V0X2FycmF5YnVmZmVyKHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7ICAgICAgICBcclxuICAgICAgICAvL2hlYWRlcnMuYXBwZW5kKCdSZXNwb25zZSBUeW9lJywgJ2Jsb2InKTtcclxuXHJcblxyXG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7aGVhZGVyczogaGVhZGVycywgYm9keToge1wiY29ycmVvXCI6IFwicGFyYW1zXCJ9LCBwYXJhbXM6bXlQYXJhbXN9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYXJyYXlidWZmZXJcIixcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgZ2V0UHJlc3RhbW8odXJsR2V0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0KHVybEdldCwgdGhpcy5zZXJ2aWRvclByZXN0YW1vKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0V2l0aEJvZHlNM1RpbWVPdXQodXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55LCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5VGltZU91dCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JNMywgcGFyYW1zLCB0aW1lb3V0VGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlQcmVzdGFtbyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0V2l0aEJvZHkodXJsR2V0LCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8sIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFdpdGhCb2R5TTModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5KHVybEdldCwgdGhpcy5zZXJ2aWRvck0zLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFdpdGhCb2R5UGVyc29uYXModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5KHVybEdldCwgdGhpcy5zZXJ2aWRvclBlcnNvbmFzLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFdpdGhCb2R5R2VuZXJhbGVzKHVybEdldDogc3RyaW5nLCBwYXJhbXM6IGFueSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXRXaXRoQm9keSh1cmxHZXQsIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlEb2N1bWVudG8odXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XHJcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoJ3Jlc3BvbnNlVHlwZScsICdSZXNwb25zZUNvbnRlbnRUeXBlLkJsb2InKTtcclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldCh0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyArIHVybEdldCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNcclxuICAgICAgICAgICAgfSkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X2Jsb2JfRG9jdW1lbnRvcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwX2dldF9ibG9iKHVybEdldCwgdGhpcy5zZXJ2aWRvckRvY3VtZW50b3MsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X2FycmF5YnVmZmVyX0RvY3VtZW50b3ModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cF9nZXRfYXJyYXlidWZmZXIodXJsR2V0LCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcywgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQb3N0cyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQZXJzb25hcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yUGVyc29uYXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEdlbmVyYWxlcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNMyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yTTMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE0zV2l0aFRpbWVPdXQodXJsR2V0OiBzdHJpbmcsIHRpbWVPdXQ6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXRXaXRoVGltZU91dCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JNMywgdGltZU91dCk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgZ2V0RG9jdW1lbnRvcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldENvbnRhYmxlKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JDb250YWJsZSk7XHJcbiAgICB9XHJcbiAgICAvLy9FbmQgaHR0cEdldFxyXG5cclxuICAgIGdldFBvc3RzV2l0aE91dEpzb24odXJsR2V0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLnNlcnZpZG9yICsgdXJsR2V0KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5zZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1c1RleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8vcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBcclxuICAgIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5zZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBDYWxsU2VydmljZSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoaVNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMpLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwUHJlc3RhbW9zKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVJlc3BvbnNlSHR0cENhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8pO1xyXG4gICAgfVxyXG4gICAgLy8vRW5kIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwXHJcblxyXG5cclxuICAgIC8vL3Bvc3RTZXJ2aWNlSHR0cE9wdGlvbnNcclxuICAgIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNDYWxsU2VydmljZSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChpU2Vydmlkb3IgKyB1cmxHZXQsIHBhcmFtcywgb3B0aW9ucykubWFwKFxyXG4gICAgICAgICAgICByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwT3B0aW9ucyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCBoZWFkZXJzLCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBPcHRpb25zTTModXJsR2V0OiBzdHJpbmcsIHBhcmFtcywgaGVhZGVycykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNDYWxsU2VydmljZSh1cmxHZXQsIHBhcmFtcywgaGVhZGVycywgdGhpcy5zZXJ2aWRvck0zKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBPcHRpb25zRG9jcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCBoZWFkZXJzLCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vRW5kIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNcclxuXHJcbiAgICAvLy9wb3N0U2VydmljZUh0dHBSZXNGdWxsXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsQ2FsbFNlcnZpY2UodXJsR2V0OiBzdHJpbmcsIHBhcmFtcywgaVNlcnZpZG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGlTZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbCh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbENhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxQZXJzb25hcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VXZWJBcGkodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JQZXJzb25hcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVdlYkFwaSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvck0zKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsRkVNWCh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VXZWJBcGkodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JGRU1YKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsR2VuZXJhbGVzKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZUh0dHBSZXNGdWxsQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxQcmVzdGFtb3ModXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxDYWxsU2VydmljZSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvclByZXN0YW1vKTtcclxuICAgIH1cclxuICAgIC8vL0VuZCBwb3N0U2VydmljZUh0dHBSZXNGdWxsXHJcbiAgICBwb3N0U2VydmljZVdlYkFwaSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcclxuICAgICAgICBoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHsgaGVhZGVyczogaGVhZGVycyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGlTZXJ2aWRvciArIHVybEdldCwgcGFyYW1zLCBvcHRpb25zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIHhtbFRvSnNvblRGe1xyXG5cclxuICAgIGNvbnZlcnRYbWxUb0pzb24oaW5wdXRYbWwpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gcmVxdWlyZSgneG1sMmpzJykucGFyc2VTdHJpbmc7XHJcbiAgICAgICAgY29uc3QgeG1sID0gaW5wdXRYbWw7XHJcbiAgICAgICAgbGV0IHJlc3VsdGFkbztcclxuICAgICAgICBwYXJzZVN0cmluZyh4bWwsIChlcnIsIHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHRhZG89IHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcGxhY2VDaGFyWG1sKGlucHV0WG1sKXtcclxuICAgICAgICBsZXQgZ3QgPSAvJmd0Oy9naTsgICAgICAgIFxyXG4gICAgICAgIGxldCBsdCA9IC8mbHQ7L2dpO1xyXG4gICAgICAgIGxldCBxdW90ID0gLyZxdW90Oy9naTtcclxuICAgICAgICBsZXQgcmVzdWx0YWRvID0gaW5wdXRYbWwucmVwbGFjZShndCxcIj5cIik7XHJcbiAgICAgICAgcmVzdWx0YWRvID0gcmVzdWx0YWRvLnJlcGxhY2UobHQsXCI8XCIpO1xyXG4gICAgICAgIHJlc3VsdGFkbyA9IHJlc3VsdGFkby5yZXBsYWNlKHF1b3QsXCInXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zQ291Y2hNYWVzdHJvIHtcclxuICAgIHB1YmxpYyBvRGF0YU0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuICAgICAgICAgICAgdmFyIHNUaXBvSHViOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgc1RpcG9IdWIgPSB0aGlzLkdldFRpcG9IdWJGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICBpZiAoc0lka2F0aW9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc1RpcG9IdWIgJiYgc1RpcG9IdWIudG9VcHBlckNhc2UoKS50cmltKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tRWNjX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21FY2NfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0VFQ0MhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21fXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0UhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0Z1bmNpb24gcXVlIHRyYWVyYSBlbCB0aXBvIGRlIGh1YlxyXG4gICAgcHVibGljIEdldFRpcG9IdWJGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5UaXBvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1NVYmljYWNpb24uTTNIVUJTWzBdLlRpcG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RGF0YVBvdWNoQkQoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpc0tleSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIC8vIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSk7XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgIC8vICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIC8vIH07XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zMiA9IHtcclxuICAgICAgICAvLyAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAvLyAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICAvLyB9O1xyXG5cclxuICAgICAgICAvLyAvL3RoaXMuYXV0ZW50aWNhY2lvblNlcnZlcihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgLy8gdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgLy8gICAgIG9wdGlvbnMyXHJcbiAgICAgICAgLy8gfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJDb21wbGV0bzpcIiArIGNoYW5nZSlcclxuICAgICAgICAvLyB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgLy8gfSkub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBkb2N1bWVudG8gcXVlIHNlIHF1aWVyZSBjb25zdWx0YXJcclxuICAgIHB1YmxpYyBHZXRLZXlEb2N1bWVudG9EQihpc0lES2F0aW9zOiBzdHJpbmcsIGlzRG9jdW1lbnRvOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaXNJREthdGlvcyArIFwiP1wiICsgaXNEb2N1bWVudG87XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3MnO1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM0RhdGEge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIkNhcnJpdG9Db21wcmFzXCIsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYXIgZW4gQkQgcG91Y2guXHJcbiAgICBwdWJsaWMgQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoaWQ6IHN0cmluZywgZG9jdW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGRvY3VtZW50Ll9pZCA9IGlkO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5fcmV2ID0gcmVzdWx0Ll9yZXY7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0FkaWNpb25hciBlbiBCRCBwb3VjaCwgQXN5bmMuXHJcbiAgICBwdWJsaWMgYXN5bmMgQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXNBc3luYyhpZDogc3RyaW5nLCBkb2N1bWVudDogYW55KSB7XHJcbiAgICAgICAgZG9jdW1lbnQuX2lkID0gaWQ7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0KGlkKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuX3JldiA9IHJlc3VsdC5fcmV2O1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgLy8gICAgIGRvY3VtZW50Ll9yZXYgPSByZXN1bHQuX3JldjtcclxuICAgICAgICAvLyAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICAvLyB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikge1xyXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAvLyAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIEdldERhdGFQb3VjaEJEKGlzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIERlbGV0ZShpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zMiA9IHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL3RoaXMuYXV0ZW50aWNhY2lvblNlcnZlcihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXMsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBJREthdGlvcywgdGRvYyB5IG5kb2MuXHJcbiAgICBwdWJsaWMgR2V0S2V5Q2Fycml0b0NvbXByYXMoaXNJREthdGlvczogc3RyaW5nLCBpc1Rkb2M6IHN0cmluZywgaXNOZG9jOiBzdHJpbmcsIGlzVWJpY2FjaW9uOiBzdHJpbmcsIGlzSWRIdWI6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBcIkNDP1wiICsgaXNJREthdGlvcyArIFwiP1wiICsgaXNVYmljYWNpb24gKyBcIj9cIiArIGlzSWRIdWIgKyBcIj9cIiArIGlzVGRvYyArIFwiP1wiICsgaXNOZG9jO1xyXG4gICAgfVxyXG5cclxuICAgIC8vRGVzdHJ1aXIgeSByZWNvbnN0cnVpciBsYSBiYXNlIGRlIGRhdG9zIHBvdWNoREJcclxuICAgIHB1YmxpYyBSZXNlckJEKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQignQ2Fycml0b0NvbXByYXMnLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBGaWx0cm9zIHtcclxuICAgIHB1YmxpYyBBdHJpYnV0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlzQXRyaWJ1dG86c3RyaW5nLCBpc1ZhbG9yOnN0cmluZyl7XHJcbiAgICAgICAgdGhpcy5BdHJpYnV0byA9IGlzQXRyaWJ1dG87XHJcbiAgICAgICAgdGhpcy5WYWxvciA9IGlzVmFsb3I7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIE0zUHJkQWRpY2lvbmFsZXN7XHJcbiAgICBTS1AxOnN0cmluZztcclxuICAgIEFUUklCVVRPOnN0cmluZztcclxuICAgIFZBTE9SOnN0cmluZztcclxuICAgIE5JVkVMMTpudW1iZXI7XHJcbiAgICBOSVZFTDI6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQcmVzZW50YWNpb25lcyB9IGZyb20gXCIuL20zLXByZXNlbnRhY2lvbmVzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQcmRMaXN0YXtcclxuICAgIElETElTVEE6c3RyaW5nO1xyXG4gICAgU0tVOnN0cmluZztcclxuICAgIExPVEU6c3RyaW5nO1xyXG4gICAgUFJFQ0lPOm51bWJlcjtcclxuICAgIExCOiBudW1iZXI7XHJcbiAgICBMQzogbnVtYmVyO1xyXG4gICAgTEQ6IG51bWJlcjtcclxuICAgIFNVQklORElDRTogc3RyaW5nO1xyXG4gICAgUE9SSUdJTkFMOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgTTNQcmVzZW50YWNpb25lcyA9IG5ldyBBcnJheTxNM1ByZXNlbnRhY2lvbmVzPigpO1xyXG59IiwiaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tEZXQgfSBmcm9tIFwiLi9NM1ByZFBhY2tEZXRcIjtcclxuaW1wb3J0IHsgTTNDb2RzWFBSRCB9IGZyb20gXCIuL00zQ29kc1hQUkQudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tSZWdsYXMgfSBmcm9tIFwiLi9NM1ByZFBhY2tSZWdsYXNcIjtcclxuZXhwb3J0IGNsYXNzIE0zUHJkR2VuZXJhbCB7XHJcbiAgICBTS1U6IHN0cmluZztcclxuICAgIExPVEU6IHN0cmluZztcclxuICAgIE5PTUJSRTE6IHN0cmluZztcclxuICAgIE5PTUJSRUxBUkdPOiBzdHJpbmc7XHJcbiAgICBBQ1QxQ1RCTDogc3RyaW5nO1xyXG4gICAgQUNUMkNUQkw6IHN0cmluZztcclxuICAgIENUQkxEUFJEOiBzdHJpbmc7XHJcbiAgICBDVEJMRElNUFBSRDogc3RyaW5nO1xyXG4gICAgU0tQMTogc3RyaW5nO1xyXG4gICAgU0tQMjogc3RyaW5nO1xyXG4gICAgU0tQMzogc3RyaW5nO1xyXG4gICAgU0tQNDogc3RyaW5nO1xyXG4gICAgU0tQNTogc3RyaW5nO1xyXG4gICAgRElTUE9OSUJMRTogbnVtYmVyO1xyXG4gICAgRElTUE9OSUJMRVJlZjogbnVtYmVyO1xyXG4gICAgTTNQQUNLOiBBcnJheTxNM1ByZFBhY2tEZXQ+ID0gbnVsbDtcclxuICAgIE0zUGFja1JlZ2xhczogQXJyYXk8TTNQcmRQYWNrUmVnbGFzPiA9IG51bGw7XHJcbiAgICBMb00zTGlzdGFQcmVjaW8gPSBuZXcgQXJyYXk8TTNQcmRMaXN0YT4oKTtcclxuICAgIExvTTNQcmRMaXN0YSA9IG5ldyBNM1ByZExpc3RhKCk7XHJcbiAgICBNM0NvZHMgPSBuZXcgQXJyYXk8TTNDb2RzWFBSRD4oKTtcclxuICAgIEltcHVlc3RvcyA9IG5ldyBBcnJheTxNM1BSREltcHVlc3Rvcz4oKTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUFJESW1wdWVzdG9zIHtcclxuICAgIENvZEltcDogc3RyaW5nO1xyXG4gICAgTWV0b2RvbG9naWE6IHN0cmluZztcclxuICAgIFZhbG9yOiBudW1iZXI7XHJcbn0iLCJpbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZEFkaWNpb25hbGVzIH0gZnJvbSBcIi4vTTNQcmRBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zUHJkUGFja0J5VGlwbyB9IGZyb20gXCIuL20zLXBhY2stYnktdGlwb1wiO1xyXG5pbXBvcnQgeyBNM1BVbmlkTWVkaWRhIH0gZnJvbSBcIi4vbTNwLXVuaWQtbWVkaWRhXCI7XHJcbmltcG9ydCB7IE0zUHJkR3JwQXNvY2lhZG8gfSBmcm9tIFwiLi9NM1ByZEdycEFzb2NpYWRvXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVHlwZU0zUHJkR3JwIHtcclxuICAgIFNLUDE6IHN0cmluZztcclxuICAgIFJBVElORzogbnVtYmVyO1xyXG4gICAgRklDSEFURUNOSUNBOiBzdHJpbmc7XHJcbiAgICBNQVJDQTogc3RyaW5nO1xyXG4gICAgQ0xBU0lGSUNBQ0lPTjogc3RyaW5nO1xyXG4gICAgTk9NQlJFOiBzdHJpbmc7XHJcbiAgICBUSVBPOiBzdHJpbmc7XHJcbiAgICBDYW50aWRhZDogbnVtYmVyO1xyXG4gICAgQ2FtcG9zQWRpY2lvbmFsZXM6IHN0cmluZztcclxuICAgIExvTTNQcmRHZW5lcmFsID0gbmV3IEFycmF5PE0zUHJkR2VuZXJhbD4oKTtcclxuICAgIExvTTNQcmRBZGljaW9uYWxlcyA9IG5ldyBBcnJheTxNM1ByZEFkaWNpb25hbGVzPigpO1xyXG4gICAgTTNQQUNLQllUSVBPID0gbmV3IEFycmF5PE0zUHJkUGFja0J5VGlwbz4oKTtcclxuICAgIE0zUHJkR3JwQXNvY2lhZG86QXJyYXk8TTNQcmRHcnBBc29jaWFkbz4gPSBudWxsO1xyXG5cclxuICAgIGxpc3RJbWFnZW5lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICBJbXB1ZXN0b3MgPSBuZXcgQXJyYXk8VHlwZUltcHVlc3Rvc1BSRD4oKTtcclxuICAgIE0zUFVuaWRNZWRpZGE6IE0zUFVuaWRNZWRpZGE7XHJcblxyXG4gICAgZW5jb250cmFkb0xvY2FsOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG5cclxuICAgIH1cclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVHlwZUltcHVlc3Rvc1BSRCB7XHJcbiAgICBDb2RJbXA6IHN0cmluZztcclxuICAgIE1ldG9kb2xvZ2lhOiBzdHJpbmc7XHJcbiAgICBWYWxvcjogc3RyaW5nXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNQSW1wdWVzdG9ze1xyXG4gICAgcHVibGljIFBvcmNlbnRhamU6bnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlcjtcclxuICAgIHB1YmxpYyBMaW1pdGVPcHVlc3RvOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb2RJbXB1ZXN0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQmFzZTpudW1iZXI7XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIE0zUERldGFsbGVJdGVtcyB7XHJcbiAgICBwdWJsaWMgTm9tYnJlQ29uY2VwdG86IHN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQSXRlbXNXRUIge1xyXG4gICAgcHVibGljIGRDYW50aWRhZDogbnVtYmVyO1xyXG4gICAgcHVibGljIGRQcmVjaW9Ub3RhbDogbnVtYmVyO1xyXG4gICAgcHVibGljIEJpc1Byb2R1Y3RvUHJvbW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBCaXNPYnNlcXVpbzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBVbmlkYWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ2xhdmVQcmRTUlY6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ2xhdmVQcmRVbmlkYWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgSWRQcm9jZXNvOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG9ic2VydmFjaW9uOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHB1YmxpYyBTdWJFc3RhZG9fbzogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBFc3RhZG9fbzogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBQYXRoSW1hZ2VuOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHB1YmxpYyBJREVuY1JlcGV0aWRvOiBudW1iZXIgPSAtMTtcclxuICAgIHB1YmxpYyBJREVuY1Byb2Nlc2FkbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgSURFbmNQYWRyZTogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgVGlwb0FncnVwYWNpb246IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ29kaWdvQmFycmFzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIENhbXBvc0FkaWNpb25hbGVzID0gW107XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BEZXRhbGxlQ3Vwb24ge1xyXG4gICAgcHVibGljIElkQ3Vwb246IHN0cmluZztcclxuICAgIHB1YmxpYyBDYW50aWRhZDogbnVtYmVyO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBNM1BEaW5hbWljYXMge1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG59IiwiaW1wb3J0IHsgTTNQRGluYW1CeUFjdGl2aWRhZCB9IGZyb20gXCIuL20zLXBkaW5hbS1ieS1hY3RpdmlkYWRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BFbmNGUCB7XHJcbiAgICBwdWJsaWMgVmFsb3I6bnVtYmVyO1xyXG4gICAgcHVibGljIERlc2NyaXBjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBFc3RhZG86c3RyaW5nO1xyXG4gICAgcHVibGljIElkVGlwb1BhZ286bnVtYmVyOyAvLzE6IEVmZWN0aXZvIDI6IFRhcmpldGEgZGUgY3LDg8KpZGl0byAzOiBUYXJqZXRhIERlYml0byA0OiBQU0VcclxuICAgIHB1YmxpYyBJRDpudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsQ2FtYmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBWYWxPdHJhQ2xhc2k6bnVtYmVyID0wO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxuXHJcblxyXG4gICAgLy9WYXJpYWJsZXMgU29sb0Zyb250XHJcbiAgICBwdWJsaWMgQVBMQ2FtYmlvOnN0cmluZztcclxuICAgIHB1YmxpYyBBUExGaWRlbGl6YWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIGRlamFyX2JvcnJhcjpib29sZWFuID0gdHJ1ZTtcclxuXHJcbn0iLCJpbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUERldGFsbGVDdXBvbiB9IGZyb20gXCIuL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUEltcHVlc3RvcyB9IGZyb20gXCIuL20zLXAtaW1wdWVzdG9zXCI7XHJcbmltcG9ydCB7IFByb21vY2lvbkNvbWJpbmFkYSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM1BFbnZpb3MgfSBmcm9tIFwiLi9tMy1wLWVudmlvc1wiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUEVuY0l0ZW1zIHtcclxuICAgIHB1YmxpYyBJZFByb2R1Y3RvOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgTG90ZTogc3RyaW5nO1xyXG4gICAgcHVibGljIElEOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgT3JkZW46IG51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmU6IHN0cmluZztcclxuICAgIHB1YmxpYyBDb2RpZ29CYXJyYXM6IHN0cmluZztcclxuICAgIHB1YmxpYyBJZEVudmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBESVNQT05JQkxFOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIFBhdGhJbWFnZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTTNERVQgPSBuZXcgQXJyYXk8TTNQRGV0YWxsZUl0ZW1zPigpOyAgICBcclxuICAgIHB1YmxpYyBNM0RldEN1cG9uZXMgPSBuZXcgQXJyYXk8TTNQRGV0YWxsZUN1cG9uPigpO1xyXG4gICAgcHVibGljIE0zUEltcHVlc3RvcyA9IG5ldyBBcnJheTxNM1BJbXB1ZXN0b3M+KCk7XHJcbiAgICBwdWJsaWMgTTNQRGluYW1CeUFjdGl2aWRhZCA9IG5ldyBBcnJheTxNM1BEaW5hbUJ5QWN0aXZpZGFkPigpO1xyXG5cclxuICAgIC8vRXN0YXMgcHJvcGllZGFkZXMgbm8gc29uIHJlcGxpY2EgYSBiYXNlIGRlIGRhdG9zLCBzb24gcGFyYSB1c28gaW50ZXJuby5cclxuICAgIHB1YmxpYyBQcm9tb0NvbWJpbmFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPigpO1xyXG5cclxuICAgIHB1YmxpYyBJZEVuY1BhZHJlOm51bWJlcjtcclxuICAgIHB1YmxpYyBUaXBvQWdydXBhY2lvbjpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdW5pdGFyaWFcclxuICAgIHB1YmxpYyBHZXRQcmljZVVuaXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGVsIHByZWNpbyB1bml0YXJpYSwgY29uIGRlc2N1ZW50b3MgaW5jbHVpZG9zXHJcbiAgICBwdWJsaWMgR2V0UHJpY2VVbml0TmV0bygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdW5pdGFyaWEsIGNvbiBkZXNjdWVudG9zIGluY2x1aWRvc1xyXG4gICAgcHVibGljIFNldFByaWNlVW5pdE5ldG8oaVZhbG9yKSB7XHJcbiAgICAgICAgdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBpVmFsb3I7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdG90YWwuXHJcbiAgICBwdWJsaWMgR2V0UHJpY2VUb3RhbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUEVudmlvc3tcclxuICAgIHB1YmxpYyBJZEVudmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZEZvcm1hRW52aW86bnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZUZFbnZpbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRGlyZWNjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBQYWlzOnN0cmluZztcclxuICAgIHB1YmxpYyBDaXVkYWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxufSIsImV4cG9ydCBjbGFzcyBNM0ZUcmFiYWpve1xyXG4gICAgcHVibGljIElkSHViOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZFViaWM6bnVtYmVyO1xyXG4gICAgcHVibGljIElkSHViUHJlOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZFViaWNQcmU6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tIFwiLi9tMy1wZW5jLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUEVuY0ZQIH0gZnJvbSBcIi4vbTMtcGVuYy1mcFwiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tIFwiLi9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvIH0gZnJvbSBcIi4vbTMtcHJvbS1jb21iXCI7XHJcbmltcG9ydCB7IE0zRlRyYWJham8gfSBmcm9tIFwiLi9tMy1mLXRyYWJham9cIjtcclxuaW1wb3J0IHsgTTNQRW52aW9zIH0gZnJvbSBcIi4vbTMtcC1lbnZpb3NcIjtcclxuaW1wb3J0IHsgTTNQUmVjZXBjaW9uIH0gZnJvbSBcIi4vbTMtcHJlY2VwY2lvblwiO1xyXG5pbXBvcnQgeyBQcm9tb2Npb25Db21iaW5hZGEgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zUHJvbW9Qcm9jZXNhZGEuY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQZXJYUHJvY2VzbyB9IGZyb20gXCIuL20zLXBlci14LXByb2Nlc29cIjtcclxuaW1wb3J0IHsgTTNSZWdpc3Ryb1RyeCB9IGZyb20gXCIuL20zLXJlZy10cnhcIjtcclxuaW1wb3J0IHsgTTNPdENsYXNpZmljYWNpb25lcyB9IGZyb20gXCIuL20zLW90LWNsYXNpZmljYWNpb25lc1wiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG5leHBvcnQgY2xhc3MgTTNQcm9jZXNvcyB7XHJcbiAgICBwdWJsaWMgSWRNMzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRmVjaGE6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG9UZXJjZXJvOm51bWJlcjtcclxuICAgIHB1YmxpYyBURG9jOnN0cmluZztcclxuICAgIHB1YmxpYyBORG9jOnN0cmluZztcclxuICAgIHB1YmxpYyBVYmljMTpudW1iZXI7XHJcbiAgICBwdWJsaWMgVWJpYzI6bnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yTmV0bzpudW1iZXIgPTA7XHJcbiAgICBwdWJsaWMgVmFsb3I6bnVtYmVyID0wO1xyXG4gICAgcHVibGljIFZhbE90cmFDbGFzaTpudW1iZXIgPTA7XHJcbiAgICBwdWJsaWMgU3ViRXN0YWRvRGVzOnN0cmluZztcclxuICAgIHB1YmxpYyBFc3RhZG9EZXM6c3RyaW5nO1xyXG4gICAgcHVibGljIFN1YkVzdGFkb0FudDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRXN0YWRvQW50OnN0cmluZztcclxuICAgIHB1YmxpYyBUTUlkUHJvY2VzbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSUREaWFyaW86c3RyaW5nO1xyXG4gICAgcHVibGljIElERGlhcmlvQ2llcnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBJREh1YjpudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwb1RSWDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTTNFTkMgPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICBwdWJsaWMgTTNPdENsYXNpZmljYWNpb25lcyA9IG5ldyBBcnJheTxNM090Q2xhc2lmaWNhY2lvbmVzPigpO1xyXG4gICAgcHVibGljIGxNM1BEaW5hbWljYXMgPSBuZXcgQXJyYXk8TTNQRGluYW1pY2FzPigpO1xyXG4gICAgcHVibGljIE0zUGVyWFByb2Nlc28gPSBuZXcgQXJyYXk8TTNQZXJYUHJvY2Vzbz4oKTtcclxuICAgIHB1YmxpYyBsTTNQRW5jRlAgPSBuZXcgQXJyYXk8TTNQRW5jRlA+KCk7XHJcbiAgICBwdWJsaWMgTTNGVHJhYmFqbyA9IG5ldyBNM0ZUcmFiYWpvKCk7XHJcbiAgICBwdWJsaWMgTTNQRW52aW9zID0gbmV3IEFycmF5PE0zUEVudmlvcz4oKTtcclxuICAgIHB1YmxpYyBNM1BSZWNlcGNpb24gPSBuZXcgQXJyYXk8TTNQUmVjZXBjaW9uPigpO1xyXG4gICAgcHVibGljIGxNM1JlZ2lzdHJvVHJ4ID0gbmV3IEFycmF5PE0zUmVnaXN0cm9Ucng+KCk7XHJcbiAgICBwdWJsaWMgZXNwZXJhOiBib29sZWFuO1xyXG4gICAgcHVibGljIGZlY2hhSG9yYTogRGF0ZTtcclxuICAgIFxyXG4gICAgcHVibGljIEZlY2hhSG9yYUVzdGFkbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRFc3RhZG86c3RyaW5nO1xyXG5cclxuXHJcbiAgICAvL0VzdGFzIHByb3BpZWRhZGVzIG5vIHNvbiByZXBsaWNhIGEgYmFzZSBkZSBkYXRvcywgc29uIHBhcmEgdXNvIGludGVybm8uXHJcbiAgICAvL3B1YmxpYyBsTTNQcm9tQ29tYmluYWRhID0gbmV3IEFycmF5PE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvPigpO1xyXG5cclxuICAgIHB1YmxpYyBQcm9tb3NDb21iaW5hZGFzID0gbmV3IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4oKTtcclxuXHJcbiAgICBwdWJsaWMgQXBsUGFnb0VuTGluZWE6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBBcGxEZXNkZVNlcnZlcjpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIG5kb2NVQWN0aXZvOnN0cmluZzsgLy9KQUdNIDIwMTkxMDE3IE51ZXZvcyBwYXJhbWV0cm9zLHBhcmEgbGxldmFyIGVsIHJlZ2lzdHJvIGRlbCB1c3VhcmlvIGFjdGl2bywgcXVlIGNyZW8gZXN0ZSBwcm9jZXNvXHJcbiAgICBwdWJsaWMgdGRvY1VBY3Rpdm86c3RyaW5nOy8vSkFHTSAyMDE5MTAxNyBOdWV2b3MgcGFyYW1ldHJvcyxwYXJhIGxsZXZhciBlbCByZWdpc3RybyBkZWwgdXN1YXJpbyBhY3Rpdm8sIHF1ZSBjcmVvIGVzdGUgcHJvY2Vzb1xyXG4gICAgLy9wdWJsaWMgYkFQTENvbWJpbmFkYXNBY3VtOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuRmVjaGEgPW1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUFJlY2VwY2lvbntcclxuICAgIHB1YmxpYyBJZFJlY2VwY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRFbmM6bnVtYmVyO1xyXG4gICAgcHVibGljIENhbnRpZGFkOm51bWJlcjtcclxuICAgIHB1YmxpYyBGZWNoYTpEYXRlOyAgICBcclxuICAgIHB1YmxpYyBNM1BEaW5hbUJ5QWN0aXZpZGFkID0gbmV3IEFycmF5PE0zUERpbmFtQnlBY3RpdmlkYWQ+KCk7XHJcbiAgICBwdWJsaWMgRXN0YWRvOiBzdHJpbmc7XHJcbn0iLCJleHBvcnQgY2xhc3MgTTNQZXJYUHJvY2Vzb3tcclxuICAgIHB1YmxpYyBUaXBvUGVyc29uYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGRvYzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTmRvYzpzdHJpbmc7ICAgIFxyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRGVzY1RpcG9QOnN0cmluZztcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgIE0zT3RDbGFzaWZpY2FjaW9uZXN7XHJcbiAgICBwdWJsaWMgSUQ6bnVtYmVyO1xyXG4gICAgcHVibGljIElkUHJvZHVjdG86c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkOm51bWJlcjtcclxuICAgIHB1YmxpYyBPcmRlbjpudW1iZXI7Ly9WYXJpYWJsZSBkZSBvcmRlbmFtaWVudG8gZW4gZWwgZnJvbnRcclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VNM0ZFIHtcclxuXHJcbiAgICBwdWJsaWMgYWRkX3Byb2Nlc29fZ2VuZXJhckZFKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zRkUvYWRkX3Byb2Nlc29fZ2VuZXJhckZFL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZF9wcm9jZXNvX2dlbmVyYXJOQyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM0ZFL2FkZF9wcm9jZXNvX2dlbmVyYXJOQy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBhZGRQcm9jZXNvR2VuZXJhckZFQXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQganNvbjtcclxuICAgICAgICBsZXQgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNGRS9hZGRfcHJvY2Vzb19nZW5lcmFyRkUvXCIgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVzcClcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJDYXJ0YVBvcnRlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZG0zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbEZFTVgoXCJGRU1YL2dlbmVyYXJDYXJ0YVBvcnRlL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBpZG0zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJGRUFudGljaXBvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsRkVNWChcIkZFTVgvZ2VuZXJhckZFQW50aWNpcG9zL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJOQ0FudGljaXBvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbEZFTVgoXCJGRU1YL2dlbmVyYXJOQ0FudGljaXBvcy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEluZm9GYWN0dXJhRWxlY3Ryb25pY2EoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogaWRfa2F0aW9zLnRyaW0oKSB9O1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zRkUvZ2V0SW5mb0ZhY3R1cmFFbGVjdHJvbmljYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSW5mbylcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRIdG1sRnJvbUZFKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGlkTTM6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZXNwO1xyXG4gICAgICAgIGxldCBkYXRhID0geyAnaWRNMyc6IGlkTTMgfTtcclxuICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM0ZFL2dldEh0bWxGcm9tRkUvJyArIGlkS2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBJVV9JbmZvRmFjdHVyYUVsZWN0cm9uaWNhKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRmFjdHVyYTogYW55LCB1VEFjdGl2bzogc3RyaW5nLCB1TkFjdGl2bzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IGlkX2thdGlvcy50cmltKCksICdvRmFjdHVyYSc6IG9GYWN0dXJhLCAndVRBY3Rpdm8nOiB1VEFjdGl2bywgJ3VOQWN0aXZvJzogdU5BY3Rpdm8gfTtcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zRkUvSVVfSW5mb0ZhY3R1cmFFbGVjdHJvbmljYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsSW5zU2VyaWVzeFViaWMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNGRS9kZWxJbnNTZXJpZXN4VWJpYy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTsgICAgICAgIFxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihKU09OLnBhcnNlKEpTT04ucGFyc2UoZXJyW1wiX2JvZHlcIl0pLk1lc3NhZ2UpLlJFU1BVRVNUQVtcIjBcIl0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQcm9jZXNvU2VydmljZSB7XHJcblxyXG4gICAgcHVibGljIGFkZF9wcm9jZXNvRUEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiUHJvY2Vzb3NNMy9hZGRfcHJvY2Vzb0VBL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBNM0dldF9Qcm9jZXNvc1BvckNhbnRpZGFkKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnUHJvY2Vzb3NNMy9NM0dldF9Qcm9jZXNvc1BvckNhbnRpZGFkLycgKyBzSURLYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9sUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3MgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9sUHJvY2Vzb3MuUkVTUFVFU1RBLlRQLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvbFByb2Nlc29zLlJFU1BVRVNUQS5UUCA9IG5ldyBBcnJheShvbFByb2Nlc29zLlJFU1BVRVNUQS5UUCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBsYSBsaXN0YSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhLCB1biBhcnJheSBkZSBmaWx0cm9zLlxyXG4gICAgcHVibGljIE0zR2V0X0FjdGl2aWRhZGVzWVByb2Nlc29zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL00zR2V0X0FjdGl2aWRhZGVzWVByb2Nlc29zLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvbFByb2Nlc29zO1xyXG4gICAgICAgICAgICBvbFByb2Nlc29zID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgLy9TaSBsYXMgYWN0aXZpZGFkZXMgbm8gdmllbmVuIGNvbW8gdW4gYXJyYXksIGNvbnZlcnRpcmxvXHJcbiAgICAgICAgICAgIGlmIChvbFByb2Nlc29zLlJFU1BVRVNUQS5BQ1RJVklEQURFUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMgPSBuZXcgQXJyYXkob2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1NpIGxvcyBwcm9jZXNvcyBubyB2aWVuZW4gY29tbyB1biBhcnJheSwgY29udmVydGlybG9cclxuICAgICAgICAgICAgb2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMuZm9yRWFjaChBY3RpdmlkYWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjdGl2aWRhZC5QUk9DRVNPUyAhPT0gdW5kZWZpbmVkICYmIEFjdGl2aWRhZC5QUk9DRVNPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIEFjdGl2aWRhZC5QUk9DRVNPUyA9IG5ldyBBcnJheShBY3RpdmlkYWQuUFJPQ0VTT1MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgbGlzdGEgZGUgcHJvZHVjdG8sIHRlbmllbmRvIGVuIGN1ZW50YSwgdW4gYXJyYXkgZGUgZmlsdHJvcy5cclxuICAgIHB1YmxpYyBNM0dldF9NM1Byb2Nlc29zQnlJZFByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIHNJZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldF9NM1Byb2Nlc29zQnlJZFByb2Nlc28vJyArIHNJREthdGlvcyArICcvJyArIHNJZFByb2Nlc28sIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvbFByb2Nlc29zTTM7XHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3NNMyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGFzIGFjdGl2aWRhZGVzIG5vIHZpZW5lbiBjb21vIHVuIGFycmF5LCBjb252ZXJ0aXJsb1xyXG4gICAgICAgICAgICBpZiAob2xQcm9jZXNvc00zLlJFU1BVRVNUQS5TVUJFU1RBRE9TLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvbFByb2Nlc29zTTMuUkVTUFVFU1RBLlNVQkVTVEFET1MgPSBuZXcgQXJyYXkob2xQcm9jZXNvc00zLlJFU1BVRVNUQS5TVUJFU1RBRE9TKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TaSBsb3MgcHJvY2Vzb3Mgbm8gdmllbmVuIGNvbW8gdW4gYXJyYXksIGNvbnZlcnRpcmxvXHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3NNMy5SRVNQVUVTVEEuU1VCRVNUQURPUy5mb3JFYWNoKHN1YnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YnMuTTNQUk9DRVNPUyAhPT0gdW5kZWZpbmVkICYmIHN1YnMuTTNQUk9DRVNPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YnMuTTNQUk9DRVNPUyA9IG5ldyBBcnJheShzdWJzLk0zUFJPQ0VTT1MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvc00zKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgTTNwcm9jZXNvcywgZGVzZGUgZWwgaWRkaWFyaW8uXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0TTNQcm9jZXNvc0J5SWREaWFyaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZERpYXJpbzogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJJZERpYXJpb1wiOiBzSWREaWFyaW8gfTtcclxuICAgICAgICB2YXIgb00zUHJvY2VzbztcclxuICAgICAgICBvTTNQcm9jZXNvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL0dldE0zUHJvY2Vzb3NCeUlkRGlhcmlvLycgKyBzSURLYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIE0zcHJvY2Vzb3MsIFRlbmllbmRvIGVsIElETTMuICAgIFxyXG4gICAgcHVibGljIE0zR2V0X00zUHJvY2Vzb3NCeUlkTTMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJRE0zOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZywgc1ViaWNhY2lvbjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIHViaWNFeHRlcm5vID0gZmFsc2UsIGJBUExQYWdvc1BEID0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgdmFyIG9EYXRhO1xyXG4gICAgICAgIG9EYXRhID0geyBcIklkTTNcIjogc0lETTMsIFwiSWRQcm9jZXNvXCI6IHNJZFByb2Nlc28gfTtcclxuICAgICAgICBpZiAoYkFQTFBhZ29zUEQpIHtcclxuICAgICAgICAgICAgb0RhdGEuYkFQTFBhZ29zUEQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL0dldFByb2Nlc29NM0J5SWRNMy8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IGFueTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgLy9WYWxpZGFyIHF1ZSBsYSB1YmljYWNpb24gYWN0dWFsZXMgdmFsaWRhIHBhcmEgZWwgcHJvY2Vzb1xyXG4gICAgICAgICAgICAvL3BjYXN0cm8sIHNlIGNvbWVudGFyZWEgcG9ycXVlIG5vIGZ1bmNpb25hIGNvbiB0ZiwgcmV0b3JuYSBwYXJhIFRGIFNJRU1QUkUgTlVMTCwgbm8gc2UgbWFuZWphIHViaWNhY2lvbmVzXHJcbiAgICAgICAgICAgIC8vU2UgY29sb2NhIGRpZiBhIDAsIHBvciB2ZXJzaW9uIFRGLCBxdWUgbm8gdXRpbGl6YSBmdW5jaW9uYWxpZGFkIGRlIFViaWNhY2lvbmVzXHJcbiAgICAgICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZS50b1N0cmluZygpICE9IFwiMFwiICYmIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlLnRvU3RyaW5nKCkgIT0gc1ViaWNhY2lvbi50b1N0cmluZygpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXViaWNFeHRlcm5vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b21hIGVsIHByb2Nlc28gcXVlIHRpZW5lIHBvciBkaW5hbWljYSBfSURNM1JldG9tYWRvIGVsIGlkbTMgZW52YWlkbyBwb3IgcGFyYW1ldHJvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lETTMgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb3NCeUlkTTNSZXRvbWFkbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lETTM6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJpZE0zUmV0b21hZG9cIjogc0lETTMgfTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL2dldE0zUHJvY2Vzb3NCeUlkTTNSZXRvbWFkby8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgcHJvY2VzbyBNMywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkIE0zIHkgSWRwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lETTMgXHJcbiAgICAgKiBAcGFyYW0gc0lkUHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBzVWJpY2FjaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNHZXRfTTNQcm9jZXNvc0J5SWRNM0FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSURNMzogc3RyaW5nLFxyXG4gICAgICAgIHNJZFByb2Nlc286IHN0cmluZywgc1ViaWNhY2lvbjogc3RyaW5nLCBiQVBMUGFnb3NQRDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJJZE0zXCI6IHNJRE0zLCBcIklkUHJvY2Vzb1wiOiBzSWRQcm9jZXNvIH07XHJcbiAgICAgICAgdmFyIHJlc3A7XHJcbiAgICAgICAgaWYgKGJBUExQYWdvc1BEKSB7XHJcbiAgICAgICAgICAgIG9EYXRhLmJBUExQYWdvc1BEID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9HZXRQcm9jZXNvTTNCeUlkTTMvJyArIHNJREthdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgcHJvY2VzbyBNMywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkRGlhcmlvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gaWREaWFyaW8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtM19nZXRQcm9jZXNvTTNCeUlkRGlhcmlvQXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGlkRGlhcmlvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0RhdGE7XHJcbiAgICAgICAgb0RhdGEgPSB7IFwiaWREaWFyaW9cIjogaWREaWFyaW8gfTtcclxuICAgICAgICB2YXIgcmVzcDogYW55ID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL20zX2dldFByb2Nlc29NM0J5SWREaWFyaW8vJyArIHNJREthdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIGVzdHVyY3R1cmFzIGRlIGxhcyBjYXB0dXJhcyBkaW5hbWljYXMgYXNvY2lhZGFzIGF1biBwcm9jZW9zIHkgdW4gaWRwcm9jZXNvXHJcbiAgICBwdWJsaWMgbTNfZ2V0X2RhdGFfY2FwdF9kaW5hbShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy8vb0RhdGEgPSB7XCJpZF9wcm9jZXNvXCI6XCJcIixcImlkX3N1Yl9wcm9jZXNvXCI6XCJcIn07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL20zX2dldF9kYXRhX2NhcHRfZGluYW0vJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIFJldG9ybmEgZWwgUlBUZW1wbGF0ZSBwYXJhIGVsIGFybWFkbyBkZWwgUmVwb3J0ZVxyXG4gICAgLy8gICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAvLyAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgLy8gICogQHBhcmFtIGlkX3JlcCBcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIGFzeW5jIGdldF90ZW1wbGF0ZV9yZXBvcnRlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9yZXA6IHN0cmluZykge1xyXG4gICAgLy8gICAgIHZhciBvRGF0YTtcclxuICAgIC8vICAgICB2YXIgcmVzcDtcclxuICAgIC8vICAgICB2YXIgb0pzb247XHJcbiAgICAvLyAgICAgb0RhdGEgPSB7IFwiaWRfcmVwXCI6IGlkX3JlcCB9O1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvZ2V0X3RlbXBsYXRlX3JlcG9ydGUvJyArIGlkX2thdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgLy8gICAgICAgICBvSnNvbiA9IEpTT04ucGFyc2UocmVzcCk7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBvSnNvbjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgY2F0Y2h7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbG9zIHByb2Nlc29zIGFzb2NpYWRvcyBhIHVuYSBwZXJzb25hXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0RhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb0J5UGVyc29uYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL00zR2V0UHJvY2Vzb0J5UGVyc29uYS8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb0J5SWREaWFyaW9DaWVycmUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldFByb2Nlc29CeUlkRGlhcmlvQ2llcnJlLycgKyBpZF9rYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHByb2Nlc29zIE9mZiBsaW5lXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0RhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb3NPZmZMaW5lKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvTTNHZXRQcm9jZXNvc09mZkxpbmUvJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9lbmEgZWwgVERldGFsbGVQcm9jZXNvIGRlIHVuIHByb2Nlc28gZGFkb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM19kZXRhbGxlUHJvY2Vzb0J5UHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9tM19kZXRhbGxlUHJvY2Vzb0J5UHJvY2Vzby8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKS5SRVNQVUVTVEEuRGV0YWxsZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2YWxpZGFyRXhpc3RlbmNpYVByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL3ZhbGlkYXJFeGlzdGVuY2lhUHJvY2Vzby8nICsgaWRLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIG9Qcm9kdWN0bzogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgIHB1YmxpYyBQcmVjaW9Ub3RhbDogbnVtYmVyOyAvL1ByZWNpbyBpbmNsdXllbmRvIGxhcyBwcm9tb2Npb25lc1xyXG4gICAgcHVibGljIFByZWNpb1RvdGFsUHJvbW9jaW9uOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsb3JUb3RhbE1vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIExpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByb21vY2lvbmVzQXNvY2lhZGFzIHtcclxuICAgIHB1YmxpYyBJRFByb21vY2lvbjogbnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZTtcclxuICAgIHB1YmxpYyBWYWxvcjtcclxuICAgIHB1YmxpYyBWYWxvclBvcmNlbnRhamUgPSAwO1xyXG4gICAgcHVibGljIExpc3RPYnNTS1UgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgcHVibGljIFByb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhID0gbnVsbDtcclxuICAgIHB1YmxpYyBWYWxvck1vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIElkQ3Vwb246IHN0cmluZyA9IG51bGw7XHJcbiAgICBwdWJsaWMgUmVnbGE6IHN0cmluZztcclxuICAgIHB1YmxpYyBBcGxpY2FkYTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBUaXBvOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgUmVnbGFPYnNlcTogc3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkT2JzZXE6IG51bWJlcjtcclxuICAgIHB1YmxpYyBmbGFncyA9IHsgZm9ybWFQYWdvOiBmYWxzZSB9O1xyXG4gICAgcHVibGljIGxJZEFjdGl2YVByb21vOiBBcnJheTxudW1iZXI+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUHJvbW9jaW9uQ29tYmluYWRhIHtcclxuICAgIHB1YmxpYyBJZFByb21vY2lvblhQcm9jZXNvOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb25Db21iaW5hZGE6IG51bWJlcjtcclxuICAgIHB1YmxpYyBUaXBvMjogc3RyaW5nO1xyXG4gICAgcHVibGljIE5vbWJyZTogc3RyaW5nO1xyXG4gICAgcHVibGljIEFjY2lvbjogYW55O1xyXG4gICAgLy9wdWJsaWMgSWRDb25kaWNpb246c3RyaW5nOyAvL0VzdG8gcGFyYSBhZ3J1cGFjaW9uIGRlIGxhIHByb21vY2lvbiBkZSBjb21iby5cclxufSIsImV4cG9ydCBjbGFzcyBNYXRoVEYge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByb3VuZChhOiBhbnksIGRlY2ltYWxzOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgbXVsdGlwbG9EZTEwID0gTWF0aC5wb3coMTAsIGRlY2ltYWxzKTtcclxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgrYSAqIG11bHRpcGxvRGUxMCkgLyBtdWx0aXBsb0RlMTA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJvdW5kVjIoYTogYW55LCBkZWNpbWFsczogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoKCsoTWF0aC5yb3VuZCgrKGEgKyAnZScgKyBkZWNpbWFscykpICsgJ2UnICsgLWRlY2ltYWxzKSkudG9GaXhlZChkZWNpbWFscykpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgdG9GaXhlZChudW1iZXIsIGRlY2ltYWxzKSB7XHJcbiAgICAgICAgdmFyIHggPSBNYXRoLnBvdygxMCwgTnVtYmVyKGRlY2ltYWxzKSArIDEpO1xyXG4gICAgICAgIHJldHVybiAoTnVtYmVyKG51bWJlcikgKyAoMSAvIHgpKS50b0ZpeGVkKGRlY2ltYWxzKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgTTNFTkNQUk9NTyB9IGZyb20gJy4vTW9kZWxzL00zRU5DUFJPTU8uY2xhc3MnO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gJy4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGUnO1xyXG5pbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gJy4vTW9kZWxzL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzJztcclxuaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSAnLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlJztcclxuaW1wb3J0IHsgTTNERVRDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNERVRDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgUHJvbW9jaW9uZXNBc29jaWFkYXMsIFByb21vY2lvblByb2Nlc2FkYSwgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSAnLi9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCB7IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvbS1jb21iJztcclxuaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zJztcclxuaW1wb3J0IHsgTTNQRW5jRlAgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWZwJztcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhcyc7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tICcuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgX2l0ZXJhYmxlRGlmZmVyc0ZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jb3JlL3NyYy9hcHBsaWNhdGlvbl9tb2R1bGUnO1xyXG5pbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUEl0ZW1zV0VCIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXMnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRHZW5lcmFsLnR5cGUnO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tICcuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvJztcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlJztcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlJztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcbmV4cG9ydCBjbGFzcyBwcm9tb2Npb25lc1NlcnZpY2Uge1xyXG4gICAgcHVibGljIG9NYXRoVEY6IE1hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHB1YmxpYyBnb0RhdGFVc2VyOiBhbnk7XHJcbiAgICBwdWJsaWMgZ29EYXRhQWRpY2lvbmFsOiBNM1BJdGVtc1dFQjtcclxuICAgIHB1YmxpYyBnb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9EYXRhVXNlcjogYW55LCBvRGF0YUFkaWNpb25hbDogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0aGlzLmdvRGF0YVVzZXIgPSBvRGF0YVVzZXI7XHJcbiAgICAgICAgdGhpcy5nb0RhdGFBZGljaW9uYWwgPSBvRGF0YUFkaWNpb25hbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlcmF0b3JzID0ge1xyXG4gICAgICAgICc8JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPCBiIH0sXHJcbiAgICAgICAgJz4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA+IGIgfSxcclxuICAgICAgICAnPD0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA8PSBiIH0sXHJcbiAgICAgICAgJz49JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPj0gYiB9LFxyXG4gICAgICAgICdJR1VBTCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09IGIgfSxcclxuICAgICAgICAnRElGRic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICE9IGIgfSxcclxuICAgICAgICAnRU4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB9LFxyXG4gICAgICAgICdBTkQnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiIH0sXHJcbiAgICAgICAgJ09SJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfHwgYiB9LFxyXG4gICAgICAgICcqJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRydWUgfSxcclxuICAgICAgICAnTU9EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgJSBiID09IDAgfSxcclxuICAgICAgICAvLyAuLi5cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vVmVyaWZpY2FyIHByb21vY2lvbmVzLCBpbmdyZXNhbmRvIGNvbW8gcGFyYW1ldHJvIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIHZhbGlkYXIsIFViaWNhY2lvblxyXG4gICAgcHVibGljIFZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgbFRpcG9zUHJvbW86IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGFSZXNwcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGFQcm9tb2Npb25lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgdGhpcy5nb00zRU5DUFJPTU8gPSBvTTNFTkNQUk9NTztcclxuICAgICAgICBpZiAob00zRU5DUFJPTU8pIHtcclxuICAgICAgICAgICAgb00zRU5DUFJPTU8uZmlsdGVyKHggPT4gbFRpcG9zUHJvbW8uZmluZChwcm9tbyA9PiB4LlRpcG8gPT0gcHJvbW8pKS5mb3JFYWNoKGVuY2FiZXphZG9Qcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZFZpZ2VuY2lhID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLlZpZ2VuY2lhKTtcclxuICAgICAgICAgICAgICAgIHZhciBkSW5pY2lvID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLkluaWNpbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMDIzLCBzZSBxdWl0YSBUaXBvIE1hbnVhbCwgeSBzZSBkZWphIGVsIG51ZXZvIHBhcmFtZXRyby5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXJFc3RhZG9zRW5jUHJvbW8oZW5jYWJlemFkb1Byb21vKSAmJiAoZW5jYWJlemFkb1Byb21vLkVzdGFkbyAmJiBkVmlnZW5jaWEgPj0gaG95ICYmIGRJbmljaW8gPD0gaG95KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vLy8vLy8gVmFsaWRhY2lvbjogMS4gU2kgZXMgZGlmZXJlbnRlIGEgTWFudWFsLCBubyB2YWxpZGEgVmFyaWFibGUgZXN0YWRvcyBtYW51YWxlcy4gRGUgbG8gY29udHJhcmlvIGxvIHZhbGlkYS4gLS0tIDIuIFNpIGVsIGVzdGFkbyBlbCBlc3RhZG8gZXMgdmVyZGFkZXJvIHkgbGEgdmlnZW5jaWEgZXMgbWF5b3IgbyBpZ3VhbCBhIGxhIGZlY2hhIGRlbCBtb21lbnRvXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaChhZ3J1cGFjaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckFncnVwYWNpb25Qcm9tbyhvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBhZ3J1cGFjaW9uLCBlbmNhYmV6YWRvUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFSZXNwcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2V0SlJlc3BGcm9tQXJyYXkoYVJlc3BzLCBlbmNhYmV6YWRvUHJvbW8uVGlwbywgZW5jYWJlemFkb1Byb21vLlRpcG8yKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVmFsaWRhY2lvbiBkZSBhY2Npb24sIHNpIGV4aXN0ZSwgc2lubyBleGlzdGUgc2UgYWdyZWdhIGRlbCBwYXBhLiBTZSBlbnZpYSBjb21vIHJlZmVyZW5jaWEganJlc3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBlbmNhYmV6YWRvUHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihlbmNhYmV6YWRvUHJvbW8sIGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYVByb21vY2lvbmVzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gYVByb21vY2lvbmVzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhckVzdGFkb3NFbmNQcm9tbyhlbmNhYmV6YWRvUHJvbW86IE0zRU5DUFJPTU8pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZXN0YWRvID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc01hbnVhbCAmJiAhZW5jYWJlemFkb1Byb21vLkVzdGFkb01hbnVhbGVzKSB7XHJcbiAgICAgICAgICAgIGVzdGFkbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc0FwbEN1cG9uICYmICFlbmNhYmV6YWRvUHJvbW8uRXN0YWRvQXBsQ3Vwb24pIHtcclxuICAgICAgICAgICAgZXN0YWRvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXN0YWRvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGFncnVwYWNpb24gZGUgcHJvbW9jaW9uZXMsIGluZ3Jlc2FuZG8gY29tbyBwYXJhbWV0cm8gbGEgaW5mb3JtYWNpb24gZGVsIHByb2R1Y3RvIGEgdmFsaWRhciwgVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQWdydXBhY2lvblByb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGFncnVwYWNpb246IE0zQ09ORElBR1JVUEFDSU9OLCBvTTNFbmNQcm9tbzogTTNFTkNQUk9NTykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaWNpb246IE0zQ09ORElQUk9NTztcclxuICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcztcclxuICAgICAgICAgICAgY29uZGljaW9uID0gYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9baV07XHJcbiAgICAgICAgICAgIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmICghakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEIHx8IGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBcIlJFR0lTVFJPXCIpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG9NM0VuY1Byb21vLlRpcG8gPT0gXCJDT01CSU5BREFcIiAmJiBvTTNFbmNQcm9tby5UaXBvMiA9PSBcIkNPTUJPXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uICYmIGFncnVwYWNpb24uT3BlcmFkb3IudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJPUlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZ3J1cGFjaW9uLk9wZXJhZG9yLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQU5EXCIgJiYgIWpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vTGEgY29uZGljaW9uIE5PIHNlIGN1bXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWdydXBhY2lvbi5PcGVyYWRvci50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIk9SXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9MYSBjb25kaWNpb24gc2UgY3VtcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGRlYmUgZ3VhcmRhciBsYSBpbmZvcm1hY2nDg8Kzbi4gU2kgc2llbXByZSBmdWVyb24gT1IgeSBGQUxTRSwgc2UgZGViZSBjb21wYXJhciBjb21vIHVuIEFORC5cclxuICAgICAgICAgICAgICAgICAgICBhUmVzcHMucHVzaChqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRKUmVzcEZyb21BcnJheShhUmVzcHMsIG9NM0VuY1Byb21vLlRpcG8sIG9NM0VuY1Byb21vLlRpcG8yKTtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbmRpY2lvbiBkZSBwcm9tb2Npb25lcy5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PKSB7XHJcbiAgICAgICAgdmFyIGpBZGljaW9uYWVzO1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqQWRpY2lvbmFlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckNvbmRpY2lvbkNvbnRyYURhdGEob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgY29uZGljaW9uLCBqQWRpY2lvbmFlcyk7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBjb25kaWNpb24uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICB0aGlzLkFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uKTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGEganNvbiBkZSByZXNwdWVzdGEgc2kgc2UgZ2VuZXJvIE9LIGxhIGluZm9ybWFjaW9uIGRlIGxhIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpSZXNwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8pIHtcclxuICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLklEQ29uZGljaW9uID0gY29uZGljaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WZXJpZmljYSBjb25kaWNpb24sIGNvbnRyYSBkYXRhIGluZ3Jlc2FkYS5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25Db250cmFEYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpOiBhbnkge1xyXG4gICAgICAgIHZhciBvYmplY3RGaW5kZWQ7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuRXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvL1ZhIGEgZXN0cnVjdHVyYSBkZSBwcm9kdWN0byBhZGljaW9uYWxcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMb00zUHJkQWRpY2lvbmFsZXNcIjpcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RGaW5kZWQgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaWMgPT4gYWRpYy5BVFJJQlVUTy50cmltKCkgPT0gY29uZGljaW9uLkNvbmNlcHRvLnRyaW0oKSAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oYWRpYy5WQUxPUi50cmltKCksIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKVxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEZpbmRlZC5KQWRpY2lvbmFsZXMgPSBKU09OLnN0cmluZ2lmeShqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9iamVjdEZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUFJEVE9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0sIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUkRHUlBcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvUFJER1JQKG9UeXBlTTNQcmRHcnAsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJNM0RFVENPTkRJUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbi5NM0RFVENPTkRJUFJPTU8sIGNvbmRpY2lvbi5Db25jZXB0bywgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9DRVNPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfUEFHT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJQcm9jZXNvRm9ybWFQYWdvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfTElTVEFQXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLnZlcmlmaWNhclByb2Nlc29MaXN0YVByZWNpbyhvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YSwgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFESUNJT05BTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQ0FSQUNURVJJU1RJQ0FTXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vRXN0YSBwcm9tb2Npw4PCs24gZXN0YSBkaXNlw4PCsWFkYSBwYXJhIHF1ZSBzZWEgcHJvY2VzYWRhIGFsIGZpbmFsIGRlIGxhIHRyYW5zYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24uTTNERVRDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRKUmVzcEZyb21BcnJheShhUmVzcHM6IEFycmF5PGFueT4sIHRpcG8sIHRpcG8yKSB7XHJcbiAgICAgICAgdmFyIGJBUExDb25kaWNpb247XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIGlmIChhUmVzcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvL0xMZWdhIGEgZXN0ZSBwdW50bywgcG9yIGFsZ3VuYSBkZSAyIHJhem9uZXM6IFxyXG4gICAgICAgICAgICAvLzEuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBPUiB5IHRvZG9zIHNvbiBGQUxTRVxyXG4gICAgICAgICAgICAvLzIuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBBTkQgeSB0b2RvcyBzb24gVFJVRVxyXG4gICAgICAgICAgICBiQVBMQ29uZGljaW9uID0gYVJlc3BzLmZpbHRlcihyZXNwID0+IHJlc3AuQVBMQ29uZGljaW9uKTtcclxuICAgICAgICAgICAgaWYgKCFiQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aXBvID09IFwiQ09NQklOQURBXCIgJiYgdGlwbzIgPT0gXCJDT01CT1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFycmVnbG9Db25kaWNpb25lcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGJBUExDb25kaWNpb24uZm9yRWFjaChjb25kaWNpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uLklEQ29uZGljaW9uLmxlbmd0aCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb24uSURDb25kaWNpb24uZm9yRWFjaChpZENvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJlZ2xvQ29uZGljaW9uZXMuZmluZCh4ID0+IHggPT0gaWRDb24pKSBhcnJlZ2xvQ29uZGljaW9uZXMucHVzaChpZENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyZWdsb0NvbmRpY2lvbmVzLmZpbmQoeCA9PiB4ID09IGNvbmRpY2lvbi5JRENvbmRpY2lvbikpIGFycmVnbG9Db25kaWNpb25lcy5wdXNoKGNvbmRpY2lvbi5JRENvbmRpY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBBUExDb25kaWNpb246IHRydWUsIEFjY2lvbjogbnVsbCwgSURDb25kaWNpb246IGFycmVnbG9Db25kaWNpb25lcyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFSZXNwVE1QID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICAvL1ZlcmlmaWNhciBzaSBhbGd1bm8gZGUgbG9zIGFycmVnbG9zIHRpZW5lIGFjY2lvbiBkaWZlcmVudGUgYSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BUTVAgPSBhUmVzcHMuZmlsdGVyKHJlc3AgPT4gcmVzcC5BY2Npb24gIT0gbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFSZXNwVE1QLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc2FyIGVsIHVsdGltbyBpdGVtLCBxdWUgdGVuZ2EgbGEgYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gYVJlc3BUTVBbYVJlc3BUTVAubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSBhUmVzcHNbYVJlc3BzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGEgcHJvbW8gZGVwZW5kZSBkZSBsYSBmb3JtYSBkZSBwYWdvIGHDg8KxYWRlIGVzdGEgaW5mb3JtYWNpw4PCs25cclxuICAgICAgICAgICAgaWYgKGFSZXNwcy5maW5kKHggPT4geC5Gb3JtYVBhZ28pKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcFtcIkZvcm1hUGFnb1wiXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLy9HZW5lcmFyIFJlc3B1ZXN0YSBkZSBjb25kaWNpb24uXHJcbiAgICBwdWJsaWMgR2VuZXJhclJlc3B1ZXN0YShiQVBMUHJvbW86IGJvb2xlYW4sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqUmVzcCA9IHsgXCJBUExDb25kaWNpb25cIjogYkFQTFByb21vLCBcIkFjY2lvblwiOiBudWxsIH07XHJcbiAgICAgICAgaWYgKGpBZGljaW9uYWxlcyAhPSBudWxsICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLkFjY2lvbiA9IGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGxQcmVjaW9zOiBBcnJheTxhbnk+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB2YWxvcmVzOiBBcnJheTxhbnk+ID0gY29tYmkuQWNjaW9uLlZhbG9yZXM7XHJcbiAgICAgICAgICAgIC8vdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IGxQcmVjaW9zLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIGJFbnRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiAoYS5DYW50aWRhZCA8IGIuQ2FudGlkYWQpID8gMSA6ICgoYi5DYW50aWRhZCA8IGEuQ2FudGlkYWQpID8gLTEgOiAwKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLkFwbGljYXJQcm9tb0J5VmFsb3Jlcyh2YWxvcmVzLCBsUHJlY2lvcywgbFByZWNpb3MubGVuZ3RoKTsvL0pBR00gMjAxOTA3MzEsIGZ1bmNpb24gcmVjdXJzaXZhIHBhcmEgY2FsY3VsYXIgbG9zIHByZWNpb3MgbnVldm9zLlxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBsUHJlY2lvczogQXJyYXk8YW55PiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55ID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JlczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5WYWxvcmVzO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiBhLkNhbnRpZGFkIC0gYi5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWxvclByb21vID0gaSA8IHZhbG9yZXMubGVuZ3RoID8gdmFsb3Jlc1tpXS5WYWxvciA6IDBcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSAoKCtsUHJlY2lvc1tpXS5QVU5JVE5FVE8pICogKCgrdmFsb3JQcm9tbykgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBBcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlczogQXJyYXk8YW55PiwgbFByZWNpb3M6IEFycmF5PGFueT4sIHJlc2lkdW9FbnRyYW50ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IHJlc2lkdW9FbnRyYW50ZTsvLyBKQUdNIDIwMTkwNzMxIG51ZXZvIHBhcmFtZXRybyA9IGxQcmVjaW9zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxvcmVzLmxlbmd0aDsgaSsrKSB7Ly9KQUdNIDIwMTkwNzMwIHNlIGFncmVnYSBmdW5jaW9uYWxpZGFkIHBhcmEgcXVlIHNlIHB1ZWRhIHRlbmVyIHZhcmlvcyB2YWxvcmVzLlxyXG4gICAgICAgICAgICB2YXIgaUNhbnRpZGFkUHJvbW86IG51bWJlciA9IHZhbG9yZXNbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHZhciB2YWxvclByb21vOiBudW1iZXIgPSB2YWxvcmVzW2ldLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgICAgIHZhciBSZXNpZHVvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIFJlc2lkdW8gPSBpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlcywgbFByZWNpb3MsIFJlc2lkdW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSArbFByZWNpb3MubGVuZ3RoIC0gK3Jlc2lkdW9FbnRyYW50ZTsgaSA8ICtsUHJlY2lvcy5sZW5ndGggLSArUmVzaWR1bzsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gK2xQcmVjaW9zW2ldLlBVTklUTkVUTyAtICgoK2xQcmVjaW9zW2ldLlBVTklUTkVUTykgKiAoKCt2YWxvclByb21vKSAvIDEwMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFybWFyIG51ZXZvIGFycmVnbG8sIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBhcnJlZ2xvIGVudHJhbnRlLiBTZSByZWNvcnJlIGRlIGF0cmFzIGhhY2lhIGFkZWxhbnRlIHkgc2UgdmEgY3JlYW5kbyBlbCBudWV2byBhcnJlZ2xvXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gcmVzaWR1byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFybWFyTnVldm9BcnJheURlc2RlUmVzaWR1byhsUHJlY2lvczogQXJyYXk8YW55PiwgcmVzaWR1bykge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc1Jlc2lkdW8gPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbFByZWNpb3MubGVuZ3RoIC0gMTsgaSA+IHJlc2lkdW87IGktLSkge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NSZXNpZHVvLnB1c2gobFByZWNpb3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBcm1hck51ZXZvQXJyYXREZXNkZVJlc2lkdW9cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsUHJlY2lvc1Jlc2lkdW87XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcHJvbW9jaW9uZXMgcG9yIHByb2Nlc29zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGVsIE0zIHByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgT2JqZXRvLCBjb24gbGEgaW5mb3JtYWNpb24gZGUgdG9kb3MgbG9zIE0zUHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gT2JqZXRvIGNvbiBpbmZvcm1hY2lvbiBkZSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBkZSBpbmZvcm1hY2lvbiBhZGljaW9uYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGVsIHByb2Nlc28gdGllbmUgdW5hIGZvcm1hIGRlIHBhZ28gcXVlIGN1bXBsYSBjb24gbGEgY29uZGljaW9uIGVudHJhbnRlLCBoYWNlIHVuICBwYXNzIHRydWUsIGxhIGxvZ2ljYSBzZSBoYWNlIGRlc2RlIGxhIGZvcm1hIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJvY2Vzb0Zvcm1hUGFnbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIGxldCBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIGpSZXNwW1wiRm9ybWFQYWdvXCJdID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgdmVyaWZpY2FyUHJvY2Vzb0xpc3RhUHJlY2lvKG9MaXN0YVByZWNpbzogTTNQcmRMaXN0YSwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9MaXN0YVByZWNpb1tjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHByb21vY2lvbmVzIHBvciBwcm9jZXNvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBNMyBwcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIE0zIFByb2Nlc29zIE9iamV0bywgY29uIGxhIGluZm9ybWFjaW9uIGRlIHRvZG9zIGxvcyBNM1Byb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvZHVjdG8ob00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob00zUHJkR2VuZXJhbFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBkZSBwcm9kdWN0byBhZ3J1cGFkby5cclxuICAgICAqIEBwYXJhbSBvVHlwZU0zUHJkR3JwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvZHVjdG9QUkRHUlAob1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob1R5cGVNM1ByZEdycFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBhZGljaW9uYWwsIGVzdGEgaW5mb3JtYWNpb24gYWRpY2lvbmFsIGVzdGEgZW4gdW5hIHZhcmlhYmxlIGdsb2JhbDogZ29EYXRhQWRpY2lvbmFsXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICBpZiAodGhpcy5nb0RhdGFBZGljaW9uYWxbY29uZGljaW9uLkNvbmNlcHRvXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXSh0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIk1PRFwiICYmICt0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dID4gK2NvbmRpY2lvbi5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgaW5mb3JtYWNpb24gY29udHJhIHVzdWFyaW8gZGF0YS5cclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICBpZiAodGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10gIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0odGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10uaW5jbHVkZXMoJywnKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10uc3BsaXQoJywnKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShlbGVtZW50LCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbnRyYSBlbCBkZXRhbGxlIGRlIGxhIGNvbmRpY2nDg8KzblxyXG4gICAgcHVibGljIFZlcmlmaWNhY2lvbk0zRGV0YWxsZUNvbmRpY2lvbihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLFxyXG4gICAgICAgIGRldENvbmRpY2lvbmVzOiBBcnJheTxNM0RFVENPTkRJUFJPTU8+LCBjb25jZXB0b0NvbmRpY2lvbjogc3RyaW5nLCBqQWRpY2lvbmFsZXNDb25kaWNpb24pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIG9kZXRDb25kaWNpb25lc0ZpbmRlZDtcclxuICAgICAgICBzd2l0Y2ggKGNvbmNlcHRvQ29uZGljaW9uLnRyaW0oKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLUDFcIjpcclxuXHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLCBvVHlwZU0zUHJkR3JwLlNLUDEpKTtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9TS1AxKzJcIjpcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIG9UeXBlTTNQcmRHcnAuU0tQMSArIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uU0tQMikpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLVVwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLlNLVS50b1N0cmluZygpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX0RJU1BcIjpcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUudG9TdHJpbmcoKSwgZGV0LlZhbG9yLnRvU3RyaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfVElQT1wiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVHlwZU0zUHJkR3JwLlRJUE8udG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFwiUEVSX1BST0NFU09cIjovLyogU29sbyB2YWxpZGEgdW5hIGRldENvbmRpY2lvblxyXG4gICAgICAgICAgICAgICAgbGV0IHBlclhQcm9jZXNvOiBNM1BlclhQcm9jZXNvO1xyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgcGVyWFByb2Nlc28gPSBvTTNQcm9jZXNvcy5NM1BlclhQcm9jZXNvLmZpbmQoeCA9PiB4LlRpcG9QZXJzb25hID09IGRldENvbmRpY2lvbmVzWzBdLlZhbG9yLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJFTlwiICYmIHBlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXNbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uID09IFwiRElGRlwiICYmICFwZXJYUHJvY2Vzbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzWzBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiQUxNQUNFTlwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvTTNVYmljYWNpb24uSURVYmljYWNpb24udG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiSE9SQVJJT19IT1JBXCI6XHJcbiAgICAgICAgICAgICAgICB2YXIgb1RpbWVOb3c6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVGltZU5vdy5nZXRIb3VycygpLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIkxvTTNQcmRBZGljaW9uYWxlc1wiOlxyXG4gICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuQ29uY2VwdG8gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBWbHJBZGkgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5Db25jZXB0bykuVkFMT1JcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IudG9TdHJpbmcoKSwgVmxyQWRpLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgLy9Qcm9jZXNvc1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb25jZXB0b0NvbmRpY2lvbi5zcGxpdChcIl9cIilbMF0udHJpbSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlBST0NcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gY29uY2VwdG9Db25kaWNpb24uc3BsaXQoXCJfXCIpWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgb00zUHJvY2Vzb3NbcHJvcGVydHldKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVU0VSXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGNvbmNlcHRvQ29uZGljaW9uLnNwbGl0KFwiX1wiKVsxXS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtwcm9wZXJ0eV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJObyBFbnRybyBwb3IgRGV0YWxsZSFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL1ZhbGlkYXIgcmVzcHVlc3RhLCBjb24gb2JqZXRvIGEgdmFsaWRhclxyXG4gICAgcHVibGljIFZhbGlkYXJSZXNwdWVzdGEob2JqZWN0VmFsaWRhdGUpIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGpBZGljaW9uYWxlcztcclxuICAgICAgICBpZiAob2JqZWN0VmFsaWRhdGUpIHtcclxuICAgICAgICAgICAgakFkaWNpb25hbGVzID0gSlNPTi5wYXJzZShvYmplY3RWYWxpZGF0ZS5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MjUgQWdyZWdhciBzZWNjaW9uIGRlIHZhbGlkYWNpb25lcy5cclxuICAgICAgICAgICAgdmFyIGJSZXNwID0gdGhpcy5WYWxpZGFjaW9uZXNCeUpBZGljaW9uYWxlcyhqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIGlmIChiUmVzcCkge1xyXG4gICAgICAgICAgICAgICAgLy9TZSBlbnZpYSBlbiBhZGljaW9uYWxlcywgZWwganNvbiBkZSBsYSBpbmZvcm1hY2lvbiBlbmNvbnRyYWRhIGRlbCBkZXRhbGxlLlxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcmVnbGFzIGNvbmZpZ3VyYWRhcyBkZXNkZSBKU09OIGRlIEFkaWNpb25hbGVzXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhY2lvbmVzQnlKQWRpY2lvbmFsZXMoakFkaWNpb25hbGVzOiBhbnkpIHtcclxuICAgICAgICB2YXIgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlZhbGlkYWNpb25lc0J5SkFkaWNpb25hbGVzXCIpXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTICYmIGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5USVBPKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5USVBPKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlZJR0VOQ0lBXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdGhpcy5WYWxpZGFyVmlnZW5jaWEoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlZBTDEsIGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5WQUwyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqRXJyb3JcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBWYWxpZGFyVmlnZW5jaWEodmFsMTogRGF0ZSwgdmFsMjogRGF0ZSkge1xyXG5cclxuICAgICAgICB2YXIgRmVjaGFBY3R1YWwgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHZhbDEpXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codmFsMilcclxuXHJcbiAgICAgICAgLy8gdmFyIGRWYWwxID0gbmV3IERhdGUodmFsMSk7XHJcbiAgICAgICAgLy8gdmFyIGRWYWwyID0gbmV3IERhdGUodmFsMik7XHJcblxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGRWYWwxKVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGRWYWwyKVxyXG5cclxuXHJcbiAgICAgICAgdmFyIG5GZWNoYUFjdHVhbDogbnVtYmVyID0gK3RoaXMuR2V0RmVjaGFOdW1iZXIoRmVjaGFBY3R1YWwpOyAvLysoRmVjaGFBY3R1YWwuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBGZWNoYUFjdHVhbC5nZXRNb250aCgpICsgXCJcIiArIEZlY2hhQWN0dWFsLmdldERhdGUoKSk7XHJcbiAgICAgICAgdmFyIG5WYWwxOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcih2YWwxKTsgLy8rKGRWYWwxLmdldEZ1bGxZZWFyKCkgKyBcIlwiICsgZFZhbDEuZ2V0TW9udGgoKSArIFwiXCIgKyAoK2RWYWwxLmdldERhdGUoKSArIDEpICk7XHJcbiAgICAgICAgdmFyIG5WYWwyOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcih2YWwyKSAvLysoZFZhbDIuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkVmFsMi5nZXRNb250aCgpICsgXCJcIiArICgrZFZhbDIuZ2V0RGF0ZSgpICsgMSkgKTtcclxuICAgICAgICBpZiAobkZlY2hhQWN0dWFsID49IG5WYWwxICYmIG5GZWNoYUFjdHVhbCA8PSBuVmFsMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RmVjaGFOdW1iZXIoZGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIHZhciBkID0gbW9tZW50KGRhdGUpLmZvcm1hdCgnWVlZWU1NREQnKTtcclxuICAgICAgICByZXR1cm4gZDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WYWxpZGFyIGFjY2lvbiwgc2kgbm8gdGllbmUgY2FyZ2FkYSB1bmEuIEVzdGEgYWNjaW9uIHNlIGNhcmdhIGplcmFycXVpY2FtZW50ZS5cclxuICAgIHB1YmxpYyBWYWxpZGFyQWNjaW9uKGpSZXNwLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIganNvbkFkaWMgPSBKU09OLnBhcnNlKGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgaWYgKGpSZXNwLkFjY2lvbiA9PSBudWxsICYmIGpzb25BZGljLlJPT1QuQWNjaW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgalJlc3AuQWNjaW9uID0ganNvbkFkaWMuUk9PVC5BY2Npb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vUmV0b21hciBpbmZvcm1hY2nDg8KzbiBcclxuICAgIHB1YmxpYyBSZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihvTTNFTkNQUk9NTzogTTNFTkNQUk9NTywgalJlc3ApIHtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24gPSB7fTtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24uTm9tYnJlID0gb00zRU5DUFJPTU8uTm9tYnJlO1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbi5JRCA9IG9NM0VOQ1BST01PLklkUHJvbW9jaW9uO1xyXG4gICAgICAgIC8vU2kgbm8gdHV2byBuaW5ndW5hIGFjY2lvblxyXG4gICAgICAgIGlmIChqUmVzcC5BY2Npb24gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSB7IFwiVGlwbzJcIjogb00zRU5DUFJPTU8uVGlwbzIsIFwiVGlwb1wiOiBvTTNFTkNQUk9NTy5UaXBvIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vIFJldG9tYXIgZGVzZGUgZWwgZW5jYWJlemFkbyBwcm9tbywgc2kgbm8gZXhpc3RlIGVsIHRpcG8geSBUaXBvMlxyXG4gICAgICAgICAgICBpZiAoIWpSZXNwLkFjY2lvbi5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8yID0gb00zRU5DUFJPTU8uVGlwbzI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFqUmVzcC5BY2Npb24uVGlwbykge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8gPSBvTTNFTkNQUk9NTy5UaXBvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIHByb21vY2nDg8KzbiwgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIGFwbGljYXIgbGEgcHJvbW9jaW9uIHkgbGFzIHByb21vY2lvbmVzIGEgYXBsaWNhclxyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9jaW9uKEpQcm9tb2Npb25lczogQXJyYXk8YW55Piwgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGdzSWRLYXRpb3MgPSBudWxsKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICBsZXQgc3BsaXRQcmVjaW8gPSB0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICB2YXIgb0xpc3RhRmluZGVkID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBzcGxpdFByZWNpb1swXSk7XHJcbiAgICAgICAgbGV0IHByZWNpb01vbmVkZXJvID0gMDtcclxuICAgICAgICBsZXQgbGlzdGFBcGxpY2FkYSA9IFwiVmFsb3JcIjtcclxuICAgICAgICBpZiAob0xpc3RhRmluZGVkICYmIHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChzcGxpdFByZWNpb1sxXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxCXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdGFBcGxpY2FkYSA9IFwiTEJcIjtcclxuICAgICAgICAgICAgICAgICAgICBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTGlzdGFGaW5kZWQuTEI7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTENcIjpcclxuICAgICAgICAgICAgICAgICAgICBsaXN0YUFwbGljYWRhID0gXCJMQ1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9MaXN0YUZpbmRlZC5MQztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RhQXBsaWNhZGEgPSBcIkxEXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxEO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgaWYgKGdzSWRLYXRpb3MgIT0gbnVsbCAmJiBnc0lkS2F0aW9zID09IFwiQ1ROXCIpIHtcclxuICAgICAgICAgICAgcHJlY2lvTW9uZWRlcm8gPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKS5QUkVDSU87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTywgcHJlY2lvTW9uZWRlcm8sIGxpc3RhQXBsaWNhZGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gcXVlIHNlIGhhY2VuIHZhbGlkYXMgZGVzcHVlcyBkZSByZWdpc3RyYXIgdG9kb3MgbG9zIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSBKUHJvbW9jaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQWZ0ZXIoSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9NM1Byb2Nlc29zLlZhbG9yTmV0bztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb00zUHJvY2Vzb3MuVmFsb3JOZXRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiBlbiBnZW5lcmFsXHJcbiAgICAgKiBAcGFyYW0gSlByb21vY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIG5QcmVjaW8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lczogQXJyYXk8YW55PiwgblByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgcHJlY2lvTW9uZWRlcm8gPSAwLCBsaXN0YUFwbGljYWRhID0gXCJWYWxvclwiKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzOiBQcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB2YXIgb0xpc3RhUHJvbW9zQXNvYyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxuICAgICAgICBsZXQgcHJlY2lvQXNpZ25hZG8gPSBuUHJlY2lvO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBKUHJvbW9jaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIC8vSlByb21vY2lvbmVzLmZvckVhY2gocHJvbW9jaW9uID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21vY2lvbiA9IEpQcm9tb2Npb25lc1tfaV07XHJcbiAgICAgICAgICAgIC8vIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLkFjY2lvbi5UaXBvMiAhPSBudWxsICYmIHByb21vY2lvbi5BY2Npb24uVGlwbzIgPT0gXCJNT05FREVST1wiICYmIHByZWNpb01vbmVkZXJvID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByZWNpb01vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0J5VGlwbyhwcm9tb2Npb24sIHByZWNpb0FzaWduYWRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTywgbGlzdGFBcGxpY2FkYSk7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MucHVzaChvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlZhbGlkYXJNZWpvclByb21vY2lvbihvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBwcmVjaW9Nb25lZGVybyk7XHJcblxyXG4gICAgICAgIC8vIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5wdXNoKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPCAwKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL0ZTIDIwMTkwNzI1IFJlZG9kbmVvIGRlIGxvcyB2YWxvcmVzIHRvdGFsZXNcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpb24gZGUgbWVqb3Igb3BjaW9uLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIHByb21vY2lvbmVzIHByb2Nlc2FkYXMuXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RhUHJvbW9zQXNvYyBMaXN0YSBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBQcm9tb2Npb24gcHJvY2VzYWRhLCBxdWUgcmV0b3JuYXLDg8KhIGEgZmx1am8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTWVqb3JQcm9tb2Npb24ob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG1vbmVkZXJvOiBudW1iZXIpOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIGxldCBwcm9tb0Fzb2NpYWRhUmVzdHJpbmdpZG8gPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlRpcG8gPT0gXCJSRVNUUklDQ0lPTlwiKTtcclxuICAgICAgICAvL1NpIGVsIHByb2R1Y3RvIGVzdGEgcmVzdHJpbmdpZG8gbGUgZGEgbWF5b3IgcHJpb3JpZGFkIGEgZXN0YSBwcm9tb2Npw4PCs25cclxuICAgICAgICBpZiAoIXByb21vQXNvY2lhZGFSZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAvLzEuIFN1bWEgZGUgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcbiAgICAgICAgICAgIC8vdmFyIGRQcm9tb0FDTTogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgLy9kUHJvbW9BQ00gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTVwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgbGV0IGRQcm9tb0VYQyA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiRVhDXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vQUNNRElOID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJBQ01ESU5cIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIC8vUHJvbW9jaW9uZXMgTm8gQWN1bXVsYWJsZXNcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJvbW9BQ01ESU4gPCBkUHJvbW9FWEMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vRVhDKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9BQ01ESU4ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcblxyXG4gICAgICAgICAgICAvL1JlY29ycmVyIHRvZGFzIGxhcyBwcm9tb2Npb25lcyBBY3VtdWxhYmxlc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiICYmICF4LmZsYWdzLmZvcm1hUGFnbykpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vbmVkZXJvICE9IDAgJiYgcHJvbW8uVGlwbyA9PSBcIk1PTkVERVJPXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCttb25lZGVybykgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCttb25lZGVybykgLSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHByb21vLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBwcm9tby5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tby5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLy8vLy8vRlVOQ0lPTkFMSURBRCBQUk9EUklBIEZVTkNJT05BUiBNw4PCgVMgQURFTEFOVEUsIFNJIFNFIFFVSUVSRSBBR1JVUEFSIExBUyBQUk9NT0NJT05FUyBBQ00gWSBFWENcclxuICAgICAgICAgICAgLy8gaWYoZFByb21vQUNNID09IDAgJiYgZFByb21vRVhDID09IDApe1xyXG4gICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzZSBlbmNvbnRyYXJvbiBwcm9tb2Npb25lcycpO1xyXG4gICAgICAgICAgICAvLyB9ZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgIGlmKGRQcm9tb0FDTSA+IGRQcm9tb0VYQyl7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9HYW5hIHByb21vY2lvbmVzIGFjdW11bGF0aXZhcy5cclxuICAgICAgICAgICAgLy8gICAgICAgICBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIikuZm9yRWFjaCh4ID0+IHguQXBsaWNhZGEgPSB0cnVlKTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gb0xpc3RhUHJvbW9zQXNvYzsvLy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBkUHJvbW9BQ00pICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIGRQcm9tb0FDTSkgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLlZhbG9yTW9uZWRlcm8pLCAwKTtcclxuICAgICAgICAgICAgLy8gICAgIH1lbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vR2FuYSBwcm9tb2Npb25lcyBleGNsdXllbnRlcy5cclxuICAgICAgICAgICAgLy8gICAgICAgICBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykuQXBsaWNhZGEgPSB0cnVlOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvTGlzdGFQcm9tb3NBc29jLy8ucHVzaChvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykpO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gZFByb21vRVhDKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBkUHJvbW9FWEMpICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykuVmFsb3JNb25lZGVybztcclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KHByb21vQXNvY2lhZGFSZXN0cmluZ2lkbyk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gPSAwO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgfVxyXG5cclxuICAgIGFwbGljYVByb21vRVhDKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCB2YWxvclByb21vRVhDOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHJvbW9FeGM6IFByb21vY2lvbmVzQXNvY2lhZGFzO1xyXG4gICAgICAgIGlmICh2YWxvclByb21vRVhDID4gMCkge1xyXG4gICAgICAgICAgICBwcm9tb0V4YyA9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gdmFsb3JQcm9tb0VYQyB8fCB4LlZhbG9yTW9uZWRlcm8gPT0gdmFsb3JQcm9tb0VYQyk7XHJcbiAgICAgICAgICAgIHByb21vRXhjLkFwbGljYWRhID0gdHJ1ZTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBwcm9tb0V4Yy5WYWxvcik7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHByb21vRXhjLlZhbG9yKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gcHJvbW9FeGMuVmFsb3JNb25lZGVybztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhcGxpY2FQcm9tb0FDTURJTihvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgdmFsb3JQcm9tb0FDTURJTjogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHZhbG9yUHJvbW9BQ01ESU4gPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYSA9PSBcIkFDTURJTlwiKSkge1xyXG4gICAgICAgICAgICAgICAgcHJvbW8uQXBsaWNhZGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gcHJvbW8uVmFsb3JNb25lZGVybztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSB2YWxvclByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgdmFsb3JQcm9tb0FDTURJTik7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZWwgbWF4aW1vIHZhbG9yIHNlZ3VuIGxhIHJlZ2xhIGEgY29tcGFyYXJcclxuICAgICAqIEBwYXJhbSBvTGlzdGFQcm9tb3NBc29jIFxyXG4gICAgICogQHBhcmFtIHNSZWdsYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIHNSZWdsYTogc3RyaW5nLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB2YXIgcmVzdWx0OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoc1JlZ2xhKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQUNNXCI6XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVzdWx0ID0gb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IHNSZWdsYSAmJiAheC5mbGFncy5mb3JtYVBhZ28pLnJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuVmFsb3IpLCAwKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJBQ01ESU5cIjpcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJlY2lvQWN0dWFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JUb3RhbERlc2N1ZW50byA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tbyBvZiBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01ESU5cIiAmJiAoIXguZmxhZ3MuZm9ybWFQYWdvIHx8IHguVGlwbyA9PSBcIk1PTkVERVJPXCIpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW8uVmFsb3JQb3JjZW50YWplID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAocHJlY2lvQWN0dWFsICogcHJvbW8uVmFsb3JQb3JjZW50YWplIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb0FjdHVhbCAtPSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbERlc2N1ZW50byArPSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvQWN0dWFsIC09IHByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbERlc2N1ZW50byArPSBwcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxvclRvdGFsRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkVYQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBzUmVnbGEgJiYgKCF4LmZsYWdzLmZvcm1hUGFnbyB8fCB4LlRpcG8gPT0gXCJNT05FREVST1wiKSkubWFwKGZ1bmN0aW9uIChvKSB7IHJldHVybiBvLlZhbG9yID4gby5WYWxvck1vbmVkZXJvID8gby5WYWxvciA6IG8uVmFsb3JNb25lZGVybzsgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhciBwcm9tb2Npb24gc2VndW4gZWwgdGlwbyBcclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQnlUaXBvKHByb21vY2lvbjogYW55LCBQcmVjaW86IG51bWJlciwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGxpc3RhQXBsaWNhZGEgPSBcIlZhbG9yXCIpOiBQcm9tb2Npb25lc0Fzb2NpYWRhcyB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIEFjY2lvbjtcclxuICAgICAgICAgICAgdmFyIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBQcm9tb2Npb25lc0Fzb2NpYWRhcygpO1xyXG4gICAgICAgICAgICBpZiAocHJvbW9jaW9uLkFjY2lvbiAhPSBudWxsICYmIHByb21vY2lvbi5Qcm9tb2Npb24gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSURQcm9tb2Npb24gPSBwcm9tb2Npb24uUHJvbW9jaW9uLklEO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZSA9IHByb21vY2lvbi5Qcm9tb2Npb24uTm9tYnJlO1xyXG4gICAgICAgICAgICAgICAgQWNjaW9uID0gcHJvbW9jaW9uLkFjY2lvbjtcclxuICAgICAgICAgICAgICAgIGlmIChBY2Npb24uUmVnbGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGEgPSBBY2Npb24uUmVnbGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYSA9IFwiRVhDXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlRpcG8gPSBBY2Npb24uVGlwbzI7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsb3JBcGxpY2FyID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2lvbltsaXN0YUFwbGljYWRhXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yQXBsaWNhciA9IEFjY2lvbltsaXN0YUFwbGljYWRhXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fJVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yUG9yY2VudGFqZSA9ICt2YWxvckFwbGljYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gKCtQcmVjaW8pICogKCgrdmFsb3JBcGxpY2FyKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fVkFMT1JcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSB2YWxvckFwbGljYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fRVhBQ1RcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAoK1ByZWNpbykgLSAoK3ZhbG9yQXBsaWNhcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJPQlNFUVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IEFjY2lvbi5PQlNFUVVJT1M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYU9ic2VxID0gQWNjaW9uLlJlZ2xhT2JzZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckNhbnRpZGFkT2JzZXF1aW9zKG9NM0VOQ1BST01PLCBBY2Npb24uT0JTRVFVSU9TLCBvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3ZhbGlkYXIgY2FudGlkYWQgdnMgY2FudGlkYWQgZGUgb2JzcXVpb3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1PTkVERVJPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yTW9uZWRlcm8gPSArQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0ZTIDIwMTkwODI3IFlhIG5vIHNlIGd1YXJkYSBlbCB2YWxvciB0b3RhbCBkZWwgbW9uZWRlcm8gc2kgbm8gdW5pY2FtZW50ZSBlbCBwb3JjZW50YWplLi4uIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqICgoK0FjY2lvbi5WYWxvcikgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQ1VQT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSWRDdXBvbiA9IEFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkFDVElWQV9QUk9NT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5sSWRBY3RpdmFQcm9tbyA9IEFjY2lvbi5WYWxvci5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUkVTVFJJQ0NJT05fUEFHT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJSRVNUUklDQ0lPTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5UaXBvID0gQWNjaW9uLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFwiTU9EX0NBTlRJREFEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vdGhpcy5BcGxpY2FyUmVnbGFNb2RDYW50aWRhZChvUHJvbW9jaW9uZXNBc29jaWFkYXMsIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIEFjY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBY2Npb24uVGlwbyA9PSBcIkNPTUJJTkFEQVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYSA9IG5ldyBQcm9tb2Npb25Db21iaW5hZGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEgPSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSURQcm9tb2Npb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yID0gQWNjaW9uLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5Ob21icmUgPSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTm9tYnJlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5BY2Npb24gPSBBY2Npb247XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQ2FtcG9zQWRpY2lvbmFsZXMob00zRU5DUFJPTU8sIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEsIHByb21vY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb2Npb24uRm9ybWFQYWdvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLmZsYWdzLmZvcm1hUGFnbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gb1Byb21vY2lvbmVzQXNvY2lhZGFzO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBWYWxpZGFyQ2FudGlkYWRPYnNlcXVpb3Mob00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LFxyXG4gICAgICAgIG9ic2VxdWlvczogQXJyYXk8YW55Piwgb1Byb21vY2lvbmVzQXNvY2lhZGFzOiBQcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgdmFyIFZhbG9yQ2FudFBSRDogbnVtYmVyID0gLTE7XHJcbiAgICAgICAgICAgIHZhciBWYWxvckNhbnRQUkRSZWFsOiBudW1iZXIgPSB0aGlzLmdvRGF0YUFkaWNpb25hbC5kQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgcHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBjb25kaXByb21vID0geC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZGlwcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIFZhbG9yQ2FudFBSRCA9ICtjb25kaXByb21vLlZhbG9yXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIFZhbG9yQ2FudFBSRCA9IDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5DYW50aWRhZE9ic2VxID0gVmFsb3JDYW50UFJEXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBjYW1wb3MgYWRpY2lvbmFsZXMgZW4gcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNFTkNQUk9NTyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uQ29tYmluYWRhIFxyXG4gICAgICogQHBhcmFtIHByb21vY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJDYW1wb3NBZGljaW9uYWxlcyhvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSwgcHJvbW9jaW9uOiBhbnkpIHtcclxuICAgICAgICBzd2l0Y2ggKG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIpIHtcclxuICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgLy9BZ3JlZ2FyIENhbnRpZGFkLlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNWYWxvckNhbnRpZGFkOiBzdHJpbmcgPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25kaXByb21vID0geC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpcHJvbW8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc1ZhbG9yQ2FudGlkYWQgPSBjb25kaXByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNWYWxvckNhbnRpZGFkID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5DYW50aWRhZE9ic3EgPSBzVmFsb3JDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiWENBUkFDVEVSSVNUSUNBXCI6XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgICAgICAvLyBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGpBZGljOmFueSA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgIC8vIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLkNsYXNpZmljYWNpb24gPSBqQWRpYy5ST09ULkFjY2lvbi5DYXJhY3RlcmlzdGljYTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiQ09NQk9cIjpcclxuICAgICAgICAgICAgICAgIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLk51bUNvbmRpY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uTnVtQ29uZGljaW9uZXMgPSBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTlswXS5NM0NPTkRJUFJPTU8ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vY2lvbi5JRENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLklkQ29uZGljaW9uID0gcHJvbW9jaW9uLklEQ29uZGljaW9uXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBQcm9jZXNhbWllbnRvIENvbWJpbmFkYSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAvL1Byb2Nlc2FyIHByb21vY2lvbmVzIGNvbWJpbmFkYXNcclxuICAgIHB1YmxpYyBQcm9jZXNhckNvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuUHJvbW9Db21iaW5hZGFzVjIob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9jZXNhckNvbWJpbmFkYVwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1YyIENPTUJJTkFEQVxyXG4gICAgLyoqXHJcbiAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGlzdGEgZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhcyBkZSBNM1Byb2Nlc29zXHJcbiAgICogQHBhcmFtIGlvTTNQcm9jZXNvIE9iamV0byBNMyBQcm9jZXNvcywgZWwgY3VhbCBzZSByZWNvcnJlcsODwqEgbGEgaW5mb3JtYWNpb24gZGUgbGlzdGEgZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAqL1xyXG4gICAgcHVibGljIFByb21vQ29tYmluYWRhc1YyKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICBsZXQgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsID0gXy5jbG9uZURlZXAoaW9NM1Byb2Nlc28uTTNFTkMpO1xyXG5cclxuICAgICAgICBpZiAoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0Q29tYmluYWRhc0Zyb21EaW5hbWljYXMoaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIHZhciBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhc1tpXTtcclxuICAgICAgICAgICAgdmFyIGVzQWN1bXVsYWJsZSA9IHRoaXMuR2V0RXNBY3VtdWxhYmxlUHJvbW8oY29tYmkpXHJcbiAgICAgICAgICAgIC8vL09idGVuZXIgdG9kb3MgbG9zIEVuY2FiZXphZG9zIHF1ZSBhcGxpY2FuIGEgbGEgcHJvbW9jaW9uIGEgbGEgcXVlIHNlIGVzdGEgaXRlcmFuZG9cclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IHRoaXMuR2V0RW5jYWJlemFkb0J5Q29tYmkoY29tYmksIGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgc3dpdGNoIChjb21iaS5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHByb21vY2lvbiBlczogMyBnYXNlb3NhcyBwb3IgJDUwMFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Qcm9jZXNhclByb21vT2JzcUNpZXJyZShsUHJlY2lvcywgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRX1NVTVRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhck9ic2VxU3VtVG90YWwob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiLCBjb21iaSwgbFByZWNpb3MsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiWENBUkFDVEVSSVNUSUNBUEFSQ0lBTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3JkZW5hckxpc3RhRW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyQ2FyYWN0ZXJpc3RpY2FQYXJjaWFsKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJDT01CT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGxDb21ibyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFwbENvbWJvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwbENvbWJvID0gdGhpcy5Qcm9tb2Npb25Db21iaW5hZGFDb21ibyhsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fVkFMT1JUT1RBTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxSZWdsYUNvbWJWYWxvclRvdGFsKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9EX0FQTERFU0NcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvZHVjdG9BcGxEZXNjKG9MaXN0RW5jYWIsIGNvbWJpLCBpb00zUHJvY2VzbywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHByb21vY2lvbiBlcyBwYXJhIDJ4MSwgM3gxLCA0eDIsIC4uLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTGlzdEVuY2FiICYmIG9MaXN0RW5jYWIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlYyhsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vU2UgcmVlc3RhYmxlY2UgbGEgY2FudGlkYWQgb3JpZ2luYWwgcGFyYSBxdWUgbm8gc2UgcXVlZGUgZW4gdW4gYnV2bGUgaW5maW5pdG9cclxuICAgICAgICBmb3IgKGNvbnN0IG9NM1BFbmNPcmlnaW5hbGVzIG9mIGVuY0NvbkxhQ2FudGlkYWRPcmlnaW5hbCkge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRPcmlnaW5hbCA9IG9NM1BFbmNPcmlnaW5hbGVzLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0FjdHVhbCA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklEID09IG9NM1BFbmNPcmlnaW5hbGVzLklEKTtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGNhbnRpZGFkT3JpZ2luYWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9yZGVuYXJMaXN0YUVuYyhvbGlzdGFFbmM6IE0zUEVuY0l0ZW1zW10sIGVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgIGlmIChlc0FjdW11bGFibGUpIG9saXN0YUVuYy5zb3J0KChhLCBiKSA9PiAoK2IuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUTkVUTycpLlZhbG9yKSAtICgrYS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpKTtcclxuICAgICAgICBlbHNlIG9saXN0YUVuYy5zb3J0KChhLCBiKSA9PiAoK2IuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVCcpLlZhbG9yKSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBcGxSZWdsYUNvbWJWYWxvclRvdGFsKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgQWNjaW9uID0gY29tYmkuQWNjaW9uO1xyXG4gICAgICAgIHZhciBjYW50aWRhZERlc2NQcm9tbzogbnVtYmVyID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICBsZXQgcHJlY2lvVG90YWxDb21wcmE6IG51bWJlciA9IGxQcmVjaW9zLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSArIE51bWJlcihiLlBVTklUTkVUTyk7IH0sIDApO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcocHJlY2lvVG90YWxDb21wcmEpO1xyXG4gICAgICAgIGxldCBkZXNjQWN1bSA9IDA7XHJcbiAgICAgICAgbGV0IGRlc2NQcm9kQWN0dWFsO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxQcmVjaW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGRlc2NQcm9kQWN0dWFsID0gKGxQcmVjaW9zW2ldLlBVTklUTkVUTyAvIHByZWNpb1RvdGFsQ29tcHJhKSAqIGNhbnRpZGFkRGVzY1Byb21vIC8vNDBcclxuICAgICAgICAgICAgZGVzY0FjdW0gKz0gZGVzY1Byb2RBY3R1YWw7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gbFByZWNpb3NbaV0uUFVOSVRORVRPIC0gZGVzY1Byb2RBY3R1YWw7XHJcbiAgICAgICAgICAgIC8vIGlmIChjYW50aWRhZERlc2NQcm9tbyA+IDApIHtcclxuICAgICAgICAgICAgLy8gICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gICAgIGlmIChsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPCBjYW50aWRhZERlc2NQcm9tbykge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGNhbnRpZGFkRGVzY1Byb21vIC09IGxQcmVjaW9zW2ldLlBVTklUTkVUTztcclxuICAgICAgICAgICAgLy8gICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSAwO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLT0gY2FudGlkYWREZXNjUHJvbW87XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW50aWRhZERlc2NQcm9tbyA+IGRlc2NBY3VtIHx8IGNhbnRpZGFkRGVzY1Byb21vIDwgZGVzY0FjdW0pIHtcclxuICAgICAgICAgICAgLy9maW5kIGRlbCB1bHRpbW8gXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJFbmNvbnRyZSBkaWZlcmVuY2lhIGVuIHByb21vcyBjb21iaW5hZGFzOiBcIiArIGNhbnRpZGFkRGVzY1Byb21vICsgXCIgdnMgXCIgKyBkZXNjQWN1bSk7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zW2xQcmVjaW9zLmxlbmd0aCAtIDFdLlBVTklUTkVUTyA9IGxQcmVjaW9zW2xQcmVjaW9zLmxlbmd0aCAtIDFdLlBVTklUTkVUTyAtIChjYW50aWRhZERlc2NQcm9tbyAtIGRlc2NBY3VtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsUHJlY2lvcy5maW5kKHggPT4geC5BcGxpY2FkbykpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJPYnNlcVN1bVRvdGFsKHByb2R1Y3Rvc0FwbGljYVByb21vOiBNM1BFbmNJdGVtc1tdLCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCB2YWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICBsZXQgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICBsZXQgY2FudGlkYWRPYnNlcXVpb3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZFByb2R1Y3RvQWN0dWFsID0gMTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBsZXQgdmFsb3JDb21ibyA9IDA7XHJcbiAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBlbmNJdGVtIG9mIHByb2R1Y3Rvc0FwbGljYVByb21vKSB7XHJcbiAgICAgICAgICAgIGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgICAgICBsZXQgcFVuaXRBY3R1YWwgPSArZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRBY3R1YWwgPSArZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB3aGlsZSAoY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA8PSBjYW50aWRhZEFjdHVhbCkge1xyXG4gICAgICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zICs9IHBVbml0QWN0dWFsO1xyXG4gICAgICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCsrO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0b1JldmlzYWRvID0gcHJvZHVjdG9zUmV2aXNhZG9zLmZpbmQoeCA9PiB4LklkID09IGVuY0l0ZW0uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2R1Y3RvUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b1JldmlzYWRvLkNhbnRpZGFkKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MucHVzaCh7IElkOiBlbmNJdGVtLklELCBDYW50aWRhZDogMSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdW1hVmFsb3JQcm9kdWN0b3MgKyBkaWZlcmVuY2lhID49IHZhbG9yUHJvbW8pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckNvbWJvICs9IHN1bWFWYWxvclByb2R1Y3RvcztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIG9NM1Byb2Nlc29zLCBwcm9kdWN0b3NSZXZpc2Fkb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnRpZGFkT2JzZXF1aW9zKys7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IHN1bWFWYWxvclByb2R1Y3RvcyAtIHZhbG9yUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gb00zUmVnU2VydmljZS5sb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8ob00zUHJvY2Vzb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLkFjY2lvbi5Db2RpZ28sIHZhbG9yQ29tYm8sIDEpO1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBvTTNSZWdTZXJ2aWNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3NTdW1Ub3RhbChwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcykge1xyXG4gICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBsZXQgcHJvZEhpam86IE0zUEVuY0l0ZW1zO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBwcm9kUmV2aXNhZG8gb2YgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9kUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSBvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklEID09IHByb2RSZXZpc2Fkby5JZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kSGlqbyA9IF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZS5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ocHJvZEhpam8sIHByb2RSZXZpc2Fkby5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChwcm9kSGlqbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhckFQcm9kdWN0b3NRdWl0YXJDb21iaShvTTNQcm9jZXNvLCBwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm9TdW1Ub3RhbChwcm9kdWN0b3NFbk0zUHJvY2VzbzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpOiBNM1BFbmNJdGVtcyB7XHJcbiAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IHByb2R1Y3Rvc0VuTTNQcm9jZXNvLmZpbmQoeCA9PiB4LklEID09IG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbC5JRClcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gKCtvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yIC0gMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmNsb25lRGVlcChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRMaXN0YVByZWNpb3MobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc0ZpbHRlciA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zLmZpbHRlcih5ID0+IHkuSUQgPT0gb0xpc3RFbmNhYltpXS5JRCkuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zRmlsdGVyLnB1c2goeCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxQcmVjaW9zRmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvbW9jaW9uIGRlIGNvbWJvLCB4IHByb2R1Y3RvcywgeSBwcm9kdWN0b3MsIC4uLiBuIHByb2R1Y3RvcyBcclxuICAgICAqIHBvciAkMTAwMFxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKiBAcGFyYW0gYkVzQWN1bXVsYWJsZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4sIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIGxldCBmbGFnQXBsaWNvUHJvbW8gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgbk51bWVyb0NvbmRpY2lvbmVzOiBudW1iZXIgPSArY29tYmkuQWNjaW9uLk51bUNvbmRpY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JQcm9tbyA9ICtjb21iaS5BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBMaXN0Q29uZGljaW9uZXMgPSBuZXcgQXJyYXk8QXJyYXk8YW55Pj4oKTtcclxuICAgICAgICAgICAgdmFyIG1pbmltb0l0ZW1zOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICBsZXQgcG9yY2VudGFqZVByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHZhbG9yVG90YWxTaW5Qcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZTogTTNSZWdTZXJ2aWNlO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IG5OdW1lcm9Db25kaWNpb25lczsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAvL0J1c2NhciBjb25kaWNpb24gMS5cclxuICAgICAgICAgICAgICAgIHZhciBMaXN0UHJvbW9Db21iaTogQXJyYXk8TTNQRW5jSXRlbXM+ID0gdGhpcy5CdXNjYXJFbmNCeVByb21vWUNvbmQob0xpc3RFbmNhYiwgaS50b1N0cmluZygpLCBjb21iaS5JZFByb21vY2lvbkNvbWJpbmFkYS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIExpc3RDb25kaWNpb25lcy5wdXNoKHRoaXMuR2V0TGlzdGFQcmVjaW9zKGxQcmVjaW9zLCBMaXN0UHJvbW9Db21iaSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpbHRyYXJMaXN0YUNvbmRpY2lvbmVzQ29tYm8oTGlzdENvbmRpY2lvbmVzLCBvTGlzdEVuY2FiKTtcclxuICAgICAgICAgICAgaWYgKExpc3RDb25kaWNpb25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0J1c2NhciBlbCB2YWxvciBtZW5vciBkZSBsYXMgaXRlbXMgYWdyZWdhZGFzXHJcbiAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IExpc3RDb25kaWNpb25lc1swXS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGorKykgey8vQ29taWVuemEgZGVzZGUgMSBwb3JxdWUgZWwgMCB5YSBzZSB2YWxpZG8gZW4gbGEgYW50ZXJpb3IgbGluZWFcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXNQcmVjaW9zOiBBcnJheTxhbnk+ID0gTGlzdENvbmRpY2lvbmVzW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXdNaW4gPSBpdGVtc1ByZWNpb3MubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdNaW4gPCBtaW5pbW9JdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IG5ld01pbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL0xvcyBjb21ib3MgZGViZW4gcHJvY2VzYXJzZSBkZSBhIHVubyBwYXJhIHN1IGNvcnJlY3RvIGZ1bmNpb25hbWllbnRvXHJcbiAgICAgICAgICAgICAgICBpZiAobWluaW1vSXRlbXMgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1vSXRlbXMgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vUmVjb3JyZSB0b2RvcyBsb3MgcHJlY2lvcyBkZSBsb3MgcHJvZHVjdG9zIGRlIGxhIHByb21vIHBhcmEgc2FiZXIgY3VhbCBlcyBlbCB2YWxvciByb2FsIGRlIGxhIHByb21vXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaSA9IExpc3RDb25kaWNpb25lc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IG1pbmltb0l0ZW1zOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuYzogYW55ID0gY29uZGlbbF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5Qcm9tbyArPSArbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9DYWxjdWxhIGVsIHZhbG9yIGRlbCBwb3JjZW50YWplIGRlIGxhIHByb21vIGEgcGFydGlyIGRlbCBjYWxvciBkZWwgY29tYm8geSBkZSBsYSBzdW1hIGRlIGxvcyBwcmVjaW9zIG9yaWdpbmFsZXMgZGUgbG9zIHByb2R1Y3Rvc1xyXG4gICAgICAgICAgICAgICAgcG9yY2VudGFqZVByb21vID0gMTAwIC0gKCtWYWxvclByb21vICogMTAwIC8gdmFsb3JUb3RhbFNpblByb21vKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaSA9IExpc3RDb25kaWNpb25lc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IG1pbmltb0l0ZW1zOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuYzogYW55ID0gY29uZGlbbF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5mb3JFYWNoKHByZWNpbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlY2lvLkluZGljZSA9PSBlbmMuSW5kaWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVjaW8uUHJvbW9BcGxpY2FkYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3IgPSBwcmVjaW8uUFVOSVRORVRPO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Nb2RpZmljYSBlbCBwcmVjaW8gZGUgbG9zIHByb2R1Y3RvcyBhIHN1IG51ZXZvIHZhbG9yIGNvbiBsYSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlBVTklUTkVUTyA9IHZhbG9yIC0gKHZhbG9yICogcG9yY2VudGFqZVByb21vIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlByb21vQXBsaWNhZGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBpb00zUHJvY2VzbywgcHJlY2lvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRW4gbGFzIHByb21vcyBwb3IgY29tYm8gbm8gYXBsaWNhbiBlbCBwcmVjaW8gZGUgbG9zIG90cm9zIHByb2R1Y3RvcyBxdWUgbm8gaGFjZW4gcGFydGUgZGVsIGNvbWJvIDopXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2xQcmVjaW9zLmZpbmQoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LkluZGljZSA9PSBlbmMuSW5kaWNlKS5QVU5JVE5FVE8gPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ0FwbGljb1Byb21vID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdBcGxpY29Qcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbGV0IHByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gY29tYmkuQWNjaW9uLkNvZGlnbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFwcm9kdWN0b1Byb21vQ29tYmlFeGlzdGVudGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZS5sb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8oaW9NM1Byb2Nlc28sIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLkFjY2lvbi5Db2RpZ28sIGNvbWJpLkFjY2lvbi5WYWxvciwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubGltcGlhckVuY0l0ZW1QcmRDb25kaShvTGlzdEVuY2FiKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9tb2Npb25Db21iaW5hZGFDb21ib1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWdBcGxpY29Qcm9tbztcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhsaXN0Q29uZGljaW9uZXM6IEFycmF5PGFueT4sIG9NM1BFbmNJdGVtc0xpc3Q6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0Q29uZGljaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBudWV2YUNvbmRpY2lvbiA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmRpY2lvbiBvZiBsaXN0Q29uZGljaW9uZXNbX2ldKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5jSXRlbSA9IG9NM1BFbmNJdGVtc0xpc3QuZmluZCh4ID0+IHguSUQgPT0gY29uZGljaW9uLklEKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbmNJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRldENhbnRpZGFkID0gZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA9IGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA/IGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldENhbnRpZGFkID4gZW5jSXRlbVtcIlByZENvbmRpXCJdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51ZXZhQ29uZGljaW9uID0gW2NvbmRpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY0l0ZW1bXCJQcmRDb25kaVwiXSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGlzdENvbmRpY2lvbmVzW19pXSA9IG51ZXZhQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsaW1waWFyRW5jSXRlbVByZENvbmRpKG9NM1BFbmNJdGVtc0xpc3Q6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIG9NM1BFbmNJdGVtc0xpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIGVsZW1lbnRbXCJQcmRDb25kaVwiXTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkID0gMSkge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b1F1aXRhcjtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0gPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByb2R1Y3RvUXVpdGFyID0gb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdLmZpbmQoeCA9PiB4LklEID09IG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG9RdWl0YXIpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9RdWl0YXIuQ2FudGlkYWQgKz0gKC0xICogY2FudGlkYWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdLnB1c2goeyBJRDogb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8sIENhbnRpZGFkOiAoLTEgKiBjYW50aWRhZCkgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZ3JlZ2EgZWwgcHJvZHVjdG8gZGUgbGEgbGlzdGEgZGUgZW50cmFkYSBhIHVuIGFycmVnbG8gZGUgcHJvZHVjdG9zIHF1ZSBwb3N0ZXJpb3JtZW50ZSBzZXJhIGxvcyBwcm9kdWN0b3MgaGlqb3MgZGVsIHByb2R1Y3RvIENvbWJvXHJcbiAgICBhZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3MocHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gdGhpcy5nZXRQcm9kdXRvUHJvbW9Db21ibyhvTTNQcm9jZXNvLk0zRU5DLCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpO1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAvL0xhIGNhbnRpZGFkIGRpc21pbnV5ZSBwZXJvIGVzdGUgbW92aW1pZW50byBzZSByZXZlcnNhIGFsIHRlcm1pbmFyIGRlIHZhbGlkYXIgZXN0YSBwcm9tb1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhvTTNQRW5jSXRlbXMsIDEpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0Rpc21pbnV5ZSBlbiB1bm8gbGEgY2FudGlkYWQgZGVsIHByb2R1Y3RvIHkgcmV0b3JuYSB1biBjbG9uIGRlIGVzdGVcclxuICAgIGdldFByb2R1dG9Qcm9tb0NvbWJvKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IHByb2R1Y3Rvc0VuTTNQcm9jZXNvLmZpbmQoeCA9PiB4LklEID09IG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbC5JRClcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gKCtvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yIC0gMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmNsb25lRGVlcChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBlbiBoYXNobWFwIGRlIHByZWNpb3NcclxuICAgICAqIEBwYXJhbSBobWxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIElEIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkdG9IbVByZWNpb3MoaG1sUHJlY2lvczogQXJyYXk8YW55PiwgSUQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBmaW5kZWQ6IGFueSA9IGhtbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gSUQpO1xyXG4gICAgICAgIGlmIChmaW5kZWQpIHtcclxuICAgICAgICAgICAgZmluZGVkLkluZGljZSA9ICtmaW5kZWQuSW5kaWNlICsgKzE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZmluZGVkID0geyBcIklEXCI6IElELCBcIkluZGljZVwiOiAwIH07XHJcbiAgICAgICAgICAgIGhtbFByZWNpb3MucHVzaChmaW5kZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmluZGVkLkluZGljZTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1c2NhciBlbmNhYmV6YWRvcyBxdWUgdGVuZ2EgbGEgcHJvbW9jaW9uIHkgY29uZGljaW9uIGVudmlhZGEgY29tbyBwYXJhbWV0cm9cclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIFxyXG4gICAgICogQHBhcmFtIElkQ29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGlkUHJvbW9jaW9uZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBCdXNjYXJFbmNCeVByb21vWUNvbmQob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBJZENvbmRpY2lvbjogc3RyaW5nLCBpZFByb21vY2lvbmVzOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0VuY0ZpbmRlZCA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob00zUEVuY0l0ZW1zLklkRW5jUGFkcmUpXHJcbiAgICAgICAgICAgICAgICBpZiAoIW9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlIHx8ICEob00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPiAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXRDYW50aWRhZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXQgJiYgZGV0Q2FudGlkYWQgJiYgK2RldENhbnRpZGFkLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbW9zOiBBcnJheTxhbnk+ID0gSlNPTi5wYXJzZShkZXQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbW9GaW5kZWQgPSBwcm9tb3MuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gaWRQcm9tb2Npb25lcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb21vRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZGljaW9uRmluZGVkID0gcHJvbW9GaW5kZWQuQWNjaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaWNpb25GaW5kZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaWNpb25GaW5kZWQuZmluZCh4ID0+IHggPT0gSWRDb25kaWNpb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZCA9PSBJZENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0VuY0ZpbmRlZC5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvRW5jRmluZGVkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpw4PCs24gc2kgbGEgcHJvbW9jacODwrNuIHF1ZSBsbGVnYSBjb21vIHBhcmFtZXRybywgZXMgYWN1bXVsYWJsZSBvIG5vXHJcbiAgICAgKiBAcGFyYW0gcHJvbW9jaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0RXNBY3VtdWxhYmxlUHJvbW8ocHJvbW9jaW9uOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAocHJvbW9jaW9uLkFjY2lvbi5SZWdsYSAmJiBwcm9tb2Npb24uQWNjaW9uLlJlZ2xhID09IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBHZXRFc0FjdW11bGFibGVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhclByb2R1Y3RvQXBsRGVzYyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBlc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICBsZXQgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGxldCBwcm9kc0FwbERlc2N1ZW50bzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IHNrdUFwbERlc2N1ZW50b3M6IEFycmF5PGFueT4gPSBjb21iaS5BY2Npb24uc2t1QXBsRGVzYzsgLy9be1NLVTpcIlhYWFhYWFwifSwge1NLVTpcIllZWVlZWVlcIn1dXHJcbiAgICAgICAgbGV0IG1heE51bURlc2N1ZW50b3MgPSArY29tYmkuQWNjaW9uLm1heE51bURlc2M7XHJcbiAgICAgICAgbGV0IGNvbnREZXNjQXBsaWNhZG9zID0gMDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG1heE51bURlc2N1ZW50b3MpIHtcclxuICAgICAgICAgICAgICAgIC8vQ2FsY3VsYSBlbCBudW1lcm8gbWF4aW1vIGRlIGRlc2NpbmV0b3MgcXVlIHB1ZWRlIGFwbGljYXIgbGEgcHJvbW8gcXVlIGVzIGNvbWJpLkFjY2lvbi5tYXhOdW1EZXNjIG11bHRpcGxpY2FkbyBwb3IgbGEgY2FudGlkYWQgZGUgcHJvZHVjdG9zIHF1ZSBwYWxpY2FuIGxhIHByb21vIGVuIGVsIHByb2Nlc29cclxuICAgICAgICAgICAgICAgIG1heE51bURlc2N1ZW50b3MgPSBvTGlzdEVuY2FiLnJlZHVjZSgoYWNjLCBjdXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjICsgK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgICAgIH0sIDApICogbWF4TnVtRGVzY3VlbnRvcztcclxuXHJcbiAgICAgICAgICAgICAgICAvL0RlIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gZmlsdHJvIGxvcyBwcm9kdWN0b3MgcXVlIGFwbGljYXJhbiBlbCBkZXNjdWVudG8gc2VndW4gbG9zIFNLVSBjb25maWd1cmFkb3MgZW4gY29tYmkuQWNjaW9uLnNrdUFwbERlc2NcclxuICAgICAgICAgICAgICAgIGlvTTNQcm9jZXNvLk0zRU5DLmZvckVhY2gob00zUEVuY0l0ZW1zID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2t1QXBsRGVzY3VlbnRvcy5maW5kKHggPT4geC5TS1UgPT0gb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2RzQXBsRGVzY3VlbnRvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0PDg8KhbGN1bG8gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zIGRlIGxvcyBwcm9kdWN0b3MgYSBsb3MgcXVlIGxhIHByb21vIGFwbGljYXJhIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhwcm9kc0FwbERlc2N1ZW50bywgZXNBY3VtdWxhYmxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0FwbGljYSB0YW50b3MgZGVzY3VlbnRvcyBzZSBwdWVkYW4gYSBwbGFpY2FyIGEgY2FkYSB2YWxvciBkZSBsUHJlY2lvXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY29udERlc2NBcGxpY2Fkb3MgPCBtYXhOdW1EZXNjdWVudG9zICYmIGNvbnREZXNjQXBsaWNhZG9zIDwgbFByZWNpb3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTyAtPSAoK2xQcmVjaW9zW2NvbnREZXNjQXBsaWNhZG9zXS5QVU5JVE5FVE8pICogKCgrY29tYmkuQWNjaW9uLlZhbG9yKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udERlc2NBcGxpY2Fkb3MrKztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL1JlY2FsY3VsYSBsb3MgdmFsb3JlcyBkZWwgcHJvZHVjdG8gYXBsaWNhbmRvIGVsIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIHByb2RzQXBsRGVzY3VlbnRvLCBjb21iaSwgdHJ1ZSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vQ0FOVElEQUQgUE9SIFBST0RVQ1RPXHJcbiAgICAgICAgICAgICAgICBvTGlzdEVuY2FiLmZvckVhY2gocHJkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb250RGVzY0FwbGljYWRvcyA9IDBcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJkRmluZGVkID0gc2t1QXBsRGVzY3VlbnRvcy5maW5kKHggPT4geC5TS1UgPT0gcHJkLklkUHJvZHVjdG8pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJkRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2RzQXBsRGVzY3VlbnRvLnB1c2gocHJkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9DYWxjdWxhIGVsIG51bWVybyBtYXhpbW8gZGUgZGVzY2luZXRvcyBxdWUgcHVlZGUgYXBsaWNhciBsYSBwcm9tbyBxdWUgZXMgY29tYmkuQWNjaW9uLm1heE51bURlc2MgbXVsdGlwbGljYWRvIHBvciBsYSBjYW50aWRhZCBkZSBwcm9kdWN0b3MgcXVlIHBhbGljYW4gbGEgcHJvbW8gZW4gZWwgcHJvY2Vzb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhOdW1EZXNjdWVudG9zID0gK3ByZC5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciAqIHByZEZpbmRlZC5DYW50aWRhZDtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0PDg8KhbGN1bG8gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zIGRlIGxvcyBwcm9kdWN0b3MgYSBsb3MgcXVlIGxhIHByb21vIGFwbGljYXJhIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuY0J5UHJkKHByZCwgZXNBY3VtdWxhYmxlLCBsUHJlY2lvcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0FwbGljYSB0YW50b3MgZGVzY3VlbnRvcyBzZSBwdWVkYW4gYSBwbGFpY2FyIGEgY2FkYSB2YWxvciBkZSBsUHJlY2lvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb250RGVzY0FwbGljYWRvcyA8IG1heE51bURlc2N1ZW50b3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2NvbnREZXNjQXBsaWNhZG9zXS5QVU5JVE5FVE8gLT0gKCtsUHJlY2lvc1tjb250RGVzY0FwbGljYWRvc10uUFVOSVRORVRPKSAqICgoK2NvbWJpLkFjY2lvbi5WYWxvcikgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udERlc2NBcGxpY2Fkb3MrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL1JlY2FsY3VsYSBsb3MgdmFsb3JlcyBkZWwgcHJvZHVjdG8gYXBsaWNhbmRvIGVsIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIHByb2RzQXBsRGVzY3VlbnRvLCBjb21iaSwgdHJ1ZSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc2FtaWVudG8gZGUgb2JzZXF1aW9zIGVuIGVsIGNpZXJyZVxyXG4gICAgICogVmFsaWRhIHRvZGEgbGEgbGlzdGEgZGUgZW5jYWJlemFkb3MsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBjYW50aWRhZCBpbmdyZXNhZGEgZW4gZWwgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgKiBWYWxpZGEgbGEgcHJvbW9jacODwrNuLCBwb3IgY2FkYSBjdWFudG9zIHByb2R1Y3RvcyBpbmdyZXNhZG9zLCBjdcODwqFudG9zIG9ic2VxdWlvcyBzZSBwdWVkZW4gZGFyLlxyXG4gICAgICogVHJhZSB0b2RvcyBsb3Mgb2JzZXF1aW9zIHF1ZSBzZSBpbmdyZXNhcm9uIGVuIGVsIGNhcnJpdG8gZGUgY29tcHJhcywgbG9zIGxpc3RhXHJcbiAgICAgKiBjb2xvY2EgZW4gdmFsb3IgMCBsb3Mgb2JzZXF1aW9zIHF1ZSBzZWxlY2Npb25vIGF1dG9tYXRpY2FtZW50ZSBlbCBhbGdvcml0bW9cclxuICAgICAqIFJlY2FsY3VsbyBkZSBwcmVjaW9zLCBpbXB1ZXN0b3MgeSBkZW1hcyB2YWxvcmVzIHRvdGFsZXMuXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBsb3MgcHJvZHVjdG9zIGluZ3Jlc2Fkb3MgYWwgY2Fycml0byBxdWUgdGllbmVuIG9ic2VxdWlvXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgSW5mb3JtYWNpw4PCs24gZGUgcHJvbW9jacODwrNuIGRlIG9ic2VxdWlvc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFByb2Nlc28gY29uIHRvZG9zIGxvcyBwcm9kdWN0b3MgZSBpbmZvcm1hY2nDg8Kzbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9PYnNxQ2llcnJlKG9MaXN0RW5jYWI6IEFycmF5PGFueT4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBlc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpb00zUHJvY2Vzb1snUHJvZHVjdG9zQ29tYmknXSA9IFtdO1xyXG4gICAgICAgIGxldCBjYW50UG9yT2JzID0gK2NvbWJpLkFjY2lvbi5DYW50aWRhZE9ic3E7IC8vUG9yIGNhZGEgY3VhbnRvcyBwcm9kdWN0b3MgY29uIGxhIHByb21vY2nDg8KzbiBzZSBkYXLDg8KhIGVsIG9ic2VxdWlvLlxyXG4gICAgICAgIGxldCBjYW50QWdyZWdhZGEgPSAwO1xyXG4gICAgICAgIGxldCBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZE9ic2VxdWlvcyA9IDA7XHJcbiAgICAgICAgbGV0IHZhbG9yQ29tYm8gPSAwO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IG0zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgbTNSZWdTZXJ2aWNlLm9ic2VxdWlvc0V4YyA9IHRydWU7XHJcbiAgICAgICAgbTNSZWdTZXJ2aWNlLm9MaXN0YU9ic2VxdWlvcyA9IGNvbWJpLkFjY2lvbi5PQlNFUVVJT1M7XHJcbiAgICAgICAgbTNSZWdTZXJ2aWNlLm9ic2VxdWlvc0NhbnRpZGFkID0gMFxyXG4gICAgICAgIC8vIHZhciBjYW50T2JzZXF1aW9zOiBudW1iZXIgPSAwOyAvL0NhbnRpZGFkIGRlIG9ic2VxdWlvcyBxdWUgc2UgZGFyw4PCoSBwb3IgZXN0YSBjb21wcmEuXHJcblxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByb2R1Y3RvIG9mIG9MaXN0RW5jYWIpIHtcclxuICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zICs9IHByb2R1Y3RvLlBVTklUTkVUTztcclxuICAgICAgICAgICAgY2FudEFncmVnYWRhKys7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b1JldmlzYWRvID0gcHJvZHVjdG9zUmV2aXNhZG9zLmZpbmQoeCA9PiB4LklkID09IHByb2R1Y3RvLklEKTtcclxuICAgICAgICAgICAgaWYgKHByb2R1Y3RvUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3RvUmV2aXNhZG8uQ2FudGlkYWQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcy5wdXNoKHsgSWQ6IHByb2R1Y3RvLklELCBDYW50aWRhZDogMSB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNhbnRBZ3JlZ2FkYSA9PT0gY2FudFBvck9icykge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JDb21ibyArPSBzdW1hVmFsb3JQcm9kdWN0b3M7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGlvTTNQcm9jZXNvLCBwcm9kdWN0b3NSZXZpc2Fkb3MpO1xyXG4gICAgICAgICAgICAgICAgY2FudGlkYWRPYnNlcXVpb3MrKztcclxuICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY2FudEFncmVnYWRhID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNvbWJpLkFjY2lvbi5Db2RpZ28pIGNvbnNvbGUuZXJyb3IoJ0VsIGPDg8KzZGlnbyBkZWwgY29tYm8gbm8gZXN0YSBjb25maWd1cmFkbyBlbiBNM0RFVENPTkRJUFJPTU8nKVxyXG4gICAgICAgIGlmIChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmxlbmd0aCA+IDAgJiYgY29tYmkuQWNjaW9uLkNvZGlnbykge1xyXG4gICAgICAgICAgICBsZXQgcHJvZHVjdG9Db21ibyA9IG0zUmVnU2VydmljZS5sb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8oaW9NM1Byb2Nlc28sIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLkFjY2lvbi5Db2RpZ28sIHZhbG9yQ29tYm8sIDEpO1xyXG4gICAgICAgICAgICBtM1JlZ1NlcnZpY2UuYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBwcm9kdWN0b0NvbWJvLCBjYW50aWRhZE9ic2VxdWlvcyk7XHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvW1wib00zUmVnU2VydmljZVwiXSA9IG0zUmVnU2VydmljZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBcGxpY2FyIHJlZ2xhcywgcmVzcGVjdG8gYSBsYSBjYW50aWRhZCBpbmdyZXNhZGEuXHJcbiAgICAqIEBwYXJhbSBvUHJvbW9jaW9uZXNBc29jaWFkYXMgXHJcbiAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBBcGxpY2FyUmVnbGFNb2RDYW50aWRhZChsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIEFjY2lvbiA9IGNvbWJpLkFjY2lvbjtcclxuXHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFByb21vOiBudW1iZXIgPSBBY2Npb24uQ2FudGlkYWQ7IC8vRWplbXBsbyA6IDNcclxuICAgICAgICAvL3ZhciBpQ2FudGlkYWRBUExQcm9tbzogbnVtYmVyOyAvL051bWVybyByZWFsIGRlIGFwbGljYWNpb24gZGUgcHJvbW9jaW9uZXMsIFNpIGFwbGljYSByZXN0YSBlbCByZXNpZHVvLlxyXG4gICAgICAgIHZhciBpQ2FudGlkYWRSZWFsOiBudW1iZXI7IC8vQ2FudGlkYWQgcmVhbCBpbmdyZXNhZGEuXHJcbiAgICAgICAgdmFyIFZhbG9yUHJvbW86IG51bWJlciA9IEFjY2lvbi5WYWxvcjtcclxuICAgICAgICB2YXIgdmFsb3JQcm9tb1VuaXQ6IG51bWJlciA9ICgrVmFsb3JQcm9tbykgLyAoK2lDYW50aWRhZFByb21vKVxyXG4gICAgICAgIGlDYW50aWRhZFJlYWwgPSBsUHJlY2lvcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmIChpQ2FudGlkYWRSZWFsID49IGlDYW50aWRhZFByb21vKSB7IC8vSkFHTSAyMDE5MDQyNiBTRSBDQU1CSUEsIEFOVEVTIEVTVEFCQSBMQSBGVU5DSU9OQUxJREFEIERFIENBTlRJREFEIFJFQUwgVlMgQ0FOVElEQUQgUFJPTU9DSU9OLlxyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCAlIGlDYW50aWRhZFByb21vID09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vaUNhbnRpZGFkQVBMUHJvbW8gPSBpQ2FudGlkYWRSZWFsIC8gaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgUmVzaWR1bzogbnVtYmVyID0gaUNhbnRpZGFkUmVhbCAlIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICAgICAgaUNhbnRpZGFkUmVhbCA9IGlDYW50aWRhZFJlYWwgLSBSZXNpZHVvO1xyXG4gICAgICAgICAgICAgICAgLy9pQ2FudGlkYWRBUExQcm9tbyA9IGlDYW50aWRhZFJlYWwgLyBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpQ2FudGlkYWRSZWFsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPiB2YWxvclByb21vVW5pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9IHZhbG9yUHJvbW9Vbml0O1xyXG4gICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8pKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWRcIilcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXJnYXIgY29tYmluYWRhcyBkZXNkZSBkaW5hbWljYXNcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldENvbWJpbmFkYXNGcm9tRGluYW1pY2FzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHNDb21iaW5hZGEgPSBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZSA9PSBcIkNPTUJJTkFEQVwiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIG9Db21iaW5hZGEgPSBKU09OLnBhcnNlKHNDb21iaW5hZGEpO1xyXG5cclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyA9IG9Db21iaW5hZGE7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBhIGRpbmFtaWNhcyBwcm9jZXNvIGRlIGNvbWJpbmFkYXNcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZERpbmFtaWNhUHJvY2Vzb0NvbWJpbmFkYXMoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb00zUERpbmFtaWNhc0ZpbmRlZDogTTNQRGluYW1pY2FzO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQgPSBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZSA9PSBcIkNPTUJJTkFEQVwiKTtcclxuICAgICAgICBpZiAob00zUERpbmFtaWNhc0ZpbmRlZCkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4gPSBKU09OLnBhcnNlKG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyclByb21vLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb21vQ29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSA9IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gYXJyUHJvbW9baV0uSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvUHJvbW9Db21iaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMucHVzaChhcnJQcm9tb1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IFwiQ09NQklOQURBXCI7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXIgcHJvbW9jaW9uZXMsIHNlZ3VuIGxhIGxpc3RhIGRlIHByZWNpb3MgZGl2aWRpZGEuXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgTGlzdGEgZGUgcHJlY2lvcywgY29udHJhIGVzdGUgb2JqZXRvIHNlIGl0ZXJhcsODwqEgeSBzZSBvcmRlbmFyw4PCoSBkZSBtYXlvciBhIG1lbm9yXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlYyhsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIFRpcG9Qcm9tbyA9IGNvbWJpLlRpcG8yO1xyXG4gICAgICAgIHZhciBpeDogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgaXk6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIHg6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzFdXHJcbiAgICAgICAgdmFyIHk6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzBdIC0gKCt4KTtcclxuICAgICAgICB2YXIgcmVzaWR1b1g6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGJFbnRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoeC50b1N0cmluZygpLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHJlc2lkdW9YID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV07XHJcbiAgICAgICAgICAgIHggPSAreC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVswXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vL1NlIGl0ZXJhIGVsIGFycmVnbG8gZGUgcHJpbmNpcGlvIGEgZmluIHkgZGUgZmluIGEgcHJpbmNpcGlvLi4uIFxyXG4gICAgICAgIC8vL0NvbmZvcm1lIHNlIHJlY29ycmUgZWwgYXJyZWdsbyBkZSBmaW4gYSBwcmluaWNpbywgc2UgdmEgZGFuZG8gbGEgcHJvbW9jacODwrNuIGEgbG9zIHByb2R1Y3RvcyBkZSBtZW5vciB2YWxvci5cclxuICAgICAgICAvLy9TaSBsYSBwcm9tb2Npw4PCs24gZXN0YSBpbmNvbXBsZXRhLCBsb3MgcHJvZHVjdG9zIGRlIGxhIG1pdGFkIHF1ZWRhbiBzaW4gcHJvbW9jacODwrNuIFxyXG4gICAgICAgIHZhciBpOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxQcmVjaW9zID0gbFByZWNpb3Muc29ydCgoYSwgYikgPT4gYS5QVU5JVE5FVE8gPCBiLlBVTklUTkVUTyA/IDEgOiBhLlBVTklUTkVUTyA+IGIuUFVOSVRORVRPID8gLTEgOiAwKVxyXG4gICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBqID0gK2xQcmVjaW9zLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgbFByZWNpb3MubGVuZ3RoICYmIGogPj0gaSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGl4ID0gMDtcclxuICAgICAgICAgICAgICAgIGl5ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaXggPCB4KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGl4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGl5IDwgeSAmJiBqID49IGkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2lkdW9YID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYkVudHJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3Nbal0uUFVOSVRORVRPID0gMC4wMTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiRW50cm8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLy9QYXJhIGxhcyBwcm9tb2Npb24gY29tbzogMlgxLjUsIC4uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0VzdGEgc29wb3J0YW5kbyBzb2xvIHBhcmE6IDJYMS41XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2pdLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tqXS5QVU5JVE5FVE8gKiAoK3Jlc2lkdW9YIC8gMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpeSsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGotLTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9DYWxjdWxhciBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgICAgICAgICAvL0pHQU0gMjAxOTEwMjMsIGZ1bmNpb25hbGlkYWQgZGUgcXVlIHNvbG8gZW50cmEgYWPDg8KhIGN1YW5kbyBzZSBjYW1iaW8gYWxndW4gcHJlY2lvXHJcbiAgICAgICAgICAgIGlmIChiRW50cm8pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgLy8gZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAgICAgICAgIC8vICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCkuXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKCthY2MpICsgKCtjdXIuUFVOSVRORVRPKSwgMCk7XHJcblxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5TZXRWYWxvclByb21vY2lvbmVzKGVuYyk7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLkFncmVnYXJMaXN0YVByb21vKGVuYywgY29tYmkpO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhciBwcmVjaW8gdG90YWwgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGxpc3RhIGRlIHByZWNpb3NcclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBMaXN0YSBkZSBwcmVjaW9zIGEgdGVuZXIgZW4gY3VlbnRhXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBlbmNhYmV6YWRvc1xyXG4gICAgICogQHBhcmFtIGNvbWJpIFByb21vY2lvbiBjb21iaW5hZGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIENhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBiQXBsVmFsaWRhOiBib29sZWFuLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgLy9DYWxjdWxhciBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICAvL1RlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MuXHJcbiAgICAgICAgdmFyIGRWYWxvclByb21vQW50OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIC8vdmFyIGRWYWxvclByb21vQW50QWN1bTogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZFZhbG9yQWN0OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAgICAgICAgIHZhciBkUHJlY2lvTnVldm8gPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoK2FjYykgKyAoK2N1ci5QVU5JVE5FVE8pLCAwKTtcclxuICAgICAgICAgICAgdmFyIHByZWNpb1RvdGFsQW50ZXJpb3I7XHJcbiAgICAgICAgICAgIHByZWNpb1RvdGFsQW50ZXJpb3IgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3I7XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MTggU0UgUVVJVEEgVkFMSURBQ0lPTiwgUE9SIEZMVUpPIFFVRSBTSSBTRSBERVZVRUxWRSBUUkFFIExBIFBST01PLCBQRVJPIFNJIFNFIEJPUlJBLiBpZiAoZFByZWNpb051ZXZvIDwgcHJlY2lvVG90YWxBbnRlcmlvcikgeyAvLyBTZSBhZ3JlZ2EgdmFsaWRhY2lvbiBkZSBwcmVjaW8sIHBhcmEgZXNjb2dlciBlbCBtZWpvci4gTm8gcHVlZGVuIGEgdmVyIDIgcHJvbW9jaW9uZXMuXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciA9IGRQcmVjaW9OdWV2bztcclxuICAgICAgICAgICAgLy9lbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxSRUFMXCIpLlZhbG9yID0gZFByZWNpb051ZXZvO1xyXG4gICAgICAgICAgICAvL0xpbXBpYXIgcHJvbW9jaW9uZXNcclxuICAgICAgICAgICAgaWYgKCh0aGlzLlZhbGlkYXJTaVRvZG9zQVBMUHJvbW9Db21iaW5hZGEobFByZWNpb3MsIGVuYykgfHwgIWJBcGxWYWxpZGEpICYmICFiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIk5PTUJfUFJPTU9DXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIk5PTUJfUFJPTU9DXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIk5PTUJfUFJPX0NPTUJJXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIk5PTUJfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9fQ09NQklcIikuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIikuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLlF1aXRhckxhc1Byb21vc0RpcmVjdGFzKGVuYyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlF1aXRhckxhc1Byb21vc0NvbWJpbmFkYXMoZW5jKTtcclxuICAgICAgICAgICAgICAgIC8vIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKS5WYWxvciA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAvLyBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKS5WYWxvciA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JBY3QgPSAoKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikuVmFsb3IpIC0gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IpKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yUHJvbW9BbnQgPSB0aGlzLkdldFZhbG9yUHJvbW9BbnRlcmlvcihsUHJlY2lvcywgZW5jKTtcclxuICAgICAgICAgICAgICAgIGRWYWxvckFjdCA9IHRoaXMuR2V0VmFsb3JQcm9tb0FDdChlbmMsIGRWYWxvclByb21vQW50LCBkUHJlY2lvTnVldm8sIHByZWNpb1RvdGFsQW50ZXJpb3IsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzMwIHNlIGFncmVnYSBwYXJhIHByb21vY2lvbmVzIGFjdW11bGFibGVzLiBhY3VtdWxhYlxyXG4gICAgICAgICAgICAgICAgaWYgKCFiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikuVmFsb3IgPSBkVmFsb3JQcm9tb0FudC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL0VzIGFjdW11bGFibGUsIHV0aWxpemFyIGxhIGluZm9ybWFjacODwrNuIFxyXG4gICAgICAgICAgICAgICAgICAgIGRWYWxvclByb21vQW50ID0gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikuVmFsb3IgLSBwcmVjaW9Ub3RhbEFudGVyaW9yKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLlNldFZhbG9yUHJvbW9jaW9uZXMoZW5jLCBkVmFsb3JBY3QgKyBkVmFsb3JQcm9tb0FudCk7XHJcbiAgICAgICAgICAgIHRoaXMuQWdyZWdhckxpc3RhUHJvbW8oZW5jLCBjb21iaSwgZFZhbG9yQWN0KTtcclxuICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvVW5pdEZyb21Ub3RhbChlbmMsIGRQcmVjaW9OdWV2byk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIFF1aXRhckxhc1Byb21vc0RpcmVjdGFzKGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmlsdGVyKHggPT4geC5Ob21icmVDb25jZXB0by50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJWQUxfUFJPTU9DX1wiKSkuZm9yRWFjaChkZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGV0LlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFF1aXRhckxhc1Byb21vc0NvbWJpbmFkYXMoZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maWx0ZXIoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlZBTF9QUk9fQ09NQklfXCIpKS5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkZXQuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsY3VsYXIgcHJlY2lvIHVuaXRhcmlvLCBhIHBhcnRpciBkZSB1biBudWV2byBwcmVjaW8gVG90YWwuXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIG5ld1ByaWNlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmVjYWxjdWxhclByZWNpb1VuaXRGcm9tVG90YWwoZW5jOiBNM1BFbmNJdGVtcywgbmV3UHJpY2U6IG51bWJlcikge1xyXG4gICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSAoK25ld1ByaWNlIC8gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgc2kgdG9kb3MgbG9zIHByZWNpb3MgZGUgdW4gcHJvZHVjdG8gc2UgY2FtYmlhcm9uIG8gbm8uXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgTGlzdGEgY29uIHRvZG9zIGxvcyBpdGVtc1xyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJTaVRvZG9zQVBMUHJvbW9Db21iaW5hZGEobFByZWNpb3M6IEFycmF5PGFueT4sIGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAvL0NoZWNrLCBzaSBhbGd1bm8gZGUgbGEgbGlzdGEgZGUgcHJlY2lvIGVzIGlndWFsIGFsIHByZWNpbyBhbnRlcmlvclxyXG4gICAgICAgIHZhciBwcmVjaW9BbnRlcmlvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5maW5kKHggPT4geC5QVU5JVE5FVE8gPT0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKTtcclxuICAgICAgICBpZiAocHJlY2lvQW50ZXJpb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3JlcyBkZSBwcm9tb2Npb25lcyBkZXBlbmRpZW5kbyBkZWwgbnVtZXJvIGRlIGl0ZW1zIHF1ZSBubyBzZSBtb2RpZmljYXJvblxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldFZhbG9yUHJvbW9BbnRlcmlvcihsUHJlY2lvczogQXJyYXk8YW55PiwgZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBkVmFsb3IgPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBudW1lcm9JdGVtcyA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEICYmIHguUFVOSVRORVRPID09IGRWYWxvcikubGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgZFVuaXRQcm9tbyA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlZVTklUUFJPTU9cIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHJldHVybiArbnVtZXJvSXRlbXMgKiArZFVuaXRQcm9tbztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvciBkZSBsYSBwcm9tb2Npb24gcXVlIHNlIGVzdGEgcHJvY2VzYW5kbyBhY3R1YWxtZW50ZVxyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqIEBwYXJhbSB2YWxvclByb21vQW50IFxyXG4gICAgICogQHBhcmFtIHZhbG90VG90YWxOdWV2byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldFZhbG9yUHJvbW9BQ3QoZW5jOiBNM1BFbmNJdGVtcywgdmFsb3JQcm9tb0FudDogbnVtYmVyLCB2YWxvdFRvdGFsTnVldm86IG51bWJlciwgcHJlY2lvVG90YWxBbnQ6IG51bWJlciwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB2YWxvclRvdGFsU2luRHRvOiBudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciB2YWxvclByb21vQWN0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDczMCBzaSB2aWVuZSBhY3VtdWxhYmxlIHV0aWxpemFyIGVsIHByZWNpbyBhbnRlcmlvciwgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIGR0by5cclxuICAgICAgICAgICAgaWYgKGJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5EdG8gPSBwcmVjaW9Ub3RhbEFudDtcclxuICAgICAgICAgICAgICAgIHZhbG9yUHJvbW9BY3QgPSArdmFsb3JUb3RhbFNpbkR0byAtICt2YWxvdFRvdGFsTnVldm87XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YWxvclRvdGFsU2luRHRvID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgICAgIHZhbG9yUHJvbW9BY3QgPSArdmFsb3JUb3RhbFNpbkR0byAtICt2YWxvclByb21vQW50IC0gK3ZhbG90VG90YWxOdWV2bztcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB2YWxvclByb21vQWN0O1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgR2V0VmFsb3JQcm9tb0FDdDogXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0ZWFyIGVsIHZhbG9yIGRlIGxhIHByb21vY2lvblxyXG4gICAgICogQHBhcmFtIGVuYyBFbmNhYmV6YWRvIGRlIGl0ZW1zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTZXRWYWxvclByb21vY2lvbmVzKGVuYzogTTNQRW5jSXRlbXMsIHZhbG9yUHJvbW86IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IgPSAoKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikuVmFsb3IpIC0gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IpKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAvL0ZTIDIwMTkwNzI1IFJlZG9uZGVvIGRlbCB2YWxvciBkZSBwcm9tb2Npb25cclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IgPSAoTWF0aC5yb3VuZCh2YWxvclByb21vICogMTAwKSAvIDEwMCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNjE4IFNlIGFncmVnYSBlbCB2YWxvciB1bml0YXJpbyBkZSBsYSBwcm9tb2Npw4PCs25cclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZVTklUUFJPTU9cIikuVmFsb3IgPSAoKyhNYXRoLnJvdW5kKHZhbG9yUHJvbW8gKiAxMDApIC8gMTAwKSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAgLyoqXHJcbiAgICAvLyAgKiBTZXRlYXIgZWwgdmFsb3IgZGUgbGEgcHJvbW9jaW9uXHJcbiAgICAvLyAgKiBAcGFyYW0gZW5jIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIFNldFZhbG9yUHJvbW9jaW9uZXNGcm9tTGlzdGFQcmVjaW9zKGVuYzogTTNQRW5jSXRlbXMsIGxQcmVjaW9zOiBBcnJheTxhbnk+KSB7XHJcbiAgICAvLyAgICAgdHJ5IHtcclxuICAgIC8vICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LlBVTklUTkVUTyA9PSBkVmFsb3IpXHJcbiAgICAvLyAgICAgfSBjYXRjaHtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIC8vIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzQnlMaXN0YVByZWNCZXRhKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgIC8vICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICB2YXIgVGlwb1Byb21vID0gY29tYmkuVGlwbzI7XHJcbiAgICAvLyAgICAgICAgIHZhciBpU2l6ZVByZWM6IG51bWJlciA9IGxQcmVjaW9zLmxlbmd0aDtcclxuICAgIC8vICAgICAgICAgdmFyIGlNaXRhZDogbnVtYmVyO1xyXG5cclxuICAgIC8vICAgICAgICAgdmFyIHJlc2lkdW9YOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgICAgICB2YXIgeDogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMV1cclxuICAgIC8vICAgICAgICAgdmFyIHk6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzBdIC0gKCt4KTtcclxuICAgIC8vICAgICAgICAgdmFyIGlEdG86IG51bWJlcjtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmICh4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDEpIHtcclxuICAgIC8vICAgICAgICAgICAgIHJlc2lkdW9YID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV07XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIGlNaXRhZCA9ICgreSkgLyAoK2lTaXplUHJlYyk7XHJcbiAgICAvLyAgICAgICAgIGlNaXRhZCA9IE1hdGguY2VpbCgoK2lNaXRhZCkgKiAoK3gpKSAtIDE7XHJcblxyXG4gICAgLy8gICAgICAgICBsUHJlY2lvcyA9IGxQcmVjaW9zLnNvcnQoKGEsIGIpID0+IGEuUFVOSVRORVRPIDwgYi5QVU5JVE5FVE8gPyAxIDogYS5QVU5JVE5FVE8gPiBiLlBVTklUTkVUTyA/IC0xIDogMClcclxuXHJcbiAgICAvLyAgICAgICAgIHZhciBpWCA9IDA7XHJcbiAgICAvLyAgICAgICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBpRHRvID0gaU1pdGFkO1xyXG4gICAgLy8gICAgICAgICAgICAgd2hpbGUgKGlEdG8gPCBpU2l6ZVByZWMpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAocmVzaWR1b1ggPT0gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSAwO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpRHRvKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8vUGFyYSBsYXMgcHJvbW9jaW9uIGNvbW86IDJYMS41LCAuLi5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHNvcG9ydGFuZG8gc29sbyBwYXJhOiAyWDEuNVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaUR0b10uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUoaVggPCB4KXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gKiAoK3Jlc2lkdW9YIC8gMTApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyAgICAgaVgrKztcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlEdG8rKztcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyBpWCA9IDA7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgLy9DYWxjdWxhciBwcmVjaW9zIHRvdGFsZXNcclxuICAgIC8vICAgICAgICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgIC8vICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCkuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGEgbGlzdGEgZGUgZGV0YWxsZSBlbDogIE5PTUJfUFJPTU9DLCBWQUxfUFJPTU9DIHkgSURfUFJPTU9DXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIGNvbWJpIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWdyZWdhckxpc3RhUHJvbW8oZW5jOiBNM1BFbmNJdGVtcywgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgZFZhbG9yUHJvbW9Db21iaTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGRldE5vbWJyZXM6IHN0cmluZztcclxuICAgICAgICB2YXIgZGV0VmFsb3Jlczogc3RyaW5nO1xyXG4gICAgICAgIHZhciBkZXRJZHM6IHN0cmluZztcclxuXHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNOYW1lczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNWYWxzOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtc0lkczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcblxyXG5cclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKTtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscyA9IGVuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9fQ09NQklcIik7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcyA9IGVuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST19DT01CSVwiKTtcclxuXHJcbiAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXNOYW1lcykge1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuTm9tYnJlQ29uY2VwdG8gPSBcIk5PTUJfUFJPX0NPTUJJXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuTm9tYnJlQ29uY2VwdG8gPSBcIlZBTF9QUk9fQ09NQklcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLk5vbWJyZUNvbmNlcHRvID0gXCJJRF9QUk9fQ09NQklcIlxyXG5cclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciA9IFwiXCJcclxuXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNOYW1lcylcclxuICAgICAgICAgICAgZW5jLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtc1ZhbHMpXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNJZHMpXHJcblxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciArIGNvbWJpLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yICsgY29tYmkuSWRQcm9tb2Npb25Db21iaW5hZGEgKyBcIixcIjtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yICsgZFZhbG9yUHJvbW9Db21iaS50b1N0cmluZygpICsgXCIsXCI7XHJcblxyXG4gICAgICAgIC8vQWhvcmEgc2UgYWdyZWdhIHVuYSBkaW5hbWljYSBwb3IgYXRyaWJ1dG8gZGUgbGEgcHJvbW8gcGFyYSBmYWNpbGl0YXIgbGEgcmV0b21hIGRlIGVzdGEgaW5mb3JtYWNpw4PCs25cclxuICAgICAgICBsZXQgbGlzdE5vbWJyZSA9IG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvci5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICBsZXQgbGlzdElkID0gb00zUERldGFsbGVJdGVtc0lkcy5WYWxvci5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICBsZXQgbGlzdFZhbG9yID0gb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcblxyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0SWQubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsaXphck9DcmVhclBEaW5hbWljYShlbmMuTTNERVQsIGxpc3ROb21icmVbX2ldLCBcIk5PTUJfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJJRF9QUk9fQ09NQklfXCIgKyBfaSk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsaXphck9DcmVhclBEaW5hbWljYShlbmMuTTNERVQsIGxpc3ROb21icmVbX2ldLCBcIlZBTF9QUk9fQ09NQklfXCIgKyBfaSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoYXJyYXlEaW5hbWljYXM6IEFycmF5PE0zUERldGFsbGVJdGVtcz4sIG5vbWJyZURpbmFtaWNhOiBzdHJpbmcsIFZhbG9yRGluYW1pY2E6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBvTTNQRGV0YWxsZUl0ZW1zID0gYXJyYXlEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gbm9tYnJlRGluYW1pY2EpO1xyXG4gICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBWYWxvckRpbmFtaWNhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5Ob21icmVDb25jZXB0byA9IG5vbWJyZURpbmFtaWNhO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gVmFsb3JEaW5hbWljYTtcclxuICAgICAgICAgICAgYXJyYXlEaW5hbWljYXMucHVzaChvTTNQRGV0YWxsZUl0ZW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGxhIGxpc3RhIGRlIGVuY2FiZXphZG9zLCBxdWUgYXBsaWNhbiBhIGxhIGxpc3RhIGNvbWJpbmFkYSBxdWUgdGllbmVcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uQ29tYmluYWRhIE9iamV0byBkZSBwcm9tb2Npb24gY29tYmlhbmRhXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gT2JqZXRvIGRlIE0zUHJvY2Vzb1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEdldEVuY2FiZXphZG9CeUNvbWJpKG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgICAgICBvTGlzdEVuY2FiID0gaW9NM1Byb2Nlc28uTTNFTkMuZmlsdGVyKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLlByb21vQ29tYmluYWRhcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5TZXRQcm9tb0NvbWJpbmFkYUVOQyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCEoZW5jLklkRW5jUGFkcmUgPiAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmMuUHJvbW9Db21iaW5hZGFzICYmICtlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMjA4IHNlIGNhbWJpYSB2YWxpZGFjaW9uLCBwYXJhIHF1ZSB0ZW5nYSBlbiBjdWVudGEgY3VhbHF1aWVyIHByb21vY2lvbiBjb21iaW5hZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGVuYy5Qcm9tb0NvbWJpbmFkYXMubGVuZ3RoID4gMCAmJiBlbmMuUHJvbW9Db21iaW5hZGFzWzBdLklkUHJvbW9jaW9uQ29tYmluYWRhID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuYy5Qcm9tb0NvbWJpbmFkYXMubGVuZ3RoID4gMCAmJiBlbmMuUHJvbW9Db21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gb0xpc3RFbmNhYjtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBTZXRQcm9tb0NvbWJpbmFkYUVOQyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIilcclxuICAgICAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMgPSBKU09OLnBhcnNlKG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgLy8vRGVzQWNvcGxhciBsaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByZWNpb3MgdG90YWxlc1xyXG4gICAgICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgICAgICAgICB2YXIgblByZWNpb1VuaXQ6IG51bWJlcjtcclxuICAgICAgICAgICAgbkNhbnRpZGFkID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvcy5wdXNoKHsgXCJJbmRpY2VcIjogaiwgXCJQVU5JVE5FVE9cIjogblByZWNpb1VuaXQsIFwiSURcIjogZW5jLklELCBcIklEUFJPRFVDVE9cIjogZW5jLklkUHJvZHVjdG8gfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxQcmVjaW9zO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmNCeVByZChlbmM6IE0zUEVuY0l0ZW1zLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuLCBsUHJlY2lvczogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgICAgIHZhciBuUHJlY2lvVW5pdDogbnVtYmVyO1xyXG4gICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAgICAgaWYgKGJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5QcmVjaW9Vbml0ID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvclxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zLnB1c2goeyBcIkluZGljZVwiOiBqLCBcIlBVTklUTkVUT1wiOiBuUHJlY2lvVW5pdCwgXCJJRFwiOiBlbmMuSUQsIFwiSURQUk9EVUNUT1wiOiBlbmMuSWRQcm9kdWN0byB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgIC8vICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyAgICAgLy8vRGVzQWNvcGxhciBsaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByZWNpb3MgdG90YWxlc1xyXG4gICAgLy8gICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAvLyAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgLy8gICAgICAgICB2YXIgblByZWNpb1VuaXQ6IG51bWJlcjtcclxuICAgIC8vICAgICAgICAgbkNhbnRpZGFkID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAvLyAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3JcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsUHJlY2lvcy5wdXNoKHsgXCJJbmRpY2VcIjogaiwgXCJQVU5JVE5FVE9cIjogblByZWNpb1VuaXQsIFwiSURcIjogZW5jLklEIH0pO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBsUHJlY2lvcztcclxuXHJcbiAgICAvLyB9XHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vRklOIFYyIENPTUJJTkFEQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogUHJvY2VzYXJDb21iaW5hZGFYcG9yWVxyXG4gICAgKiBQcm9jZXNhciBwcm9tb2Npb24gY29tYmluYWRhIHF1ZSBzZSBsbGV2YW4geCBwcm9kdWN0b3MgcG9yIGVsIHByZWNpb24gZGUgeSBwcm9kdWN0b3MuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhWHBvclkob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG86IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdmFyIG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgdmFyIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvO1xyXG5cclxuICAgICAgICAvL1ZhbGlkYSBzaSBlbCBwcm9kdWN0byBhZ3JlZ2FkbywgdGllbmUgdW5hIG1pc21hIHByb21vY2lvbiBhY3RpdmEgZW4gbGEgZmFjdHVyYS5cclxuICAgICAgICAvLyBpZiAob00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSAhPSBudWxsICYmIG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vICAgICBtM0NvbWJpbmFkYXhQcm9jZXNvID0gb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYS5maW5kKGNvbWJpbmFkYXMgPT4gY29tYmluYWRhcy5JZFByb21vY2lvbiA9PSBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSAmJiBjb21iaW5hZGFzLlRlcm1pbmFkYSA9PSBmYWxzZSk7XHJcbiAgICAgICAgLy8gICAgIC8vVmFsaWRhIHNpIHlhIGV4aXN0ZSB1biBwcm9jZXNvLlxyXG4gICAgICAgIC8vICAgICBpZiAobTNDb21iaW5hZGF4UHJvY2VzbyAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvblhQcm9jZXNvID0gbTNDb21iaW5hZGF4UHJvY2Vzby5JZFByb21vY2lvblhQcm9jZXNvO1xyXG4gICAgICAgIC8vICAgICAgICAgLy9UcmFlIGxvcyBFbmNhYmV6YWRvcyBjb24gbGEgcHJvbW9jaW9uIFxyXG4gICAgICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jcyA9PiBlbmNzLlByb21vQ29tYmluYWRhcyAhPSBudWxsICYmIGVuY3MuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jcy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25YUHJvY2VzbyA9PSBtM0NvbWJpbmFkYXhQcm9jZXNvLklkUHJvbW9jaW9uWFByb2Nlc28pO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJvbW9YUG9yWShtM0VuY3NDb25Qcm9tbywgbTNDb21iaW5hZGF4UHJvY2Vzbyk7XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLkFncmVnYXJQcm9tb2Npb25Db21iaW5hZGFBUHJvY2VzbyhvTTNQcm9jZXNvcywgbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSA9IG5ldyBBcnJheTxNM1Byb21Db21iaW5hZGFYUHJvY2Vzbz4oKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyUHJvbW9jaW9uQ29tYmluYWRhQVByb2Nlc28ob00zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG8uUHJvbW9Db21iaW5hZGFzWzBdKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vcmVjYWxjdWxhciBwcm9tb2Npb24sIGRlcGVuZGllbmRvIGRlIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBlbmNhYmV6YWRvcy5cclxuICAgIC8vMS5WYWxpZGFyIHNpIHlhIGVzdGFuIHRvZG9zIGxvcyBpdGVtcyBwYXJhIHJlY2FsY3VsYXIgbGEgcHJvbW9jaW9uXHJcbiAgICAvLzIuIE9yZGVuYXIgbG9zIGVuY2FiZXphZG9zIGRlIG1heW9yIGEgbWVub3IgcHJlY2lvLlxyXG4gICAgLy8zLiBEZWphciBlbCBwcmVjaW8gZGUgbG9zIGl0ZW1zIGRlIG1lbm9yIHByZWNpb24gZW4gMFxyXG4gICAgLy8gcHVibGljIFJlY2FsY3VsYXJQcm9tb1hQb3JZKG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz4sIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvKSB7XHJcbiAgICAvLyAgICAgdmFyIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYTtcclxuICAgIC8vICAgICB2YXIgdmFyeDogbnVtYmVyO1xyXG4gICAgLy8gICAgIHZhciB2YXJ5OiBudW1iZXI7XHJcbiAgICAvLyAgICAgdmFyIHBhcnRlRGVjWTogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICBvUHJvbW9jaW9uQ29tYmluYWRhID0gbTNFbmNzQ29uUHJvbW9bMF0uUHJvbW9Db21iaW5hZGFzWzBdO1xyXG5cclxuICAgIC8vICAgICB2YXJ4ID0gcGFyc2VGbG9hdChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiX1wiKVsxXS5zcGxpdChcIlhcIilbMF0pO1xyXG4gICAgLy8gICAgIHZhcnkgPSBwYXJzZUZsb2F0KG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkuc3BsaXQoXCJfXCIpWzFdLnNwbGl0KFwiWFwiKVsxXSk7XHJcblxyXG4gICAgLy8gICAgIGlmIChTdHJpbmcodmFyeSkuaW5jbHVkZXMoXCIuXCIpKSB7XHJcbiAgICAvLyAgICAgICAgIHBhcnRlRGVjWSA9IHBhcnNlRmxvYXQob1Byb21vY2lvbkNvbWJpbmFkYS5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKS5zcGxpdChcIl9cIilbMV0uc3BsaXQoXCJYXCIpWzFdLnNwbGl0KFwiLlwiKVsxXSk7XHJcbiAgICAvLyAgICAgICAgIHZhcnkgPSBwYXJzZUZsb2F0KFN0cmluZyh2YXJ5KS5zcGxpdChcIi5cIilbMF0pO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgaWYgKHZhcnggPT0gbTNFbmNzQ29uUHJvbW8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgICAgIG0zQ29tYmluYWRheFByb2Nlc28uVGVybWluYWRhID0gdHJ1ZTtcclxuICAgIC8vICAgICAgICAgLy9PcmRlbmFyIGxvcyBlbmNhYmV6YWRvcyBwb3IgcHJlY2lvIG1heW9yIGEgbWVub3JcclxuICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBtM0VuY3NDb25Qcm9tby5zb3J0KChhLCBiKSA9PlxyXG4gICAgLy8gICAgICAgICAgICAgKGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yIDwgYi5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpID8gMSA6XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgKChiLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA8IGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSA/IC0xIDogMCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtM0VuY3NDb25Qcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgLy9WYWxpZGEgc2kgeWEgXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAocGFydGVEZWNZICE9IDAgJiYgKCtpKSA9PSAoK3ZhcnkpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFydGVEZWNZKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSAoKCttM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpICogKCsoK3BhcnRlRGVjWSkgLyAxMDApKS50b1N0cmluZygpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIGlmICgoK2kpICsgMSA+IHZhcnkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBcIjBcIjtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBDb21iaW5hZGEgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHRvdGFsIGRlIHB1bnRvcyBkZSBmaWRlbGl6YWNpb24gZW4gbGEgdHJhbnNhY2Npw4PCs24gcmVkb25kZWFkb3MgaGFjw4PCrWEgYWJham9cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF90b3RhbF9maWRlbGl6YWNpb24ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgdG90YWxfZmlkZWxpemFjaW9uID0gMDtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRvdGFsX2ZpZGVsaXphY2lvbiA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiRklERUxJWkFDSU9OXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoKCgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkZJREVMSVpBQ0lPTlwiKS5WYWxvcikgLyAxMDApICogKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IpKSwgMClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZSByZWRvbmRlYXJhIG5vIGFjYSBzaW5vIGVuIGxhIHN1bWEgdG90YWwgZGVsIGZpZGVsaXphY2lvbiBkZSBjYWRhIGZvcm1hIGRlIHBhZ29cclxuICAgICAgICByZXR1cm4gdG90YWxfZmlkZWxpemFjaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBlbCB2YWxvciBkZWwgZmlkZWxpemFjaW9uIGRlIHVuIHByb2Nlc28sIGV2YWx1YW5kbyBjYWRhIGZvcm1hIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPikge1xyXG5cclxuICAgICAgICB2YXIgcGFnb190b3RhbF9wcm9jZXNvOiBudW1iZXIgPSBwcm9jZXNvLlZhbG9yTmV0bztcclxuICAgICAgICAvL3ZhciBtYXhfdmFsdWVfZmlkZWxpemFjaW9uOiBudW1iZXIgPSB0aGlzLmdldF90b3RhbF9maWRlbGl6YWNpb24ocHJvY2Vzbyk7XHJcbiAgICAgICAgdmFyIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgICB2YXIgbGlzdF9jb25kaV9wcm9tbyA9IHRoaXMuZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RfZW5jX3Byb21vLCBcIlBBR09cIiwgXCJNT05FREVST1wiKTtcclxuXHJcbiAgICAgICAgaWYgKHByb2Nlc28ubE0zUEVuY0ZQKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBwcm9jZXNvLmxNM1BFbmNGUC5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBmb3JtYV9wYWdvOiBNM1BFbmNGUCA9IHByb2Nlc28ubE0zUEVuY0ZQW19pXTtcclxuICAgICAgICAgICAgICAgIGxldCBwcm9tb0FwbGljYWRhOiBNM0NPTkRJUFJPTU87XHJcbiAgICAgICAgICAgICAgICBsZXQgYXBsaWNhX2ZpZGVsaXphY2lvbiA9IHRoaXMudmFsaWRhdGVfY29uZGlfYnlfZm9ybWFfcGFnbyhmb3JtYV9wYWdvLCBsaXN0X2NvbmRpX3Byb21vKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXBsaWNhX2ZpZGVsaXphY2lvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yUGFnbyA9IGZvcm1hX3BhZ28uVmFsb3IgLSBmb3JtYV9wYWdvLlZhbENhbWJpbztcclxuICAgICAgICAgICAgICAgICAgICByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiArPSB0aGlzLmNhbGN1bGF0ZV9maWRlbGl6YWNpb25fYnlfZm9ybWFfcGFnbyhwYWdvX3RvdGFsX3Byb2Nlc28sIHByb2Nlc28uTTNFTkMsIHZhbG9yUGFnbywgYXBsaWNhX2ZpZGVsaXphY2lvbiwgbGlzdF9lbmNfcHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiAocmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPiBtYXhfdmFsdWVfZmlkZWxpemFjaW9uKSB7XHJcbiAgICAgICAgLy8gICAgIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uID0gbWF4X3ZhbHVlX2ZpZGVsaXphY2lvbjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgcmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPSB0aGlzLm9NYXRoVEYucm91bmQocmVhbF92YWx1ZV9maWRlbGl6YWNpb24sIDIpO1xyXG4gICAgICAgIHJldHVybiByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGFzIHJlc3RyaWNjaW9uZXMgQWN0aXZhcyBkZSB0aXBvIGRlIHBhZ28gYSBwYXJ0aXIgZGUgQXJyYXk8TTNDT05ESVBST01PPlxyXG4gICAgICogQHBhcmFtIGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkbyAuXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zRW5jSXRlbSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXMobGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvOiBBcnJheTxNM0NPTkRJUFJPTU8+LCBsaXN0TTNFbmNJdGVtOiBBcnJheTxNM1BFbmNJdGVtcz4pOiBBcnJheTxNM0NPTkRJUFJPTU8+IHtcclxuICAgICAgICBsZXQgcmVzdHJpY2Npb25lc0FjdGl2YXMgPSBuZXcgQXJyYXk8TTNDT05ESVBST01PPigpO1xyXG4gICAgICAgIGlmIChsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdE0zRW5jSXRlbS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBsaXN0TTNEZXQgPSBsaXN0TTNFbmNJdGVtW19pXS5NM0RFVDtcclxuICAgICAgICAgICAgICAgIGlmICgrbGlzdE0zRW5jSXRlbVtfaV0uTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkUHJvbW9jaW9uZXMgPSBsaXN0TTNEZXQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9NT0NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkUHJvbW9jaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkUHJvbW8gPSBpZFByb21vY2lvbmVzLlZhbG9yLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2sgPSAwOyBfayA8IGlkUHJvbW8ubGVuZ3RoOyBfaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW8gPSAraWRQcm9tb1tfa107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlQcm9tbyA9IGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkby5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGlQcm9tbyAmJiAhcmVzdHJpY2Npb25lc0FjdGl2YXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gcHJvbW8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY2Npb25lc0FjdGl2YXMucHVzaChjb25kaVByb21vKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN0cmljY2lvbmVzQWN0aXZhcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGFzIHJlc3RyaWNjaW9uZXMgQWN0aXZhcyBwYXJhIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gYWN0dWFsXHJcbiAgICAgKiBAcGFyYW0gbGlzdEVuY1Byb21vIFxyXG4gICAgICogQHBhcmFtIGxpc3RNM0VuY0l0ZW0gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSZXN0cmljY2lvbmVzVGlwb1BhZ29BY3RpdmFzRnJvbUVuY1Byb21vKGxpc3RFbmNQcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4sIGxpc3RNM0VuY0l0ZW06IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIGxldCBsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8gPSB0aGlzLmdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0RW5jUHJvbW8sIFwiUEFHT1wiLCBcIlJFU1RSSUNDSU9OX1BBR09cIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXMobGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvLCBsaXN0TTNFbmNJdGVtKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxvcyBtb3ZpbWllbnRvcyByZWFsaXphZG9zIHBvciB1biBtM3NhbGRvc3hjdWVudGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dldF9tb3ZpbWllbnRvc19maWRlbGl6YWNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy92YXIgZGF0YSA9IHsgXCJpZF9tM1wiOiBpZG0zLCBcImlkX3Byb2Nlc29cIjogcHJvY2VzbyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL20zX2dldF9tb3ZpbWllbnRvc19maWRlbGl6YWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgbW92cyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdmFyIHJlc3BfbW92czogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgaWYgKCFtb3ZzLk1PVlMuTU9WLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgIHJlc3BfbW92cy5wdXNoKG1vdnMuTU9WUy5NT1YpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzID0gbW92cy5NT1ZTLk1PVjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3BfbW92cyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGxhIGZvcm1hIGRlIHBhZ28gY3VtcGxlIGFsZ3VuYSBjb25kaWNpb24gZGUgZmlkZWxpemFjaW9uXHJcbiAgICAgKiBAcGFyYW0gZm9ybWFfcGFnbyBcclxuICAgICAqIEBwYXJhbSBsaXN0X2NvbmRpX3Byb21vOiBsaXN0YWRvIGRlIGNvbmRpY2lvbmVzIGRlIGZpZGVsaXphY2lvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhdGVfY29uZGlfYnlfZm9ybWFfcGFnbyhmb3JtYV9wYWdvOiBNM1BFbmNGUCwgbGlzdF9jb25kaV9wcm9tbzogQXJyYXk8TTNDT05ESVBST01PPikge1xyXG4gICAgICAgIC8vcmV0dXJuIGxpc3RfY29uZGlfcHJvbW9bMF07XHJcbiAgICAgICAgbGV0IHByb21vc0FwbGljYWRhcyA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RfY29uZGlfcHJvbW8ubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaV9wcm9tbyA9IGxpc3RfY29uZGlfcHJvbW9bX2ldO1xyXG4gICAgICAgICAgICB2YXIgakFkaWNpb25hbGVzID0gSlNPTi5wYXJzZShjb25kaV9wcm9tby5KQWRpY2lvbmFsZXMpO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChjb25kaV9wcm9tby5Db25jZXB0by50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJJRF9QQUdPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TaSBlbCBvcGVyYWRvciBlcyBESUZGIGNyZWEgdW5hIGV4cHJlc2lvbiByZWd1bGEgcGFyYSBleGNsdWlyIGxvIHRpcG9kZXBhZ28gY29uZmlndXJhZG9zXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEgJiYgakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gJiYgakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJESUZGXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGlfcHJvbW8uVmFsb3IgPSBcIl4oPyEoXCIgKyBjb25kaV9wcm9tby5WYWxvciArIFwiKVxcXFxiKVxcXFx3KyRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpX3Byb21vLlZhbG9yID0gXCJeKFwiICsgY29uZGlfcHJvbW8uVmFsb3IgKyBcIikkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoY29uZGlfcHJvbW8uVmFsb3IsIFwiaVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUudGVzdChmb3JtYV9wYWdvLklkVGlwb1BhZ28udG9TdHJpbmcoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW9zQXBsaWNhZGFzLnB1c2goY29uZGlfcHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvbW9zQXBsaWNhZGFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCBsaXN0YWRvIGRlIGNvbmRpY2lvbmVzIHZhbGlkYXMgcGFyYSB1bmEgYWN0aXZpZGFkIGRhZGFcclxuICAgICAqIEBwYXJhbSBsaXN0X2VuY19wcm9tbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4sIGFjdGl2aWRhZDogc3RyaW5nLCB0aXBvMjogc3RyaW5nKTogQXJyYXk8TTNDT05ESVBST01PPiB7XHJcbiAgICAgICAgdmFyIGxpc3RfY29uZGlfcHJvbW86IEFycmF5PE0zQ09ORElQUk9NTz4gPSBuZXcgQXJyYXk8TTNDT05ESVBST01PPigpO1xyXG4gICAgICAgIHZhciBob3kgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAobGlzdF9lbmNfcHJvbW8pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgX2sgPSAwOyBfayA8IGxpc3RfZW5jX3Byb21vLmxlbmd0aDsgX2srKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVuY2FiZXphZG9Qcm9tbyA9IGxpc3RfZW5jX3Byb21vW19rXTtcclxuICAgICAgICAgICAgICAgIHZhciBkVmlnZW5jaWEgPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uVmlnZW5jaWEpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRJbmljaW8gPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uSW5pY2lvKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbmNhYmV6YWRvUHJvbW8uRXN0YWRvICYmIGRWaWdlbmNpYSA+PSBob3kgJiYgZEluaWNpbyA8PSBob3kgJiYgZW5jYWJlemFkb1Byb21vLlRpcG8yID09IHRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGVuY2FiZXphZG9Qcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpX2FncnVwYWNpb24gPSBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT05bX2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2ogPSAwOyBfaiA8IGNvbmRpX2FncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgX2orKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpX3Byb21vID0gY29uZGlfYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9bX2pdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BQ1RJVklEQUQgPT0gYWN0aXZpZGFkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfY29uZGlfcHJvbW8ucHVzaChjb25kaV9wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGlzdF9jb25kaV9wcm9tbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGEgZWwgdmFsb3IgZGVsIGZpZGVsaXphY2lvbiBkZSB1bmEgZm9ybWEgZGUgcGFnbyBkZSBhY3VlcmRvIGEgc3UgcG9yY2VudGFqZSByZXNwZWN0byBlbCB2YWxvciB0b3RhbCBkZWwgcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIHBhZ29fdG90YWxfcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBtYXhfdmFsdWVfZmlkZWxpemFjaW9uIFxyXG4gICAgICogQHBhcmFtIHZhbHVlX2Zvcm1hX3BhZ28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYWxjdWxhdGVfZmlkZWxpemFjaW9uX2J5X2Zvcm1hX3BhZ28ocGFnb190b3RhbF9wcm9jZXNvOiBudW1iZXIsIGxpc3RNM0VuYzogTTNQRW5jSXRlbXNbXSwgdmFsdWVfZm9ybWFfcGFnbzogbnVtYmVyLCBwcm9tb3NBcGxpY2FkYTogQXJyYXk8TTNDT05ESVBST01PPiwgbGlzdF9lbmNfcHJvbW86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcbiAgICAgICAgbGV0IGxpc3RQcm9tb3NBcGxpY2FkYXM7XHJcbiAgICAgICAgbGV0IGRldGFsbGVJZFByb21vYztcclxuICAgICAgICBsZXQgdmFsb3JGaWRlbGl6YWNpb24gPSAwO1xyXG4gICAgICAgIGxldCBwZXJjZW50X2Zvcm1hX3BhZ286IG51bWJlciA9IHZhbHVlX2Zvcm1hX3BhZ28gLyBwYWdvX3RvdGFsX3Byb2Nlc287XHJcbiAgICAgICAgdmFyIHByZWNpb1Byb2R1Y3RvID0gMDtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdE0zRW5jKSB7XHJcbiAgICAgICAgICAgIGxpc3RQcm9tb3NBcGxpY2FkYXMgPSBbXTtcclxuICAgICAgICAgICAgZGV0YWxsZUlkUHJvbW9jID0gaXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST01PQ1wiKTtcclxuICAgICAgICAgICAgcHJlY2lvUHJvZHVjdG8gPSAraXRlbS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgbGV0IHByZWNpb1NSID0gaXRlbS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9TUlwiKTtcclxuICAgICAgICAgICAgaWYgKHByZWNpb1NSICE9IG51bGwgJiYgcHJlY2lvU1IuVmFsb3IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcHJlY2lvUHJvZHVjdG8gPSArcHJlY2lvU1IuVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRldGFsbGVJZFByb21vYyAmJiBkZXRhbGxlSWRQcm9tb2MuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIGxpc3RQcm9tb3NBcGxpY2FkYXMgPSBkZXRhbGxlSWRQcm9tb2MuVmFsb3Iuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW9BcGwgb2YgcHJvbW9zQXBsaWNhZGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChsaXN0UHJvbW9zQXBsaWNhZGFzLmZpbmQoeCA9PiAreCA9PSBwcm9tb0FwbC5JZFByb21vY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW8gPSBsaXN0X2VuY19wcm9tby5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tb0FwbC5JZFByb21vY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yID0gdGhpcy52YWxpZGFyUmVkb25kZW8ocHJvbW8sIHByZWNpb1Byb2R1Y3RvICogdGhpcy5nZXRQb3JjZW50YWplRmlkZWxpemFjaW9uRnJvbUVuY1Byb21vKHByb21vKSAvIDEwMCkgKiAocGVyY2VudF9mb3JtYV9wYWdvKTtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckZpZGVsaXphY2lvbiArPSB2YWxvcjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsb3JGaWRlbGl6YWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UG9yY2VudGFqZUZpZGVsaXphY2lvbkZyb21FbmNQcm9tbyhwcm9tbykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24gJiYgakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJSZWRvbmRlbyhwcm9tbywgdmFsb3I6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24gJiYgakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlJlZG9uZGVvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yLCArakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlJlZG9uZGVvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hIHVuYSBkaW5hbWljYSBjb24gZWwgdmFsb3IgZGUgbGEgZmlkZWxpemFjacODwrNuIGRlIGRpY2hvIHByb2Nlc28geSByZXRvcm5hIGRpY2hvIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkX2RpbmFtaWNhX2ZpZGVsaXphY2lvbl90b19wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPik6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIHZhciB2YWx1ZV9maWRlbGl6YWNpb24gPSAwXHJcbiAgICAgICAgaWYgKGxpc3RfZW5jX3Byb21vKSB7XHJcbiAgICAgICAgICAgIHZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMuZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc28sIGxpc3RfZW5jX3Byb21vKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZV9maWRlbGl6YWNpb24gPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYV9maWRlbGl6YWNpb246IE0zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLk5vbWJyZSA9IFwiRklERUxJWkFDSU9OXCJcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLlZhbG9yID0gdmFsdWVfZmlkZWxpemFjaW9uLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChkaW5hbWljYV9maWRlbGl6YWNpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBkb2N1bWVudG8gZGUgZmlkZWxpemFjaW9uIGVuIGxhIHRhYmxhIE0zU2FsZG9zWEN1ZW50YVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRvIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9kb2NfZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvdmFsaWRhdGVfZG9jX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzYWxkb194X2N1ZW50YTtcclxuICAgICAgICAgICAgc2FsZG9feF9jdWVudGEgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkuUkVTUFVFU1RBLk0zU2FsZG9zWEN1ZW50YTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHNhbGRvX3hfY3VlbnRhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgZWwgc2FsZG8gc3VtYW5kb2xlIGVsIHZhbG9yIGVudmlhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdHVhbGl6YXJfc2FsZG9fZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9kYXRhID0ge1wiZG9jdW1lbnRvXCI6ZG9jdW1lbnRvLCBcInZhbG9yX21vdmltaWVudG9cIjp2YWxvcl9tb3ZpZW50bywgXCJwYWdvXCI6cGFnbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9hY3R1YWxpemFyX3NhbGRvX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEucGFnby5pZERpYXJpbyA9IHJlc3BbXCJfYm9keVwiXS5yZXBsYWNlKCdcIicsICcnKS5yZXBsYWNlKCdcIicsICcnKTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKGRhdGEucGFnbyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSBVbiBib25vIGRlIGRldm9sdWNpb24gcG9yIGVsIHZhbG9yIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgPSB7XCJwcm9jZXNvXCIscHJvY2VzbyxcInZhbG9yXCI6dmFsb3J9XHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dlbmVyYXJfYm9ub19kZXZvbHVjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9ib25vX2Rldm9sdWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWEgdW4gbnVldm8gcmVnaXN0cm8gZW4gbGEgdGFibGEgU2FsZG9YQ3VlbnRhXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM0luc2VydFNhbGRvWEN1ZW50YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vdmFyIGRhdGEgPSB7ICdEb2N1bWVudG8nOiB0aGlzLmRvY3VtZW50bywgJ1REb2NUaXR1bGFyJzogJzUnLCAnTkRvY1RpdHVsYXInOiB0aGlzLm5kb2NfY2xpZW50ZSwgJ05vbUN1ZW50YSc6ICdGSURFTElaQUNJT04nLCAnVmFsQ3VlbnRhJzogMCB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9tM0luc2VydFNhbGRvWEN1ZW50YS9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKE0zRU5DOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICBpZiAoTTNFTkMpIHtcclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZCA9IE0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChkQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvdWNoQ29uZmlnTFBTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBpZGthdGlvczogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBwcml2YXRlIGFwbFN5bmNDb3VjaEF1dG8gPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRGbGFnU3luY0NvdWNoKCkge1xyXG4gICAgICAgIHZhciBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIHZhciBvU1ViaWNhY2lvbjtcclxuICAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgbGV0IGNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gbnVsbCAmJiBjb25maWcuU3luY0NvdWNoQXV0byAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmbGFnID0gY29uZmlnLlN5bmNDb3VjaEF1dG87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgdGhpcy5pZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJDb25maWdMUF9cIiArIHRoaXMuaWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJhZGFwdGVyXCIpXHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmRhdGFiYXNlLmFkYXB0ZXIpO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgLy8gdGhpcy52YWxpZGFyUGFxdWV0ZXMoKVxyXG4gICAgICAgIHRoaXMuc3luY0NvdWNoKCk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIENPTkZJR0xQICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vIHZhbGlkYXJQYXF1ZXRlcygpIHtcclxuICAgIC8vICAgICBpZiAodGhpcy5hcGxQYXF1ZXRlcykge1xyXG4gICAgLy8gICAgICAgICBsZXQgdWJpY2FjaW9uID0gdGhpcy5nZXRVYmljYWNpb24oKTtcclxuICAgIC8vICAgICAgICAgaWYgKHViaWNhY2lvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNhXCIgKyB1YmljYWNpb24gKyBcIl9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgc3luY0NvdWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZGthdGlvcykge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImNvbmZpZ2xwX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VWJpY2FjaW9uKCkge1xyXG4gICAgICAgIGxldCBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIGxldCBvU1ViaWNhY2lvbjtcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5JRFViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TVWJpY2FjaW9uLklEVWJpY2FjaW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIC8vIHB1YmxpYyBHZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCkge1xyXG4gICAgLy8gICAgIHZhciBLYXRpb3MgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnS2F0aW9zXCIgKyB0aGlzLmlka2F0aW9zLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgLy8gICAgIGlmIChLYXRpb3MgIT09IHVuZGVmaW5lZCAmJiBLYXRpb3MgIT0gbnVsbCkge1xyXG4gICAgLy8gICAgICAgICB2YXIgakthdGlvc00zID0gSlNPTi5wYXJzZShLYXRpb3MpO1xyXG4gICAgLy8gICAgICAgICBpZiAoakthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3NNMyAmJiBqS2F0aW9zTTMuS2F0aW9zTTMuYXBsUGFxcykge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5hcGxQYXF1ZXRlcyA9IGpLYXRpb3NNMy5LYXRpb3NNMy5hcGxQYXFzXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlc3Ryb3koaWRrYXRpb3MpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmFwbFN5bmNDb3VjaEF1dG8gPSB0aGlzLmdldEZsYWdTeW5jQ291Y2goKTtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRoaXMuYXBsU3luY0NvdWNoQXV0byxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBDT05GSUdMUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gQ09ORklHTFAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmluZm8oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZUxwKGlkKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaWQpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlbGV0ZUFsbERvY3MoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pLnRoZW4oYWxsRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxEb2NzLnJvd3MubWFwKHJvdyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBfaWQ6IHJvdy5pZCwgX3Jldjogcm93LmRvYy5fcmV2LCBfZGVsZXRlZDogdHJ1ZSB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS50aGVuKGRlbGV0ZURvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5idWxrRG9jcyhkZWxldGVEb2NzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG59IiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgeyBDb3VjaENvbmZpZ0xQU2VydmljZSB9IGZyb20gXCIuLi9PZmZsaW5lL2NvdWNoLWNvbmZpZ2xwLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTWF0aFRGIH0gZnJvbSBcIi4uL01pc2NlbGFuZWEvTWF0aFRGLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zUHJkQWRpY2lvbmFsZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEFkaWNpb25hbGVzLnR5cGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvIHtcclxuICAgIHByaXZhdGUgb01hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHByaXZhdGUgZ3NpZGthdGlvczogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBhcGxQcmVjaW9zRGluYW1pY29zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWRrYXRpb3MpIHtcclxuICAgICAgICB0aGlzLmdzaWRrYXRpb3MgPSBpZGthdGlvcztcclxuICAgICAgICB0aGlzLkdldEthdGlvc00zRnJvbVNlc3Npb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICBsZXQgS2F0aW9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJDb25maWdLYXRpb3NcIiArIHRoaXMuZ3NpZGthdGlvcy50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoS2F0aW9zICE9PSB1bmRlZmluZWQgJiYgS2F0aW9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIGpLYXRpb3NNMyA9IEpTT04ucGFyc2UoS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYgKGpLYXRpb3NNMyAmJiBqS2F0aW9zTTMuS2F0aW9zICYmIGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBhcGwgPSBqS2F0aW9zTTMuS2F0aW9zLkthdGlvc00zLmZpbmQoeCA9PiB4LkxsYXZlLnRvVXBwZXJDYXNlKCkgPT0gXCJBUExMUERJTkFNSUNPU1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChhcGwgJiYgYXBsLlZhbG9yID09IFwiMVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcGxQcmVjaW9zRGluYW1pY29zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy9Bc2lnbmFyIGxpc3RhIGRlIHByZWNpb3MsIHNlZ3VuIGxpc3RhIGRlIHByZWNpb3MgYXNvY2lhZG8gYSB1c3VhcmlvIHBvciBjYWRhIHVqbm8gZGUgIGxvcyBwcm9kdWN0b3MgaGlqb3NcclxuICAgIHB1YmxpYyBhc3luYyBBc2lnbmFyTGlzdGFQcmVjaW9NM1BhY2soUHJvZHVjdG9NYWVzdHJvOiBUeXBlTTNQcmRHcnAsIG9EYXRhVXNlcjogYW55LCBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG9NM1ByZEdycEFzb2NpYWRvIG9mIFByb2R1Y3RvTWFlc3Ryby5NM1ByZEdycEFzb2NpYWRvKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuQXNpZ25hckxpc3RhUHJlY2lvKG9NM1ByZEdycEFzb2NpYWRvLk0zR1JQLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmRHZW5lcmFsIG9mIFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbCkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG0zUGFjayBvZiBwcmRHZW5lcmFsLk0zUEFDSykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW8obTNQYWNrLk0zR1JQLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL0FzaWduYXIgbGlzdGEgZGUgcHJlY2lvcywgc2VndW4gbGlzdGEgZGUgcHJlY2lvcyBhc29jaWFkbyBhIHVzdWFyaW8uXHJcbiAgICBwdWJsaWMgYXN5bmMgQXNpZ25hckxpc3RhUHJlY2lvKFByb2R1Y3RvTWFlc3RybzogVHlwZU0zUHJkR3JwLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICB0aGlzLkdldEthdGlvc00zRnJvbVNlc3Npb24oKTtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT09IHVuZGVmaW5lZCAmJiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvICE9IC0xICYmIFByb2R1Y3RvTWFlc3Rybykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHByZEdybCA9IFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbFtpXTtcclxuICAgICAgICAgICAgICAgIGxldCBzcGxpdFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8uc3BsaXQoXCItXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IHByZEdybC5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBzcGxpdFByZWNpb1swXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob0xpc3RhRmluZGVkICYmIHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXBsUHJlY2lvc0RpbmFtaWNvcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNwbGl0UHJlY2lvWzFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTEJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IG9MaXN0YUZpbmRlZC5MQztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJMRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MaXN0YUZpbmRlZC5QUkVDSU8gPSBvTGlzdGFGaW5kZWQuTEQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9Db3VjaENvbmZpZ0xQU2VydmljZSA9IG5ldyBDb3VjaENvbmZpZ0xQU2VydmljZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RhQ291Y2ggPSBhd2FpdCBvQ291Y2hDb25maWdMUFNlcnZpY2UuZ2V0KHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpDb25maWdMUCA9IEpTT04ucGFyc2UobGlzdGFDb3VjaC5KQ29uZmlndXJhY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakNvbmZpZ0xQICYmIGpDb25maWdMUC5GYWN0b3JlcyAmJiBqQ29uZmlnTFAuRmFjdG9yZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmYWN0b3IgPSBwYXJzZUZsb2F0KGpDb25maWdMUC5GYWN0b3Jlcy5maW5kKHggPT4geC5Ob21icmUgPT0gc3BsaXRQcmVjaW9bMV0pLkZhY3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IHRoaXMub01hdGhURi5yb3VuZChvTGlzdGFGaW5kZWQuUFJFQ0lPICogZmFjdG9yLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuTTNQcmVzZW50YWNpb25lcy5mb3JFYWNoKHByZXNlbnRhY2lvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhY2lvbi5WQUxPUiA9IHRoaXMub01hdGhURi5yb3VuZChwcmVzZW50YWNpb24uVkFMT1IgKiBmYWN0b3IsIDIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGVuIGFzaWduYXJsaXN0YXByZWNpbzogXCIgKyBFeC5tZXNzYWdlICsgXCIgLSBcIiArIHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvTGlzdGFGaW5kZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZEdybC5Mb00zUHJkTGlzdGEgPSBvTGlzdGFGaW5kZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuVmFsaWRhckRhdGFGcm9tSW52ZW50YXJpbyhwcmRHcmwsIG9EYXRhVXNlciwgb1Bvc3RTZXJ2aWNlTTMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBvTTNQcmRBZGljaW9uYWxlcyA9IG5ldyBNM1ByZEFkaWNpb25hbGVzKCk7XHJcbiAgICAgICAgICAgIG9NM1ByZEFkaWNpb25hbGVzLkFUUklCVVRPID0gXCJMSVNUQVBSRUNJT1wiO1xyXG4gICAgICAgICAgICBvTTNQcmRBZGljaW9uYWxlcy5WQUxPUiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW87XHJcbiAgICAgICAgICAgIFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkQWRpY2lvbmFsZXMucHVzaChvTTNQcmRBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChQcm9kdWN0b01hZXN0cm8pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW9NM1BhY2soUHJvZHVjdG9NYWVzdHJvLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEFzaWduYXJMaXN0YVByZWNpb0FHZW5lcmFsKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbyAhPT0gdW5kZWZpbmVkICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT0gLTEpIHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IHByZEdybC5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvKTtcclxuICAgICAgICAgICAgaWYgKG9MaXN0YUZpbmRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb0xpc3RhRmluZGVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5WYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybCwgb0RhdGFVc2VyLCBvUG9zdFNlcnZpY2VNMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBWYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICB2YXIgc0xpc3RhOiBzdHJpbmcgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIC8vVmFsaWRhciBzaSBlcyB1biB2YWxvciBkZSBpbnZlbnRhcmlvLlxyXG4gICAgICAgIGlmIChzTGlzdGEuc3BsaXQoJ18nKVswXSA9PSBcIklOVlwiKSB7XHJcbiAgICAgICAgICAgIHZhciBqRGF0YTogYW55ID0geyBcInViaWNhY2lvblwiOiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBcInNrdVwiOiBwcmRHcmwuU0tVLCBcImxvdGVcIjogcHJkR3JsLkxPVEUsIFwiY29uY2VwdG9cIjogc0xpc3RhLnNwbGl0KCdfJylbMV0gfTtcclxuICAgICAgICAgICAgdmFyIHByZWNpbyA9IGF3YWl0IG9NM1JlZ1NlcnZpY2UuR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYihvUG9zdFNlcnZpY2VNMywgdGhpcy5nc2lka2F0aW9zLCBqRGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChwcmVjaW8gJiYgcHJlY2lvICE9IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQcmRMaXN0YSA9IG5ldyBNM1ByZExpc3RhKCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcmRMaXN0YS5JRExJU1RBID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLkxPVEUgPSBwcmRHcmwuTE9URTtcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlBSRUNJTyA9IHByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlNLVSA9IHByZEdybC5TS1U7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb00zUHJkTGlzdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG4vL2ltcG9ydCB7IHNlc3Npb25XRTggfSBmcm9tIFwiLi4vLi4vLi4vU2Vzc2lvbi9zZXNzaW9uLmNsYXNzXCI7XHJcbmltcG9ydCB7IEZpbHRyb3MgfSBmcm9tIFwiLi4vTWFlc3Ryby9maWx0cm9zXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgU2VydmljZUxpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZUxvYWRMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxvYWQtbC1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IHsgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyDDicK1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX3BsYXRmb3JtX2Jyb3dzZXJfYSB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTTNNYWVzdHJvIHtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb3NQb3JDcmVkaXRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRNM1Byb2Nlc29zUG9yQ3JlZGl0by8nICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb0J5SWRQcmVzdGFtbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkUHJlc3RhbW86IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvZ2V0TTNQcm9jZXNvQnlJZFByZXN0YW1vLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRQcmVzdGFtbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IGFueTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG4gICAgLy9yYWUgZWwgVElQTywgU0tQMSwgTk9NQlJFIGRlIGxhIHRhYmxhIHByZGdycFxyXG4gICAgcHVibGljIG0zR2V0UFJER1JQKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0TTNQUkRHUlAvJyArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gSlNPTi5wYXJzZShyZXNwKTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob0RhdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgY2FudGlkYWQgZGlzcG9uaWJsZSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIFNLUDEgeSBsYSB1YmljYWNpw4PCs24uXHJcbiAgICAvL0xhIGRhdGEgZGViZSB0ZW5lciB1bmEgZXN0cnVjdHVyYToge1wiVUJJQ0FDSU9OXCI6XCIxMTExXCIsIFwiU0tQMVwiOlwiOTk5OWFcIn1cclxuICAgIHB1YmxpYyBNM0dldENhbnRpZGFkQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXRDYW50aWRhZEJ5U0tQMS8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBvRGF0YSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdmFyIGdvRGF0YURpc3A6IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIGlmIChvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vTm8gZXMgYXJyYXlcclxuICAgICAgICAgICAgICAgIGdvRGF0YURpc3AgPSBuZXcgQXJyYXk8YW55PihvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ29EYXRhRGlzcCA9IG9EYXRhLlJFU1BVRVNUQS5ESVNQT05JQklMSURBRDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhnb0RhdGFEaXNwKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhnb0RhdGFEaXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBHZXRMaXN0YVByZFhGaWx0cm9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9sRmlsdHJvczogQXJyYXk8RmlsdHJvcz4sIHNJRExpc3RhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGlkVWJpY2FjaW9uID0gXCItMVwiLCBAT3B0aW9uYWwoKSBhcGxVbHRpbW9GaWx0cm8gPSB0cnVlLCBAT3B0aW9uYWwoKSB0b3BMaW1pdCA9IFwiMFwiLCBAT3B0aW9uYWwoKSBmaWx0cmFySW52VWJpYyA9IFwiMFwiKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhU2VuZDtcclxuICAgICAgICBvRGF0YVNlbmQgPSB7IFwiRmlsdHJvc1wiOiBKU09OLnN0cmluZ2lmeShvbEZpbHRyb3MpLCBcIklkTGlzdGFcIjogc0lETGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiYXBsVWx0aW1vRmlsdHJvXCI6IGFwbFVsdGltb0ZpbHRybywgXCJ0b3BMaW1pdFwiOiB0b3BMaW1pdCwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIGlmIChvbEZpbHRyb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTGlzdFBSREZpbHRyb3MvJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwLCBvbEZpbHRyb3MpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvRnVuY2lvbkVycihcIk5vIGhheSBmaWx0cm9zIHBhcmEgbGEgYnVzcXVlZGFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0NhdGVnb3JpYTogc3RyaW5nLCBvRGF0YUNsYXNpZmljYWNpb24sIElkTGlzdGE6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgQE9wdGlvbmFsKCkgaWRVYmljYWNpb24gPSBcIi0xXCIsIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG4gICAgICAgIHZhciBvbEZpbHRyb3M6IEFycmF5PEZpbHRyb3M+O1xyXG4gICAgICAgIHZhciBvRGF0YVNlbmQ7XHJcbiAgICAgICAgb2xGaWx0cm9zID0gdGhpcy5GaW5kRmlsdGVySW5DbGFzaWZpY2FjaW9uKHNDYXRlZ29yaWEsIHNJREthdGlvcywgb0RhdGFDbGFzaWZpY2FjaW9uKTtcclxuXHJcbiAgICAgICAgb0RhdGFTZW5kID0geyBcIkZpbHRyb3NcIjogSlNPTi5zdHJpbmdpZnkob2xGaWx0cm9zKSwgXCJJZExpc3RhXCI6IElkTGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiZmlsdHJhckludlViaWNcIjogZmlsdHJhckludlViaWMgfTtcclxuICAgICAgICBpZiAob2xGaWx0cm9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vR2V0X0xpc3RQUkRGaWx0cm9zLycgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgb2xGaWx0cm9zKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiTm8gaGF5IGZpbHRyb3MgcGFyYSBsYSBidXNxdWVkYVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfS8vRW5kIEdldExpc3RhUHJkWENhdGVnb3JpYVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWFXaXRoT3V0RmlsdGVycyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzQ2F0ZWdvcmlhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlDbGFzaWZpY2FjaW9uLycgKyBzSURLYXRpb3MgKyAnLycgKyBzQ2F0ZWdvcmlhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgbnVsbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0TGlzdGFQcmRYQ2F0ZWdvcmlhXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBlbCBub21icmUgbyBkZXNjcmlwY2nDg8Kzbi5cclxuICAgIEdldExpc3RhUHJkWE5vbWJyZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FyZ2FyTGlzdFByZEJ5R2VuZXJpYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2Nhcmdhckxpc3RQcmRCeUdlbmVyaWMvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vY2FyZ2FyIGluZm9ybWFjaW9uIGRlIGNsYXNpZmljYWNpb25cclxuICAgIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBqc29uUmVzcCxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vdmFyIG9zZXNzaW9uV0U4ID0gbmV3IHNlc3Npb25XRTgoKTtcclxuXHJcbiAgICAgICAgLy9qc29uUmVzcCA9IG9zZXNzaW9uV0U4LkdldERhdGFDTEFTSUZJQ0FDSU9OKHNJREthdGlvcyk7XHJcbiAgICAgICAgaWYgKGpzb25SZXNwID09PSB1bmRlZmluZWQgfHwganNvblJlc3AgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL00zR2V0Q2xhc2lmaWNhY2lvbi9cIiArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAganNvblJlc3AgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQXJyYXlDbGFzaWZpY2FjaW9uKGpzb25SZXNwKTtcclxuICAgICAgICAgICAgICAgIC8vb3Nlc3Npb25XRTguU2V0RGF0YUNMQVNJRklDQUNJT04oanNvblJlc3AsIHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfS8vRW5kIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uXHJcblxyXG4gICAgLy9WYWxpZGFyIHF1ZSBsYSBjbGFzaWZpY2FjaW9uLCBlc3RlbiBjb21vIGFycmF5LlxyXG4gICAgVmFsaWRhckFycmF5Q2xhc2lmaWNhY2lvbihvRGF0YUNsYXMpIHtcclxuICAgICAgICB0aGlzLlJlY3Vyc2l2ZUNvbnZlcnRBcnJheShvRGF0YUNsYXMuUkVTUFVFU1RBLkNMQVNJRklDQUNJT05FUyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQXBsaWNhciBmaWx0cm9zIGEgbGEgY2F0ZWdvcmlhIGVudHJhbnRlLlxyXG4gICAgRmluZEZpbHRlckluQ2xhc2lmaWNhY2lvbihzQ2xhc0ZpbmQ6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhQ2xhc2lmaWNhY2lvbikge1xyXG4gICAgICAgIHZhciBzQ2xhc2lmaWNhY2lvbjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgb0RhdGFGaWx0cmFkYTtcclxuICAgICAgICAvL3ZhciBvc2Vzc2lvbldFOCA9IG5ldyBzZXNzaW9uV0U4KCk7XHJcbiAgICAgICAgdmFyIG9sRmlsdHJvcyA9IG5ldyBBcnJheTxGaWx0cm9zPigpO1xyXG4gICAgICAgIHZhciBvRmlsdHJvczogRmlsdHJvcztcclxuICAgICAgICB2YXIgZmlsdHJvQXRyaWJ1dG86IHN0cmluZztcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhzQ2xhc0ZpbmQpO1xyXG4gICAgICAgIC8vb0RhdGFDbGFzaWZpY2FjaW9uID0gb3Nlc3Npb25XRTguR2V0RGF0YUNMQVNJRklDQUNJT04oc0lES2F0aW9zKTtcclxuXHJcbiAgICAgICAgb0RhdGFGaWx0cmFkYSA9IG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTO1xyXG5cclxuICAgICAgICBpZiAoc0NsYXNGaW5kLmxlbmd0aCAlIDMgPT0gMCkge1xyXG4gICAgICAgICAgICB3aGlsZSAoc0NsYXNGaW5kICE9IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBzQ2xhc2lmaWNhY2lvbiA9IHNDbGFzaWZpY2FjaW9uICsgc0NsYXNGaW5kLnN1YnN0cmluZygwLCAzKTtcclxuICAgICAgICAgICAgICAgIHNDbGFzRmluZCA9IHNDbGFzRmluZC5zdWJzdHJpbmcoMyk7XHJcbiAgICAgICAgICAgICAgICBvRGF0YUZpbHRyYWRhID0gb0RhdGFGaWx0cmFkYS5DQVRFR09SSUEuZmluZChmaWx0cm8gPT4gZmlsdHJvLkNMQVNJRklDQUNJT04udG9TdHJpbmcoKSA9PSBzQ2xhc2lmaWNhY2lvbi50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmaWx0cm9BdHJpYnV0byA9IG9EYXRhRmlsdHJhZGEuQVRSSUJVVE87XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRyb0F0cmlidXRvLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJST09UXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0ZpbHRyb3MgPSBuZXcgRmlsdHJvcyhvRGF0YUZpbHRyYWRhLkFUUklCVVRPLCBvRGF0YUZpbHRyYWRhLkRlc2NyaXBjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBvbEZpbHRyb3MucHVzaChvRmlsdHJvcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIC8vb0RhdGFSZXNwQ2xhID0gdGhpcy5SZWN1cnNpdmVDbGFzaWZpY2FjaW9uKG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTLkNBVEVHT1JJQSwgc0NsYXNGaW5kKTtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cob0RhdGFSZXNwQ2xhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2xGaWx0cm9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVjdXJzaXZpZGFkLCBwYXJhIHZhbGlkYXIgcXVlIHRvZG9zIGxvcyBub2Rvcywgc2VhbiB0aXBvIGFycmF5XHJcbiAgICBSZWN1cnNpdmVDb252ZXJ0QXJyYXkob0RhdGFDbGFzKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhQ2xhcy5DQVRFR09SSUEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAob0RhdGFDbGFzLkNBVEVHT1JJQS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQSA9IG5ldyBBcnJheShvRGF0YUNsYXMuQ0FURUdPUklBKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KG9EYXRhQ2xhcy5DQVRFR09SSUFbMF0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQS5mb3JFYWNoKGNsYXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KGNsYXMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYSB1biBwcm9kdWN0b1xyXG4gICAgbTNBZGRQcm9kdWN0byhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgdGRvY1VBY3Rpdm86IHN0cmluZywgbmRvY1VBY3Rpdm86IHN0cmluZywgb00zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIGRpc2FibGVkV2ViOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB2YXIgZGF0YTtcclxuICAgICAgICBkYXRhID0geyAnc1Rkb2NVc3VhcmlvJzogdGRvY1VBY3Rpdm8sICdzTmRvY1VzdWFyaW8nOiBuZG9jVUFjdGl2bywgJ29NM1ByZEdycCc6IG9NM1ByZEdycCwgJ2Rpc2FibGVkV2ViJzogZGlzYWJsZWRXZWIgfTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vYWRkUHJvZHVjdG8vXCIgKyBzSURLYXRpb3MudHJpbSgpLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gcG9yIFNLUDEuXHJcbiAgICBNM0dldFByb2R1Y3RvQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vTTNHZXRQcm9kdWN0b0J5U0tQMS9cIiArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG86IGFueSA9IHJlc3A7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhwcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIHJhbmRvbSBwb3IgU0tQMS5cclxuICAgIE0zR2V0UHJvZHVjdG9SYW5kb21CeVNLUDEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTWFlc3Ryby9NM0dldFByb2R1Y3RvUmFuZG9tQnlTS1AxL1wiICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBwb3IgU0tQMS5cclxuICAgIE0zR2V0Q2F0QXNvY2lhZGFzQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBza3AxOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoXCJNM01hZXN0cm8vTTNHZXRDYXRBc29jaWFkYXNCeVNLUDEvXCIgKyBzSURLYXRpb3MgKyAnLycgKyBza3AxKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vR2V0IEltYWdlbmVzIGVudmlhbmRvIGVuIGxhIG9EYXRhOiB7XCJQYXRoXCI6XCJ4eHhcIiwgXCJTS1VcIjpcIlNLVXh4eFwifVxyXG4gICAgcHVibGljIE0zR2V0SW1hZ2VuZXNCeVBhdGgoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTTNNdWx0aW1lZGlhQnlQYXRoLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9vYnRlbmVyIGluZm9ybWFjaW9uIGRlIHBsYW50aWxsYXMsIGRlc2RlIHNlcnZpZG9yLi4uIFxyXG4gICAgR2V0X00zU0tQbGFudGlsbGFCeVNLVUlEKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBTS1VJRDogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL0dldF9NM1NLUGxhbnRpbGxhQnlTS1VJRC9cIiArIHNJREthdGlvcyArIFwiL1wiICsgU0tVSUQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpw4PCs24gZGUgcHJvZHVjdG9zLCBkZXNkZSBjb2RpZ28gZGUgYmFycmFzXHJcbiAgICBHZXRJbmZvQnlGaWx0ZXJDb2RlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzRmlsdGVyQ29kZTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiRklMVEVSQ09ERVwiOiBzRmlsdGVyQ29kZSB9O1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFNLUDFQcmRzQnlGaWx0ZXJzQ29kZS8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0SW5mb0J5RmlsdGVyQ29kZSBcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZFViaWNhY2lvbjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9NM1ViaWNhY2lvbmVzLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zVWJpY2FjaW9uZXNcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXNDb21wbGV0YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkVWJpY2FjaW9uOiBzdHJpbmcsIHNJZEh1Yjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zV2l0aFRpbWVPdXQoJ00zTWFlc3Ryby9nZXRfTTNVYmljYWNpb25lc0NvbXBsZXRhLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24gKyAnLycgKyBzSWRIdWIsIDEwMDAwKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9NM1ViaWNhY2lvbmVzQ29tcGxldGFcclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIHB1YmxpYyBNM0dldFByb2R1Y3RvQnlTS1UoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhQb3N0U2VydmljZU0zKTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFByb2R1Y3RvQnlTS1UvJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIFBvc3RTZXJ2aWNlTTMpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIGFzeW5jIE0zR2V0UHJvZHVjdG9CeVNLVUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzU0tVOiBzdHJpbmcsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIFViaWNhY2lvbjogc3RyaW5nID0gXCItMVwiLCBzQXBsRXhjOiBzdHJpbmcgPSBcIjFcIikge1xyXG4gICAgICAgIHZhciBkYXRhO1xyXG4gICAgICAgIHZhciByZXNwO1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGRhdGEgPSB7ICdTS1UnOiBzU0tVLCBcIlVCSUNBQ0lPTlwiOiBVYmljYWNpb24gPT0gXCItMVwiID8gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiA6IFViaWNhY2lvbiwgJ0FwbEV4Yyc6IHNBcGxFeGMgfTtcclxuICAgICAgICBpZiAob0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSBkYXRhLmZlY2hhTFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbztcclxuXHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0UHJvZHVjdG9CeVNLVS8nICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ocmVzcCwgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIGVzcGVjZmljbyB0ZW5pZW5kbyBlbiBjdWVudGEgY29kaWdvLlxyXG4gICAgYXN5bmMgR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8oc0lES2F0aW9zKTtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgYXdhaXQgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gb1Byb2R1Y3RvO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1RyYWUgbG9zIHJlZ2lzdHJvcyBxdWUgc2UgZW5jdWVudHJlbiBlbiBNM1Byb2Nlc29zIHF1ZSBzZSBlbmN1ZW50cmVuIGNvbiBlc3RhZG9nZW5lcmFsIHByb2Nlc29cclxuICAgIE0zZ2V0UmVnaXN0cm9zRW5Qcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRfUmVnaXN0cm9zRW5Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JTb2R5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRpZW5lIGVsIHRvcCAyMCBkZSBwcm9kdWN0b3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIGdldF9NM1ByZEdycEJ5Tm9tYnJlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzTm9tYnJlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X00zUHJkR3JwQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLk0zR1JQO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zUHJkR3JwQnlOb21icmVcclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIHB1YmxpYyBHZXRNM1ByZEFncnVwYWRvQnlOb21icmUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNOb21icmU6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfbTNfcHJkX2J5X25vbWJyZV9hZ3J1cGFkby8nICsgc0lES2F0aW9zICsgJy8nICsgc05vbWJyZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuTTNHUlA7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG8geSBxdWUgbm8gZXN0ZW4gZXhsY3VpZG9zIChNM0V4Y1ByZFhVYmljKVxyXG4gICAgcHVibGljIGdldF9tM19wcmRfYnlfbm9tYnJlX2FncnVwYWRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL2RhdGEgPSB7bm9tYnJlOidhc2Rhc2QnLCBpZFViaWNhY2lvbjonMSd9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X20zX3ByZF9ieV9ub21icmVfYWdydXBhZG8vJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShTdHJpbmcocmVzcCkpLlJFU1BVRVNUQS5NM0dSUDtcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLl9ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yICYmIGVyci5lcnJvci5NZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIHBhdGggYmFzZSBkb25kZSBzZSBlbmN1ZW50cmEgYWxvamFkYXMgbGFzIGltYWdlbmVzIGVuIGVsIHNlcnZpZG9yXHJcbiAgICBwdWJsaWMgZ2V0X1BhdGhTZXJ2aWRvckltYWdlbmVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9QYXRoU2Vydmlkb3JJbWFnZW5lcy8nICsgc0lES2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwKVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9QYXRoU2Vydmlkb3JJbWFnZW5lc1xyXG5cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gZXNwZWNmaWNvIHRlbmllbmRvIGVuIGN1ZW50YSBjb2RpZ28uXHJcbiAgICBHZXRfTTNQcm9kdWN0b0VzcGVjQnlDb2RlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB2YXIgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8gPSBuZXcgU2VydmljZUxvYWRMaXN0YVByZWNpbyhzSURLYXRpb3MpO1xyXG5cclxuICAgICAgICBpZiAob0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSBkYXRhLmZlY2hhTFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbztcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIFBvc3RTZXJ2aWNlTTMpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnJvci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZVRpbWVPdXQoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgdGltZW91dFRpbWU6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0VGltZSAhPSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YVVzZXIgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbykgZGF0YS5mZWNoYUxQcmVjaW8gPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW87XHJcbiAgICAgICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNM1RpbWVPdXQoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSwgdGltZW91dFRpbWUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICAgICAgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnJvci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRfRG9jc0Zyb21Db3VjaE1hZXN0cm8ob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3Rybywgc0lkS2F0aW9zOiBzdHJpbmcsIHNEb2M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ2V0X0RvY3NGcm9tQ291Y2hNYWVzdHJvXCIpXHJcbiAgICAgICAgdmFyIHNJZEtleURvYyA9IG9NM0NvdWNoTWFlc3Ryby5HZXRLZXlEb2N1bWVudG9EQihzSWRLYXRpb3MsIHNEb2MpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHNJZEtleURvYylcclxuICAgICAgICBvTTNDb3VjaE1hZXN0cm8uR2V0RGF0YVBvdWNoQkQoc0lkS2V5RG9jKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzdWx0KTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRQcm9kdWN0b0VzcGVjQnlDb2RlRnJvbUNvdWNoKGpQcm9kdWN0c0NvdWNoOiBhbnksIHNDb2RlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGpQcm9kdWN0c0ZpbCA9IGpQcm9kdWN0c0NvdWNoLmZpbmQoeCA9PiB4LkxvTTNQcmRHZW5lcmFsICE9IHVuZGVmaW5lZCAmJiB4LkxvTTNQcmRHZW5lcmFsLmZpbmQodyA9PiB3Lk0zQ29kcyAhPSB1bmRlZmluZWQgJiYgdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpICE9IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RfY2xvbmUgPSBfLmNsb25lRGVlcChqUHJvZHVjdHNGaWwpO1xyXG5cclxuICAgICAgICBpZiAoalByb2R1Y3RzRmlsICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB2YXIgalByZEVzcCA9IGpQcm9kdWN0c0ZpbC5Mb00zUHJkR2VuZXJhbC5maW5kKHcgPT4gdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHByb2R1Y3RfY2xvbmUuTG9NM1ByZEdlbmVyYWwgPSBbXTtcclxuICAgICAgICAgICAgcHJvZHVjdF9jbG9uZS5Mb00zUHJkR2VuZXJhbC5wdXNoKGpQcmRFc3ApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInByb2R1Y3RfY2xvbmVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocHJvZHVjdF9jbG9uZSlcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0X2Nsb25lKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnJvcihcIk5vIHNlIGVuY29udHLDg8KzIG51bmfDg8K6biByZWdpc3Ryby5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxvcyBUaXBvcyBkZSBwcm9jZXNvcyBkZXNkZSBlbCBzZXJ2aWRvclxyXG4gICAgcHVibGljIGdldF9UaXBvc1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgYWN0aXZpZGFkOiBzdHJpbmcgPSAnVmVudGFzJykge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X1RpcG9zUHJvY2Vzby8nICsgc0lES2F0aW9zICsgJy8nICsgYWN0aXZpZGFkKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9UaXBvc1Byb2Nlc29cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIEluZm8gZGUgdW4gcHJvY2VzbyBhIHBhcnRpciBkZSB1biBpZFByb2Nlc28geSB1biBJZE0zXHJcbiAgICBwdWJsaWMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXRfSW5mb1BlcnNvbmFfUHJvY2Vzby8nICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UoU3RyaW5nKHJlc3ApKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9JbmZvUHJvY2Vzb1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBsYSBJbmZvIGRlIHVuIHByb2Nlc28gYSBwYXJ0aXIgZGUgdW4gaWRQcm9jZXNvIHkgdW4gSWRNMyBkZSBtYW5lcmEgc2luY3LDg8KzbmljYVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGpEYXRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc29fYXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICB2YXIganNvbjtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldF9JbmZvUGVyc29uYV9Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVzcClcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgdW4gcHJvZHVjdG8gYWdydXBhZG8sIHRlbmllbmRvIHVuYSBsaXN0YSBkZSBwcm9kdWN0byBhZ3J1cGFkb3MgeSB1biBza3VcclxuICAgIHB1YmxpYyBHZXRNM1ByZEdycEZyb21MaXN0KExpc3RQcmQ6IEFycmF5PFR5cGVNM1ByZEdycD4sIHNrdSk6IFR5cGVNM1ByZEdycCB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9UeXBlTTNQcmRHcnBSZXN1bHQ6IFR5cGVNM1ByZEdycDtcclxuICAgICAgICAgICAgb1R5cGVNM1ByZEdycFJlc3VsdCA9IExpc3RQcmQuZmluZChwcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBwcmQuTG9NM1ByZEdlbmVyYWwuZm9yRWFjaChwcmQgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJkLlNLVSA9PT0gc2t1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9UeXBlTTNQcmRHcnBSZXN1bHQuTG9NM1ByZEdlbmVyYWwgPSBvVHlwZU0zUHJkR3JwUmVzdWx0LkxvTTNQcmRHZW5lcmFsLmZpbHRlcihnZW4gPT4gZ2VuLlNLVSA9PSBza3UpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1R5cGVNM1ByZEdycFJlc3VsdDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0ZW5lciBkZSB1bmEgbGlzdGEgZGUgdWJpY2FjaW9uZXMsIHVuYSB1YmljYWNpb24gZW4gcGFydGljdWxhciwgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgR2V0VWJpY2FjaW9uRnJvbUxpc3QoTGlzdFViaWM6IEFycmF5PE0zVWJpY2FjaW9uPiwgc0lkVWJpYykge1xyXG4gICAgICAgIHZhciBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uO1xyXG4gICAgICAgIG9NM1ViaWNhY2lvbiA9IExpc3RVYmljLmZpbmQodWJpYyA9PiB1YmljLklEVWJpY2FjaW9uID09IHNJZFViaWMpO1xyXG4gICAgICAgIHJldHVybiBvTTNVYmljYWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aWVuZSBsb3MgZGF0b3MgZGUgZmFjdHVyYWNpb24gdGFsIGNvbW8gZWwgY29kaWdvIHBvc3RhbCB5IGVsIHJlZ2ltZW4gZmlzY2FsIGFzb2NpYWRvIGEgdW4gUkZDXHJcbiAgICBwdWJsaWMgZ2V0RGF0b3NGYWN0dXJhY2lvbkZyb21SRkMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXREYXRvc0ZhY3R1cmFjaW9uRnJvbVJGQy8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0RGF0b3NGYWN0dXJhY2lvbkZyb21SRkNcclxuXHJcbiAgICBwdWJsaWMgYWN0dWFsaXphclJGQyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nLCBvRGF0YSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM01hZXN0cm8vYWN0dWFsaXphclJGQy8nICsgSWRLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocG9zdHMgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHBvc3RzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIFhtbCBkZSBjb25maWd1cmFjaW9uIGRlIGxhIGVtcHJlc2EgYSBwYXJ0aXIgZGVsIGlkdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBnZXRfWG1sQ29uZmlnX3hfSWRVYmljYWNpb25cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIFhtbCBkZSBjb25maWd1cmFjaW9uIGRlIGxhIGVtcHJlc2EgYSBwYXJ0aXIgZGVsIGlkdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgZ2V0Q0ZESXNYUHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldENGRElzWFByb2Nlc28vJyArIHNJREthdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9YbWxDb25maWdfeF9JZFViaWNhY2lvblxyXG5cclxuICAgIC8vL09idGllbmUgbG9zIGF0cmlidXRvcyBlbiBtM2NsYXNpZmljYSBhIHBhcnRpciBkZSB1biBpZGthdGlvc1xyXG4gICAgZ2V0X2NsYXNpZmljYXRpb25fYXR0cmlidXRlcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfY2xhc2lmaWNhdGlvbl9hdHRyaWJ1dGVzLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuQVRUUklCVVRFUztcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsYXMgY2F0ZWdvcmlhcyBlbiBtM2NsYXNpZmljYSBhIHBhcnRpciBkZSB1biBpZGthdGlvcyB5IHVuIGF0cmlidXRvXHJcbiAgICBnZXRfY2xhc2lmaWNhdGlvbl9jYXRlZ29yaWVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfY2xhc2lmaWNhdGlvbl9jYXRlZ29yaWVzLycgKyBpZF9rYXRpb3MgKyBcIi9cIiArIGF0dHJpYnV0ZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgalJlc3AgPSBKU09OLnBhcnNlKHJlc3ApLlJFU1BVRVNUQS5DQVRFR09SSUVTO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9wY2lvbmVzQWRpY2lvbmFsZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0T3BjaW9uZXNBZGljaW9uYWxlcy8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkFUVFJJQlVURVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBdHJpYnV0b3NBZGljaW9uYWxlcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgYXR0cmlidXRlOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0QXRyaWJ1dG9zQWRpY2lvbmFsZXMvJyArIGlkX2thdGlvcyArIFwiL1wiICsgYXR0cmlidXRlKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkNBVEVHT1JJRVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsYSBpbmZvcm1hY2lvbiBkZSB0aXBvcyBkZSBlbnZpby5cclxuICAgIE0zR2V0Rm9ybWFzRW52aW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vTTNHZXRGb3JtYXNFbnZpby8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBqc1Jlc3A7XHJcbiAgICAgICAgICAgIGpzUmVzcCA9IEpTT04ucGFyc2UocmVzcCk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soanNSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBnZXRfdWJpY2FjaW9uZXNfY29tcGxldGUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X3ViaWNhY2lvbmVzX2NvbXBsZXRlLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBnZXRfdWJpY2FjaW9uZXNfc2ltcGxlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF91YmljYWNpb25lc19zaW1wbGUvJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBhc3luYyBNM0dFVF9MSVNUQVBSRUNJT1NfQVN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb1JlY0xpc3RhUHJlYzogYW55O1xyXG5cclxuICAgICAgICBvUmVjTGlzdGFQcmVjID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR0VUX0xJU1RBUFJFQ0lPUy8nICsgaWRfa2F0aW9zKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gb1JlY0xpc3RhUHJlY1swXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0RW5jYWJlemFkb0xpc3Rhc1ByZWNpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByZXNwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvR2V0Q29uZmlnTFAvJyArIHNJREthdGlvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVnaXN0cmFyQ29sb25pYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nLCBzQ29sb25pYTogc3RyaW5nLCBzQ29kUG9zdGFsLCBzVGVsZWZvbm86IHN0cmluZywgbmRvYzogc3RyaW5nLCBzTGluZWExOiBzdHJpbmcsIHNDb2Rlc3RhZG86IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YVNlbmQ7XHJcbiAgICAgICAgb0RhdGFTZW5kID0geyBcInNDb2xvbmlhXCI6IHNDb2xvbmlhLCBcInNDb2RQb3N0YWxcIjogc0NvZFBvc3RhbCwgXCJzVGVsZWZvbm9cIjogc1RlbGVmb25vLCBcIm5kb2NcIjogbmRvYywgXCJzTGluZWExXCI6IHNMaW5lYTEsIFwic0NvZGVzdGFkb1wiOiBzQ29kZXN0YWRvIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zTWFlc3Ryby9yZWdpc3RyYXJDb2xvbmlhLycgKyBJZEthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocG9zdHMgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0ZW5lciBwcm9tb2Npb25lcyBcclxuICAgIHB1YmxpYyBhc3luYyBNM19HZXRQcm9tb2Npb25lc01hZXN0cm9Bc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvUmVjTGlzdGFQcmVjOiBhbnk7XHJcblxyXG4gICAgICAgIG9SZWNMaXN0YVByZWMgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vTTNfR2V0UHJvbW9jaW9uZXNNYWVzdHJvLycgKyBpZF9rYXRpb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiBvUmVjTGlzdGFQcmVjO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRlbmVyIERpbmFtaWNhcyBwb3IgYWN0aXZpZGFkIFxyXG4gICAgcHVibGljIGFzeW5jIE0zR2V0RGluQnlBY3RpdmlkYWQoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXREaW5CeUFjdGl2aWRhZC8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBqc1Jlc3A6YW55ID0gcmVzcDtcclxuICAgICAgICAgICAgLy9qc1Jlc3AgPSBKU09OLnBhcnNlKGpzUmVzcCk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgLy8gdmFyIG9SZWNMaXN0YVByZWM6IGFueTtcclxuXHJcbiAgICAgICAgLy8gb1JlY0xpc3RhUHJlYyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0RGluQnlBY3RpdmlkYWQvJyArIGlkX2thdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIC8vIHJldHVybiBvUmVjTGlzdGFQcmVjO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYSBpbmZvIGJhc2ljYSBkZSBsYXMgdWJpY2FjaW9uZXMgY29uIEh1YiB0aXBvIFdFQiBhY3Rpdm9zIGVuIGVsIG1vbWVudG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIGdldFViaWNhY2lvbmVzV2ViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0VWJpY2FjaW9uZXNXZWIvJyArIGlkS2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIFJldG9ybmEgbGEgaW5mbyBiYXNpY2EgZGUgbGFzIHViaWNhY2lvbmVzIGNvbiBIdWIgdGlwbyBXRUIgYWN0aXZvcyBlbiBlbCBtb21lbnRvIHF1ZSBhYmFycXVlbiB1biBjb2Rwb3N0YWwgZW4gY29uY3JldG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgZ2V0VWJpY2FjaW9uZXNCeUNvZFBvc3RhbChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL2RhdGEgPSB7IFwiY29kUG9zdGFsXCI6IHN0cmluZyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldFViaWNhY2lvbmVzQnlDb2RQb3N0YWwvJyArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHBhdGggZGUgbGEgZmFjdHVyYSBlbGVjdHLDg8KzbmljYSBhIHBhcnRpciBkZSB1biBJZERpYXJpbyBhc29jaWFkbyBhbCBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UGF0aEZFRnJvbURpYXJpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCB0aXBvR2VuZXJhY2lvbjogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0UGF0aEZFRnJvbURpYXJpby8nICsgaWRLYXRpb3MgKyAnLycgKyB0aXBvR2VuZXJhY2lvbiwgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3RhOiBhbnkgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcHVlc3RhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERpYXJpb0FkaWNpb25hbGVzeERpYXJpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlHZW5lcmFsZXMoJ0RpYXJpby9nZXREaWFyaW9BZGljaW9uYWxlc3hEaWFyaW8vJyArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciByZXNwdWVzdGE6IGFueSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwdWVzdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhc3luYyBJVV9IdWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9IdWI6IGFueSwgdVRBY3Rpdm86IHN0cmluZywgdU5BY3Rpdm86IHN0cmluZykge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBpZF9rYXRpb3MudHJpbSgpLCAnb0h1Yic6IG9IdWIsICd1VEFjdGl2byc6IHVUQWN0aXZvLCAndU5BY3Rpdm8nOiB1TkFjdGl2byB9O1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNNYWVzdHJvL0lVX0h1YicsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBjdGl2byBkZXNkZSBzZXJ2aWRvclxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGlkcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSB1YmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaHViIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBHZXRDdGl2b0JZUHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRwcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRwcm9jZXNvJzogaWRwcm9jZXNvLCAndWJpY2FjaW9uJzogdWJpY2FjaW9uLCAnaHViJzogaHViIH07XHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvR2V0Q3Rpdm9CWVByb2Nlc28vJyArIGlkX2thdGlvcy50cmltKCksIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIFZhbGlkYXJDdGl2b3NWU0xvY2FsKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGluZlByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nLCBmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTMvVmFsaWRhckN0aXZvc1ZTTG9jYWwvJyArIGlkX2thdGlvcyArICcvJyArIHViaWNhY2lvbiArICcvJyArIGh1YiwgaW5mUHJvY2Vzbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBmdW5jaW9uUmVzcChyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKHsgXCJlcnJvclwiOiBlcnJvciB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgR2VuZXJhckF1dG9yaXphY2lvbkN1ZW50YXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgZGF0YSkge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG5cclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zL0dlbmVyYXJBdXRvcml6YWNpb25DdWVudGFzJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mb1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGVsIGNvZGlnbyBpbmdyZXNhZG8gY29ycmVzcG9uZGUgYWwgZG9jdW1lbnRvIHkgc2kgZWwgY29kaWdvIGVzdGEgZW4gZXN0YWRvIGFjdGl2b1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgdmFsaWRhY2lvbkF1dG9yaXphY2lvbk0zQ3VlbnRhcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBkYXRhKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcblxyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTMvdmFsaWRhY2lvbkF1dG9yaXphY2lvbk0zQ3VlbnRhcycsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgVmVyaWZpY2FyUGFnb1RhcmpldGFCQlZBKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSWRLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBqRGF0YSA9IHsgXCJJZGthdGlvc1wiOiBzSURLYXRpb3MsIFwiaWRLZXlcIjogc0lkS2V5IH1cclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9WZXJpZmljYXJQYWdvVGFyamV0YUJCVkEnLCBqRGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mbztcclxuICAgIH0vL0VuZCBnZXRfSW5mb1Byb2Nlc29cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZTIDIwMTkwODEzOiBSZXRvcm5hIGxvcyBjb2RpZ29zIGRlIGxvcyBTS1Aoc2twVG9GaW5kKSB5IHN1IHJlc3BlY3Rpdm8gc2lnbmlmaWNhZG8gcGFyYSB1biBwcm9kdWN0byBkYWRvXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwY2lvblNLUHMoaWRLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMyxcclxuICAgICAgICBkYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy9sZXQgZGF0YSA9IHtcIlNLUDFcIjpcIlNLUDFcIiwgU0tQVG9GaW5kOiAyIH19O1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9nZXREZXNjcmlwY2lvblNLUHMvXCIgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soZGF0YS5TS1AxLCBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgZ2V0VG90YWxlc0NpZXJyZUNhamEocG9zdFNlcnZpY2U6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBzdWJpY2FjaW9uOiBzdHJpbmcsIHNodWI6IHN0cmluZywgc3VzdWFyaW86IHN0cmluZywgc0ZlY2hhSTogc3RyaW5nLCBzRmVjaGFGOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc2Vjb3BjaW9uZXM6IGFueTtcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogc0lkS2F0aW9zLCAndWJpY2FjaW9uJzogc3ViaWNhY2lvbiwgJ2h1Yic6IHNodWIsICd1c3VhcmlvJzogc3VzdWFyaW8sICdGZWNoYUknOiBzRmVjaGFJLCAnRmVjaGFGJzogc0ZlY2hhRiB9XHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBhd2FpdCBwb3N0U2VydmljZS5nZXRXaXRoQm9keU0zKCdNMy9nZXRUb3RhbGVzQ2llcnJlQ2FqYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBKU09OLnBhcnNlKHNlY29wY2lvbmVzKVxyXG4gICAgICAgIHJldHVybiBzZWNvcGNpb25lc1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENpZXJyZXN4VWJpY2FjaW9uKHBvc3RTZXJ2aWNlOiBQb3N0U2VydmljZU0zLCBzSWRLYXRpb3M6IHN0cmluZywgc3ViaWNhY2lvbjogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHNGZWNoYTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNlY29wY2lvbmVzOiBhbnk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IHNJZEthdGlvcywgJ3ViaWNhY2lvbic6IHN1YmljYWNpb24sICdpZFByb2Nlc28nOiBzSWRQcm9jZXNvLCAnRmVjaGEnOiBzRmVjaGEgfVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gYXdhaXQgcG9zdFNlcnZpY2UuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0Q2llcnJlc3hVYmljYWNpb24nLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gSlNPTi5wYXJzZShzZWNvcGNpb25lcylcclxuICAgICAgICByZXR1cm4gc2Vjb3BjaW9uZXNcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRDaWVycmVzeEVtcHJlc2EocG9zdFNlcnZpY2U6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHNGZWNoYTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNlY29wY2lvbmVzOiBhbnk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IHNJZEthdGlvcywgJ2lkUHJvY2Vzbyc6IHNJZFByb2Nlc28sICdGZWNoYSc6IHNGZWNoYSB9XHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBhd2FpdCBwb3N0U2VydmljZS5nZXRXaXRoQm9keU0zKCdNMy9nZXRDaWVycmVzeEVtcHJlc2EnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gSlNPTi5wYXJzZShzZWNvcGNpb25lcylcclxuICAgICAgICByZXR1cm4gc2Vjb3BjaW9uZXNcclxuICAgIH1cclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIHNpbXVsYXJwYWdvRW5saW5lYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkTTM6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNMy9WYWxpZGFjaW9uUGFnb0ludGVncmFjaW9uVGVzdC8nICsgc0lES2F0aW9zICsgJy8nICsgc0lkTTMgKyAnLycgKyBzSWRQcm9jZXNvKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmFsaWRhclByZHNNaXNtb1Byb3ZlZWRvcihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgbm9tYnJlQWRpY2lvbmFsUHJvdmVlZG9yOiBzdHJpbmcsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vdmFsaWRhclByZHNNaXNtb1Byb3ZlZWRvci9cIiArIGlkX2thdGlvcyArIFwiL1wiICsgbm9tYnJlQWRpY2lvbmFsUHJvdmVlZG9yLCBvTTNQcm9jZXNvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHZhbGlkYXJQcmRzTWlzbW9Qcm92ZWVkb3JcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShlcnJbJ19ib2R5J10pLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0Z1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNNYWVzdHJvL3ZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvL1wiICsgaWRfa2F0aW9zLCBvTTNQcm9jZXNvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uUmVzcChKU09OLnBhcnNlKEpTT04ucGFyc2UoZXJyWydfYm9keSddKS5NZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2YWxpZGFyUmVzdHJpY2Npb25JbnZOZWdhdGl2b1YyKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBwcmRzOiBhbnksIG9GdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby92YWxpZGFyUmVzdHJpY2Npb25JbnZOZWdhdGl2b1YyL1wiICsgaWRfa2F0aW9zLCBwcmRzKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpKVxyXG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzcClcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uUmVzcChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvVjJcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShlcnJbJ19ib2R5J10pLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZhbGlkYXJFZmVjdGl2b0VuQ2FqYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgdWJpaHViOiBhbnksIG9GdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby92YWxpZGFyRWZlY3Rpdm9FbkNhamEvXCIgKyBpZF9rYXRpb3MsIHViaWh1Yikuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXNwWydfYm9keSddKS50b1N0cmluZygpKSlcclxuICAgICAgICAgICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlc3ApXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvblJlc3AoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB2YWxpZGFyRWZlY3Rpdm9FbkNhamFcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShlcnJbJ19ib2R5J10pLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldEluZm9QcmRHYXN0b3NFbnZpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuXHJcbiAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby9nZXRJbmZvUHJkR2FzdG9zRW52aW8vXCIgKyBpZF9rYXRpb3MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpLlJFU1BVRVNUQVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhIHVuYSBzYWxkb3hjdWVudGEgYWxlYXRvcmlvIHBvciBlbCB2YWxvciBkYWRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhID0ge1wicHJvY2Vzb1wiLHByb2Nlc28sXCJ2YWxvclwiOnZhbG9yLFwibm9tYnJlRG9jXCI6IG5vbWJyZURvY31cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG0zX2dlbmVyYXJfTTNTWENfYWxlYXRvcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9NM1NYQ19hbGVhdG9yaW8vXCIgKyBpZGthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04ucGFyc2UocmVzcFsnX2JvZHknXSkudG9TdHJpbmcoKSkuUkVTUFVFU1RBO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgdW4gY29uY2VwdG8gZGVsIE0zX3NhbGRvc0l0ZW1VYlxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTTNfYWN0dWFsaXphckNvbmNlcHRvU0lVKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9NM19hY3R1YWxpemFyQ29uY2VwdG9TSVUvXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2Vzb0FsQ2llcnJlVWJpYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvcHJvY2Vzb0FsQ2llcnJlVWJpYy9cIiArIGlkX2thdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApXHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvciAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcHJvY2Vzb0FsQ2llcnJlVWJpY1wiKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldF9Qcm9jZXNvc0FiaWVydG9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBqRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X1Byb2Nlc29zQWJpZXJ0b3MvJyArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKFN0cmluZyhyZXNwKSkuUkVTUFVFU1RBKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBnZXRfUHJvY2Vzb3NBYmllcnRvc1wiKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBnZXRfSW5mb1Byb2Nlc29cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5pbXBvcnQgeyBNM1BFbmNJdGVtcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR2VuZXJhbC50eXBlXCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgTTNQRGV0YWxsZUl0ZW1zLCBNM1BJdGVtc1dFQiwgTTNQRGV0YWxsZUN1cG9uIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM0RhdGEgfSBmcm9tIFwiLi4vRGF0YS9tMy1kYXRhXCI7XHJcbmltcG9ydCB7IERFRkFVTFRfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvZGVmYXVsdF92YWx1ZV9hY2Nlc3NvclwiO1xyXG5pbXBvcnQgeyB4bWxUb0pzb25URiB9IGZyb20gXCIuLi8uLi9Db252ZXJ0L3htbFRvSlNvbi5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM1BJbXB1ZXN0b3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcC1pbXB1ZXN0b3NcIjtcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBNM0VOQ1BST01PIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM0VOQ1BST01PLmNsYXNzXCI7XHJcbmltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgcHJvbW9jaW9uZXNTZXJ2aWNlIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL3Byb21vY2lvbmVzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgUHJvbW9jaW9uUHJvY2VzYWRhLCBQcm9tb2Npb25lc0Fzb2NpYWRhcywgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM1Byb21vUHJvY2VzYWRhLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4vTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkaW5hbWljYXNcIjtcclxuaW1wb3J0IHsgU2VydmljZUxpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZUxvYWRMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxvYWQtbC1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBhIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjNcIjtcclxuaW1wb3J0IHsgTTNQcmVzZW50YWNpb25lcyB9IGZyb20gXCIuLi9NYWVzdHJvL20zLXByZXNlbnRhY2lvbmVzXCI7XHJcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gXCJAYW5ndWxhci9jb21waWxlci9zcmMvdXRpbFwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tEZXQgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZFBhY2tEZXRcIjtcclxuaW1wb3J0IHsgTTNQcmRBZGljaW9uYWxlcyB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkQWRpY2lvbmFsZXMudHlwZVwiO1xyXG5pbXBvcnQgeyBNM090Q2xhc2lmaWNhY2lvbmVzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLW90LWNsYXNpZmljYWNpb25lc1wiO1xyXG5pbXBvcnQgeyBNM1ByZExpc3RhIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlXCI7XHJcbmltcG9ydCB7IE1hdGhURiB9IGZyb20gXCIuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzc1wiO1xyXG5pbXBvcnQgeyBFQ0FOQ0VMRUQgfSBmcm9tIFwiY29uc3RhbnRzXCI7XHJcbmltcG9ydCAqIGFzIHhtbDJqcyBmcm9tICd4bWwyanMnO1xyXG5cclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxudmFyIGJpZ0RlY2ltYWwgPSByZXF1aXJlKCdqcy1iaWctZGVjaW1hbCcpO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnU2VydmljZSB7XHJcbiAgICBwdWJsaWMgb01hdGhURjogTWF0aFRGID0gbmV3IE1hdGhURigpO1xyXG4gICAgcHJpdmF0ZSBvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvO1xyXG4gICAgcHVibGljIG9MaXN0YU9ic2VxdWlvczogQXJyYXk8YW55PiA9IG51bGw7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9zRXhjOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9PUHJvbW86IG51bWJlciA9IC0xO1xyXG4gICAgcHVibGljIG9ic2VxdWlvc0NhbnRpZGFkOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGxJZEFjdGl2YVByb21vID0gW107XHJcbiAgICBwcml2YXRlIEdvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMztcclxuICAgIHByaXZhdGUgZ3NJZGthdGlvcztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihpb00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybywgSXNQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSWRrYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub00zQ291Y2hNYWVzdHJvID0gaW9NM0NvdWNoTWFlc3RybztcclxuICAgICAgICB0aGlzLkdvUG9zdFNlcnZpY2VNMyA9IElzUG9zdFNlcnZpY2VNMztcclxuICAgICAgICB0aGlzLmdzSWRrYXRpb3MgPSBzSWRrYXRpb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICogVmFsaWRhciBudW1lcm8gZGUgaXRlbXMgYWdyZWdhZG9zLiBzaSBlcyBtYXlvciBhIDEuMDAwIHByZW5kZSBwYXJhbWV0cm8gXHJcbiAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhck51bWVyb0l0ZW1zKG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvbE0zUHJvY2Vzb3MuTTNFTkMubGVuZ3RoID4gMTAwMCkge1xyXG4gICAgICAgICAgICBvbE0zUHJvY2Vzb3MuQXBsRGVzZGVTZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICBvbE0zUHJvY2Vzb3MuTTNFTkMgPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBQcm9jZXNhbWllbnRvU2VydmljZShzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGFwbFJldG9tYXJJbmZvOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuVmFsaWRhck51bWVyb0l0ZW1zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICB0aGlzLlJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLCBhcGxSZXRvbWFySW5mbyk7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvUmVnaXN0cm9FdmVudG9NMy9cIiArIHNJREthdGlvcyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvTTNQcm9jZXNvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSWRNMyA9IG9Kc29uLlJFU1BVRVNUQS5JRE0zO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpbyA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJTztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW9DaWVycmUgPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU9DSUVSUkVcclxuXHJcbiAgICAgICAgICAgIC8vQWN0dWFsaXphY2lvbiBkZSBlc3RhZG9zLlxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLkVzdGFkb0RlcztcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb0pzb24uUkVTUFVFU1RBKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBwcm9jZXNhbWllbnRvX3NlcnZpY2VfYXN5bmMoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBhcGxSZXRvbWFySW5mbzogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLlJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLCBhcGxSZXRvbWFySW5mbyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvUmVnaXN0cm9FdmVudG9NMy9cIiArIHNJREthdGlvcyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvTTNQcm9jZXNvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JZE0zID0gb0pzb24uUkVTUFVFU1RBLklETTM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPO1xyXG5cclxuICAgICAgICAgICAgLy9BY3R1YWxpemFjaW9uIGRlIGVzdGFkb3MuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuRXN0YWRvRGVzO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIFJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogQXJyYXk8TTNQcm9jZXNvcz4sIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zT2ZmTGluZS9cIiArIHNJREthdGlvcyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvTTNQcm9jZXNvcykudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLy9SZXRvbWFyIGluZm9ybWFjaW9uIHBhcmEgZWwgcHJvY2Vzby5cclxuICAgIHB1YmxpYyBSZXRvbWFySW5mb3JtYWNpb24ob0RhdGFVc2VyOiBhbnksIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBhcGxSZXRvbWFySW5mbzogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChvRGF0YVVzZXIgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5JZE0zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuSWRNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChhcGxSZXRvbWFySW5mbykge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQjtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9PSB1bmRlZmluZWQgfHwgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmVcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vUHJvY2VzYW1pZW50byBkZSBkYXRvcyBlbiBiYXNlIGRlIGRhdG9zIHBvdWNoREIuXHJcbiAgICBwdWJsaWMgUHJvY2VzYW1pZW50b1NlcnZpY2VQb3VjaERCKG9NM0RhdGE6IE0zRGF0YSwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHZhciBwcm9kdWN0VW5pdFNlbGVjdGVkOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgcHJvZHVjdFVuaXRTZWxlY3RlZCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXTtcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAvL0NhcmdhciBkZXRhbGxlIGRlIGl0ZW1zXHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKS50aGVuKGFzeW5jIHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gcmVzdWx0O1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy52YWxpZGFyRXhpc3RhUHJvZHVjdG8ob00zUHJvY2Vzb3MuTTNFTkMsIHByb2R1Y3RVbml0U2VsZWN0ZWQsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGlmIChjYW50aWRhZF9hY3R1YWwgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9sZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy5nZXRDYW50aWRhZChvTTNQcm9jZXNvcywgcHJvZHVjdFVuaXRTZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gKCtjYW50aWRhZF9hY3R1YWwpICsgK29NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9sZXQgTTNFbmMgPSB0aGlzLmdldF9NM0VOQ19ieV9pZHByZF9sb3RlKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVSwgcHJvZHVjdFVuaXRTZWxlY3RlZC5MT1RFKTtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVICYmIHByb2QuTG90ZSA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUgJiYgIShwcm9kLklkRW5jUGFkcmUgPiAwKSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhvRGF0YUNhcnJpdG9Db21wcmFzKTtcclxuICAgICAgICB9LCBhc3luYyBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvRGF0YVVzZXIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGlvTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkb1wiKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWdyZWdhciBhIGNhcnJpdG8gcHJvZHVjdG8uXHJcbiAgICBwdWJsaWMgYWRkdG9jYXJ0KG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsLCB2YWxvckRlc2N1ZW50byA9IDApIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zID0gaW9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHZhciBwcm9kdWN0VW5pdFNlbGVjdGVkOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgcHJvZHVjdFVuaXRTZWxlY3RlZCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXTtcclxuICAgICAgICAvL0pBR00gMjAxOTA3MjIgc2UgYWdyZWdhIHBhcmEgY3VhbmRvIGVzIGVsIHByaW1lciBwcm9kdWN0byBxdWUgc2UgYWdyZWdhcsODwqFcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNFTkMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb0RhdGFVc2VyLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBpb00zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMudmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM1Byb2Nlc29zLk0zRU5DLCBwcm9kdWN0VW5pdFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICBpZiAoY2FudGlkYWRfYWN0dWFsICE9IDApIHtcclxuICAgICAgICAgICAgICAgIC8vbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMuZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9ICgrY2FudGlkYWRfYWN0dWFsKSArIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIocHJvZCA9PiAhKHByb2QuSWRQcm9kdWN0byA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVSAmJiBwcm9kLkxvdGUgPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5MT1RFICYmICEocHJvZC5JZEVuY1BhZHJlID4gMCkpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLCB2YWxvckRlc2N1ZW50byk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnVuY2lvbk9LKVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQsIHZhbG9yRGVzY3VlbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vVmFsaWRhIHF1ZSBleGlzdGEgcHJvZHVjdG8gZW4gbG9zIGVuY2FiZXphZG9zLiBUcnVlOiBTaSBleGlzdGUsIEZhbHNlIGRlIG90cm8gbW9kb1xyXG4gICAgLy8gU2UgY2FtYmlhIGZ1bmNpb25hbGlkYWQgZGUgcmV0dXJuLlxyXG4gICAgcHVibGljIHZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNMaXN0YUVuYzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQcmRHcmw6IE0zUHJkR2VuZXJhbCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQik6IG51bWJlciB7XHJcbiAgICAgICAgdmFyIG9FbmM6IE0zUEVuY0l0ZW1zID0gbnVsbDtcclxuICAgICAgICB2YXIgY2FudGlkYWQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSAtMTtcclxuICAgICAgICBpZiAob00zTGlzdGFFbmMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcmRHcmwgIT09IHVuZGVmaW5lZCAmJiBvTTNMaXN0YUVuYy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICBvRW5jID0gb00zTGlzdGFFbmMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gb00zUHJkR3JsLlNLVSAmJiAhZW5jLklkRW5jUGFkcmUgJiYgdGhpcy5nZXRDYW50aWRhZFBvc2l0aXZhKGVuYykpO1xyXG4gICAgICAgICAgICBpZiAob0VuYyAhPT0gdW5kZWZpbmVkICYmIG9FbmMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzE3IFZhbGlkYXIgYWhvcmEgZWwgcHJlY2lvLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXNHZW5lcmFsKG9NM1ByZEdybCwgK29FbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5WYWxpZGFyUHJlY2lvc1ByZHMob0VuYywgb00zUHJkR3JsLkxvTTNQcmRMaXN0YSkgJiYgIXRoaXMuVmFsaWRhckVzdGFQYXF1ZXRlKG9FbmMsIG9NM0xpc3RhRW5jKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gb0VuYy5JRDtcclxuICAgICAgICAgICAgICAgICAgICBjYW50aWRhZCA9ICtvRW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW50aWRhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDYW50aWRhZFBvc2l0aXZhKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgY2FudGlkYWQgPSAwO1xyXG4gICAgICAgIGxldCBkZXRDYW50aWRhZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpXHJcblxyXG4gICAgICAgIGlmIChkZXRDYW50aWRhZCkge1xyXG4gICAgICAgICAgICBjYW50aWRhZCA9ICtkZXRDYW50aWRhZC5WYWxvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW50aWRhZCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBxdWUgZWwgZW5jYWJlemFkbyBjb24gZWwgcHJvZHVjdG8gYWdyZWdhZG8sIHNlYSB1biBwYXF1ZXRlXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIG9NM0xpc3RhRW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhckVzdGFQYXF1ZXRlKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9NM0xpc3RhRW5jOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAob00zTGlzdGFFbmMuZmluZCh4ID0+IHguSWRFbmNQYWRyZSA9PSBvTTNQRW5jSXRlbXMuSUQpKSB7XHJcbiAgICAgICAgICAgICAgICBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgbG9zIHByZWNpb3MgZGUgbG9zIHByb2R1Y3Rvc1xyXG4gICAgICogQHBhcmFtIG9FbmMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJkTGlzdGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyUHJlY2lvc1ByZHMob0VuYzogTTNQRW5jSXRlbXMsIG9NM1ByZExpc3RhOiBNM1ByZExpc3RhKSB7XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9FbmM6IG51bWJlciA9ICtvRW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBkUHJlY2lvTGlzdDogbnVtYmVyID0gb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRQcmVjaW9MaXN0ID09IGRQcmVjaW9FbmMpIHtcclxuICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBWYWxpZGFyUHJlY2lvc1ByZHNcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCB0aXBvVWJpY2FjaW9uOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb25cclxuICAgICAgICAsIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIgPSBudWxsKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vSURIVUJcclxuICAgICAgICBpZiAodGlwb1ViaWNhY2lvbi50b1VwcGVyQ2FzZSgpID09IFwiV0VCXCIpIHtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICAgICAgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0bykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2sob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgbTNVYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBtM1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2sob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgaWYgKG0zVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBsb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQikge1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQiA9IG9NM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyh0aGlzLmdzSWRrYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgdGhpcy5Qcm9jUHJvbW9BZnRlckFkZFRvQ2FydChvTTNQcm9jZXNvcywgb0RhdGFVc2VyLCBsb00zUEl0ZW1zV0VCLCBtM1ViaWNhY2lvbiwgdHJ1ZSkudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHgpO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cob0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhc0FzeW5jKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coeClcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkbyBlbiBwcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2tcIik7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5vRW5jYWJlemFkb00zQ29tcG9uZW50LlJlY2FyZ2FyQ2Fycml0bygpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLkxvYWRDYXJ0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyB1cGRhdGVBUG91Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIHRpcG9VYmljYWNpb246IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvL0lESFVCXHJcbiAgICAgICAgaWYgKHRpcG9VYmljYWNpb24udG9VcHBlckNhc2UoKSA9PSBcIldFQlwiKSB7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZWxldGVNM1Byb2Nlc28ob00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgYXdhaXQgb00zRGF0YS5EZWxldGUoc0tleUNhcnJpdG8pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9FbGltaW5hciBkb2N1bWVudG8gZGUgY291Y2gvcG91Y2gsIGluaWNpbyB5IGFjdHVhbFxyXG4gICAgcHVibGljIERlbERvY3NTdGFydEFuZEN1cnJlbnQob00zRGF0YTogTTNEYXRhLCBzSURLYXRpb3M6IHN0cmluZywgb2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBVYmljYWNpb25DdXJyZW50LCBIdWJDdXJyZW50KSB7XHJcbiAgICAgICAgLy9FbGltaW5hciBJbmljaWFsXHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSAhPT0gdW5kZWZpbmVkICYmIG9sTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YVVzZXIgPSB7IFwiVXN1YXJpb1Npc3RlbWFcIjogeyBcIlRET0NcIjogb2xNM1Byb2Nlc29zLlREb2MsIFwiTkRPQ1wiOiBvbE0zUHJvY2Vzb3MuTkRvYywgXCJVQklDQUNJT05cIjogb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIFwiSURIVUJcIjogb2xNM1Byb2Nlc29zLklESHViIH0gfVxyXG4gICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVsZXRlIHN0YXJ0XCIpO1xyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgLy9FbGltaW5hciBhY3R1YWxcclxuICAgICAgICAgICAgb0RhdGFVc2VyID0geyBcIlVzdWFyaW9TaXN0ZW1hXCI6IHsgXCJURE9DXCI6IG9sTTNQcm9jZXNvcy5URG9jLCBcIk5ET0NcIjogb2xNM1Byb2Nlc29zLk5Eb2MsIFwiVUJJQ0FDSU9OXCI6IFViaWNhY2lvbkN1cnJlbnQudG9TdHJpbmcoKSwgXCJJREhVQlwiOiBIdWJDdXJyZW50IH0gfVxyXG4gICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVsZXRlIGN1cnJlbnRcIik7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q2Fycml0b0NvbXByYXNQb3VjaERCKG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB2YXIgb00zUHJvY2VzbztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgb00zUHJvY2VzbyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVHJhc2xhZGFyIGluZm9ybWFjacODwrNuIGRlIGNhcnJpdG8sIGRvcyB1c3Vhcmlvc1xyXG4gICAgcHVibGljIGFzeW5jIE1vdmVDYXJ0SW50b1VzZXIoc0lES2F0aW9zOiBzdHJpbmcsIG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyT3JpZ2VuOiBhbnksIG9EYXRhVXNlckRlc3Rpbm86IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0b09yaWdlbjtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG9EZXN0aW5vO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0b09yaWdlbiA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvRGVzdGlubyA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICBsZXQgb00zUHJvY2VzbyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG9PcmlnZW4pO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzby5URG9jID0gb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5URE9DO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvLk5Eb2MgPSBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLk5ET0M7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvW1wiX3JldlwiXTtcclxuICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0b0Rlc3Rpbm8sIG9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGFyIHByZWNpb3MgdG90YWxlcyB5IGRlIGJhc2VcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsO1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWxCYXNlO1xyXG4gICAgICAgIC8vIHZhciBkVmFsb3I6IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy8gdmFyIGRWYWxvck5ldG86IG51bWJlciA9IDA7XHJcblxyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbCA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciAvLygrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSAqICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbEJhc2UgPSB0aGlzLkNhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKGVuYywgZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMQkFTRVwiKS5WYWxvciA9IFN0cmluZyhNYXRoLnJvdW5kKGRQcmVjaW9Ub3RhbEJhc2UgKiAxMDApIC8gMTAwKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yID0gKCtkVmFsb3IpICsgKCtkUHJlY2lvVG90YWxCYXNlKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yTmV0byA9ICgrZFZhbG9yTmV0bykgKyAoK2RQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuUmVjYWxjdWxvSW1wdWVzdG9zKGVuYywgZFByZWNpb1RvdGFsQmFzZSk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy8gLy9vTTNQcm9jZXNvcy5WYWxvciA9IGRWYWxvcjtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBkVmFsb3JOZXRvO1xyXG4gICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1JlY2FsY3VsYXIgcHJlY2lvcy4gcmVjb3JyaWVuZG8gbG9zIGVuY2FiZXphZG9zLlxyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIHZhbG9yID0gMDtcclxuICAgICAgICB2YXIgVmFsb3JOZXRvID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MTAxMCBzZSBjYW1iaWEgZWwgdmFsb3IgZGVsIHByZWNpbyB1bml0YXJpbyBiYXNlLCB5YSBxdWUgYWwgbW9tZW50byBkZSBsbGFtYXIgbGEgZnVuY2nDg8KzbiBWYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc29cclxuICAgICAgICAgICAgLy8gc2UgcmVjYWxjdWxvIGVsIHByZWNpbyB0b3RhbCwgZGVwZW5kaWVuZG8gZGUgZXN0ZSB2YWxvci5cclxuICAgICAgICAgICAgbGV0IHBUb3RhbEJhc2UgPSB0aGlzLkNhbGN1bGF0ZVByZWNpb0Jhc2UoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNUQkxESU1QUFJEXCIpLlZhbG9yLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vTWF0aFRGLnJvdW5kKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciwgMikpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZEVuYyA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGlmICgrZENhbnRpZGFkRW5jICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9VTklUQkFTRVwiKS5WYWxvciA9ICgrcFRvdGFsQmFzZSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIikuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhlbmMsICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVjYWxjdWxhck0zUHJvY2VzbyhvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYWxjdWxhciBwcmVjaW8gYmFzZSBkZSB1biBwcmVjaW8sIHRlbmllbmRvIGVsIHZhbG9yIHRvdGFsIG8gbmV0by5cclxuICAgIHB1YmxpYyBDYWxjdWxhclByZWNpb0Jhc2VGcm9tUHJvY2VzbyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkUHJlY2lvTmV0bzogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGRWYWxvckltcHVlc3RvOiBudW1iZXIgPSAxO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgZFZhbG9ySW1wdWVzdG8gPSAoK2RWYWxvckltcHVlc3RvKSArICgraW1wLlBvcmNlbnRhamUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKCtkUHJlY2lvTmV0bykgLyAoK2RWYWxvckltcHVlc3RvKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZWNhbGN1bG8gZGUgdmFsb3IgZGUgaW1wdWVzdG9zLCBjdWFuZG8gY2FtYmlhIGVsIHZhbG9yLiBTZWEgcG9yIGNhbnRpZGFkLCBlbGltaW5hY2nDg8Kzbi4uLlxyXG4gICAgLy8gcHVibGljIFJlY2FsY3Vsb0ltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkUHJlY2lvQmFzZTogbnVtYmVyKSB7XHJcbiAgICAvLyAgICAgdmFyIGRUb3RhbEltcHVlc3RvOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgLy8gICAgICAgICBpbXAuVmFsb3IgPSAoK2RQcmVjaW9CYXNlKSAqICgraW1wLlBvcmNlbnRhamUpO1xyXG4gICAgLy8gICAgICAgICAvL0pBR00gMjAxODA5MTIgbnVldm8gY29uY2VwdG9cclxuICAgIC8vICAgICAgICAgaW1wLkJhc2UgPSBkUHJlY2lvQmFzZTtcclxuICAgIC8vICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSAoK2RUb3RhbEltcHVlc3RvKSArICgraW1wLlZhbG9yKTtcclxuICAgIC8vICAgICAgICAgLy9TdW1hIGRlIHByZWNpbyBiYXNlIFxyXG4gICAgLy8gICAgICAgICBkUHJlY2lvQmFzZSA9ICgrZFByZWNpb0Jhc2UpICsgKCtpbXAuVmFsb3IpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICAgIGRUb3RhbEltcHVlc3RvID0gTWF0aC5yb3VuZChkVG90YWxJbXB1ZXN0byAqIDEwMCkgLyAxMDA7XHJcbiAgICAvLyAgICAgb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMSU1QVUVTVE9TXCIpLlZhbG9yID0gZFRvdGFsSW1wdWVzdG8udG9TdHJpbmcoKTtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhY2lvbiBudWV2byBNMyBwcm9jZXNvcywgZXN0ZSB2YSB2YWNpbyBzaW4gbmlzaXF1aWVyYSBNM1BFbmNJdGVtcy4gXHJcbiAgICAgKiBTZSB1dGlsaXphIHByaW5jaXBhbG1lbnRlIHBhcmEgbGFzIGNyZWFjaW9uIGRlc2RlIDAgdW4gTTMgUHJvY2Vzby4gUXVlIHBhc2EgZGUgZXN0YWRvcyAnJyBhbCBwcmltZXIgZXN0YWRvXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIGlkcHJvY2Vzb19kZXN0aW5vIFxyXG4gICAgICogQHBhcmFtIHRkb2MgXHJcbiAgICAgKiBAcGFyYW0gbmRvYyBcclxuICAgICAqIEBwYXJhbSBlc3RhZG9zX2Z1dHVyb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRIdWIgXHJcbiAgICAgKiBAcGFyYW0gaWRVYmljYWNpb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDcmVhdGVNM05ld1Byb2Nlc29FbXB0eShpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkcHJvY2Vzb19kZXN0aW5vOiBzdHJpbmcsIHRkb2M6IHN0cmluZywgbmRvYzogc3RyaW5nLFxyXG4gICAgICAgIGVzdGFkb3NfZnV0dXJvczogQXJyYXk8YW55PiwgaWRIdWI6IHN0cmluZywgaWRVYmljYWNpb246IHN0cmluZykge1xyXG5cclxuICAgICAgICBpb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBpZHByb2Nlc29fZGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gXCJcIjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gXCJcIjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gZXN0YWRvc19mdXR1cm9zWzBdLkVfRGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID0gZXN0YWRvc19mdXR1cm9zWzBdLlNFX0Rlc3Rpbm87XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSAraWRIdWI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gK2lkVWJpY2FjaW9uO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5JREh1YiA9ICtpZEh1YjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVWJpYzEgPSAraWRVYmljYWNpb247XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlREb2MgPSB0ZG9jO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5ORG9jID0gbmRvYztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVGlwb1RlcmNlcm8gPSAxO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5VYmljMiA9IC0xO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlID0gLTE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlID0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DdWFuZG8gc2UgYWdyZWdhIHBvciBwcmltZXJhIHZleiBhbCBjYXJyaXRvIGRlIGNvbXByYS5cclxuICAgIHB1YmxpYyBMb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9EYXRhVXNlcjogYW55LCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgLy9zSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTlxyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvcztcclxuICAgICAgICBpZiAoaW9NM1Byb2Nlc29zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBuZXcgTTNQcm9jZXNvcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuRmVjaGEgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVGlwb1RlcmNlcm8gPSAxO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlREb2MgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQztcclxuICAgICAgICBvTTNQcm9jZXNvcy5ORG9jID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0M7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVWJpYzEgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlViaWMyID0gLTE7XHJcbiAgICAgICAgLy8vQUdSRUdBUiBOVUVWQSBGVU5DSU9OQUxJREFEIERFIEhVQlMuIEZMVUpPIERFIFRSQUJBSk9cclxuICAgICAgICBvTTNQcm9jZXNvcy5JREh1YiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb00zUHJvY2Vzb3MuSURIdWI7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvTTNQcm9jZXNvcy5VYmljMTtcclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YlByZSA9IC0xO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlID0gLTE7XHJcblxyXG4gICAgICAgIC8vL0ZJTiBBR1JFR0FSIE5VRVZBIEZVTkNJT05BTElEQUQgREUgSFVCUy4gRkxVSk8gREUgVFJBQkFKT1xyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IFwiXCI7XHJcblxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPT0gXCJcIiAmJiBpb00zUHJvY2Vzb3MgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBcIlJlZ2lzdHJvXCI7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IFwiQWN0aXZvXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob00zUEl0ZW1zV0VCLlN1YkVzdGFkb19vICE9IFwiXCIgJiYgb00zUEl0ZW1zV0VCLkVzdGFkb19vICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID0gb00zUEl0ZW1zV0VCLlN1YkVzdGFkb19vO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBvTTNQSXRlbXNXRUIuRXN0YWRvX287XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gPT0gXCJcIiAmJiBpb00zUHJvY2Vzb3MgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IFwiTTNFQ0NcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSWRQcm9jZXNvICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gb00zUEl0ZW1zV0VCLklkUHJvY2VzbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpKTtcclxuICAgICAgICB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBudWxsLCAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yID0gb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsO1xyXG5cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgLy90aGlzLlByb2Nlc2FtaWVudG9TZXJ2aWNlKFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQ2FyZ2FyIG51ZXZvcyBhZGljaW9uYWxlcyBhZGljaW9uYWxlc1xyXG4gICAgcHVibGljIExvYWRBZGljaW9uYWxlcyhvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBwcm9kdWN0OiBUeXBlTTNQcmRHcnApOiBNM1BJdGVtc1dFQiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLkNsYXZlUHJkU1JWID0gcHJvZHVjdC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IFwiQ0xBVkVQUk9EU0VSVlwiKS5WQUxPUjtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLkNsYXZlUHJkVW5pZGFkID0gcHJvZHVjdC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IFwiQ0xBVkVVTklEQURcIikuVkFMT1I7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5VbmlkYWQgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJVTklEQURcIikuVkFMT1I7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb00zUEl0ZW1zV0VCO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIHByb2Nlc29zLCByZXRvbWFuZG8gZGVzZGUgZGF0YVxyXG4gICAgcHVibGljIExvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsLCB2YWxvckRlc2N1ZW50byA9IDApOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvciA9ICgrb00zUHJvY2Vzb3MuVmFsb3IpICsgKCtvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvTTNQcm9jZXNvcy5WYWxvcjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPT0gXCJcIiAmJiBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpKTtcclxuICAgICAgICB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBudWxsLCB2YWxvckRlc2N1ZW50bywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKVxyXG5cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIExvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9lbmNhYmV6YWRvSXRlbXM6IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvUGFkcmVNM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIHZhbG9yRGVzY3VlbnRvID0gMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsKSB7XHJcblxyXG4gICAgICAgIC8vVmFsaWRhY2lvbiBkZSBJbnZlbnRhcmlvLlxyXG4gICAgICAgIGxldCBhZGlWZW50YU5lZyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZCh4ID0+IHguQVRSSUJVVE8gPT0gXCJWRU5UQU5FR1wiKVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXSkge1xyXG4gICAgICAgICAgICBkZWxldGUgb00zUHJvY2Vzb3NbXCJJbnZlbnRhcmlvRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5UTUlkUHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiTTNFQ0NcIiAmJiBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRSA8IG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgJiYgb00zVWJpY2FjaW9uLk0zSFVCU1swXS5UaXBvID09IFwiV0VCXCIgJiYgIShhZGlWZW50YU5lZyAmJiBhZGlWZW50YU5lZy5WQUxPUikpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NbXCJJbnZlbnRhcmlvRXJyb3JcIl0gPSAnTm8gaGF5IGludmVudGFyaW8gcGFyYSBhZ3JlZ2FyICcgKyBvTTNQSXRlbXNXRUIuZENhbnRpZGFkICsgJyBJdGVtcyc7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRTtcclxuICAgICAgICB9IC8vZWxzZSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBvTTNQRW5jSXRlbXMgPSB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmxJdGVtKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb1BhZHJlTTNQRW5jSXRlbXMsIHZhbG9yRGVzY3VlbnRvKTtcclxuXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvc1tcIk1lbnNhamVFcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9QYWRyZU0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIC8vVGllbmUgdW4gZW5jYWJlemFkbyBwYWRyZS5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPSBvUGFkcmVNM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIHZhciBvbE0zUHJkUGFja0RldDogQXJyYXk8TTNQcmRQYWNrRGV0PjtcclxuICAgICAgICAgICAgb2xNM1ByZFBhY2tEZXQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTTNQQUNLXHJcbiAgICAgICAgICAgIGlmIChvbE0zUHJkUGFja0RldCAmJiBvbE0zUHJkUGFja0RldC5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9sZXQgdmFsb3JEZXNjdWVudG9QYWNrID0gdGhpcy5jYWxjdWxhclBvcmNlbnRhamVEZXNjdWVudG9Db21ibyhwcm9kR1JQU2VsZWN0ZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2xNM1ByZFBhY2tEZXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUHJkUGFja0RldDogTTNQcmRQYWNrRGV0ID0gb2xNM1ByZFBhY2tEZXRbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhY2tNM1BJdGVtc1dFQjogTTNQSXRlbXNXRUI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQcmRQYWNrRGV0Lm9NM1BJdGVtc1dFQikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIgPSBvTTNQcmRQYWNrRGV0Lm9NM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQiA9IE9iamVjdC5hc3NpZ24oe30sIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBvTTNQcmRQYWNrRGV0LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuUGF0aEltYWdlbiA9IG9NM1ByZFBhY2tEZXQuZ3NQYXRoSW1hZ2VuO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBwYWNrTTNQSXRlbXNXRUIuZENhbnRpZGFkICogb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMuQ2FsY3VsYXJQcmVjaW9zUENLRyhvTTNQcmRQYWNrRGV0KTtcclxuICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgaSArIDI7IC8vRXN0byBmdW5jaW9uYSBzaSB0aWVuZSBzb2xvIDIgbml2ZWxlc1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2kgZXN0byBzZSBjdW1wbGUgZXN0ZSBwcm9kdWN0byBlcyB1biBwYWNrIHkgdGllbmUgcHJvZHVjdG9zIGFzb2NpYWRvcy5cclxuICAgICAgICAgICAgICAgICAgICBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmRHZW5lcmFsID0gb00zUHJkUGFja0RldC5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5NM0NvZHMuZmluZCh4ID0+IHguSWRDb2RpZ28gPT0gXCJVUENcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmRHZW5lcmFsICYmIHByZEdlbmVyYWwuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5Db2RpZ29CYXJyYXMgPSBwcmRHZW5lcmFsLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwibm8gYcODwrFhZGkgY29kaWdvIGRlIGJhcnJhcyBhIHByb2R1Y3RvIGhpam86IFwiICsgb00zUHJkUGFja0RldC5TS1VISUpPKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIG9NM1ByZFBhY2tEZXQuTTNHUlAsIG9NM1Byb2Nlc29zLk0zRU5DLCBwYWNrTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUEVuY0l0ZW1zLCAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MjMsIGVzdG8gZXMgY3VhbmRvIHNlIG1vZGlmaWNhIGxhIGNhbnRpZGFkIGRlIHByb2RjdXRvcyBleGlzdGVudGVzLlxyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JRCA9IG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5IGVudmlvIGRlIHBhZHJlIGRlc2RlIGluc3RydWNjaW9uIG1hcyBhcnJpYmFcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JREVuY1BhZHJlICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA9IG9NM1BJdGVtc1dFQi5JREVuY1BhZHJlO1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlRpcG9BZ3J1cGFjaW9uID0gb00zUEl0ZW1zV0VCLlRpcG9BZ3J1cGFjaW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQgJiYgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZC5mb3JFYWNoKGRpbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUERpbmFtQnlBY3RpdmlkYWQucHVzaCh7Li4uIGRpbn0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIk1lbnNhamVFcnJvclwiXSA9IG9NM1BFbmNJdGVtc1tcIk1lbnNhamVFcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUHJvY2VzYWRvID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgIC8vfVxyXG4gICAgfVxyXG5cclxuICAgIGNhbGN1bGFyUG9yY2VudGFqZURlc2N1ZW50b0NvbWJvKHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwKSB7XHJcbiAgICAgICAgbGV0IHZhbG9yRGVzY3VlbnRvUGFjayA9IDA7XHJcbiAgICAgICAgbGV0IHZhbG9ySXRlbXNDb21ib1N1bWEgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckZpbmFsQ29tYm8gPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTztcclxuXHJcbiAgICAgICAgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLk0zUEFDSy5mb3JFYWNoKHByZFBhY2sgPT4ge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWQgPSBwcmRQYWNrLk0zR1JQLkNhbnRpZGFkID8gcHJkUGFjay5NM0dSUC5DYW50aWRhZCA6IDE7XHJcbiAgICAgICAgICAgIGxldCBpbmZOaXZlbGVzUHJjaW8gPSB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlcyhwcmRQYWNrLk0zR1JQLCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuSURMSVNUQSlcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8pXHJcbiAgICAgICAgICAgIHZhbG9ySXRlbXNDb21ib1N1bWEgKz0gKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyAqIGNhbnRpZGFkKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHZhbG9ySXRlbXNDb21ib1N1bWEgPiB2YWxvckZpbmFsQ29tYm8pIHtcclxuICAgICAgICAgICAgdmFsb3JEZXNjdWVudG9QYWNrID0gMTAwIC0gKHZhbG9yRmluYWxDb21ibyAqIDEwMCAvIHZhbG9ySXRlbXNDb21ib1N1bWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmRlYnVnKHZhbG9yRGVzY3VlbnRvUGFjaylcclxuICAgICAgICByZXR1cm4gdmFsb3JEZXNjdWVudG9QYWNrO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsY3VsbyBkZSBwcmVjaW9zIGRlIGhpam9zIGRlbCBwYXF1ZXRlXHJcbiAgICAgKiBAcGFyYW0gb00zUHJkUGFja0RldCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJlY2lvc1BDS0cob00zUHJkUGFja0RldDogTTNQcmRQYWNrRGV0KSB7XHJcbiAgICAgICAgb00zUHJkUGFja0RldC5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9hZE0zUEVuY0l0ZW1zRnJvbVByb21vY2lvbkNvbWJvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvZGlnbzogc3RyaW5nLCB2YWxvciwgZENhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9Db21ibyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLklkUHJvZHVjdG8gPSBjb2RpZ287XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5Mb3RlID0gXCIxXCI7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDg8KzZ2ljYSBhbnRlcmlvciwgc2UgaGFjZSByZW1vdmUgZGUgaXRlbS4geSBsb3MgSUQgcXVlZGFiYW4gcmVwZXRpZG9zLlxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uT3JkZW4gPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5Ob21icmUgPSBgQ29tYm8gLSAke3Byb2R1Y3Rvc0hpam9zRGVsQ29tYm8ubWFwKHg9PiB4LklkUHJvZHVjdG8pLmpvaW4oJy0nKX1gO1xyXG5cclxuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERFRISDptbTpzcycpLCBcIkZFQ0hBSU5cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwidHJ1ZVwiLCBcIkVTUFJPRFBST01PQ09NQk9cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwidHJ1ZVwiLCBcIkVTUFJPRFBST01PXCIpKTsgLy8gVFJVRS0+IFNJIEVTIFVOIFBST0RVQ1RPIFBPUiBQUk9NT0NJT04sIEZBTFNFLT4gREUgT1RSTyBNT0RPXHJcbiAgICAgICAgLy9EZXRhbGxlcyBkZSBmYWN0dXJhIGVsZWN0cm9uaWNhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJFTkNQUk9NT1wiLCBcIlRJUE9fUFJEXCIpKTtcclxuICAgICAgICAvKipGSU4gSU5GT1JNQUNJT04gR0VORVJBTCAqL1xyXG5cclxuICAgICAgICAvLyoqIElOSUNJTyBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBSRUNJT1VOSVRCQVNFXCIpKTsgLy9QcmVjaW8gU2luIGltcHVlc3Rvc1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUU0lOSU1QVUVTVE9cIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyBZIHNpbiBJbXB1ZXN0b3NcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVFwiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvICAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRORVRPXCIpKTsvL0NvbiBkZXNjdWVudG8gaW5jbHVpZG8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVlVOSVRQUk9NT1wiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlVOSVRGSURFTFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAvLyoqIEZJTiBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkQ2FudGlkYWQudG9TdHJpbmcoKSwgXCJDQU5USURBRFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIkZJREVMSVpBQ0lPTlwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxQUk9NT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiQ1RCTERJTVBQUkRcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiU1VCVE9UQUxcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxCQVNFXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMXCIpKTtcclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMucHVzaChwcm9kdWN0b0NvbWJvKTtcclxuICAgICAgICBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmZvckVhY2gocHJvZHVjdG8gPT4ge1xyXG4gICAgICAgICAgICBwcm9kdWN0by5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDg8KzZ2ljYSBhbnRlcmlvciwgc2UgaGFjZSByZW1vdmUgZGUgaXRlbS4geSBsb3MgSUQgcXVlZGFiYW4gcmVwZXRpZG9zLlxyXG4gICAgICAgICAgICBwcm9kdWN0by5JZEVuY1BhZHJlID0gcHJvZHVjdG9Db21iby5JRDtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMucHVzaChwcm9kdWN0byk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVjYWxjdWxhck0zUHJvY2VzbyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RvQ29tYm87XHJcbiAgICB9XHJcblxyXG4gICAgcmVjYWxjdWxhck0zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NBcGxTdW1hVmFsb3IgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIob00zRU5DID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldENhbnRpZGFkID0gb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGxldCBkZXRFc1ByZENvbWJvID0gb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiRVNQUk9EUFJPTU9DT01CT1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRldENhbnRpZGFkICYmICtkZXRDYW50aWRhZC5WYWxvciA+IDAgJiYgIShkZXRFc1ByZENvbWJvICYmIGRldEVzUHJkQ29tYm8uVmFsb3IgPT0gXCJ0cnVlXCIpXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgPSAwO1xyXG5cclxuICAgICAgICAvL2ZvciAoY29uc3Qgb00zRU5DIG9mIHRoaXMub00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAhZW5jLklkRW5jUGFkcmUgfHwgZW5jLklkRW5jUGFkcmUgPD0gMCkpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG9NM0VOQyBvZiBwcm9kdWN0b3NBcGxTdW1hVmFsb3IpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvICs9ICtvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgKz0gK29NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlNVQlRPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBNM1Byb2Nlc28gZW5jYWJlemFkbyBpdGVtcywgZGVzZGUgcHJvZHVjdG8gZ2VuZXJhbFxyXG4gICAgcHVibGljIExvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmxJdGVtKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvZW5jYWJlemFkb0l0ZW1zOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb1BhZHJlTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zID0gdW5kZWZpbmVkLCB2YWxvckRlc2N1ZW50byA9IDApOiBNM1BFbmNJdGVtcyB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuICAgICAgICB2YXIgb00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHZhciBkUFJFQ0lPVW5pdEJhc2UgPSAwO1xyXG4gICAgICAgIHZhciBpbmZOaXZlbGVzUHJjaW87XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYTtcclxuICAgICAgICB2YXIgZFRvdGFsSW1wdWVzdG9zVG90YWw6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRVbml0YXJpb01vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVW5pdGFyaW9Qcm9tbzogbnVtYmVyID0gMDtcclxuICAgICAgICAvL1ZlcmlmaWNhciBlbCBwcmVjaW8gYSB1c2FyLCB1c2FuZG8gbGEgbG9naWNhIGRlIG5pdmVsZXMgZGUgcHJlY2lvcy5cclxuICAgICAgICBpbmZOaXZlbGVzUHJjaW8gPSB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlcyhwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG4gICAgICAgIGlmICh2YWxvckRlc2N1ZW50byA+IDApIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPICogdmFsb3JEZXNjdWVudG8gLyAxMDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyAtIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gdGhpcy5DYWxjdWxhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vVmFsaWRhIHNpIGVsIHByb2R1Y3RvIGVzdMODwqEgcmVzdGluZ2lkb1xyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGFyUHJvZHVjdG9SZXN0cmluZ2lkbyhvUHJvbW9jaW9uUHJvY2VzYWRhKSkge1xyXG4gICAgICAgICAgICB0aGlzLkFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXMob00zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtcyk7XHJcblxyXG4gICAgICAgICAgICAvL0NhbGN1bG8gZGVsIHRvdGFsIGRlIHB1bnRvcyB5IGVsIHZhbG9yIHRvdGFsIGRlIGxhIHByb21vY2nDg8KzbiBwb3IgbGEgY3FhbnRpZGFkIGRlIHByb2R1Y3RvcyBkZSBsYSBtaXNtYSByZWZlcmVuY2lhXHJcbiAgICAgICAgICAgIGRVbml0YXJpb01vbmVkZXJvID0gb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm87IC8vVW5pdGFyaW8gTW9uZWRlcm9cclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vTm8gc2UgdXRpbGl6YSwgc2UgZGVqYSBwYXJhIHVzb3MgYWRlbGFudGVcclxuXHJcbiAgICAgICAgICAgIGRVbml0YXJpb1Byb21vID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjsgLy9Qcm9tb2Npb24gdW5pdGFyaW9cclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24sIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpOyAvL05vIHNlIHV0aWxpemEsIHNlIGRlamEgcGFyYSB1c29zIGFkZWxhbnRlXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RldEN1cG9uZXMgPSB0aGlzLmdldF9saXN0X2N1cG9uZXNfZnJvbV9wcm9tbyhvUHJvbW9jaW9uUHJvY2VzYWRhLCArb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL0NhbGN1bG8gZGUgcHJlY2lvIHRvdGFsLCBkZXNwdWVzIGRlIHByb21vY2lvbmVzXHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwgPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FyZ2FyIHByb2R1Y3RvIFxyXG4gICAgICAgICAgICBvTTNQcmRHZW5lcmFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8gPSBvTTNQcmRHZW5lcmFsLlNLVTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLkxvdGUgPSBvTTNQcmRHZW5lcmFsLkxPVEU7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9lbmNhYmV6YWRvSXRlbXMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMODwrNnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5PcmRlbiA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9lbmNhYmV6YWRvSXRlbXMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTm9tYnJlID0gb00zUHJkR2VuZXJhbC5OT01CUkUxO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuRElTUE9OSUJMRSA9IG9NM1ByZEdlbmVyYWwuRElTUE9OSUJMRTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlBhdGhJbWFnZSA9IG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuQ29kaWdvQmFycmFzID0gb00zUEl0ZW1zV0VCLkNvZGlnb0JhcnJhcztcclxuICAgICAgICAgICAgaWYgKG9NM1ViaWNhY2lvbiAmJiBvTTNVYmljYWNpb24uTTNVYmlBZGljaW9uYWxlcyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgdWJpSW1wRmlqbyA9IG9NM1ViaWNhY2lvbi5NM1ViaUFkaWNpb25hbGVzLmZpbmQoeCA9PiB4LkF0cmlidXRvID09IFwiSU1QRklKT1wiKTtcclxuICAgICAgICAgICAgICAgIGlmICh1YmlJbXBGaWpvICYmIHViaUltcEZpam8uVmFsb3IgIT0gXCJcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCA9IHViaUltcEZpam8uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHBUb3RhbEJhc2UgPSB0aGlzLkNhbGN1bGF0ZVByZWNpb0Jhc2Uob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgdGhpcy5vTWF0aFRGLnJvdW5kKGJpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCksIDIpKTtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZFBSRUNJT1VuaXRCYXNlID0gcFRvdGFsQmFzZSAvIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkUFJFQ0lPVW5pdEJhc2UgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkVG90YWxJbXB1ZXN0b3NUb3RhbCA9IHRoaXMuTG9hZE0zUEltcHVlc3Rvc0Zyb21QcmRHcmwob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgb00zUEVuY0l0ZW1zLCBwVG90YWxCYXNlLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkLCBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKTtcclxuICAgICAgICAgICAgLyoqIElOSUNJTyBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERFRISDptbTpzcycpLCBcIkZFQ0hBSU5cIikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkJpc09ic2VxdWlvLnRvU3RyaW5nKCksIFwiRVNPQlNFUVVJT1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5TS1AxLCBcIlBSRF9FU1RJTE9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQsIFwiQ1RCTERJTVBQUkRcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5vYnNlcnZhY2lvbi50b1N0cmluZygpLCBcIk9CU0VSVkFDSU9OXCIpKTsgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuLCBcIlBBVEhJTUFHRU5cIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkJpc1Byb2R1Y3RvUHJvbW8udG9TdHJpbmcoKSwgXCJFU1BST0RQUk9NT1wiKSk7IC8vIFRSVUUtPiBTSSBFUyBVTiBQUk9EVUNUTyBQT1IgUFJPTU9DSU9OLCBGQUxTRS0+IERFIE9UUk8gTU9ET1xyXG4gICAgICAgICAgICAvL0RldGFsbGVzIGRlIGZhY3R1cmEgZWxlY3Ryb25pY2FcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShwcm9kR1JQU2VsZWN0ZWQuVElQTywgXCJUSVBPX1BSRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLlVuaWRhZCwgXCJVTklEQURcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DbGF2ZVByZFNSViwgXCJDTEFWRVBST0RTRVJWXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2xhdmVQcmRVbmlkYWQsIFwiQ0xBVkVVTklEQURcIikpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZEl0ZW1zSW50ZXJmYXoob00zUEVuY0l0ZW1zLCBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgdGhpcy5BZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zLCBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICB0aGlzLmNhbXBvc0FkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQilcclxuICAgICAgICAgICAgdGhpcy5Mb2FkRGV0YWxsZU5pdmVsZXNQcmVjaW8oaW5mTml2ZWxlc1ByY2lvLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZEluZm9Qcm9tb2Npb25lc0FEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vIExpc3RhIGRlIFByb21vY2lvbmVzIFxyXG4gICAgICAgICAgICAvKipGSU4gSU5GT1JNQUNJT04gR0VORVJBTCAqL1xyXG5cclxuICAgICAgICAgICAgLy8qKiBJTklDSU8gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkUFJFQ0lPVW5pdEJhc2UudG9TdHJpbmcoKSwgXCJQUkVDSU9VTklUQkFTRVwiKSk7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3NcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVG90YWxJbXB1ZXN0b3NUb3RhbC50b1N0cmluZygpLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgodGhpcy5vTWF0aFRGLnJvdW5kKHRoaXMuR2V0VW5pdGFyaW9CeVRvdGFsKG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJUT1RBTElNUFVFU1RPU1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPIC0gK2RUb3RhbEltcHVlc3Rvc1VuaXRhcmlvKS50b1N0cmluZygpLCBcIlBVTklUU0lOSU1QVUVTVE9cIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyBZIHNpbiBJbXB1ZXN0b3MgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCtkUFJFQ0lPVW5pdEJhc2UgKyArZFVuaXRhcmlvUHJvbW8pLnRvU3RyaW5nKCksIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3RvcyAvLy0tLS0tLSBOdW5jYSBDYW1iaWEgLy9GUyAyMDE5MDcyNSBDb3JyZWNjaW9uIGVuIGxhIGZvbXJhIGRlIGNhbGN1bGFybG9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8udG9TdHJpbmcoKSwgXCJQVU5JVFwiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvICAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbC50b1N0cmluZygpLCBcIlBVTklUTkVUT1wiKSk7Ly9Db24gZGVzY3VlbnRvIGluY2x1aWRvLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRVbml0YXJpb01vbmVkZXJvLnRvU3RyaW5nKCksIFwiVU5JVEZJREVMXCIpKTsvL1VuaXRhcmlvIGZpZGVsaXphY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFVuaXRhcmlvUHJvbW8udG9TdHJpbmcoKSwgXCJWVU5JVFBST01PXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdzSWRrYXRpb3MgPT0gXCJDVE5cIikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpc3RhU1IgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM0xpc3RhUHJlY2lvLmZpbmQoeCA9PiB4LklETElTVEEgPT0gXCIyXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RhU1IpIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZCh4ID0+IHguSURMSVNUQSA9PSBcIjJcIikuUFJFQ0lPLnRvU3RyaW5nKCksIFwiUFJFQ0lPU1JcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vKiogRklOIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcblxyXG4gICAgICAgICAgICAvLyAqKiogSW5mb3JtYWNpb24gZGUgYWNjaW9uZXMgZW4gZWwgY2xpZW50ZSAqKipcclxuICAgICAgICAgICAgaWYgKHByb2RHUlBTZWxlY3RlZC5lbmNvbnRyYWRvTG9jYWwpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJMT0NBTFwiLCBcIkNPTlNVTFRPRU5cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJTRVJWSURPUlwiLCBcIkNPTlNVTFRPRU5cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL2lmICghb1BhZHJlTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgPSAoK29NM1Byb2Nlc29zLlZhbG9yKSArICgrb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlNVQlRPVEFMXCIpLlZhbG9yKSAvLyAoK29NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSAoK29NM1Byb2Nlc29zLlZhbG9yTmV0bykgKyAoK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcik7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgLy9WZXJpZmljYXIgb2JzZXF1aW9zIGRlbCBwcm9kdWN0byBxdWUgc2UgaW5ncmVzbyBhbCBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJPYnNlcXVpb3Mob1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy50dXJuT25Qcm9tb3Mob1Byb21vY2lvblByb2Nlc2FkYSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtc1tcIk1lbnNhamVFcnJvclwiXSA9IFwiUHJvZHVjdG8gUmVzdHJpbmdpZG9cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQRW5jSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIHRydWUgc2kgZXN0ZSBwcm9kdWN0byBzZSBlbmN1ZW50cmEgcmVzdHJpbmdpZG9cclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhclByb2R1Y3RvUmVzdHJpbmdpZG8ob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9tb1Jlc3RyaW5naWRvID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmluZCh4ID0+IHguVGlwbyA9PSBcIlJFU1RSSUNDSU9OXCIpO1xyXG4gICAgICAgICAgICBpZiAocHJvbW9SZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgICAvKipcclxuICAgICAqIEV4Y2x1eWUgdG9kb3MgbG9zIGltcHVlc3RvcyBkZWphbmRvIHNvbG8gZWwgRklKTyBzaSBlcyBkZSBsYSB1YmljYWNpb24gZGFkYSBcclxuICAgICAqL1xyXG4gICAgIHB1YmxpYyBHZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShsaXN0YSwgYXRyaWJ1dG8pIHtcclxuICAgICAgICBpZiAobGlzdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgbGlzdElEID0gbGlzdGEubWFwKHggPT4geFthdHJpYnV0b10pO1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgbGlzdElEKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsb3JlcyBDYWxjdWxhZG9zIHBvciBwcm9jZXNvLlxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBkQ2FudGlkYWQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZENhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICAvKiogSU5JQ0lPIFZBTE9SRVMgRElOQU1JQ09TICovXHJcbiAgICAgICAgLy8gdmFyIGRUb3RhbEltcHVlc3RvcyA9ICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsU2luRHRvID0gdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRcIilcclxuICAgICAgICAvLyB2YXIgZFN1YlRvdGFsID0gTWF0aC5yb3VuZCgoK2RQcmVjaW9Ub3RhbFNpbkR0byAtICtkVG90YWxJbXB1ZXN0b3MpICogMTAwKSAvIDEwMDtcclxuXHJcbiAgICAgICAgbGV0IHN1YlRvdGFsID0gMDtcclxuICAgICAgICBsZXQgcHJlY2lvVG90YWxTaW5EdG8gPSAwO1xyXG4gICAgICAgIGxldCB0b3RhbEltcHVlc3Rvc1xyXG4gICAgICAgIC8vQWdyZWdhciBJbXB1ZXN0b3NcclxuICAgICAgICB0b3RhbEltcHVlc3RvcyA9IHRoaXMuYWdyZWdhckltcHVlc3RvKG9NM1BFbmNJdGVtcywgZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgLy9GUyAyMDE5MDcyNSBBcnJlZ2xvIGVuIGVsIGNhbGN1bG8gZGUgdG90YWxlcyBlbiBjYXNvIGRlIGhhYmVyIGltcHVlc3Rvc1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy9TdWJ0b3RhbCBTdW1hcyBkZSBsYXMgYmFzZXNcclxuICAgICAgICAgICAgc3ViVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoKCh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBSRUNJT1VOSVRCQVNFXCIpLCAyKSkgKyAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlZVTklUUFJPTU9cIikpKSwgMik7XHJcbiAgICAgICAgICAgIHRvdGFsSW1wdWVzdG9zID0gdGhpcy5nZXRWYWxvclRvdGFsRnJvbUltcHVlc3RvcyhvTTNQRW5jSXRlbXMsIFwiVmFsb3JcIik7XHJcbiAgICAgICAgICAgIHByZWNpb1RvdGFsU2luRHRvID0gc3ViVG90YWwgKyB0b3RhbEltcHVlc3RvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vU2UgYXN1bWUgcXVlIG5vIGhheSBpbXB1ZXN0b3MgZW50b25jZXMgZWwgc3ViVG90YWwgZXMgaWd1YWwgYWwgcHJlY2lvVG90YWxTaW5EdG9cclxuICAgICAgICAgICAgcHJlY2lvVG90YWxTaW5EdG8gPSB0aGlzLm9NYXRoVEYucm91bmQodGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRcIiksIDIpO1xyXG4gICAgICAgICAgICBzdWJUb3RhbCA9IHByZWNpb1RvdGFsU2luRHRvO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBkQ2FudGlkYWQudG9TdHJpbmcoKSwgXCJDQU5USURBRFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKHRvdGFsSW1wdWVzdG9zLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVFU1RPU1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFVuaXRhcmlvQnlUb3RhbChkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJUT1RBTElNUFVFU1RPU1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVTklUXCIpO1xyXG5cclxuICAgICAgICAvL0xhIGZpZGVsaXphY2lvbiBlcyB1biBwb3JjYW50YWplIHBvciBlbmRlIG5vIGRlYmUgbXVsdGlwbGljYXJzZSB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCB0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJVTklURklERUxcIikudG9TdHJpbmcoKSwgXCJGSURFTElaQUNJT05cIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlVOSVRGSURFTFwiKS5WYWxvciwgXCJGSURFTElaQUNJT05cIik7XHJcbiAgICAgICAgLy90aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVE5FVE9cIiksIDIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMXCIpO1xyXG4gICAgICAgIC8vdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVE5FVE9cIikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxSRUFMXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHByZWNpb1RvdGFsU2luRHRvLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxTSU5EVE9cIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgc3ViVG90YWwudG9TdHJpbmcoKSwgXCJTVUJUT1RBTFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyksIFwiRlVUXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlZVTklUUFJPTU9cIiksIDIpKS50b1N0cmluZygpLCBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFJFQ0lPVU5JVEJBU0VcIiksIDIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMQkFTRVwiKTsgLy9QcmVjaW8gU2luIGltcHVlc3RvcyAgICAgICAgXHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgoc3ViVG90YWwgKyArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMSU1QVUVTVE9TXCIpLlZhbG9yIC0gK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIik7XHJcblxyXG4gICAgICAgIC8qKiBGSU4gVkFMT1JFUyBESU5BTUlDT1MgKi9cclxuXHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoID4gMCAmJiBkQ2FudGlkYWQgPT0gMCkgey8vU2kgbGEgY2FudGlkYWQgZXMgMCBzaWduaWZpY2EgcXVlIHNlIGVzdMODwqEgYm9ycmFuZG8gZWwgaXRlbSBvIGVzIHVuIG9ic2VxdWlvLCBwb3IgbG8gcXVlIG5vIHRpZW5lIHNlbnRpZG8gcXVlIHRlbmdhIE0zUEltcHVlc3RvXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxhIHN1bWF0b3JpYSBkZSBsb3MgdmFsb3JlcyBkZSB1biBhdHJpYnV0byBkYWRvIGRlbCBhcnJlZ2xvIGRlIGltcHVlc3Rvc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBhdHJpYnV0byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFZhbG9yVG90YWxGcm9tSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGF0cmlidXRvOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBzdW1hdG9yaWEgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbXB1ZXN0byA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3NbX2ldO1xyXG4gICAgICAgICAgICBzdW1hdG9yaWEgPSBzdW1hdG9yaWEgKyAoK2ltcHVlc3RvW2F0cmlidXRvXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQoc3VtYXRvcmlhLDIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWdyZWdhckltcHVlc3RvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGV0X2N0YmxkX2ltcF9wcmQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1RCTERJTVBQUkRcIik7XHJcbiAgICAgICAgbGV0IGRldF9wcmVjaW9fdW5pdF9iYXNlID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpO1xyXG4gICAgICAgIGxldCB2YWxvclRvdGFsSW1wdWVzdG9zOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGlmIChkZXRfY3RibGRfaW1wX3ByZCAmJiBkZXRfcHJlY2lvX3VuaXRfYmFzZSkge1xyXG4gICAgICAgICAgICB2YWxvclRvdGFsSW1wdWVzdG9zID0gdGhpcy5Mb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChkZXRfY3RibGRfaW1wX3ByZC5WYWxvciwgb00zUEVuY0l0ZW1zLCArYmlnRGVjaW1hbC5tdWx0aXBseShkZXRfcHJlY2lvX3VuaXRfYmFzZS5WYWxvciwgY2FudGlkYWQpLCBjYW50aWRhZCwgK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yVG90YWxJbXB1ZXN0b3MsMik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBJbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIHZhbG9yOiBzdHJpbmcsIHNDb25jZXB0bzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9EZXQ6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICBvRGV0ID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBzQ29uY2VwdG8pO1xyXG4gICAgICAgIGlmIChvRGV0KSB7XHJcbiAgICAgICAgICAgIC8vIEV4aXN0ZSBBY3R1YWxpemFcclxuICAgICAgICAgICAgb0RldC5WYWxvciA9IHZhbG9yO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vTm8gZXhpc3RlIGFncmVnYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLnRvU3RyaW5nKCksIHNDb25jZXB0bykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3IgdG90YWxcclxuICAgICAqIEBwYXJhbSBjYW50aWRhZCBOdWV2YSBDYW50aWRhZCBcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gRGVzY1VuaXRhcmlvIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEdldFRvdGFsQnlVbml0YXJpbyhjYW50aWRhZDogbnVtYmVyLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBEZXNjVW5pdGFyaW86IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB1bml0YXJpbyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gRGVzY1VuaXRhcmlvKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICtiaWdEZWNpbWFsLm11bHRpcGx5KHVuaXRhcmlvLCBjYW50aWRhZCk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3IgdW5pdGFyaW9cclxuICAgICAqIEBwYXJhbSBjYW50aWRhZCBcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gRGVzY1RvdGFsIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEdldFVuaXRhcmlvQnlUb3RhbChjYW50aWRhZDogbnVtYmVyLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBEZXNjVG90YWw6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICgrY2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHRvdGFsID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBEZXNjVG90YWwpLlZhbG9yO1xyXG4gICAgICAgICAgICByZXR1cm4gK3RvdGFsIC8gK2NhbnRpZGFkO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZXMgcmVsYWNpb25hZG9zIGNvbiBsYSBpbmZvcm1hY2lvbiBkZSBzdyBleHRlcm5vLlxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgZ3VhcmRhcsODwqEgbG9zIG51ZXZvcyBhdHJpYnV0b3MuXHJcbiAgICAgKiBAcGFyYW0gb0FkaWNpb25hbGVzIERlc2RlIGRvbmRlIHNlIHNhY2Fyw4PCoSBsYSBpbmZvcm1hY2nDg8Kzbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEl0ZW1zSW50ZXJmYXoob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb0FkaWNpb25hbGVzOiBBcnJheTxNM1ByZEFkaWNpb25hbGVzPikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvQWRpY2lvbmFsZXNGaWx0ZXI6IEFycmF5PE0zUHJkQWRpY2lvbmFsZXM+O1xyXG4gICAgICAgICAgICBvQWRpY2lvbmFsZXNGaWx0ZXIgPSBvQWRpY2lvbmFsZXMuZmlsdGVyKGEgPT4gYS5BVFJJQlVUTy5zdGFydHNXaXRoKFwiQ1NJQV9cIikpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9BZGljaW9uYWxlc0ZpbHRlci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvQWRpY2lvbmFsZXNGaWx0ZXJbaV0uVkFMT1IsIG9BZGljaW9uYWxlc0ZpbHRlcltpXS5BVFJJQlVUTykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBkZXRhbGxlcyBcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgT2JqZXRvIGRvbmRlIHNlIGd1YXJkYXLDg8KhIGxvcyBudWV2b3MgYXRyaWJ1dG9zLlxyXG4gICAgICogQHBhcmFtIG9BZGljaW9uYWxlcyBEZXNkZSBkb25kZSBzZSBzYWNhcsODwqEgbGEgaW5mb3JtYWNpw4PCs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb0FkaWNpb25hbGVzOiBBcnJheTxNM1ByZEFkaWNpb25hbGVzPikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0FkaWNpb25hbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9BZGljaW9uYWxlc1tpXS5WQUxPUiwgXCJBRENfXCIgKyBvQWRpY2lvbmFsZXNbaV0uQVRSSUJVVE8pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjYW1wb3NBZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlc1tpXS5WQUxPUiwgXCJDQU1BRENfXCIgKyBvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXNbaV0uQVRSSUJVVE8pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIE5vbWJyZSwgSUQuIGEgZGV0YWxsZSBkZWwgZW5jYWJlemFkbyBkZSBwcm9kdWN0byBhZ3JlZ2Fkb1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgSW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMgcHJvY2VzYWRhc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBFbmNhYmV6YWRvIGRlIGl0ZW1zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGlDYW50aWRhZDogbnVtYmVyLCBhcGxpY2FkYXMgPSB0cnVlKSB7XHJcbiAgICAgICAgdmFyIHNOb21icmVzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBzSWRzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBzVmFsb3Jlczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0YTtcclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYSAmJiBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAmJiBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChhcGxpY2FkYXMpIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+IHguQXBsaWNhZGEpLmZpbHRlcih4ID0+IHguUHJvbW9jaW9uQ29tYmluYWRhID09IG51bGwpLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNOb21icmVzID0gc05vbWJyZXMgKyBwcm9tby5Ob21icmUgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzSWRzID0gc0lkcyArIHByb21vLklEUHJvbW9jaW9uICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc1ZhbG9yZXMgPSBzVmFsb3JlcyArIGJpZ0RlY2ltYWwubXVsdGlwbHkocHJvbW8uVmFsb3IsIGlDYW50aWRhZCkgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHggPT4gIXguQXBsaWNhZGEpLmZpbHRlcih4ID0+IHguUHJvbW9jaW9uQ29tYmluYWRhID09IG51bGwpLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNOb21icmVzID0gc05vbWJyZXMgKyBwcm9tby5Ob21icmUgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzSWRzID0gc0lkcyArIHByb21vLklEUHJvbW9jaW9uICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc1ZhbG9yZXMgPSBzVmFsb3JlcyArIGJpZ0RlY2ltYWwubXVsdGlwbHkocHJvbW8uVmFsb3IsIGlDYW50aWRhZCkgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGEgPSB7IFwiTk9NQlJFU1wiOiBzTm9tYnJlcywgXCJJRFwiOiBzSWRzLCBcIlZBTE9SRVNcIjogc1ZhbG9yZXMgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBkZXRhbGxlIGRlIHByb21vY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIHNOb21icmVzIFxyXG4gICAgICogQHBhcmFtIHNJZHMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRJbmZvUHJvbW9jaW9uZXNBRGV0YWxsZShvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGlDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLkdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIGlDYW50aWRhZClcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuTk9NQlJFUywgXCJOT01CX1BST01PQ1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5JRCwgXCJJRF9QUk9NT0NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuVkFMT1JFUywgXCJWQUxfUFJPTU9DXCIpKTtcclxuXHJcbiAgICAgICAgICAgIC8vQWhvcmEgc2UgYWdyZWdhIHVuYSBkaW5hbWljYSBwb3IgYXRyaWJ1dG8gZGUgbGEgcHJvbW8gcGFyYSBmYWNpbGl0YXIgbGEgcmV0b21hIGRlIGVzdGEgaW5mb3JtYWNpw4PCs25cclxuICAgICAgICAgICAgbGV0IGxpc3ROb21icmUgPSBkYXRhLk5PTUJSRVMucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIGxldCBsaXN0SWQgPSBkYXRhLklELnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGlzdFZhbG9yID0gZGF0YS5WQUxPUkVTLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RJZC5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdE5vbWJyZVtfaV0sIFwiTk9NQl9QUk9NT0NfXCIgKyBfaSkpO1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0SWRbX2ldLCBcIklEX1BST01PQ19cIiArIF9pKSk7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3RWYWxvcltfaV0sIFwiVkFMX1BST01PQ19cIiArIF9pKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGEgPSB0aGlzLkdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIGlDYW50aWRhZCwgZmFsc2UpXHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLk5PTUJSRVMsIFwiTk9NQl9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuSUQsIFwiSURfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLlZBTE9SRVMsIFwiVkFMX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhcmdhciBhIGRldGFsbGUgaW5mb3JtYWNpb24gZGUgbml2ZWxlcyBkZSBwcmVjaW9cclxuICAgICAqIEBwYXJhbSBpbmZOaXZlbGVzUHJjaW8gSW5mb3JtYWNpb24gZGUgbml2ZWxlcyBkZSBwcmVjaW9cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgT2JqZXRvIGRvbmRlIHNlIGNhcmdhcsODwqEgbGEgaW5mb3JtYWNpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWREZXRhbGxlTml2ZWxlc1ByZWNpbyhpbmZOaXZlbGVzUHJjaW8sIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAoaW5mTml2ZWxlc1ByY2lvICYmIGluZk5pdmVsZXNQcmNpby5OSVZFTCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoaW5mTml2ZWxlc1ByY2lvLk5JVkVMLCBcIk5JVkVMUFJFQ0lPXCIpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgY29uIHF1ZSBuaXZlbCBkZSBwcmVjaW8gdmEgYSB0cmFiYWphclxyXG4gICAgICogQHBhcmFtIHByb2RHUlBTZWxlY3RlZCBFbCBwcm9kdWN0byBpbmdyZXNhZG9cclxuICAgICAqIEBwYXJhbSBpQ2FudGlkYWQgTGEgY2FudGlkYWQgZGUgcHJvZHVjdG9zIHF1ZSB2YSBhIGluZ3Jlc2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIGlDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9NM1ByZXNlbnRhY2lvbmVzOiBNM1ByZXNlbnRhY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgalJlc3BOaXZlbGVzID0ge307XHJcbiAgICAgICAgICAgIGlmIChwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMgJiZcclxuICAgICAgICAgICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJlc2VudGFjaW9uZXMgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZmluZCh4ID0+IGlDYW50aWRhZCA+PSB4LlRPUEUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1ByZXNlbnRhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTTNQcmVzZW50YWNpb25lcy5WQUxPUjtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcE5pdmVsZXMgPSB7IFwiUFJFQ0lPXCI6IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SLCBcIk5JVkVMXCI6IG9NM1ByZXNlbnRhY2lvbmVzLk5JVkVMUFJTIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGpSZXNwTml2ZWxlcztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJQcmVjaW9CeU5pdmVsZXNHZW5lcmFsKG9NM1ByZEdlbmVyYWw6IE0zUHJkR2VuZXJhbCwgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJlc2VudGFjaW9uZXM6IE0zUHJlc2VudGFjaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcE5pdmVsZXMgPSB7fTtcclxuICAgICAgICAgICAgaWYgKG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMgJiYgb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJlc2VudGFjaW9uZXMgPSBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmZpbmQoeCA9PiBpQ2FudGlkYWQgPj0geC5UT1BFKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQcmVzZW50YWNpb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwTml2ZWxlcyA9IHsgXCJQUkVDSU9cIjogb00zUHJlc2VudGFjaW9uZXMuVkFMT1IsIFwiTklWRUxcIjogb00zUHJlc2VudGFjaW9uZXMuTklWRUxQUlMgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4galJlc3BOaXZlbGVzO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxvcyBjdXBvbmVzIGdlbmVyYWRvcyBkZSBsYSBsaXN0YSBkZSBwcm9tb3Byb2Nlc2FkYXNcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X2xpc3RfY3Vwb25lc19mcm9tX3Byb21vKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgY2FudGlkYWQ6IG51bWJlcik6IEFycmF5PE0zUERldGFsbGVDdXBvbj4ge1xyXG4gICAgICAgIHZhciBsaXN0X2N1cG9uZXMgPSBBcnJheTxNM1BEZXRhbGxlQ3Vwb24+KCk7XHJcblxyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvbW9fYXNvY2lhZGEgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhc1tfaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vX2Fzb2NpYWRhLklkQ3Vwb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY3Vwb24gPSBuZXcgTTNQRGV0YWxsZUN1cG9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3Vwb24uSWRDdXBvbiA9IHByb21vX2Fzb2NpYWRhLklkQ3Vwb247XHJcbiAgICAgICAgICAgICAgICAgICAgY3Vwb24uQ2FudGlkYWQgPSBjYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0X2N1cG9uZXMucHVzaChjdXBvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0X2N1cG9uZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Bc2lnbmFyIGEgcHJvbW9jaW9uZXMgY29tYmlhbmFzIGRlc2RlIGxvIHF1ZSBzZSBlbmNvbnRyw4PCsyBhbCBlbmNhYmV6YWRvIGl0ZW0sIGRlbCBwcm9kdWN0byBzZWxlY2Npb25hZG9cclxuICAgIHB1YmxpYyBBc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYSAhPSBudWxsICYmIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZm9yRWFjaChwcm9tb0FzbyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9Bc28uUHJvbW9jaW9uQ29tYmluYWRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGFncmVnYSBwcm9tb2Npb24gY29tYmluYWRhIGEgZW5jYWJlemFkbyBkZSBpdGVtcy5cclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzLnB1c2gocHJvbW9Bc28uUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICAvLy9BZ3JlZ2FyIHByb21vY2lvbmVzIGNvbWJpbmFkYXNcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IEpTT04uc3RyaW5naWZ5KG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShKU09OLnN0cmluZ2lmeShvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzKSwgXCJQUk9NT0NPTUJJXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Bc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzQU0zUHJvY2VzbyhvTTNQcm9jZXNvcywgcHJvbW9Bc28uUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNpZ25hciBwcm9tb2Npb25lcyBjb21iaWFuZGFzIGEgTTMgUHJvY2VzbywgZXN0ZSwgdmFsaWRhIHF1ZSBubyBleGlzdGEgdW4gcHJvbW9jaW9uIGFudGVyaW9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhc0FNM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSkge1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcykge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzID0gbmV3IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSkpIHtcclxuICAgICAgICAgICAgLy8vLy8vLyBleGlzdGVcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLy8vLy8gTm8gRXhpc3RlXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMucHVzaChvUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMpIHtcclxuICAgICAgICAgICAgdGhpcy5BZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGEgZGluYW1pY2FzIHByb2Nlc28gZGUgY29tYmluYWRhc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBvTTNQRGluYW1pY2FzRmluZGVkOiBNM1BEaW5hbWljYXM7XHJcbiAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZCA9IGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiQ09NQklOQURBXCIpO1xyXG4gICAgICAgIGlmIChvTTNQRGluYW1pY2FzRmluZGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPiA9IEpTT04ucGFyc2Uob00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvcik7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyUHJvbW8ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvUHJvbW9Db21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBhcnJQcm9tb1tpXS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9Qcm9tb0NvbWJpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5wdXNoKGFyclByb21vW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gXCJDT01CSU5BREFcIjtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG5cclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9DYWxjdWxvIGRlIHByb21vY2lvbmVzXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgdmFyIGxUaXBvcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJESVJFQ1RBXCIpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiQ09NQklOQURBXCIpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiTU9ORURFUk9cIik7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJNQU5VQUxcIik7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG9NM0VOQ1BST01PICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQik7XHJcblxyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW8gPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGxUaXBvcyk7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhclByb21vY2lvbihhcnJQcm9tbywgcHJvZEdSUFNlbGVjdGVkLCBvTTNFTkNQUk9NTywgdGhpcy5nc0lka2F0aW9zKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gaGF5IGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIG9ic2VxdWlvcyB5IGFncmVnYXJsb3MuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyT2JzZXF1aW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+O1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHByb21vID0+IHByb21vLkxpc3RPYnNTS1UgIT0gbnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyclByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwgJiYgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID09IC0xXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvbW8uTGlzdE9ic1NLVS5sZW5ndGgpIHByb21vLkxpc3RPYnNTS1UgPSBbcHJvbW8uTGlzdE9ic1NLVV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGFTaVRpZW5lT3RyYVByb21vKHByb21vLCBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXF1aW9PUHJvbW8gPSBwcm9tby5JRFByb21vY2lvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFybWFyTGlzdGFPYnNlcXVpb3NTS1UocHJvbW8sIG9NM1BFbmNJdGVtcywgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdHVybk9uUHJvbW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+O1xyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIocHJvbW8gPT4gcHJvbW8ubElkQWN0aXZhUHJvbW8gJiYgcHJvbW8ubElkQWN0aXZhUHJvbW8ubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyclByb21vY2lvbmVzQXNvY2lhZGFzICYmIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sSWRBY3RpdmFQcm9tbyA9IHRoaXMubElkQWN0aXZhUHJvbW8uY29uY2F0KHByb21vLmxJZEFjdGl2YVByb21vKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUR1cGxpY2F0ZXModGhpcy5sSWRBY3RpdmFQcm9tbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUR1cGxpY2F0ZXMoYXJyOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdmFyIHVuaXF1ZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh1bmlxdWUuaW5kZXhPZihhcnJbaV0pID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdW5pcXVlLnB1c2goYXJyW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcm1hckxpc3RhT2JzZXF1aW9zU0tVKHByb21vOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBjYW50aWRhZFJlYWwgPSBNYXRoLmZsb29yKGNhbnRpZGFkIC8gcHJvbW8uQ2FudGlkYWRPYnNlcSk7XHJcbiAgICAgICAgaWYgKHByb21vLlJlZ2xhT2JzZXEgPT0gXCJFWENcIikge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IGNhbnRpZGFkUmVhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpbyhwcm9tbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgcHJvbW8uTGlzdE9ic1NLVS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5DYW50aWRhZCA9IGNhbnRpZGFkUmVhbCAqICtlbGVtZW50LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBwcm9tby5MaXN0T2JzU0tVO1xyXG4gICAgfVxyXG5cclxuICAgIGFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW86IFByb21vY2lvbmVzQXNvY2lhZGFzLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKHByb21vLkxpc3RPYnNTS1UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcm9tby5MaXN0T2JzU0tVLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlkRW5jUGFkcmUgPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcm1hckxpc3RhT2JzZXF1aW9zQ29tYmlTS1UoY29tYmksIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoY29tYmkuQWNjaW9uLlJlZ2xhT2JzZXEgPT0gXCJFWENcIikge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8oY29tYmkuQWNjaW9uLk9CU0VRVUlPUywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8oY29tYmkuQWNjaW9uLk9CU0VRVUlPUywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgY29tYmkuQWNjaW9uLk9CU0VRVUlPUy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5DYW50aWRhZCA9IGNhbnRpZGFkICogK2VsZW1lbnQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9MaXN0YU9ic2VxdWlvcyA9IGNvbWJpLkFjY2lvbi5PQlNFUVVJT1M7XHJcbiAgICB9XHJcblxyXG4gICAgYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpb0NvbWJpbmFkbyhvYnNlcXVpb3MsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAob2JzZXF1aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb2JzZXF1aW9zLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlkRW5jUGFkcmUgPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1JldG9ybmEgdHJ1ZSBzaSBoYXkgb3RyYSBwcm9tbyBhcGxpY2FkYSBkb25kZSBuaSBsYSBwcm9tbyBkZSBvYnNlcXVpbyBvIGxhIGFwbGljYWRhIHNvbiBmaWphcyB5IHVuYSBkZSBsYXMgZG9zIGVzIEVYQ1xyXG4gICAgdmFsaWRhU2lUaWVuZU90cmFQcm9tbyhwcm9tb09ic2VxdWlvOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChwcm9tb09ic2VxdWlvLlJlZ2xhICE9IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgbGV0IG9Qcm9tb3NOb09ic2VxdWlvcyA9IGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+IHguSURQcm9tb2Npb24gIT0gcHJvbW9PYnNlcXVpby5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW8gb2Ygb1Byb21vc05vT2JzZXF1aW9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW8uUmVnbGEgIT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9tby5BcGxpY2FkYSAmJiAocHJvbW8uUmVnbGEgPT0gXCJFWENcIiB8fCBwcm9tb09ic2VxdWlvLlJlZ2xhID09IFwiRVhDXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL3Byb2Nlc2FtaWVudG8gZGUgb2JzZXF1aW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgUHJvY2VzYXJPYnNlcXVpb3Mob0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID0gLTE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvcyAhPSBudWxsICYmIHRoaXMub0xpc3RhT2JzZXF1aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vTGlzdGFPYnNlcXVpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uU0tVKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDgxMCB2YWxpZGEsIGN1YW50b3MgcHJvZHVjdG9zIHNlIGFncmVnYSBlbiBlbCBvYnNlcXVpby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLkNhbnRpZGFkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gdGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMTEyIHNlIGFncmVnIGZ1bmNpb25hbGlkYWQgZGUgb2JzZXF1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5CaXNPYnNlcXVpbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1BhZHJlID0gdGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uaWRFbmNQYWRyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlRpcG9BZ3J1cGFjaW9uID0gXCJPQlNRXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuR3VhcmRhclByb21vY2lvbih0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXSwgb0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0d1YXJkYXIgcHJvbW9jaW9uIHNlZ3VuIHVuIHNrdVxyXG4gICAgLy8xLiBCdXNjYXIgZWwgcHJvZHVjdG8gc2VndW4gZWwgc2t1XHJcbiAgICAvLzIuIEFncmVnYXIgZWwgcHJvZHVjdG8gYSBtM3Byb2Nlc29zXHJcbiAgICAvLzMuIEFncmVnYXIgYWwgY2Fycml0byBkZSBjb21wcmFzLlxyXG4gICAgcHVibGljIGFzeW5jIEd1YXJkYXJQcm9tb2Npb24ocHJvbW8sIG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy8gMjAxODExMjEgIHZhciBzS2V5Q2Fycml0bztcclxuICAgICAgICAvLyAyMDE4MTEyMSB2YXIgb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHByb2Nlc29Qcm9tbztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vIDIwMTgxMTIxIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcblxyXG4gICAgICAgIC8vIDIwMTgxMTIxIG9NM1Byb2Nlc29zID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcbiAgICAgICAgcHJvY2Vzb1Byb21vID0gYXdhaXQgdGhpcy5BZGljaW9uYXJQcm9tb2Npb25BUHJvY2Vzbyhwcm9tbywgb00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBFbkxpbmVhLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBwb3VjaCBEQlxyXG4gICAgICAgIC8vIDIwMTgxMTIxICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBwcm9jZXNvUHJvbW8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsb3MgcHJvZHVjdG8gc2VndW4gc3UgU0tVLCBzYWNhbmRvIGxhIGluZm9ybWFjaW9uIGRlc2RlIHBvdWNoREIuXHJcbiAgICBwdWJsaWMgYXN5bmMgQWRpY2lvbmFyUHJvbW9jaW9uQVByb2Nlc28ocHJvbW8sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgdGhpcy5HZXRQcm9kdWN0b0J5U0tVKHByb21vLlNLVSwgRW5MaW5lYSwgb00zUHJvY2Vzb3MsIG9EYXRhVXNlcik7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhvUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChvUHJvZHVjdG8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvL1lhIG5vIHNlIGRlamEgcHJlY2lvIGNlcm8gc2lubyBxdWUgY29tbyBlcyBvYnNlcXVpbyBzaW11bGEgdW4gZGVzY3VlbnRvIGRlbCAxMDAlIFxyXG4gICAgICAgICAgICAvL1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgICAgICAgICAvL0FncmVnYXIgYSBtM3Byb2Nlc29zIGVsIG9ic2VxdWlvLlxyXG4gICAgICAgICAgICAvL29NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIG9Qcm9kdWN0bywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG51bGwsIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLmFkZHRvY2FydChvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0bywgbnVsbCwgbnVsbCwgb0RhdGFVc2VyLCB0aGlzLmdzSWRrYXRpb3MsIG9NM1ViaWNhY2lvbiwgbnVsbCwgb00zUHJvY2Vzb3MsIG51bGwsIDEwMCk7Ly8qU2UgbWFuZGEgdmFsb3IgZGUgZGVzY3Vlbm50byAxMDAgJVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIHNlZ3VuIGVsIFNLVVxyXG4gICAgcHVibGljIGFzeW5jIEdldFByb2R1Y3RvQnlTS1Uoc1NLVSwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55LCBkaXNwb25pYmxlTTNFbmMgPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICB2YXIgcHJvZHVjdG9zO1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8odGhpcy5nc0lka2F0aW9zKTtcclxuXHJcbiAgICAgICAgLy9vU2VydmljZUxpc3RhUHJlY2lvLkdlbmVyYXRlRGF0YVZhbGlkYWNpb24ob0RhdGFVc2VyLCBvTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbyk7XHJcbiAgICAgICAgaWYgKCFFbkxpbmVhICYmICFvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIHtcclxuICAgICAgICAgICAgdmFyIHNJRFByb2R1Y3RvcyA9IHRoaXMuZ3NJZGthdGlvcyArIFwiP1BSRFwiO1xyXG4gICAgICAgICAgICBwcm9kdWN0b3MgPSBhd2FpdCB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoc0lEUHJvZHVjdG9zKTtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvID0gb1NlcnZpY2VNM01hZXN0cm8uR2V0TTNQcmRHcnBGcm9tTGlzdChwcm9kdWN0b3MuTTNMaXN0UHJvZHVjdG9zLk0zR1JQLCBzU0tVKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyh0aGlzLkdvUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lka2F0aW9zLCBzU0tVLCBvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPD0gMCAmJiBkaXNwb25pYmxlTTNFbmMpIHtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPSBkaXNwb25pYmxlTTNFbmM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIHRoaXMuR29Qb3N0U2VydmljZU0zKTtcclxuICAgICAgICAvL29TZXJ2aWNlTGlzdGFQcmVjaW8uVmFsaWRhckxpc3RhUHJlY2lvcyhvUHJvZHVjdG8sIHRoaXMuR29Qb3N0U2VydmljZU0zLCB0aGlzLmdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHJldHVybiBvUHJvZHVjdG87XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYWxjdWxhciBwcmVjaW8gc2luIGltcHVlc3Rvcy4gTGEgZm9ybWEgZXMgY2FsY3VsYXIgdG9kbyBlbCB2YWxvciBkZWwgaW1wdWVzdG8uIEVKOiAxMjAuMDkgLyAxLjE2LiBTaSBlbCB2YWxvciBkZWwgaW1wdWVzdG8gZXM6IDE2JVxyXG4gICAgcHVibGljIENhbGN1bGF0ZVByZWNpb0Jhc2UoQ1RCTERJTVBQUkQ6IHN0cmluZywgZFZhbG9yTmV0bzogbnVtYmVyKSB7XHJcbiAgICAgICAgLy92YXIgZFZhbG9ySW1wdWVzdG86IG51bWJlciA9IDE7XHJcbiAgICAgICAgdmFyIGRWYWxvckJhc2U6IG51bWJlciA9IGRWYWxvck5ldG87XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG94bWxUb0pzb25URiA9IG5ldyB4bWxUb0pzb25URigpO1xyXG4gICAgICAgICAgICB2YXIgakltcHVlc3RvcztcclxuICAgICAgICAgICAgaWYgKENUQkxESU1QUFJEICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGpJbXB1ZXN0b3MgPSBveG1sVG9Kc29uVEYuY29udmVydFhtbFRvSnNvbihDVEJMRElNUFBSRCk7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9KQUdNICAyMDE5MDYyNiBDYW1iaW8gZGUgY2FsY3VsbyBkZSBiYXNlIGRlIGxvcyBpbXB1ZXN0b3MuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcC4kLk1ldG9kb2xvZ2lhID09IFwiUE9SQ0VOVEFKRVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRWYWxvckJhc2UgPSAoK2RWYWxvckJhc2UpIC8gKDEgKyAraW1wLiQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZFZhbG9yQmFzZSA9ICgrZFZhbG9yQmFzZSkgLSAoK2ltcC4kLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9NM1BFbmNJdGVtcy5NM0ltcHVlc3Rvcyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2F0Y2hcIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vcmV0dXJuICgoK2RWYWxvck5ldG8pIC8gKCtkVmFsb3JJbXB1ZXN0bykpO1xyXG4gICAgICAgIHJldHVybiBkVmFsb3JCYXNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIGluZm9ybWFjacODwrNuIGRlIGltcHVlc3RvcywgZGVzZGUgZWwgcHJvZHVjdG8gZ2VuZXJhbFxyXG4gICAgcHVibGljIExvYWRNM1BJbXB1ZXN0b3NGcm9tUHJkR3JsKENUQkxESU1QUFJEOiBzdHJpbmcsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsXHJcbiAgICAgICAgZFZhbG9yTmV0bzogbnVtYmVyLCBjYW50aWRhZDogbnVtYmVyLCB2YWxvclRvdGFsUHJvZHVjdG9Vbml0OiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb3htbFRvSnNvblRGID0gbmV3IHhtbFRvSnNvblRGKCk7XHJcbiAgICAgICAgICAgIHZhciBvTTNQSW1wdWVzdG9zOiBNM1BJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgIGxldCB2YWxvckJhc2VUb3RhbCA9IHRoaXMub01hdGhURi5yb3VuZChkVmFsb3JOZXRvLCA0KTtcclxuICAgICAgICAgICAgbGV0IHZhbG9yTmV0b1RvdGFsID0gdmFsb3JCYXNlVG90YWw7XHJcbiAgICAgICAgICAgIGxldCB2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yVG90YWxQcm9kdWN0b1VuaXQsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgdmFyIGpJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgIHZhciBkVG90YWxJbXB1ZXN0bzogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgaWYgKENUQkxESU1QUFJEICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGpJbXB1ZXN0b3MgPSBveG1sVG9Kc29uVEYuY29udmVydFhtbFRvSnNvbihDVEJMRElNUFBSRCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkwNjI2IENhbWJpbyBlbiBvcmRlbiBkZSBsb3MgaW1wdWVzdG9zLlxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yUmVhbEltcCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGltcCA9IGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MgPSBuZXcgTTNQSW1wdWVzdG9zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5Db2RJbXB1ZXN0byA9IGltcC4kLkNvZEltcDtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLlBvcmNlbnRhamUgPSBpbXAuJC5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wLiQuTWV0b2RvbG9naWEgPT0gXCJQT1JDRU5UQUpFXCIpIHsvL1BPUkNFTlRBSkVcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JSZWFsSW1wID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkoaW1wLiQuVmFsb3IsIHZhbG9yTmV0b1RvdGFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5WYWxvciA9IHRoaXMub01hdGhURi5yb3VuZCh2YWxvclJlYWxJbXAsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob00zUEltcHVlc3Rvcy5WYWxvciA8IHZhbG9yUmVhbEltcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguY2VpbCgrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguZmxvb3IoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHsvL0ZJSk9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JSZWFsSW1wID0gK2ltcC4kLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLlZhbG9yID0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yUmVhbEltcCwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChvTTNQSW1wdWVzdG9zLlZhbG9yIDwgdmFsb3JSZWFsSW1wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5jZWlsKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5mbG9vcigrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTgwOTEyIE51ZXZvIGNvbmNlcHRvIGRlIGJhc2VcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkJhc2UgPSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JOZXRvVG90YWwsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRUb3RhbEltcHVlc3RvID0gdGhpcy5vTWF0aFRGLnJvdW5kKCgrZFRvdGFsSW1wdWVzdG8pLDIpICsgdGhpcy5vTWF0aFRGLnJvdW5kKCgrb00zUEltcHVlc3Rvcy5WYWxvciksMik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTgwOTEyIFN1bWEgZGUgVmFsb3IgTmV0b1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yTmV0b1RvdGFsID0gdGhpcy5vTWF0aFRGLnJvdW5kKCgrdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yTmV0b1RvdGFsLCAyKSkgKyB0aGlzLm9NYXRoVEYucm91bmQoKCtvTTNQSW1wdWVzdG9zLlZhbG9yKSwyKSwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8vU29sbyBhZGljaW9uZSBhIGltcHVlc3RvcywgY3VhbmRvIGVzIHRvdGFsIGltcHVlc3Rvc1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbXBFeGlzdGU6IE0zUEltcHVlc3RvcztcclxuICAgICAgICAgICAgICAgICAgICBpbXBFeGlzdGUgPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZpbmQoaW1wID0+IGltcC5Db2RJbXB1ZXN0byA9PSBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wRXhpc3RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQm9ycmEgZW4gaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5maWx0ZXIoaW1wID0+IGltcC5Db2RJbXB1ZXN0byAhPSBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5wdXNoKG9NM1BJbXB1ZXN0b3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8uZm9yRWFjaChpbXAgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MjYgc2UgYWdyZWdhIHZhbGlkYWNpb24sIHlhIHF1ZSBlc3RhYmEgcXVlZGFuZG8gbGEgcmVzdGEsIGNvbiB2YWxvcmVzIGNvbW86IDAuMDAwMDAwMDAwMDEgPSAxLjE1NjQ1NjQ1NjRlODQ1IEVKXHJcbiAgICAgICAgICAgIGlmIChkVG90YWxJbXB1ZXN0byAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0RpZmVyZW5jaWEgcmVkb25kZWFkYSBhIGRvcyBkZWNpbWFsZXNcclxuICAgICAgICAgICAgICAgIGRUb3RhbEltcHVlc3RvID0gdGhpcy5vTWF0aFRGLnJvdW5kKGRUb3RhbEltcHVlc3RvLCAyKTtcclxuICAgICAgICAgICAgICAgIGxldCBkaWZlcmVuY2lhID0gdGhpcy5vTWF0aFRGLnJvdW5kKCgrdmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgLSArdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yQmFzZVRvdGFsLDIpIC0gK2RUb3RhbEltcHVlc3RvKSwgMik7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oZGlmZXJlbmNpYSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gdGhpcy5vTWF0aFRGLnJvdW5kKCsoK3ZhbG9yVG90YWxQcm9kdWN0b1RvdGFsIC0gK3RoaXMub01hdGhURi5yb3VuZCh2YWxvckJhc2VUb3RhbCwgMikgLSArZFRvdGFsSW1wdWVzdG8pLnRvRml4ZWQoNCksMik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hanVzdGFkb3JEZUltcHVlc3RvcyhvTTNQRW5jSXRlbXMsIGRpZmVyZW5jaWEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFwiVE9UQUxJTVBVRVNUT1NcIlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub01hdGhURi5yb3VuZCgodmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgLSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JCYXNlVG90YWwsMikpLCAyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhdGNoXCIpXHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZTIDIwMTkwNzI1XHJcbiAgICAgKiBDb3JyaWdlIGVsIHZhbG9yIHF1ZSB0b21vIGVsIGltcHVlc3RvIGRlc3B1ZXMgZGUgaGFiZXJzZSByZWRvbmRlYWRvXHJcbiAgICAgKiBTaSBhbCByZWNvcnJlciB0b2RvcyBsb3MgaW1wdWVzdG9zIGxhIGRpZmVyZW5jaWEgbm8gc2UgemFuamEsIE5JIE1PRE9TIGVsIGVycm9yIGVzdMODwqEgZW4gb3RyYSBwYXJ0ZVxyXG4gICAgICogU2UgY3JlYSBlc3RhIGZ1bmNpw4PCs24gcGFyYSByZXNvbHZlciBsb3MgZXJyb3JlcyBkZSB0aW1icmFkbyBkZSBmYWN0dXJhIGVsZWN0csODwrNuaWNhXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgRGlmZXJlbmNpYSBxdWUgc2UgZGViZSBzYWxkYXIgcGFyYSBjb25zZWd1aXIgZWwgdmFsb3IgdG90YWwgZGUgaW1wdWVzdG9zIHJlcXVlcmlkb1xyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JEZUltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkaWZlcmVuY2lhOiBudW1iZXIpIHtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW1wdWVzdG8gPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zW19pXTtcclxuICAgICAgICAgICAgLy9TaSBsYSBkaWZlcmVuY2lhIGVzIHBvc2l0aXZhIHF1aWVyZSBkZWNpciBxdWUgbGEgc3VtYSBkZSBsb3MgaW1wdWVzdG9zIGVzIG1lbm9yIGEgbGEgcmVhbFxyXG4gICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vU2kgZWwgaW1wdWVzdG8gc2UgcmVkb25kZW8gaGFjaWEgYWJham8gcXVpZXJlIGRlY2lyIHF1ZSBzZSBwdWRvIHJlZG9uZGVhciBoYWNpYSBhcnJpYmFcclxuICAgICAgICAgICAgICAgIC8vRW50b25jZXMgbG8gXCJyZWRvbmRlYSBoYWNpYSBhcnJpYmFcIiB5IHJlc3RhIHVuYSBjZW50ZXNpbWEgYSBsYSBkaWZlcmVuY2lhXHJcbiAgICAgICAgICAgICAgICBpZiAoaW1wdWVzdG8uVmFsb3IgPCBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uVmFsb3IgPSBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLkJhc2UgPSB0aGlzLm9NYXRoVEYucm91bmQoaW1wdWVzdG8uVmFsb3IgLyBpbXB1ZXN0by5Qb3JjZW50YWplLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gZGlmZXJlbmNpYSAtIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL1NpIFZhbG9yPlZhbG9yUmVhbCBxdWllcmUgZGVjaXIgcXVlIHJlZG9uZGVvIGhhY2lhIGFycmliYSB5IG5vIGRlYmUgbW9kaWZpY2FyIGVzZSB2YWxvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vU2kgbGEgZGlmZXJlbmNpYSBlcyBuZWdhdGl2YSBxdWllcmUgZGVjaXIgcXVlIGxhIHN1bWEgZGUgbG9zIGltcHVlc3RvcyBlcyBtYXlvciBhIGxhIHJlYWxcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL1NpIGVsIGltcHVlc3RvIHNlIHJlZG9uZGVvIGhhY2lhIGFycmliYSBxdWllcmUgZGVjaXIgcXVlIHNlIHB1ZG8gcmVkb25kZWFyIGhhY2lhIGFiYWpvXHJcbiAgICAgICAgICAgICAgICAvL0VudG9uY2VzIGxvIFwicmVkb25kZWEgaGFjaWEgYWJham9cIiB5IHN1bWEgdW5hIGNlbnRlc2ltYSBhIGxhIGRpZmVyZW5jaWFcclxuICAgICAgICAgICAgICAgIGlmIChpbXB1ZXN0by5WYWxvciA+IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5WYWxvciA9IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG87XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uQmFzZSA9IHRoaXMub01hdGhURi5yb3VuZChpbXB1ZXN0by5WYWxvciAvIGltcHVlc3RvLlBvcmNlbnRhamUsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZmVyZW5jaWEgPSBkaWZlcmVuY2lhICsgMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vU2kgVmFsb3I8VmFsb3JSZWFsIHF1aWVyZSBkZWNpciBxdWUgcmVkb25kZW8gaGFjaWEgYWJham8geSBubyBkZWJlIG1vZGlmaWNhciBlc2UgdmFsb3JcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TaSB5YSBzZSBzYWxkbyBsYSBkaWZlcmVuY2lhIHJvbXBlIGVsIGNpY2xvIGRhbmRvIHBvciBjb25jbHVpZG8gZWwgYWp1c3RlXHJcbiAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID09IDApIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vTG9hZCBwb3IgdW5pZGFkIGRldGFsbGUgZGVsIG0zcHJvY2VzbyBpdGVtcy5cclxuICAgIHB1YmxpYyBMb2FkTTNQRGV0YWxsZShzVmFsb3I6IHN0cmluZywgc0NvbmNlcHRvOiBzdHJpbmcpOiBNM1BEZXRhbGxlSXRlbXMge1xyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuTm9tYnJlQ29uY2VwdG8gPSBzQ29uY2VwdG87XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IHNWYWxvcjtcclxuICAgICAgICByZXR1cm4gb00zUERldGFsbGVJdGVtcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9HZW5lcmFyIHByb21vY2lvbiBjb21iaW5hZGFcclxuICAgIHB1YmxpYyBhc3luYyBHZW5lcmFyUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgaWYgKCFvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzIHx8IChvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzICYmICFvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZSA9PSBcIlBVRU5URV9ESUFSSU9cIikpKSB7XHJcbiAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG51bGwpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG9wcm9tb2Npb25lc1NlcnZpY2UuUHJvY2VzYXJDb21iaW5hZGEob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQ29tcGFyZSBNM1Byb2Nlc29zLiAoRmlyc3Q6IEBQYXJhbTogaWxNM1Byb2Nlc29zU1FMIFZTIFNlY29uZDogR2V0IEZyb20gQ291Y2hEQi9Qb3VjaERCKVxyXG4gICAgcHVibGljIGFzeW5jIENvbXBhcmVNM1Byb2Nlc28oc0lES2F0aW9zOiBzdHJpbmcsIG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyOiBhbnksIGlsTTNQcm9jZXNvc1NRTDogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBvUmVzcDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL0dldCBkYXRhLCBmcm9tIFBvdWNoREIvQ291Y2hEQlxyXG4gICAgICAgICAgICB2YXIgUHJvcGVydHlDb21wYXJlID0gW1wiVmFsb3JOZXRvXCIsIFwiVmFsb3JcIl07XHJcbiAgICAgICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3NDT1VDSDogTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgLy9HZXQgZGF0YSwgZnJvbSBQb3VjaERCL0NvdWNoREJcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSCA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG5cclxuICAgICAgICAgICAgLy9TdGFydCBDb21wYXJlXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUHJvcGVydHlDb21wYXJlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaWxNM1Byb2Nlc29zU1FMW1Byb3BlcnR5Q29tcGFyZVtpXV0gIT0gb00zUHJvY2Vzb3NDT1VDSFtQcm9wZXJ0eUNvbXBhcmVbaV1dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJSZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0NvbXBhcmU6IElELCBJZFByb2R1Y3RvIHkgQ0FOVElEQURcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaWxNM1Byb2Nlc29zU1FMLk0zRU5DLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1Byb2Nlc29zQ09VQ0guTTNFTkNbal0uSUQgIT0gaWxNM1Byb2Nlc29zU1FMLk0zRU5DW2pdLklEIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0guTTNFTkNbal0uSWRQcm9kdWN0byAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uSWRQcm9kdWN0byB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNILk0zRU5DW2pdLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgIT0gaWxNM1Byb2Nlc29zU1FMLk0zRU5DW2pdLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvUmVzcCA9IHsgXCJiUmVzcFwiOiBiUmVzcCwgXCJNM1Byb2Nlc29zXCI6IG9NM1Byb2Nlc29zQ09VQ0ggfTtcclxuICAgICAgICAgICAgcmV0dXJuIG9SZXNwO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgQ29tcGFyZU0zUHJvY2Vzb1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgICAgICBvUmVzcCA9IHsgXCJiUmVzcFwiOiB0cnVlLCBcIk0zUHJvY2Vzb3NcIjogbnVsbCB9O1xyXG4gICAgICAgICAgICByZXR1cm4gb1Jlc3A7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BZGljaW9uYXIgY29tZXJjaWFsIGFsIHByb2Nlc28sIGxvIGFkaWNpb25hIGFsIGFycmVnbG8gZGUgZGluYW1pY29zIGFzb2NpYWRvIGFsIHByb2Nlc28uXHJcbiAgICBwdWJsaWMgQWRkQ29tZXJjaWFsVG9NM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFRkb2NDb21lcmNpYWw6IHN0cmluZywgTmRvY0NvbWVyY2lhbDogc3RyaW5nKSB7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIlRDT01FUkNJQUxcIiwgVGRvY0NvbWVyY2lhbCkpO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaCh0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJOQ09NRVJDSUFMXCIsIE5kb2NDb21lcmNpYWwpKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NyZWFjaW9uIHkgcmV0b3JubyBkZSB0dXBsYSBkZSBkaW5hbWljb3MsIGF0YWRvcyBhIHByb2Nlc28gbTMuXHJcbiAgICBwdWJsaWMgQ3JlYXRlVHVwbGFEaW5hbWljYShub21icmUsIHZhbG9yKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBub21icmU7XHJcbiAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IHZhbG9yO1xyXG5cclxuICAgICAgICByZXR1cm4gb00zUERpbmFtaWNhcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vQWN0dWFsaXphIGxhIGNhbnRpZGFkIGRlIFxyXG4gICAgcHVibGljIHNldENhbnRpZGFkQUxMWVVQRENvdWNoKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBpQ2FudGlkYWQpIHtcclxuXHJcbiAgICAgICAgaWYgKGlDYW50aWRhZCA9PSAwICYmIG9NM1Byb2Nlc29zLklERGlhcmlvID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8vQXVuIG5vIGVzdGEgcmVnaXN0cmFkbyBlbCBwcm9jZXNvIGNvbW8gdGFsLCBzZSBwdWVkZSBib3JyYXIgZGUgcmFpelxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBcIldFQlwiLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZCA9PSAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5EZWxldGVNM1Byb2Nlc28ob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5HZXRDYXJyaXRvQ29tcHJhc1BvdWNoREIob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBuZXcgTTNQcm9jZXNvcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gaUNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIFwiV0VCXCIsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy9TZSBjYW50aWRhZCBkZSB1biBwcm9kdWN0byBlc3BlY2lmaWNvXHJcbiAgICBwdWJsaWMgc2V0Q2FudGlkYWRZVVBEQ291Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sXHJcbiAgICAgICAgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCB0aXBvVWJpY2FjaW9uLCBJREVuYyxcclxuICAgICAgICBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgZm9yemFyQm9ycmFkOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgaWYgKChpQ2FudGlkYWQgPT0gMCAmJiBvTTNQcm9jZXNvcy5JRERpYXJpbyA9PT0gdW5kZWZpbmVkICYmIHRpcG9VYmljYWNpb24gPT0gXCJXRUJcIikgfHwgZm9yemFyQm9ycmFkKSB7XHJcbiAgICAgICAgICAgIC8vL0F1biBubyBlc3RhIHJlZ2lzdHJhZG8gZWwgcHJvY2VzbyBjb21vIHRhbCwgc2UgcHVlZGUgYm9ycmFyIGRlIHJhaXpcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIocHJvZCA9PiAhKHByb2QuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIHByb2QuSUQgPT0gSURFbmMpICYmICEocHJvZC5JZEVuY1BhZHJlID09IElERW5jKSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgbG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgICAgICBsb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG0zVWJpY2FjaW9uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBKQUdNIDIwMTkxMDIxLCBubyBoYWNlciBsw4PCs2dpY2EgZGUgcHJvbW9jaW9uZXMgeSB2YXJpb3MsIGN1w4PCoW5kbyBzZSBib3JyYSBlbCBpdGVtLlxyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vU2UgdG9tYSBlbiBjdWVudGEgZWwgcHJkIHkgc3VzIGhpam9zIGNvbiBlbCBJZEVuY1BhZHJlXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+IChlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKSB8fCBlbmMuSWRFbmNQYWRyZSA9PSBJREVuYykuZm9yRWFjaChwcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZC5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGlDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIGVuYy5JRCA9PSBJREVuYykuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7Ly9BbnRpZ3VhIGxvZ2ljYVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG0zVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FudGlkYWRWMihvTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCBJREVuYywgb0RhdGFVc2VyLCBzSURLYXRpb3MsIG0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTykudGhlbihyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbiwgcmVzcC5NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbWJpYXIgY2FudGlkYWQgZGUgbTNwcm9jZXNvXHJcbiAgICAvL0pBR00gMjAxOTEwMTggU2UgYWdyZWdhIG51ZXZhIGZ1bmNpb25hbGlkYWQgYSBsYSBjYW50aWRhZDogXHJcbiAgICAvLzEuU2UgYm9ycmEgZWwgcHJvZHVjdG8gZGUgbGEgbGlzdGEgZGVsIHByb2Nlc29cclxuICAgIC8vMi4gU2UgYWdyZWdhIGRlIG51ZXZvIGVsIHByb2R1Y3RvIGNvbiBsYSBudWV2YSBjYW50aWRhZC5cclxuICAgIHB1YmxpYyBhc3luYyBzZXRDYW50aWRhZFYyKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIElERW5jLCBvRGF0YVVzZXI6IGFueVxyXG4gICAgICAgICwgc0lES2F0aW9zOiBzdHJpbmcsIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcbiAgICAgICAgdmFyIG9Qcm9kdWN0bzogVHlwZU0zUHJkR3JwID0gbnVsbDtcclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IGlDYW50aWRhZDtcclxuICAgICAgICAvL0pBR00gMjAxOTExMTQsIEFncmVnYXIgaW1hZ2VuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiBlbmMuSUQgPT0gSURFbmMpO1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4gPSBvTTNQRW5jSXRlbXMuUGF0aEltYWdlO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAhKGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiAoZW5jLklEID09IElERW5jIHx8IGVuYy5JZEVuY1BhZHJlID09IElERW5jKSkpO1xyXG5cclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCB0aGlzLkdldFByb2R1Y3RvQnlTS1UoaWRQcm9kdWN0bywgdHJ1ZSwgb00zUHJvY2Vzb3MsIG9EYXRhVXNlciwgb00zUEVuY0l0ZW1zLkRJU1BPTklCTEUpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IHRoaXMuTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvKTtcclxuICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuYWRkdG9jYXJ0KG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvLCBudWxsLCBudWxsLCBvRGF0YVVzZXIsIHNJREthdGlvcywgbTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIHsgXCJNM1Byb2Nlc29cIjogb00zUHJvY2Vzb3MsIFwiTTNQSXRlbXNXRUJcIjogb00zUEl0ZW1zV0VCIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X00zRU5DX2J5X2lkcHJkX2xvdGUob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUpOiBNM1BFbmNJdGVtcyB7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSlcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgY2FudGlkYWQgZGUgdW4gZW5jYWJlemFkbywgcHJvZHVjdG8gZXNwZWNpZmljby5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb2R1Y3RvOiBNM1ByZEdlbmVyYWwpIHtcclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gb1Byb2R1Y3RvLlNLVSAmJiBlbmMuTG90ZSA9PSBvUHJvZHVjdG8uTE9URSkuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENhbnRpZGFkVG90YWwob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vUkVHSU9OIERFIFJFQ0VQQ0lPTlxyXG4gICAgLy9TZSBhZ3JlZ2EgYXRyaWJ1dG8gZGUgQ3VycmVudCBjYW50aWRhZCBkZSByZWNlcGNpb25cclxuICAgIHB1YmxpYyBNZXJnZVJlY2VwWUVuYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRSZWNlcGNpb246IG51bWJlcikge1xyXG4gICAgICAgIC8vb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNQUmVjZXBjaW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNQUmVjZXBjaW9uLmZpbHRlcihyZWNlcCA9PiByZWNlcC5JZFJlY2VwY2lvbiA9PSBpZFJlY2VwY2lvbikuZm9yRWFjaChyZWMgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklEID09IHJlYy5JZEVuYykuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHJlYy5DYW50aWRhZC50b1N0cmluZygpLCBcIkNVUkNSRUNcIikpOy8vQ1VSUkVOVCBDQU5USURBRCBSRUNFUENJT05cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRGVqYXIgbG9zIGRlIHRhbGxlcyBkZSBsYSB2YXJpYWJsZTogQ1VSQ1JFQyBlbj0wLCBFc3RvIHBhcmEgZmx1am9zLCBkb25kZSBhZ3JlZ2EgaW5mbyBwcm9jZXNhIHkgYWjDg8KtIG1pc21vIGFncmVnYSBtw4PCoXMuXHJcbiAgICBwdWJsaWMgUmVtb3ZlQ3VyQ1JlYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zICE9IG51bGwgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPSBudWxsKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0RldGFsbGU6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgIG9EZXRhbGxlID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNVUkNSRUNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAob0RldGFsbGUgIT09IHVuZGVmaW5lZCAmJiBvRGV0YWxsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0RldGFsbGUuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vRklOIFJFR0lPTiBERSBSRUNFUENJT05cclxuXHJcbiAgICAvLy8vLy8vUkVHSU9OIEVOVFJFR0FcclxuICAgIC8vU2UgYWdyZWdhIGF0cmlidXRvIGRlIEN1cnJlbnQgY2FudGlkYWQgZGUgZW52aW9cclxuICAgIHB1YmxpYyBNZXJnZUVudHBZRW5jKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERQUkQsIFwiQ1RCTERQUkRcIikpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM1BFbnZpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM1BFbnZpb3MuZm9yRWFjaChlbnYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGxFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgICAgIGxFbmMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+IGVuYy5JZEVudmlvID09IGVudi5JZEVudmlvKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobEVuYyAhPT0gdW5kZWZpbmVkICYmIGxFbmMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxFbmMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciwgXCJDVVJDRU5UXCIpKTsvL0NVUlJFTlQgQ0FOVElEQUQgUkVDRVBDSU9OXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRGVqYXIgbG9zIGRlIHRhbGxlcyBkZSBsYSB2YXJpYWJsZTogQ1VSQ1JFQyBlbj0wLCBFc3RvIHBhcmEgZmx1am9zLCBkb25kZSBhZ3JlZ2EgaW5mbyBwcm9jZXNhIHkgYWjDg8KtIG1pc21vIGFncmVnYSBtw4PCoXMuXHJcbiAgICBwdWJsaWMgUmVtb3ZlQ3VyQ0VudChvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zICE9IG51bGwgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPSBudWxsKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0RldGFsbGU6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgIG9EZXRhbGxlID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNVUkNFTlRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAob0RldGFsbGUgIT09IHVuZGVmaW5lZCAmJiBvRGV0YWxsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0RldGFsbGUuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICB9XHJcbiAgICAvLy8vLy8vRklOIFJFR0lPTiBFTlRSRUdBXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvbW9jaW9uZXMgcXVlIHNlIHByb2Nlc2FuIGRlc3B1ZXMgZGUgYWdyZWdhciBhbCBjYXJyaXRvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gb0RhdGFVc2VyIFxyXG4gICAgICogQHBhcmFtIG9NM1BJdGVtc1dFQiBcclxuICAgICAqIEBwYXJhbSBvTTNVYmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gRW5MaW5lYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIFByb2NQcm9tb0FmdGVyQWRkVG9DYXJ0KG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuUHJvY2VzYXJPYnNlcXVpb3Mob0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYXIgcHJvbW9jaW9uZXMgZGVzcHVlcyBkZSBmaW5hbGl6YXIgZWwgcmVnaXN0cm9cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2NQcm9tb0FmdGVyRmluYWxpemFyKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55KSB7XHJcblxyXG4gICAgICAgIHRoaXMuR2VuZXJhclByb21vQ29tYmluYWRhKG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIHRoaXMuUHJvbW9BZnRlclByb2Nlc28ob00zUHJvY2Vzb3MsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFByb21vQWZ0ZXJQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgbnVsbCk7XHJcbiAgICAgICAgICAgIHZhciBsVGlwb3NQcm9tbyA9IG5ldyBBcnJheTxTdHJpbmc+KCk7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIGxUaXBvc1Byb21vLnB1c2goXCJBRlRFUlwiKTtcclxuICAgICAgICAgICAgYXJyUHJvbW8gPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBudWxsLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBsVGlwb3NQcm9tbyk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlByb2Nlc2FyUHJvbW9BZnRlcihhcnJQcm9tbywgb00zUHJvY2Vzb3MsIG9NM0VOQ1BST01PKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZEluZm9Qcm9tb2Npb25lc0FEaW5hbWljYXMob00zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMgYSBpbmZvcm1hY2lvbiBkaW5hbWljYSBkZWwgcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRJbmZvUHJvbW9jaW9uZXNBRGluYW1pY2FzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgMCk7XHJcbiAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIlZBTF9QUk9NT0NcIiwgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbi50b1N0cmluZygpKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcblxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzID0gdGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiTk9NQl9QUk9NT0NcIiwgZGF0YS5OT01CUkVTKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcblxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzID0gdGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiSURfUFJPTU9DXCIsIGRhdGEuSUQpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIHByb2Nlc28gYXNvc2lhZG8gYSB1biBpZHByZXN0YW1vc1xyXG4gICAgYXN5bmMgZ2V0X20zX3Byb2Nlc29fYnlfaWRfcHJlc3RhbW9fYXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGlkX3ByZXN0YW1vOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zL2dldE0zUHJvY2Vzb0J5SWRQcmVzdGFtby8nICsgaWRfa2F0aW9zICsgJy8nICsgaWRfcHJlc3RhbW8pLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBHZXRDb25jZXB0b00zU2FsZG9zSXRlbVViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBqRGF0YTogYW55KSB7XHJcbiAgICAgICAgdmFyIHJlc3A7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL0dldENvbmNlcHRvTTNTYWxkb3NJdGVtVWIvJyArIHNJREthdGlvcywgakRhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2EgbyBtb2RpZmljYSBsYSBjYW50aWRhZCBkZSB1biBvYmpldG8gTTNPdENsYXNpZmljYWNpb25lcyBkZW50cm8gZGVsYSBsaXN0YSBkZSB1biBQcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCBcclxuICAgICAqIEBwYXJhbSBjYW50aWRhZCBcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkUHJvZHVjdG9Ub090cmFzQ2xhcyhwcm9kdWN0OiBUeXBlTTNQcmRHcnAsIGNhbnRpZGFkOiBudW1iZXIsIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgZnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyA9IGlvTTNQcm9jZXNvcztcclxuICAgICAgICB2YXIgb00zT3RDbGFzaWZpY2FjaW9uZXM6IE0zT3RDbGFzaWZpY2FjaW9uZXM7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZHVjdC5Mb00zUHJkR2VuZXJhbFswXTtcclxuXHJcbiAgICAgICAgbGV0IHByb2R1Y3RvRXhpc3RlID0gdGhpcy52YWxpZGFyRXhpc3RhT3RyYUNsYXNpZihvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBwcm9kdWN0KTtcclxuICAgICAgICBpZiAocHJvZHVjdG9FeGlzdGUpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuQ2FudGlkYWQgPSBwcm9kdWN0b0V4aXN0ZS5DYW50aWRhZCArIGNhbnRpZGFkO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0V4aXN0ZS5WYWxvciA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KHByb2R1Y3RVbml0U2VsZWN0ZWQuTG9NM1ByZExpc3RhLlBSRUNJTywgcHJvZHVjdG9FeGlzdGUuQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0V4aXN0ZS5PcmRlbiA9IHRoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMgPSBuZXcgTTNPdENsYXNpZmljYWNpb25lcygpO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5DYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5JZFByb2R1Y3RvID0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1U7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLk5vbWJyZSA9IHByb2R1Y3RVbml0U2VsZWN0ZWQuTk9NQlJFMTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuVmFsb3IgPSArYmlnRGVjaW1hbC5tdWx0aXBseShwcm9kdWN0VW5pdFNlbGVjdGVkLkxvTTNQcmRMaXN0YS5QUkVDSU8sIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuSUQgPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiSURcIikgKyAxO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5PcmRlbiA9IHRoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgXCJPcmRlblwiKSArIDE7XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLnB1c2gob00zT3RDbGFzaWZpY2FjaW9uZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpb00zUHJvY2Vzb3MgPSB0aGlzLnJlY2FsY3VsYXJWYWxPdHJhQ2xhc2lNM1Byb2Nlc29zKGlvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVsaW1pbmEgdW4gb2JqZXRvIE0zT3RDbGFzaWZpY2FjaW9uZXMgcG9uaWVuZG8gc3UgdmFsb3IgeSBjYW50aWRhZCBlbiBjZXJvXHJcbiAgICAgKiBAcGFyYW0gb00zT3RDbGFzaWZpY2FjaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBkZWxldGVQcm9kdWN0b0Zyb21PdHJhc0NsYXMob00zT3RDbGFzaWZpY2FjaW9uZXM6IE0zT3RDbGFzaWZpY2FjaW9uZXMsIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b0FjdHVhbCA9IGlvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gb00zT3RDbGFzaWZpY2FjaW9uZXMuSWRQcm9kdWN0byk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RvQWN0dWFsKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvQWN0dWFsLkNhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuVmFsb3IgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpb00zUHJvY2Vzb3MgPSB0aGlzLnJlY2FsY3VsYXJWYWxPdHJhQ2xhc2lNM1Byb2Nlc29zKGlvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIGlvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsY3VsYSBlbCB2YWxvciBkZSBNM1Byb2Nlc29zLlZhbE90cmFDbGFzaSBhIHBhcnRpciBkZSBsYSBzdW1hdG9yaWEgZGUgbG9zIG9iamV0b3MgZGVudHJvIGRlbCBhcnJlZ2xvIE0zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lc1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICByZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlZhbE90cmFDbGFzaSA9IG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMucmVkdWNlKGZ1bmN0aW9uIChzdW1hLCBvTTNPdENsYXNpZmljYWNpb25lcykge1xyXG4gICAgICAgICAgICByZXR1cm4gc3VtYSArIG9NM090Q2xhc2lmaWNhY2lvbmVzLlZhbG9yO1xyXG4gICAgICAgIH0sIDApXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIGxhIGV4aXN0ZW5jaWEgZGUgdW4gcHJvZHVjdG8gZGVudHJvIGRlIHVuIGxhIGxpc3RhIGRlIE0zT3RDbGFzaWZpY2FjaW9uZXNcclxuICAgICAqIEBwYXJhbSBsaXN0TTNPdENsYXNpZmljYWNpb25lcyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0IFxyXG4gICAgICovXHJcbiAgICB2YWxpZGFyRXhpc3RhT3RyYUNsYXNpZihsaXN0TTNPdENsYXNpZmljYWNpb25lczogQXJyYXk8TTNPdENsYXNpZmljYWNpb25lcz4sIHByb2R1Y3Q6IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b0V4aXN0ZSA9IGxpc3RNM090Q2xhc2lmaWNhY2lvbmVzLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gcHJvZHVjdC5Mb00zUHJkR2VuZXJhbFswXS5TS1UpO1xyXG4gICAgICAgIHJldHVybiBwcm9kdWN0b0V4aXN0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBMaW1waWEgbG9zIGRldGFsbGVzIHkgbG9zIGltcHVlc3RvcyBkZSB1biBwcm9kdWN0byBkYWRvIGVuIHVuIHByb2Nlc28gZGUgZGV2b2x1Y2lvblxyXG4gICAqIEBwYXJhbSBwcm9kdWN0b0JvcnJhZG8gXHJcbiAgICogQHBhcmFtIHByb2Nlc29EZXZvbHVjaW9uIFxyXG4gICAqL1xyXG4gICAgZGVsZXRlUHJkRGV2b2x1Y2lvbihwcm9kdWN0b0JvcnJhZG8sIHByb2Nlc29EZXZvbHVjaW9uOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvID0gcHJvY2Vzb0Rldm9sdWNpb24uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBwcm9kdWN0b0JvcnJhZG8uSWRQcm9kdWN0byk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RvKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvLk0zREVULmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4oK2RldC5WYWxvcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXQuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBwcm9kdWN0by5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgaW1wLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgIGltcC5CYXNlID0gMDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWp1c3RhIGxvcyBWYWxvcmVzIGVuIGNhc28gZGUgZW5jb250cmFyIGRpZmVyZW5jaWFzIHBhcmEgcG9kZXIgZ2VuZXJhciBGRVxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JWYWxvcmVzQ0ZESUZyb250KG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSAwO1xyXG4gICAgICAgIGxldCB0b3RhbERlc2N1ZW50b3MgPSB0aGlzLmdldFZhbG9yVG90YWxEZXNjdWVudG9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICBsZXQgdG90YWxJbXBvcnRlSW1wdWVzdG9zID0gdGhpcy5nZXRWYWxvclRvdGFsSW1wb3J0ZUltcHVlc3RvcyhvTTNQcm9jZXNvcyk7XHJcblxyXG4gICAgICAgIGRpZmVyZW5jaWEgPSB0aGlzLm9NYXRoVEYucm91bmQob00zUHJvY2Vzb3MuVmFsb3JOZXRvIC0gKG9NM1Byb2Nlc29zLlZhbG9yICsgdG90YWxJbXBvcnRlSW1wdWVzdG9zIC0gdG90YWxEZXNjdWVudG9zKSwgMyk7XHJcbiAgICAgICAgaWYgKGRpZmVyZW5jaWEgIT0gMCkge1xyXG4gICAgICAgICAgICBpZiAodG90YWxJbXBvcnRlSW1wdWVzdG9zID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hanVzdGFkb3JJbXB1ZXN0b3NDRkRJKGRpZmVyZW5jaWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9yRGVzY3VlbnRvc0NGREkoZGlmZXJlbmNpYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHZhbG9yIHRvdGFsIGRlIHByb21vY2lvbmVzIGFwbGljYWRhcyBlbiBlbCBwcm9jZXNvIGVuIGN1ZXN0acODwrNuXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGdldFZhbG9yVG90YWxEZXNjdWVudG9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdG90YWxEZXNjdWVudG9zID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkZXRhbGxlUHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZVByb21vKSB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbERlc2N1ZW50b3MgKz0gK2RldGFsbGVQcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdG90YWxEZXNjdWVudG9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB2YWxvciB0b3RhbCBkZSBpbXB1ZXN0b3MgY29icmFkb3MgZW4gZWwgcHJvY2VzbyBlbiBjdWVzdGnDg8KzblxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBnZXRWYWxvclRvdGFsSW1wb3J0ZUltcHVlc3RvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICBlbmMuTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIHRvdGFsSW1wb3J0ZUltcHVlc3RvcyArPSAraW1wLlZhbG9yO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsSW1wb3J0ZUltcHVlc3RvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11ZXZlIGVsIHZhbG9yIGRlIHVuIGltcHVlc3RvIGVuIDAuMDEgeSBzdSBjb3JyZXNwb25kaWVudGUgYmFzZSBwYXJhIHF1ZSBjdWFkcmUgbG9zIHZhbG9yZXMgYWwgdGltYnJhciBsYSBGRVxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckltcHVlc3Rvc0NGREkoZGlmZXJlbmNpYTogbnVtYmVyLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBhanVzdG8gPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBlbmMgb2Ygb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW1wIG9mIGVuYy5NM1BJbXB1ZXN0b3MpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IGltcC5WYWxvciArIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSBpbXAuVmFsb3IgLSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaW1wLkJhc2UgPSBpbXAuVmFsb3IgLyBpbXAuUG9yY2VudGFqZTtcclxuICAgICAgICAgICAgICAgIGFqdXN0byA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYWp1c3RvKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11ZXZlIGVsIHZhbG9yIGRlIHVuIGRlc2N1ZW50byBlbiAwLjAxIHBhcmEgcXVlIGN1YWRyZSBsb3MgdmFsb3JlcyBhbCB0aW1icmFyIGxhIEZFXHJcbiAgICAgKiBAcGFyYW0gZGlmZXJlbmNpYSBcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yRGVzY3VlbnRvc0NGREkoZGlmZXJlbmNpYTogbnVtYmVyLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBkZXRhbGxlVG90YWxQcm9tbzogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgIGZvciAobGV0IGVuYyBvZiBvTTNQcm9jZXNvcy5NM0VOQykge1xyXG4gICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tbyA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgICAgIGlmIChkZXRhbGxlVG90YWxQcm9tbyAmJiArZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tby5WYWxvciA9ICgrZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgLSAwLjAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPSAoK2RldGFsbGVUb3RhbFByb21vLlZhbG9yICsgMC4wMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQcmRzR2VuZXJhbEZyb21NM1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lkS2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0UHJkc0dlbmVyYWxGcm9tTTNQcm9jZXNvLycgKyBzSWRLYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLmVycm9yLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNUcngge1xyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZWwgZGlhcmlvIGRlIHRyYW5zYWNjaW9uZXMgZGVzZGUgc2VydmljaW8gcmVzdCBNM1RyeC4gTWljcm9zZXJ2aWNpbyBNMy5cclxuICAgIHB1YmxpYyBNM19HZXREaWFyaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhU2VuZDogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zVHJ4L00zX0dldERpYXJpby8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9EYXRhRGlhcmlvO1xyXG4gICAgICAgICAgICBvRGF0YURpYXJpbyA9IHJlc3A7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YURpYXJpby5SRVNQVUVTVEEuZGF0YS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFEaWFyaW8uUkVTUFVFU1RBLmRhdGEgPSBuZXcgQXJyYXkob0RhdGFEaWFyaW8uUkVTUFVFU1RBLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgZGlhcmlvIGRlIHRyYW5zYWNjaW9uZXMgZGV0YWxsYWRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dldERpYXJpb1RyeChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zVHJ4L20zX2dldERpYXJpb1RyeC8nICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvRGF0YURpYXJpbztcclxuICAgICAgICAgICAgb0RhdGFEaWFyaW8gPSByZXNwO1xyXG4gICAgICAgICAgICBpZiAob0RhdGFEaWFyaW8uUkVTUFVFU1RBLkRpYXJpby5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFEaWFyaW8uUkVTUFVFU1RBLkRpYXJpbyA9IG5ldyBBcnJheShvRGF0YURpYXJpby5SRVNQVUVTVEEuRGlhcmlvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIHRyYW5zYWNjaW9uLlxyXG4gICAgcHVibGljIE0zX0dldEluZm9UUlgoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhU2VuZDogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy9sZXQgZGF0YSA9IHsgJ1RvcCc6IHRvcCB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNUcngvTTNfR2V0SW5mb1RSWC8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9EYXRhVFJYO1xyXG4gICAgICAgICAgICBvRGF0YVRSWCA9IHJlc3A7XHJcblxyXG4gICAgICAgICAgICBpZiAob0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvRGF0YVRSWC5SRVNQVUVTVEEuVElQT1MgPSBuZXcgQXJyYXkob0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TLmZvckVhY2godGlwbyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGlwby5UUlgubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aXBvLlRSWCA9IG5ldyBBcnJheSh0aXBvLlRSWCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob0RhdGFUUlgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG5cclxuXHJcbiAgICAvL0NhbWJpbyBkZSBlc3RhZG8gZGUgdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgQ2FtYmlvRXN0YWRvVWJpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvTTNVYmljYWNpb246IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM1RyeC9DYW1iaW9Fc3RhZG9VYmljYWNpb24vJyArIHNJREthdGlvcywgb00zVWJpY2FjaW9uKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcbiAgICAvL0NhbWJpbyBkZSBlc3RhZG8gZGUgSFVCXHJcbiAgICBwdWJsaWMgQ2FtYmlvRXN0YWRvSHViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvTTNVYmljYWNpb246IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM1RyeC9DYW1iaW9Fc3RhZG9IdWIvJyArIHNJREthdGlvcywgb00zVWJpY2FjaW9uKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuICAgIC8vQ2FtYmlvIGRlIGVzdGFkbyBkZSBIVUJcclxuICAgIHB1YmxpYyBDYW1iaW9ORG9jQWN0aXZvSHViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvTTNVYmljYWNpb246IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM1RyeC9DYW1iaW9ORG9jQWN0aXZvSHViLycgKyBzSURLYXRpb3MsIG9NM1ViaWNhY2lvbikuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcbn0iLCJpbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcmVjTGlzdFByZWNpb3MgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wcmVjLWxpc3QtcHJlY2lvcy50eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZUxpc3RhUHJlY2lvIHtcclxuXHJcbiAgICBwcml2YXRlIGdvRGF0YTogYW55O1xyXG4gICAgcHJpdmF0ZSBnc0lkS2F0aW9zOiBhbnk7XHJcbiAgICBwcml2YXRlIGxQcmVjaW9zU2VsZWN0ZWQ6IHN0cmluZyA9IFwiLTFcIjtcclxuXHJcbiAgICAvL0dlbmVyYXIgSlNPTiBnZW7Dg8KpcmljbywgcGFyYSB2YWxpZGFyIGxhIGxpc3RhIGRlIHByZWNpb1xyXG4gICAgY29uc3RydWN0b3IobG9nZWRfdXNlcjogYW55LCBzSWRQcm9jZXNvOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBvRGF0YSA9IHsgXCJVU0VSXCI6IGxvZ2VkX3VzZXIsIFwiUHJvY2Vzb1wiOiBzSWRQcm9jZXNvIH1cclxuICAgICAgICB0aGlzLmdvRGF0YSA9IG9EYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0TGlzdGFQcmVjaW9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmdzSWRLYXRpb3MgPSBJZEthdGlvcztcclxuICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICAgICAgdmFyIG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcztcclxuICAgICAgICAgICAgb0xpc3RQcmVjTFAgPSB0aGlzLkdldExQcmVjaW9zSW5TdG9yYWdlKElkS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYoIW9MaXN0UHJlY0xQKXtcclxuICAgICAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHRVRfTElTVEFQUkVDSU9TX0FTeW5jKFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2F2ZUxQcmVjaW9zSW5TdG9yYWdlKG9MaXN0UHJlY0xQLElkS2F0aW9zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLlZhbGlkYXJBUExSZWdsYShvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgICAgIC8vdGhpcy5GaW5kTFByZWNpbyhvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxQcmVjaW9zU2VsZWN0ZWQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgbGEgbGlzdGEgZGUgcHJlY2lvcyB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlTFByZWNpb3NJblN0b3JhZ2UobFByZWNpbzphbnksIGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJSZWdQcmVjaW9cIiArIGdzSWRrYXRpb3MsIEpTT04uc3RyaW5naWZ5KGxQcmVjaW8pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgbGEgbGlzdGEgZGUgcHJlY2lvcyB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlQ29uZmlnTFByZWNpb3NJblN0b3JhZ2UobFByZWNpbzphbnksIGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhsUHJlY2lvKTtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwiQ29uZmlnTFBcIiArIGdzSWRrYXRpb3MsIGxQcmVjaW8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKipcclxuICAgICAqIE9idGVuZXIgbGlzdGEgZGUgcHJlY2lvcyBkZXNkZSBzdG9yYWdlIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsbGF2ZTogUmVnUHJlY2lvICsgaWRrYXRpb3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExQcmVjaW9zSW5TdG9yYWdlKGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgdmFyIHNQcmVjaW9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJSZWdQcmVjaW9cIiArIGdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHZhciBvUHJlY2lvczphbnk7XHJcbiAgICAgICAgaWYoc1ByZWNpb3Mpe1xyXG4gICAgICAgICAgICBvUHJlY2lvcyA9IEpTT04ucGFyc2Uoc1ByZWNpb3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1ByZWNpb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRDb25maWdMUHJlY2lvc0luU3RvcmFnZShnc0lka2F0aW9zOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBzUHJlY2lvcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdMUFwiICsgZ3NJZGthdGlvcyk7XHJcbiAgICAgICAgdmFyIG9QcmVjaW9zOmFueTtcclxuICAgICAgICBpZihzUHJlY2lvcyl7XHJcbiAgICAgICAgICAgIG9QcmVjaW9zID0gSlNPTi5wYXJzZShzUHJlY2lvcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJlY2lvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9CdXN1Y2FyIGxhIGxpc3RhIGRlIHByZWNpbywgaW5ncmVzYSBlbCBvYmpldG8gZGUgcHJlY2VuZGVuY2lhIGRlIHJlZ2xhcyBkZSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgRmluZExQcmVjaW8ob0xpc3RQcmVjTFA6IE0zUHJlY0xpc3RQcmVjaW9zKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG9MaXN0UHJlY0xQICE9PSB1bmRlZmluZWQgJiYgb0xpc3RQcmVjTFAgIT0gbnVsbCAmJiBvTGlzdFByZWNMUC5JRCAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQLklEICE9IG51bGwpIHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChvTGlzdFByZWNMUC5QUkVDRURFTkNJQSAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQLlBSRUNFREVOQ0lBICE9IG51bGwgJiYgb0xpc3RQcmVjTFAuUFJFQ0VERU5DSUEubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJlYyBvZiBvTGlzdFByZWNMUC5QUkVDRURFTkNJQSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckFQTFJlZ2xhKHByZWMpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5GaW5kTFByZWNpbyhwcmVjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WYWxpZGFyIHJlZ2xhcywgaW5ncmVzYSBlbCBvYmpldG8gZGUgcHJlY2VuZGVuY2lhIGRlIHJlZ2xhcyBkZSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgVmFsaWRhckFQTFJlZ2xhKG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcyk6IGJvb2xlYW57XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKG9MaXN0UHJlY0xQICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTGlzdFByZWNMUC5Qcm9waWVkYWQpO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChvTGlzdFByZWNMUC5Qcm9waWVkYWQudG9VcHBlckNhc2UoKS50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRU1QUkVTQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdzSWRLYXRpb3MudG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVCSUNBQ0lPTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlBST0NFU09cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nb0RhdGEuUHJvY2Vzby50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkhVQlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hLklESFVCLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hW29MaXN0UHJlY0xQLlByb3BpZWRhZC50b1VwcGVyQ2FzZSgpLnRyaW0oKV0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9Y2F0Y2ggKGV4KXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogXCIgKyBleClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihiUmVzcCl7XHJcbiAgICAgICAgICAgIHRoaXMubFByZWNpb3NTZWxlY3RlZCA9IG9MaXN0UHJlY0xQLkxpc3RhUHJlY2lvcztcclxuICAgICAgICAgICAgdGhpcy5GaW5kTFByZWNpbyhvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIENvbXBhcmUodmFsdWUxLCB2YWx1ZTIpIHtcclxuICAgICAgICBpZiAodmFsdWUxID09IHZhbHVlMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBjb25maWd1cmFjaW9uL2VuY2FiZXphZG8gbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgcHVibGljIGFzeW5jIEdldENvbmZpZ0xpc3RhUHJlY2lvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gSWRLYXRpb3M7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgICAgIHZhciBvTGlzdFByZWNMUDogTTNQcmVjTGlzdFByZWNpb3M7XHJcbiAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gdGhpcy5HZXRDb25maWdMUHJlY2lvc0luU3RvcmFnZShJZEthdGlvcyk7XHJcbiAgICAgICAgICAgIGlmKCFvTGlzdFByZWNMUCl7XHJcbiAgICAgICAgICAgICAgICBvTGlzdFByZWNMUCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLkdldEVuY2FiZXphZG9MaXN0YXNQcmVjaW8oUG9zdFNlcnZpY2VNMywgSWRLYXRpb3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TYXZlQ29uZmlnTFByZWNpb3NJblN0b3JhZ2Uob0xpc3RQcmVjTFAsSWRLYXRpb3MpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiBvTGlzdFByZWNMUDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM0RpblByb2Nlc29ze1xyXG4gICAgcHVibGljIGlkX3Byb2Nlc286c3RyaW5nO1xyXG4gICAgcHVibGljIGlkX3N1Yl9wcm9jZXNvOnN0cmluZztcclxuICAgIHB1YmxpYyBpZF9kaW5hbWljYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGlwb19kaW5hbTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGl0dWxvOnN0cmluZztcclxuICAgIHB1YmxpYyBlc3RydWN0dXJhX2Rlc3Rpbm86IHN0cmluZztcclxuICAgIHB1YmxpYyBWRGVmYXVsdDogc3RyaW5nO1xyXG4gICAgcHVibGljIFJlcXVlcmlkbzpib29sZWFuO1xyXG59IiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1BJdGVtc1dFQiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUHJkUGFja0RldCB7XHJcbiAgICBwdWJsaWMgTE9URTogc3RyaW5nO1xyXG4gICAgcHVibGljIExPVEVISUpPOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgU0tVSElKTzogc3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwb1BhY2s6IHN0cmluZztcclxuICAgIHB1YmxpYyBnc1BhdGhJbWFnZW46IHN0cmluZztcclxuICAgIHB1YmxpYyBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG4gICAgcHVibGljIE0zR1JQID0gbmV3IFR5cGVNM1ByZEdycCgpO1xyXG4gICAgcHVibGljIE9yZGVuOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsb3JBZGljaW9uYWw6IG51bWJlcjtcclxuICAgIHB1YmxpYyBJZEdycDogc3RyaW5nO1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM1ViaUFkaWNpb25hbGVze1xyXG4gICAgcHVibGljIEF0cmlidXRvOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBNM1ViaUFkaWNpb25hbGVzIH0gZnJvbSBcIi4vTTNVYmlBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zSHVicyB9IGZyb20gXCIuL20zLWh1YnMudHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVWJpY2FjaW9ue1xyXG4gICAgcHVibGljIElEVWJpY2FjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG9VYmljYWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIFREb2NBZG1pbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTkRvY0FkbWluOnN0cmluZztcclxuICAgIHB1YmxpYyBKQ29uZmlndXJhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgU2VyaWU6c3RyaW5nO1xyXG4gICAgcHVibGljIEVzdGFkbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgRG9jdW1lbnRvSUQ6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zVWJpQWRpY2lvbmFsZXM6QXJyYXk8TTNVYmlBZGljaW9uYWxlcz47XHJcbiAgICBwdWJsaWMgTTNIVUJTID0gbmV3IEFycmF5PE0zSHVicz4oKTtcclxuICAgIHB1YmxpYyBGZWNoYVRyYWJham86RGF0ZTtcclxuICAgIHB1YmxpYyBBUExVYmljRXh0ZXJuYXM6Qm9vbGVhbjtcclxuICAgIFxyXG59IiwiaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSBcIi4vTTNDT05ESVBST01PLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNDT05ESUFHUlVQQUNJT057XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQWdydXBhY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRDb25kaWNpb25lczpzdHJpbmc7XHJcbiAgICBwdWJsaWMgT3BlcmFkb3I6c3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBNM0NPTkRJUFJPTU86QXJyYXk8TTNDT05ESVBST01PPjtcclxufSIsImltcG9ydCB7IE0zREVUQ09ORElQUk9NTyB9IGZyb20gXCIuL00zREVUQ09ORElQUk9NTy5jbGFzc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zQ09ORElQUk9NT3tcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRDb25kaWNpb246bnVtYmVyO1xyXG4gICAgcHVibGljIENvbmNlcHRvOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSkFkaWNpb25hbGVzOnN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgTTNERVRDT05ESVBST01POiBBcnJheTxNM0RFVENPTkRJUFJPTU8+O1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM0RFVENPTkRJUFJPTU97XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQ29uZGljaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb25jZXB0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG4gICAgcHVibGljIEpBZGljaW9uYWxlczpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gXCIuL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNFTkNQUk9NT3tcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvMjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmlnZW5jaWE6RGF0ZTtcclxuICAgIHB1YmxpYyBJbmljaW86RGF0ZTtcclxuICAgIHB1YmxpYyBFc3RhZG86Ym9vbGVhbjtcclxuICAgIHB1YmxpYyBKQWRpY2lvbmFsZXM6c3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBFc3RhZG9NYW51YWxlczpib29sZWFuID1mYWxzZTtcclxuICAgIHB1YmxpYyBFc01hbnVhbDpib29sZWFuPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgRXN0YWRvQXBsQ3Vwb246Ym9vbGVhbiA9ZmFsc2U7XHJcbiAgICBwdWJsaWMgRXNBcGxDdXBvbjpib29sZWFuPSBmYWxzZTtcclxuICAgIHB1YmxpYyBUb3BlOm51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgTTNDT05ESUFHUlVQQUNJT046QXJyYXk8TTNDT05ESUFHUlVQQUNJT04+O1xyXG59IiwiaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ViaUFkaWNpb25hbGVzIH0gZnJvbSBcInByb2plY3RzL3JlZ2xhbmVnb2Npb20zMS9zcmMvcHVibGljX2FwaVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVWJpY2FjaW9uU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBnb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbjtcclxuICAgIGNvbnN0cnVjdG9yKG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24pIHtcclxuICAgICAgICB0aGlzLmdvTTNVYmljYWNpb24gPSBvTTNVYmljYWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldERpcmVjY2lvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiRElSRUNDSU9OXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRUZWxlZm9ubygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiVEVMRUZPTk9cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExvbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShcIkxPTkdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExhdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiTEFUXCIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIEdldEFkaWNpb25hckJ5QXRyaWJ1dGUoQXRyaWJ1dG86IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvQWRpY2lvbmFsOiBNM1ViaUFkaWNpb25hbGVzID0gdGhpcy5nb00zVWJpY2FjaW9uLk0zVWJpQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkF0cmlidXRvID09IEF0cmlidXRvKTtcclxuICAgICAgICAgICAgaWYgKG9BZGljaW9uYWwgIT09IHVuZGVmaW5lZCAmJiBvQWRpY2lvbmFsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvQWRpY2lvbmFsLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBcIk4vQVwiO1xyXG4gICAgICAgIH1jYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiTi9BXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IE0zUEl0ZW1zV0VCLCBNM1BEZXRhbGxlSXRlbXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM0NvdWNoTWFlc3RybyB9IGZyb20gXCIuLi9EYXRhL20zLWNvdWNoLW1hZXN0cm9cIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGVyLXgtcHJvY2Vzb1wiO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8gfSBmcm9tIFwiLi9tMy1sb2FkLWwtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ291Y2hQUkRTU2VydmljZSB9IGZyb20gXCIuLi9PZmZsaW5lL2NvdWNoLXByZHMuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnTWFzaXZvIHtcclxuXHJcbiAgICBwcml2YXRlIGdzSWRLYXRpb3M6IHN0cmluZztcclxuICAgIHByaXZhdGUgcmVhZGVyOiBGaWxlUmVhZGVyO1xyXG4gICAgcHJpdmF0ZSBzZXBhcmFkb3I6IHN0cmluZyA9IFwiLFwiO1xyXG4gICAgcHJpdmF0ZSBvTTNQcm9jZXNvID0gbmV3IE0zUHJvY2Vzb3MoKTtcclxuICAgIHByaXZhdGUgcHJvZ3Jlc3M6IG51bWJlcjtcclxuICAgIHByaXZhdGUgQ29uZk1hc2l2YTogYW55O1xyXG4gICAgcHVibGljIHJvdW5kZWRfcHJvZ3Jlc3M6IG51bWJlcjtcclxuICAgIHB1YmxpYyBnYkJhckNvZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0cnVjdG9yKGlzSWRLYXRpb3M6IHN0cmluZywgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGlDb25mTWFzaXZhOiBhbnksIGliQmFyY29kZTogYm9vbGVhbixcclxuICAgICAgICBwcml2YXRlIG9Db3VjaFBSRFNTZXJ2aWNlOiBDb3VjaFBSRFNTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5vTTNQcm9jZXNvID0gaW9NM1Byb2Nlc287XHJcbiAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gaXNJZEthdGlvcztcclxuICAgICAgICB0aGlzLkNvbmZNYXNpdmEgPSBpQ29uZk1hc2l2YTtcclxuICAgICAgICB0aGlzLmdiQmFyQ29kZSA9IGliQmFyY29kZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0X3JvdW5kZWRfcHJvZ3Jlc3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm91bmRlZF9wcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICAvLy9BZGljaW9uYXIgcHJvZHVjdG9zIGVuIG1hc2l2b1xyXG4gICAgcHVibGljIGFzeW5jIEFkaWNpb25hck1hc2l2byhvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvRGF0VXNlcjogYW55LCBvRGF0YVByb2M6IGFueSwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLkdldFJlYWRlcihvRGF0YVByb2MpO1xyXG4gICAgICAgIGxldCBjc3Y6IHN0cmluZztcclxuICAgICAgICBpZiAoIXRoaXMucmVhZGVyKSB7XHJcbiAgICAgICAgICAgIGNzdiA9IG9EYXRhUHJvYy5UZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3N2ID0gdGhpcy5yZWFkZXIucmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBjc3Yuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gICAgICAgIHZhciBwcm9jZXNvOiBbTTNQcm9jZXNvcywgc3RyaW5nXSA9IGF3YWl0IHRoaXMuYWRpY2lvbmFyX21hc2l2b19mcm9tX2FycmF5KG9NM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMywgb0RhdFVzZXIsIGFyckNTViwgb00zVWJpY2FjaW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNvcnJlIHkgYWRpY2lvbmEgbG9zIHByb2R1Y3RvcyBlbiB1biBhcnJheSBhIHVuIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvTTNDb3VjaE1hZXN0cm8gXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBvRGF0VXNlciBcclxuICAgICAqIEBwYXJhbSBhcnJDU1YgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGljaW9uYXJfbWFzaXZvX2Zyb21fYXJyYXkob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb0RhdFVzZXI6IGFueSwgYXJyQ1NWOiBBcnJheTxzdHJpbmc+LCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uID0gbnVsbCwgYXBsRXhjOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICBsZXQgdG90YWwgPSBhcnJDU1YubGVuZ3RoO1xyXG4gICAgICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICAgICAgdmFyIHByb2R1Y3Q6IFR5cGVNM1ByZEdycFxyXG4gICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgdmFyIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG9NM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lkS2F0aW9zKTtcclxuICAgICAgICB2YXIgcHJkc0ZhaWxzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGxldCBwcmRmYWlsYWN0dWFsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcbiAgICAgICAgdmFyIHJlc3VsdDogYW55O1xyXG4gICAgICAgIGxldCBhcnJheVJlc3A6IFtNM1Byb2Nlc29zLCBzdHJpbmddID0gW3RoaXMub00zUHJvY2VzbywgXCJcIl07XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHByZGZhaWxhY3R1YWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFyIGxpbmU6IHN0cmluZyA9IGFyckNTVltpXTtcclxuICAgICAgICAgICAgaWYgKGxpbmUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTVjtcclxuICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWID0gdGhpcy5TZXRFc3RydWN0Q1NWKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2JCYXJDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcImZ1ZSBsb2NhbDogXCIgKyBvZXN0cnVjdENTVi5za3UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9Db3VjaFBSRFNTZXJ2aWNlLmdldChvZXN0cnVjdENTVi5za3UpLnRoZW4oYXN5bmMgcHJkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJvYnR1dm8gbG9jYWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8odGhpcy5nc0lkS2F0aW9zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhwcmQuTGlzdENvZHMsIG9EYXRVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJhc2lnbm8gbHAgbG9jYWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmQuTGlzdENvZHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBwcmQuTGlzdENvZHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGFzeW5jIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBscCAtIGludGVudG8gc2VydmVyOiBcIiArIG9lc3RydWN0Q1NWLnNrdSArIFwiOiBcIiArIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0geyBcImlkX3ViaWNhY2lvblwiOiBvRGF0VXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIFwiQ29kaWdvXCI6IG9lc3RydWN0Q1NWLnNrdSB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZUFzeW5jKFBvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZEthdGlvcywgZGF0YSwgb0RhdFVzZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGNhdGNoIGxwOiBcIiArIG9lc3RydWN0Q1NWLnNrdSArIFwiOiBcIiArIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyck1zZzogc3RyaW5nID0gZXJyLnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJkRmFpbCA9IGVyck1zZy5zdWJzdHJpbmcoZXJyTXNnLmluZGV4T2YoXCJDb2RpZ29cIikgKyA3KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmRzRmFpbHMgKz0gcHJkRmFpbCArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZGZhaWxhY3R1YWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob00zVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG9NM1ViaWNhY2lvbiAmJiBvTTNVYmljYWNpb24uSURVYmljYWNpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNVYmljYWNpb24gJiYgb00zVWJpY2FjaW9uLklEVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIG9lc3RydWN0Q1NWLnNrdSwgb0RhdFVzZXIsIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbiwgYXBsRXhjKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIG9lc3RydWN0Q1NWLnNrdSwgb0RhdFVzZXIsIFwiLTFcIiwgYXBsRXhjKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1Zyhwcm9kdWN0KTtcclxuICAgICAgICAgICAgICAgIGlmICghcHJkZmFpbGFjdHVhbCAmJiBwcm9kdWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQcmVjaW9TaUFQbGljYShwcm9kdWN0LCBvZXN0cnVjdENTVik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BZGRQcmRUb00zUHJvY2Vzbyhwcm9kdWN0LCBvZXN0cnVjdENTViwgb00zUmVnU2VydmljZSwgb0RhdFVzZXIsIG9NM1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBwcm9kdWN0IG5vIHNlIGxsZW5vOiBcIiArIG9lc3RydWN0Q1NWLnNrdSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IGNvdW50ICogMTAwIC8gdG90YWw7XHJcbiAgICAgICAgICAgIHRoaXMucm91bmRlZF9wcm9ncmVzcyA9IE1hdGgucm91bmQodGhpcy5wcm9ncmVzcyAqIDEwMCkgLyAxMDBcclxuICAgICAgICB9XHJcbiAgICAgICAgYXJyYXlSZXNwWzBdID0gdGhpcy5vTTNQcm9jZXNvO1xyXG4gICAgICAgIGFycmF5UmVzcFsxXSA9IHByZHNGYWlscztcclxuICAgICAgICByZXR1cm4gYXJyYXlSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FtYmlhciBwcmVjaW8gZGUgcHJvZHVjdG8uXHJcbiAgICBwdWJsaWMgc2V0UHJlY2lvU2lBUGxpY2EocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIGlmIChvZXN0cnVjdENTVi5wcmVjaW8gIT09IE5hTiAmJiBvZXN0cnVjdENTVi5wcmVjaW8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvZXN0cnVjdENTVi5wcmVjaW87XHJcbiAgICAgICAgICAgIHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZm9yRWFjaChvTTNQcmVzZW50YWNpb25lcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiA9IG9lc3RydWN0Q1NWLnByZWNpbztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGEgbTNwcm9jZXNvLCBwcm9kdWN0byBlc3BlY2lmaWNvLCBzZSBlbnZpYSBjYW50aWRhZC5cclxuICAgIHB1YmxpYyBBZGRQcmRUb00zUHJvY2Vzbyhwcm9kdWN0OiBUeXBlTTNQcmRHcnAsIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWLCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2UsIG9EYXRVc2VyOiBhbnksIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24gPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBvZXN0cnVjdENTVi5jYW50aWRhZDtcclxuICAgICAgICBpZiAob2VzdHJ1Y3RDU1YuUGF0aEltYWdlbikge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuUGF0aEltYWdlbiA9IG9lc3RydWN0Q1NWLlBhdGhJbWFnZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IG9NM1JlZ1NlcnZpY2UuTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQiwgcHJvZHVjdCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9NM1Byb2Nlc28uTTNFTkMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgLy8vUHJpbWVyYSB2ZXogXHJcbiAgICAgICAgICAgIC8vL05PIFNFIEVTVEEgRU5WSUFORE8gSU5GT1JNQUNJT04gREUgUFJPTU9DSU9ORVNcclxuICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvID0gb00zUmVnU2VydmljZS5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZHVjdCwgb00zUEl0ZW1zV0VCLCBvRGF0VXNlciwgb00zVWJpY2FjaW9uLCBudWxsLCB0aGlzLm9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAvL0FncmVnYXIgZGluYW1pY2FzXHJcbiAgICAgICAgICAgIHRoaXMuQWRpY2lvbmFyRGluYW1pY2Eob2VzdHJ1Y3RDU1YpO1xyXG4gICAgICAgICAgICB0aGlzLkFkaWNpb25hclBlcnNvbmFzQVByb2Nlc28ob2VzdHJ1Y3RDU1YpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YSh0aGlzLm9NM1Byb2Nlc28sIHByb2R1Y3QsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBudWxsLCBvRGF0VXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuQWRpY2lvbmFyRGV0YWxsZShvZXN0cnVjdENTVik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgY2FwdHVyYXMgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gZGUgbGluZWEgYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJEaW5hbWljYShvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYXMgPSBvZXN0cnVjdENTVi5EaW5hbWljYXNcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW5hbWljYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5sTTNQRGluYW1pY2FzID0gbmV3IEFycmF5PE0zUERpbmFtaWNhcz4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gZGluYW1pY2FzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IGRpbmFtaWNhc1tpXS5WYWxvcjtcclxuICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBkaW5hbWljYVwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgcGVyc29uYXMgYSBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJQZXJzb25hc0FQcm9jZXNvKG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHBlcnNvbmFzID0gb2VzdHJ1Y3RDU1YuUGVyc29uYXM7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGVyc29uYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQZXJYUHJvY2VzbyA9IG5ldyBNM1BlclhQcm9jZXNvKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub00zUHJvY2Vzby5NM1BlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zUGVyWFByb2Nlc28gPSBuZXcgQXJyYXk8TTNQZXJYUHJvY2Vzbz4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9NM1BlclhQcm9jZXNvLlRkb2MgPSBwZXJzb25hc1tpXS5UZG9jO1xyXG4gICAgICAgICAgICAgICAgb00zUGVyWFByb2Nlc28uTmRvYyA9IHBlcnNvbmFzW2ldLk5kb2M7XHJcbiAgICAgICAgICAgICAgICBvTTNQZXJYUHJvY2Vzby5UaXBvUGVyc29uYSA9IHBlcnNvbmFzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zUGVyWFByb2Nlc28ucHVzaChvTTNQZXJYUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBwZXJzb25hc1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZSBhbCB1bHRpbW8gZW5jYWJlemFkbyBhZ3JlZ2Fkby5cclxuICAgICAqIEBwYXJhbSBvZXN0cnVjdENTViBFc3RydWN0dXJhIGNvbiBpbmZvcm1hY2lvbiBkZSBsaW5lYSBhIGFncmVnYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkaWNpb25hckRldGFsbGUob2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZGV0YWxsZXMgPSBvZXN0cnVjdENTVi5NM0RldFxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRldGFsbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gZGV0YWxsZXNbaV0uQXRyaWJ1dG87XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gZGV0YWxsZXNbaV0uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28uTTNFTkNbdGhpcy5vTTNQcm9jZXNvLk0zRU5DLmxlbmd0aCAtIDFdLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMub00zUHJvY2Vzby5NM0VOQy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IG9lc3RydWN0Q1NWLilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgYWRpY2lvbmFyIGRldGFsbGVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRlbmVyIHkgc2V0ZWFyIGxhIGluZm9ybWFjaW9uIGRlIGFyY2hpdm8gQ1NWIHkgc2VwYXJhZG9yLlxyXG4gICAgcHVibGljIEdldFJlYWRlcihvRGF0YVByb2M6IGFueSkge1xyXG4gICAgICAgIHRoaXMucmVhZGVyID0gb0RhdGFQcm9jLkNTVjtcclxuICAgICAgICB0aGlzLnNlcGFyYWRvciA9IG9EYXRhUHJvYy5TZXBhcmFkb3I7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9TZXRlYXIgZXN0cnVjdXRhciBkZSBDU1ZcclxuICAgIHB1YmxpYyBTZXRFc3RydWN0Q1NWKGxpbmU6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTViA9IHsgXCJjYW50aWRhZFwiOiBudWxsLCBcInByZWNpb1wiOiBudWxsLCBcInNrdVwiOiBudWxsLCBcIlBhdGhJbWFnZW5cIjogbnVsbCwgXCJEaW5hbWljYXNcIjogW10sIFwiUGVyc29uYXNcIjogW10sIFwiTTNEZXRcIjogW10gfTtcclxuICAgICAgICAgICAgdmFyIG9BcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBsaW5lLnNwbGl0KHRoaXMuc2VwYXJhZG9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbmZNYXNpdmEgJiYgdGhpcy5Db25mTWFzaXZhLkNvbHVtbmFzKSB7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuRXN0cnVjdER5bmFtaWMob0FyckNTVik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuRXN0cnVjdERlZmF1bHQob0FyckNTVik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvZXN0cnVjdENTVjtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGNyZWFuZG8gZXN0cnVjdHVyYS4gUmV2aXNhciBsaW5lYXNcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXN0cnVjdHVyYSBkaW5hbWljYSBkZSBjYXJndWUgbWFzaXZhXHJcbiAgICAgKiBAcGFyYW0gb0FyckNTViBhcnJlZ2xvIGNvbiBpbmZvcm1hY2lvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEVzdHJ1Y3REeW5hbWljKG9BcnJDU1Y6IEFycmF5PHN0cmluZz4pIHtcclxuICAgICAgICB2YXIgY29sdW1uYXM6IEFycmF5PGFueT4gPSB0aGlzLkNvbmZNYXNpdmEuQ29sdW1uYXM7XHJcbiAgICAgICAgdmFyIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWID0geyBcImNhbnRpZGFkXCI6IG51bGwsIFwicHJlY2lvXCI6IG51bGwsIFwic2t1XCI6IG51bGwsIFwiUGF0aEltYWdlblwiOiBudWxsLCBcIkRpbmFtaWNhc1wiOiBbXSwgXCJQZXJzb25hc1wiOiBbXSwgXCJNM0RldFwiOiBbXSB9O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbmFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uYXNbaV0uRXN0cnVjdHVyYSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNhbnRpZGFkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuY2FudGlkYWQgPSArb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUHJlY2lvXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YucHJlY2lvID0gK29BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlNLVVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLnNrdSA9IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRJTkFNSUNBXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpbiA9IHsgXCJBdHJpYnV0b1wiOiBjb2x1bW5hc1tpXS5BdHJpYnV0bywgXCJWYWxvclwiOiBvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLkRpbmFtaWNhcy5wdXNoKGRpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTTNERVRcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNEZXQgPSB7IFwiQXRyaWJ1dG9cIjogY29sdW1uYXNbaV0uQXRyaWJ1dG8sIFwiVmFsb3JcIjogb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl0gfTtcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5NM0RldC5wdXNoKG0zRGV0KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJUSVBPUEVSU09OQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWxvciA9IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZG9jOiBzdHJpbmcgPSBcIjVcIjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmRvYzogc3RyaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsb3Iuc3BsaXQoXCItXCIpLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRkb2MgPSB2YWxvci5zcGxpdChcIi1cIilbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5kb2MgPSB2YWxvci5zcGxpdChcIi1cIilbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmRvYyA9IHZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBlcnNvbmEgPSB7IFwiQXRyaWJ1dG9cIjogY29sdW1uYXNbaV0uQXRyaWJ1dG8sIFwiVGRvY1wiOiB0ZG9jLCBcIk5kb2NcIjogbmRvYyB9O1xyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLlBlcnNvbmFzLnB1c2gocGVyc29uYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvZXN0cnVjdENTVjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzdHJ1Y3R1cmEgZGVmYXVsdC5cclxuICAgICAqIEBwYXJhbSBvQXJyQ1NWIEFycmVnbG8gY29uIGluZm9ybWFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBFc3RydWN0RGVmYXVsdChvQXJyQ1NWOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICAgICAgdmFyIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWID0geyBcImNhbnRpZGFkXCI6IG51bGwsIFwicHJlY2lvXCI6IG51bGwsIFwic2t1XCI6IG51bGwsIFwiUGF0aEltYWdlblwiOiBudWxsLCBcIkRpbmFtaWNhc1wiOiBbXSwgXCJQZXJzb25hc1wiOiBbXSwgXCJNM0RldFwiOiBbXSB9O1xyXG4gICAgICAgIC8vdmFyIG9BcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBsaW5lLnNwbGl0KHRoaXMuc2VwYXJhZG9yKTtcclxuXHJcbiAgICAgICAgaWYgKG9BcnJDU1YubGVuZ3RoID49IDEpIHtcclxuICAgICAgICAgICAgb2VzdHJ1Y3RDU1Yuc2t1ID0gb0FyckNTVlswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9BcnJDU1YubGVuZ3RoID49IDIpIHtcclxuICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuY2FudGlkYWQgPSArb0FyckNTVlsxXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvQXJyQ1NWLmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgICAgICAgIG9lc3RydWN0Q1NWLnByZWNpbyA9ICtvQXJyQ1NWWzJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob0FyckNTVi5sZW5ndGggPj0gNCkge1xyXG4gICAgICAgICAgICBvZXN0cnVjdENTVi5QYXRoSW1hZ2VuID0gb0FyckNTVlszXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9lc3RydWN0Q1NWO1xyXG4gICAgfVxyXG5cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIGVzdHJ1Y3RDU1Yge1xyXG4gICAgc2t1OiBzdHJpbmc7XHJcbiAgICBjYW50aWRhZDogbnVtYmVyO1xyXG4gICAgcHJlY2lvOiBudW1iZXI7XHJcbiAgICBQYXRoSW1hZ2VuOiBzdHJpbmc7XHJcbiAgICBEaW5hbWljYXM6IEFycmF5PGFueT47XHJcbiAgICBQZXJzb25hczogQXJyYXk8YW55PjtcclxuICAgIE0zRGV0OiBBcnJheTxhbnk+O1xyXG59IiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gXCIuL20zLXJlZy1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUEl0ZW1zV0VCIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGFzeW5jIH0gZnJvbSBcInFcIjtcclxuXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnTWFzaXZvQUtaU2VydmljZSB7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhIHVuIEVuY0l0ZW0geSBwdWVkZSBxdWUgdW5hIGRpbmFtaWNhIGNvbiBlbCBpZHByZXN0YW1vIGEgdW4gcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGlkX3ByZXN0YW1vIFxyXG4gICAgICogQHBhcmFtIG0zUHJkIFxyXG4gICAgICogQHBhcmFtIHVzZXIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGRfZGluYW1pY2FfaWRwcmVzdGFtb190b19wcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9wcmVzdGFtbzogc3RyaW5nLFxyXG4gICAgICAgIG0zUHJkLCB1c2VyLCBvdHJvc1BhcmFtZXRyb3M6IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgcmVzcDtcclxuICAgICAgICB2YXIgcGRpbmFtaWNhID0gbmV3IE0zUERpbmFtaWNhc1xyXG4gICAgICAgIHBkaW5hbWljYS5Ob21icmUgPSBcIklkUHJlc3RhbW9cIjtcclxuICAgICAgICBwZGluYW1pY2EuVmFsb3IgPSBpZF9wcmVzdGFtbztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2VfcHJvY2Vzb19tMzogTTNQcm9jZXNvc1xyXG4gICAgICAgICAgICB2YXIgbTNfcmVnX3NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIGlkX2thdGlvcyk7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlX3Byb2Nlc29fbTMgPSBhd2FpdCBtM19yZWdfc2VydmljZS5nZXRfbTNfcHJvY2Vzb19ieV9pZF9wcmVzdGFtb19hc3luYyhQb3N0U2VydmljZU0zLCBpZF9rYXRpb3MsIGlkX3ByZXN0YW1vKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2UgZGVqYW4gcGVnYWRvcyBsb3MgZXN0YWRvcyBkZSBkZXN0aW5vXHJcbiAgICAgICAgICAgIHJlc3BvbnNlX3Byb2Nlc29fbTMuRXN0YWRvRGVzID0gcmVzcG9uc2VfcHJvY2Vzb19tMy5Fc3RhZG9BbnQ7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlX3Byb2Nlc29fbTMuU3ViRXN0YWRvRGVzID0gcmVzcG9uc2VfcHJvY2Vzb19tMy5TdWJFc3RhZG9BbnQ7XHJcblxyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgdGhpcy5hZGRfcGRpbmFtaWNhX3RvX2V4aXN0aW5nX3Byb2Nlc28oUG9zdFNlcnZpY2VNMywgcmVzcG9uc2VfcHJvY2Vzb19tMywgaWRfa2F0aW9zLCBtM1ByZCwgdXNlciwgcGRpbmFtaWNhLCBvdHJvc1BhcmFtZXRyb3MpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuXHJcbiAgICAgICAgICAgIHJlc3AgPSBhd2FpdCB0aGlzLmFkZF9wZGluYW1pY2FfdG9fbmV3X3Byb2Nlc28oUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zLCBtM1ByZCwgdXNlciwgcGRpbmFtaWNhLCBvdHJvc1BhcmFtZXRyb3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSB1biBFbmNJdGVtIHkgZGluYW1pY2EgY29uIGVsIGlkcHJlc3RhbW8gYSB1biBwcm9jZXNvIG51ZXZvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gbTNQcmQgXHJcbiAgICAgKiBAcGFyYW0gdXNlciBcclxuICAgICAqIEBwYXJhbSBwZGluYW1pY2EgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGRfcGRpbmFtaWNhX3RvX25ld19wcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG0zUHJkOiBhbnksIHVzZXI6IGFueSwgcGRpbmFtaWNhOiBNM1BEaW5hbWljYXMsIG90cm9zUGFyYW1ldHJvczogQXJyYXk8YW55Pikge1xyXG5cclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IHRoaXMuR2V0TTNQSXRlbXNXRUIob3Ryb3NQYXJhbWV0cm9zKTtcclxuICAgICAgICB2YXIgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgaWRfa2F0aW9zKTtcclxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29FbXB0eVBEQihtM1ByZCwgb00zUEl0ZW1zV0VCLCB1c2VyLCBudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICByZXNwb25zZS5sTTNQRGluYW1pY2FzLnB1c2gocGRpbmFtaWNhKTtcclxuXHJcbiAgICAgICAgLy9TZSBkZWphbiBwZWdhZG9zIGxvcyBlc3RhZG9zIGRlIGRlc3Rpbm9cclxuICAgICAgICByZXNwb25zZS5Fc3RhZG9EZXMgPSBcIkFjdGl2b1wiO1xyXG4gICAgICAgIHJlc3BvbnNlLlN1YkVzdGFkb0RlcyA9IFwiUmVnaXN0cm9cIjtcclxuXHJcbiAgICAgICAgdmFyIG0zX3Byb2Nlc28gPSBhd2FpdCBvTTNSZWdTZXJ2aWNlLnByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhpZF9rYXRpb3MsIFBvc3RTZXJ2aWNlTTMsIHJlc3BvbnNlLCB1c2VyKTtcclxuICAgICAgICByZXR1cm4gbTNfcHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSB1biBFbmNJdGVtIGEgdW4gcHJvY2VzbyBleGlzdGVudGVcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIG0zX3Byb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG0zUHJkIFxyXG4gICAgICogQHBhcmFtIHVzZXIgXHJcbiAgICAgKiBAcGFyYW0gcGRpbmFtaWNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGRfcGRpbmFtaWNhX3RvX2V4aXN0aW5nX3Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgbTNfcHJvY2VzbzogTTNQcm9jZXNvcywgaWRfa2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgbTNQcmQ6IGFueSwgdXNlcjogYW55LCBwZGluYW1pY2E6IE0zUERpbmFtaWNhcywgb3Ryb3NQYXJhbWV0cm9zOiBBcnJheTxhbnk+KSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCID0gdGhpcy5HZXRNM1BJdGVtc1dFQihvdHJvc1BhcmFtZXRyb3MpO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBpZF9rYXRpb3MpO1xyXG5cclxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShtM19wcm9jZXNvLCBtM1ByZCwgb00zUEl0ZW1zV0VCLCBudWxsLCBudWxsLCB1c2VyKTtcclxuICAgICAgICByZXNwb25zZS5sTTNQRGluYW1pY2FzLnB1c2gocGRpbmFtaWNhKTtcclxuXHJcbiAgICAgICAgdmFyIG0zX3Byb2Nlc28gPSBhd2FpdCBvTTNSZWdTZXJ2aWNlLnByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhpZF9rYXRpb3MsIFBvc3RTZXJ2aWNlTTMsIHJlc3BvbnNlLCB1c2VyKTtcclxuICAgICAgICByZXR1cm4gbTNfcHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICBHZXRNM1BJdGVtc1dFQihvdHJvc1BhcmFtZXRyb3M6IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IDE7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLklkUHJvY2VzbyA9IFwiTTNWRU5UQVwiO1xyXG4gICAgICAgIG90cm9zUGFyYW1ldHJvcy5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUJbeC5Ob21icmVdID0geC5WYWxvclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIG9NM1BJdGVtc1dFQjtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JldmVyc29TZXJ2e1xyXG5cclxuXHJcbiAgICBcclxuICAgIHB1YmxpYyBQcm9jZXNhclJldmVyc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMyxzSURLYXRpb3M6IHN0cmluZywgdGRvY0FjdGl2bzpzdHJpbmcsIG5kb2NBY3Rpdm86c3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zUmV2ZXJzby9SZXZlcnNhci9cIiArIHNJREthdGlvcyArIFwiL1wiICsgbmRvY0FjdGl2byArIFwiL1wiICsgdGRvY0FjdGl2bywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH0sICk7XHJcbiAgICB9XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIE0zUERpbmFtQnlBY3RpdmlkYWR7XHJcbiAgICBwdWJsaWMgSWREaW5hbWljYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbn0iLCJleHBvcnQgY2xhc3MgTTNEaW5CeUFjdGl2aWRhZHtcclxuICAgIHB1YmxpYyBJREFjdGl2aWRhZDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQWN0aXZpZGFkOnN0cmluZztcclxuICAgIHB1YmxpYyBJRERpbmFtaWNhOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvRGluYW1pY2E6c3RyaW5nO1xyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgUmVxdWVyaWRvOmJvb2xlYW47XHJcbiAgICBwdWJsaWMgQ29uZmlndXJhY2lvbjpzdHJpbmc7XHJcbiAgICAvL1NvbG8gUHJlc2VudGFjaW9uXHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM1NhbGRvc1hDdWVudGF7XHJcbiAgICBwdWJsaWMgRG9jdW1lbnRvOnN0cmluZztcclxuICAgIHB1YmxpYyBURG9jVGl0dWxhcjpudW1iZXI7XHJcbiAgICBwdWJsaWMgTkRvY1RpdHVsYXI6c3RyaW5nO1xyXG4gICAgcHVibGljIE5vbUN1ZW50YTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsQ3VlbnRhOm51bWJlcjtcclxufSIsImltcG9ydCB7IE0zUERpbmFtQnlBY3RpdmlkYWQgfSBmcm9tIFwiLi9tMy1wZGluYW0tYnktYWN0aXZpZGFkXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnaXN0cm9Ucngge1xyXG5cclxuICAgIHB1YmxpYyBBY3RpdmlkYWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIElEOm51bWJlcjtcclxuICAgIHB1YmxpYyBNM1BEaW5hbUJ5QWN0aXZpZGFkID0gbmV3IEFycmF5PE0zUERpbmFtQnlBY3RpdmlkYWQ+KCk7XHJcblxyXG4gICAgLy9BdHJpYnV0b3MgdW5pY28gZGVsIEZyb250XHJcbiAgICBwdWJsaWMgQWN0dWFsOnN0cmluZyA9IHVuZGVmaW5lZFxyXG59IiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgY3Vwb25lc1NlcnZpY2Uge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSB0b2RvcyBsb3MgY3Vwb25lcyBnZW5lcmFkb3MgcG9yIHVuIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dldF9jdXBvbmVzX2dlbmVyYWRvc19ieV9wcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy92YXIgZGF0YSA9IHsgXCJpZF9tM1wiOiBpZG0zLCBcImlkX3Byb2Nlc29cIjogcHJvY2VzbyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL20zX2dldF9jdXBvbmVzX2dlbmVyYWRvc19ieV9wcm9jZXNvL1wiICsgaWRrYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIHZhciBjdXBvbmVzID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgdmFyIHJlc3BfY3Vwb25lczpBcnJheTxhbnk+O1xyXG4gICAgICAgICAgaWYoIWN1cG9uZXMuQ1VQT05FUy5DVVBPTi5sZW5ndGgpe1xyXG4gICAgICAgICAgICByZXNwX2N1cG9uZXMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICByZXNwX2N1cG9uZXMucHVzaChjdXBvbmVzLkNVUE9ORVMuQ1VQT04pO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJlc3BfY3Vwb25lcyA9IGN1cG9uZXMuQ1VQT05FUy5DVVBPTjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgZnVuY2lvbk9LKHJlc3BfY3Vwb25lcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgcHVibGljIGdldEN1cG9uQnlJZERldChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgXHJcbiAgICAgICAgLy92YXIgZGF0YSA9IHsgXCJpZERldEN1cG9uXCI6IGlkRGV0Q3Vwb259O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL2dldEN1cG9uQnlJZERldC9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcbmltcG9ydCB7IGZha2VBc3luYyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XHJcblxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlT2ZmTGluZSB7XHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0FkaWNpb25hciBlbiBCRCBwb3VjaC5cclxuICAgIHB1YmxpYyBBZGREb2N1bWVudChpZDogc3RyaW5nLCBkb2N1bWVudDogYW55KSB7XHJcbiAgICAgICAgZG9jdW1lbnQuX2lkID0gaWQ7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQWRkRG9jdW1lbnRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWRkRG9jdW1lbnQgZW5jb25ydHJvIGRvY3VtZW50XCIpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5fcmV2ID0gcmVzdWx0Ll9yZXY7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5zdGF0dXMpO1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBkb2N1bWVudFtcIl9yZXZcIl07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgRGVzdHJveSgpIHtcclxuICAgIC8vICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgLy8gICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVcIik7XHJcbiAgICAvLyAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgLy8gICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdHJveVRvdGFsKCl7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3NEZWxldGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUsIGRlbGV0ZWQ6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc09mZkxpbmVTaW5Eb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cm95KGZ1bmNpb25SZXA6RnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiT2ZmbGluZUxvZ1wiICsga2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXAoe1wiUmVzcFwiOlwiT0tcIn0pO1xyXG4gICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25SZXAoe1wiUmVzcFwiOlwiRXJyb3JcIiwgXCJEZXNjXCI6ZXJyfSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgRGVsZXRlQWxsRG9jcygpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSkudGhlbihhbGxEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbERvY3Mucm93cy5maWx0ZXIocm93ID0+ICFyb3cuaWQuc3RhcnRzV2l0aChcIkNUSVZPU1wiKSkubWFwKGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGUoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcbmltcG9ydCBwb3VjaGRic2l6ZSBmcm9tICdwb3VjaGRiLXNpemUnO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcbmltcG9ydCB7IE0zRGV2aWNlc1NlcnZpY2UgfSBmcm9tICdzZi1yZWdsYW5lZ29jaW8tZ3JsJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIGJkT2ZmTGluZUxvZyB7XHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgb00zRGV2aWNlc1NlcnZpY2U6TTNEZXZpY2VzU2VydmljZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lTG9nXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGVuIEJEIHBvdWNoLlxyXG4gICAgcHVibGljIEFkZERvY3VtZW50KGlkOiBzdHJpbmcsIGRvY3VtZW50OiBhbnkpIHtcclxuICAgICAgICBkb2N1bWVudC5faWQgPSBpZDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50Ll9yZXYgPSByZXN1bHQuX3JldjtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50LCB7IGZvcmNlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdHJveShmdW5jaW9uUmVwOkZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5kZXN0cm95KCkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVMb2dcIiArIGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uUmVwKHtcIlJlc3BcIjpcIk9LXCJ9KTtcclxuICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBmdW5jaW9uUmVwKHtcIlJlc3BcIjpcIkVycm9yXCIsIFwiRGVzY1wiOmVycn0pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZUluc3RhbmNlKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuY2xvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgSW5zdGFuY2VBZ2FpbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lTG9nXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gY2F0Y2h7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3NEZWxldGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUsIGRlbGV0ZWQ6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlQWxsRG9jcygpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSkudGhlbihhbGxEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbERvY3Mucm93cy5maWx0ZXIocm93ID0+ICFyb3cuaWQuc3RhcnRzV2l0aChcIkNUSVZPU1wiKSkubWFwKGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWxpbWluYSBkZWwgTG9nIGxvcyBkb2NzIGNvbiBmZWNoYSBhbnRlcmlvciBvIGlndWFsIGEge3ttYXhEaWFzfX0gZGUgbGEgZmVjaGEgYWN0dWFsXHJcbiAgICAgKiBTZSBjb25jYXRlbmEgXCIgIDAwOjAwXCIgYSBsYSBmZWNoYSBwb3IgdW4gZXJyb3IgZW4gbGEgZnVuY2lvbmFsaWRhZCBkZSBcIm5ldyBEYXRlKClcIlxyXG4gICAgICogU2UgdXRpbGl6YSAoMTAwMCAqIDM2MDAgKiAyNCkgcGFyYSBjYWxjdWxhciBlbCBudW1lcm8gZGUgbWlsaXNlZ3VuZG9zIGVuIHVuIGTDg8KtYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRGVsZXRlT2xkRG9jcyhtYXhEaWFzOm51bWJlcikge1xyXG4gICAgICAgIC8vbGV0IG1heERpYXMgPSAzO1xyXG5cclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiRGVsZXRlT2xkRG9jc1wiKVxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGFsbERvY3MpXHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9nU29ja2V0KGFsbERvY3MpO1xyXG4gICAgICAgICAgICBhbGxEb2NzLnJvd3MuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoZWxlbWVudC5kb2MuRmVjaGEpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhlbGVtZW50LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG5ldyBEYXRlKGVsZW1lbnQuZG9jLkZlY2hhLnN1YnN0cmluZygwLCAxMCkgKyBcIiAgMDA6MDBcIikpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKERhdGUubm93KCkgLSBuZXcgRGF0ZShlbGVtZW50LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpLmdldFRpbWUoKSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoKERhdGUubm93KCkgLSBuZXcgRGF0ZShlbGVtZW50LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpLmdldFRpbWUoKSkgLyAoMTAwMCAqIDM2MDAgKiAyNCkpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLmZpbHRlcihyb3cgPT4gTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIG5ldyBEYXRlKHJvdy5kb2MuRmVjaGEuc3Vic3RyaW5nKDAsIDEwKSArIFwiICAwMDowMFwiKS5nZXRUaW1lKCkpIC8gKDEwMDAgKiAzNjAwICogMjQpKSA+PSBtYXhEaWFzKVxyXG4gICAgICAgICAgICAubWFwKCByb3cgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9MbGFtYXIgc29ja2V0LiBcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5idWxrRG9jcyhkZWxldGVEb2NzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEFkZExvZ1NvY2tldChvbE0zUHJvY2Vzb3M6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJhbXM6IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIHBhcmFtcyA9IFt7IFwibm9tYnJlXCI6IFwiTTNQcm9jZXNvXCIsIFwidmFsb3JcIjogSlNPTi5zdHJpbmdpZnkob2xNM1Byb2Nlc29zKSB9XTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub00zRGV2aWNlc1NlcnZpY2UuRGV2aWNlX01Qb3ModGhpcy5BZGRMb2dTb2NrZXRPSywgcGFyYW1zLCBcIkxPR00zUHJvY2Vzb3NcIiwgbnVsbClcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBZGRMb2dTb2NrZXRPSyA9KCk9PntcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBEZWxldGUoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiXHJcbmltcG9ydCB7IHZhcmlhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbXBpbGVyL3NyYy9vdXRwdXQvb3V0cHV0X2FzdFwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4uL1NlcnZpY2VzL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFueUFSZWNvcmQgfSBmcm9tIFwiZG5zXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zTWFlc3Ryb09mZmxpbmUge1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBmb3JtYXMgZGUgcGFnb1xyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIElkIGRlIGxhIEVtcHJlc2EgXHJcbiAgICAgKiBAcGFyYW0gcmVzcE9rX2dldF9mb3JtYXNfcGFnbyBGdW5jaW9uIGNvbiByZXNwdWVzdGEgT0tcclxuICAgICAqIEBwYXJhbSByZXNwRXJyb3JfZ2V0X2Zvcm1hc19wYWdvIEZ1bmNpb24gY29uIHJlc3B1ZXN0YSBFUlJPUlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0Rm9ybWFzUGFnbyhpZEthdGlvcywgaWRQcm9jZXNvOiBzdHJpbmcsIHJlc3BPa19nZXRfZm9ybWFzX3BhZ286IEZ1bmN0aW9uLCByZXNwRXJyb3JfZ2V0X2Zvcm1hc19wYWdvOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChcIkZvcm1hc1BhZ29cIikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coeCk7XHJcblxyXG4gICAgICAgICAgICByZXNwT2tfZ2V0X2Zvcm1hc19wYWdvKHRoaXMuRmlsdHJhckJ5UHJvY2VzbyhpZFByb2Nlc28sIHguRm9ybWFzUGFnbykpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgcmVzcEVycm9yX2dldF9mb3JtYXNfcGFnbyhlcnJvcik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbHRyYXIgbGFzIGZvcm1hcyBkZSBwYWdvLCBkZXBlbmRpZW5kbyBsYSBpbmZvcm1hY2lvbiBkZWwgcHJvY2Vzby5cclxuICAgICAqIEBwYXJhbSBpZFByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gZm9ybWFzUGFnbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZpbHRyYXJCeVByb2Nlc28oaWRQcm9jZXNvOiBzdHJpbmcsIGZvcm1hc1BhZ286IEFycmF5PGFueT4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhmb3JtYXNQYWdvKTtcclxuICAgICAgICAgICAgaWYgKGlkUHJvY2VzbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtYXNQYWdvID0gZm9ybWFzUGFnby5maWx0ZXIoeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHguUFJPQ0VTT1MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF4LlBST0NFU09TLmxlbmd0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguUFJPQ0VTT1MgPSBuZXcgQXJyYXk8YW55Pih4LlBST0NFU09TKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHguUFJPQ0VTT1MuZmluZCh5ID0+IHkuSWRQcm9jZXNvID09IGlkUHJvY2VzbykgIT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGZvcm1hc1BhZ28pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBGaWx0cmFyQnlQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXNQYWdvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcm1hc1BhZ287XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEVzdHJ1Y3R1cmEoZXN0OnN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoZXN0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZGluw4PCoW1pY2FzIHBvciBhY3RpdmlkYWRcclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBJZCBkZSBsYSBlbXByZXNhXHJcbiAgICAgKiBAcGFyYW0gTG9hZERpbmFtaWNhc09LIEZ1bmNpb24gZGUgcmVzcHVlc3RhIE9LXHJcbiAgICAgKiBAcGFyYW0gTG9hZERpbmFtaWNhc0Vycm9yIEZ1bmNpb24gZGUgcmVzcHVlc3RhIEVSUk9SXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXREaW5hbWljYXNCeUFDdGl2aWRhZChpZEthdGlvcywgb0RhdGEsIExvYWREaW5hbWljYXNPSzogRnVuY3Rpb24sIExvYWREaW5hbWljYXNFcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgZGluYW1cclxuICAgICAgICB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoXCJESU5CWUFDVFwiKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZGluYW0gPSB4Lk0zRGluQnlBY3RpdmlkYWQ7XHJcbiAgICAgICAgICAgICAgICBkaW5hbSA9IGRpbmFtLmZpbHRlcih4ID0+IHguQWN0aXZpZGFkID09IG9EYXRhLkFjdGl2aWRhZCAmJiB4LklEQWN0aXZpZGFkID09IG9EYXRhLmlkQWN0aXZpZGFkICYmIHguSWRQcm9jZXNvID09IG9EYXRhLmlkUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICBMb2FkRGluYW1pY2FzT0soZGluYW0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoe1xyXG4gICAgICAgICAgICAgICAgZGluYW0gPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICAgICAgTG9hZERpbmFtaWNhc09LKGRpbmFtKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIExvYWREaW5hbWljYXNFcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgdWJpY2FjaW9uZXNcclxuICAgICAqIEBwYXJhbSBzSWRVYmljYWNpb25lcyBJZCBkZSBsYSB1YmljYWNpb24gYSBidXNjYXIgZW4gYmFzZSBkZSBkYXRvcyBOb1NRTFxyXG4gICAgICogQHBhcmFtIG9TZXJ2aWNlTTNNYWVzdHJvIFNlcnZpY2lvIG1hZXN0cm8sIGVzdGEgdGllbmUgZnVuY2lvbmFsaWRhZCBwYXJhIGJ1c2NhciBlc3BlY2lmaWNhbWVudGUgdW4gdWJpY2FjaW9uXHJcbiAgICAgKiBAcGFyYW0gRnVuY2lvbk9LIEZ1bmNpb24gcXVlIHJldG9tYSBsYSBmdW5jaW9uYWxpZGFkIGN1YW5kbyBlcyBPSy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldFViaWNhY2lvbmVzKGlka2F0aW9zOiBzdHJpbmcsIHNJZFViaWNhY2lvbmVzOiBzdHJpbmcsIG9TZXJ2aWNlTTNNYWVzdHJvOiBTZXJ2aWNlTTNNYWVzdHJvLCBGdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9DYXJnYXIgaW5mb3JtYWNpb24gZGUgdWJpY2FjaW9uXHJcbiAgICAgICAgdmFyIG9NM1ViaWNhY2lvbjtcclxuICAgICAgICB2YXIgc0lkVWJpY2FjaW9uZXNDb3VjaCA9IGlka2F0aW9zLnRyaW0oKS50b1VwcGVyQ2FzZSgpICsgXCI/VUJJQ1wiOztcclxuICAgICAgICB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoc0lkVWJpY2FjaW9uZXNDb3VjaCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBvTTNVYmljYWNpb24gPSBvU2VydmljZU0zTWFlc3Ryby5HZXRVYmljYWNpb25Gcm9tTGlzdChyZXN1bHQuTGlzdFViaWNhY2lvbmVzLk0zVUJJQ0FDSU9OLCBzSWRVYmljYWNpb25lcyk7XHJcbiAgICAgICAgICAgIEZ1bmNpb25PSyhvTTNVYmljYWNpb24pO1xyXG5cclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICBcclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIE9idGVuZXIgbGEgaW5mb3JtYWNpb24gZGUgbGFzIHByb21vY2lvbmVzXHJcbiAgICAvLyAgKiBAcGFyYW0gc0lEUHJvbW8gSWQgZGUgbGEgcHJvbW9jaW9uIGEgYnVzY2FyIGVuIGJhc2UgZGUgZGF0b3MgTm9TUUxcclxuICAgIC8vICAqIEBwYXJhbSBGdW5jaW9uT0sgRnVuY2lvbiBxdWUgcmV0b21hIGxhIGZ1bmNpb25hbGlkYWQgY3VhbmRvIGVzIE9LLlxyXG4gICAgLy8gICovXHJcbiAgICAvLyBwdWJsaWMgR2V0UHJvbW9jaW9uZXMoaWRrYXRpb3M6IHN0cmluZywgRnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgLy8gICAgIHZhciBMaXN0UHJvbW87XHJcbiAgICAvLyAgICAgdmFyIHNJRFByb21vID0gaWRrYXRpb3MudHJpbSgpLnRvVXBwZXJDYXNlKCkgKyBcIj9Qcm9tb2Npb25lc1wiO1xyXG4gICAgLy8gICAgIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChzSURQcm9tbykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgLy8gICAgICAgICBpZihyZXN1bHQuTTNFTkNQUk9NTyl7XHJcbiAgICAvLyAgICAgICAgICAgICBMaXN0UHJvbW8gPSByZXN1bHQuTTNFTkNQUk9NTztcclxuICAgIC8vICAgICAgICAgfWVsc2UgaWYocmVzdWx0Lk0zTGlzdEVOQ1BST01PLk0zRU5DUFJPTU8pe1xyXG4gICAgLy8gICAgICAgICAgICAgTGlzdFByb21vID0gcmVzdWx0Lk0zTGlzdEVOQ1BST01PLk0zRU5DUFJPTU87XHJcbiAgICAvLyAgICAgICAgIH1lbHNle1xyXG4gICAgLy8gICAgICAgICAgICAgTGlzdFByb21vID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBGdW5jaW9uT0soTGlzdFByb21vKTtcclxuICAgIC8vICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbGEgaW5mb3JtYWNpb24gc2luY3LDg8KzbmljYW1lbnRlIGRlIHRlbXBsYXRlLiBzZWd1biBlbCByZXBvcnRlIGVudHJhbnRlIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgQXN5bmNnZXRfdGVtcGxhdGVfcmVwb3J0ZShpZGthdGlvczogc3RyaW5nLCBpZHJlcCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZTtcclxuICAgICAgICAgICAgLy92YXIgc0lEID0gaWRrYXRpb3MudHJpbSgpLnRvVXBwZXJDYXNlKCkgKyBcIj9UZW1wbGF0ZXNcIjtcclxuICAgICAgICAgICAgdmFyIHNJRCA9IFwiVEVNUExBVEVTXCI7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlID0gYXdhaXQgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KHNJRCk7XHJcbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5SRVNQVUVTVEEuUlBUZW1wbGF0ZS5sZW5ndGggPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IG5ldyBBcnJheTxhbnk+KHRlbXBsYXRlLlJFU1BVRVNUQS5SUFRlbXBsYXRlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuUkVTUFVFU1RBLlJQVGVtcGxhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8vU2UgY3JlYW4gbG9zIG5vZG9zIHBhZHJlIFJFU1BVRVNUQSB5IFJQVGVtcGxhdGUsIHBhcmEgc2ltdWxhciBpZ3VhbCwgY29tbyBsbyByZXNwb25kZSBzZXJ2aWRvci5cclxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlVW5vID0geyBcIlJFU1BVRVNUQVwiOiB7IFwiUlBUZW1wbGF0ZVwiOiB0ZW1wbGF0ZS5maW5kKHQgPT4gdC5JZFJlcCA9PSBpZHJlcCkgfSB9O1xyXG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVVbm87XHJcbiAgICAgICAgfSBjYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG59ICAgIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VPZmZMaW5lIH0gZnJvbSBcIi4vU2VydmljZS9iZC1vZmZsaW5lLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi4vU2VydmljZXMvbTMtcmVnLXNlcnZpY2VcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi4vU2VydmljZXMvTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgYmRPZmZMaW5lTG9nIH0gZnJvbSBcIi4vU2VydmljZS9iZC1vZmZsaW5lLWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTTNQcm9jZXNvc09mZmxpbmUge1xyXG5cclxuICAgIC8vcHJpdmF0ZSBzS2V5Q3Rpdm9zOiBzdHJpbmcgPSBcIkNUSVZPU1wiO1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvU2VydmljZU9mZkxpbmU6IFNlcnZpY2VPZmZMaW5lLCBwcml2YXRlIG9Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLFxyXG4gICAgICAgIHByaXZhdGUgb2JkT2ZmTGluZUxvZzogYmRPZmZMaW5lTG9nKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBNM1Byb2Nlc29zLCBzZWd1biBlbCBJRCBNM1xyXG4gICAgICogQHBhcmFtIGlkIElkIGRlbCBNb3RvciAzXHJcbiAgICAgKiBAcGFyYW0gUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zIFJlc3B1ZXN0YSBPSyBkZSBnZXQgZGUgTTMgcHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBSZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3MgUmVzcHVlc3RhIEVycm9yIGRlIGdldCBkZSBNMyBwcm9jZXNvc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0UHJvY2Vzb0J5SWQoaWQsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24sIFJlc3BvbnNlRXJyb3JMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL0pBR00gMjAxOTExMDggY2FtYmlvIGRlIGRvbmRlIHRyYWVyIGVsIHByb2Nlc28gbG8gdHJhZSBkZXNkZSBvZmZsaW5lXHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KGlkKS50aGVuKHByb2Nlc28gPT4ge1xyXG4gICAgICAgICAgICAvL3RoaXMub2JkT2ZmTGluZUxvZy5nZXQoaWQpLnRoZW4ocHJvY2VzbyA9PiB7XHJcbiAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhwcm9jZXNvKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIC8vUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zKGVycm9yKTtcclxuICAgICAgICAgICAgdGhpcy5HZXRQcm9jZXNvQnlJZEZyb21Mb2coaWQsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcywgUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldFByb2Nlc29CeUlkRnJvbUxvZyhpZCwgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MTEwOCBjYW1iaW8gZGUgZG9uZGUgdHJhZXIgZWwgcHJvY2VzbyBsbyB0cmFlIGRlc2RlIG9mZmxpbmVcclxuICAgICAgICAvL3RoaXMub1NlcnZpY2VPZmZMaW5lLmdldChpZCkudGhlbihwcm9jZXNvID0+IHtcclxuICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuZ2V0KGlkKS50aGVuKHByb2Nlc28gPT4ge1xyXG4gICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MocHJvY2Vzbyk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBSZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3MoZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIE0zIFByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gaWQgSWQgZGVsIE0zIFByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvbE0zUHJvY2Vzb3MgT2JqZXRvIE0zIFByb2Nlc29zIGEgYWdyZWdhclxyXG4gICAgICogQHBhcmFtIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyBGdW5jaW9uIE9LIHJlc3B1ZXN0YSBxdWUgYXRyYXBhcsODwqEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRQcm9jZXNvKGlka2F0aW9zOiBzdHJpbmcsIG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBpZiAob2xNM1Byb2Nlc29zLklkTTMpIHtcclxuICAgICAgICAgICAgdGhpcy5BZGRUb0RvY09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0SWRNM09mZmxpbmUoaWRrYXRpb3MsIG9sTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbywgb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcy5JREh1Yi50b1N0cmluZygpKS50aGVuKGlkID0+IHtcclxuICAgICAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5JZE0zID0gaWQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZFRvRG9jT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQWRkVG9Eb2NPZmZsaW5lKG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgaW50ZW50byA9IDApIHtcclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5BZGREb2N1bWVudChvbE0zUHJvY2Vzb3MuSWRNMy50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuU2F2ZUlkTTMob2xNM1Byb2Nlc29zLklkTTMsIG9sTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbywgb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcy5JREh1Yi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5BZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuU2F2ZUlkTTMob2xNM1Byb2Nlc29zLklkTTMsIG9sTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbywgb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcy5JREh1Yi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgLy8gICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhvbE0zUHJvY2Vzb3MuSWRNMyk7XHJcbiAgICAgICAgICAgIC8vIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyk7XHJcblxyXG4gICAgICAgICAgICAvL1Jlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhvbE0zUHJvY2Vzb3MuSWRNMyk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZXJyb3JMb2dcIiArIHNGZWNoYU5vdywgSlNPTi5zdHJpbmdpZnkoeyBcImVycm9yXCI6IGVycm9yLCBcIm9sTTNQcm9jZXNvc1wiOiBvbE0zUHJvY2Vzb3MsIFwiSW50ZW50b1wiOiBpbnRlbnRvLCBcImZ1bmN0aW9uXCI6IFwiQWRkVG9Eb2NPZmZsaW5lXCIgfSkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZW50byA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuSW5zdGFuY2VBZ2FpbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRUb0RvY09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MsIDEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKHsgXCJFcnJvclwiOiBcIkVycm9yIGVuIGd1YXJkYXIgZW4gYmFzZSBkZSBkYXRvcyBwY3BhbC5cIiB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgbG9nIG9mZmxpbmUgZGUgcHJvY2Vzb3MuXHJcbiAgICAgKiBAcGFyYW0gb2xNM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24sIGludGVudG86IG51bWJlciA9IDApIHtcclxuICAgICAgICAvL0FncmVnYXIgYSBMb2cgU29ja2V0XHJcbiAgICAgICAgLy90aGlzLkFkZExvZ1NvY2tldChvbE0zUHJvY2Vzb3MpXHJcbiAgICAgICAgLy9yZXR1cm4gdGhpcy5vYmRPZmZMaW5lTG9nLkFkZERvY3VtZW50KG9sTTNQcm9jZXNvcy5JZE0zLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcylcclxuICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuQWRkRG9jdW1lbnQob2xNM1Byb2Nlc29zLklkTTMudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh4KTtcclxuICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKG9sTTNQcm9jZXNvcy5JZE0zKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiZXJyb3JcIjogZXJyb3IsIFwib2xNM1Byb2Nlc29zXCI6IG9sTTNQcm9jZXNvcywgXCJJbnRlbnRvXCI6IGludGVudG8sIFwiZnVuY3Rpb25cIjogXCJBZGRMb2dPZmZsaW5lXCIgfSkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZW50byA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuSW5zdGFuY2VBZ2FpbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zLCAxKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyh7IFwiRXJyb3JcIjogXCJFcnJvciBlbiBndWFyZGFyIGVuIGJhc2UgZGUgZGF0b3MgbG9jYWwuXCIgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBBZGRMb2dTb2NrZXRPSyA9ICgpID0+IHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsb3NlSW5zdGFuY2VMb2dPZmYoKSB7XHJcbiAgICAgICAgdGhpcy5vYmRPZmZMaW5lTG9nLmNsb3NlSW5zdGFuY2UoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldE9mZkxpbmVMb2coKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub2JkT2ZmTGluZUxvZy5HZXRBbGxEb2NzKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXQxRG9jT2ZmTGluZUxvZyhpZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9iZE9mZkxpbmVMb2cuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldmVyc2FyIG0zIHByb2Nlc28sIGVuIGVsIGxvZyBsb2NhbC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFJldmVyc2FyRW5Mb2coaWQpIHtcclxuICAgICAgICB0aGlzLkdldDFEb2NPZmZMaW5lTG9nKGlkKS50aGVuKG9NM1AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb1Jlc3VsdDogTTNQcm9jZXNvcyA9IG9NM1A7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb1Jlc3VsdC5sTTNQRW5jRlAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9SZXN1bHQubE0zUEVuY0ZQW2ldLlZhbENhbWJpbyA9IDA7XHJcbiAgICAgICAgICAgICAgICBvUmVzdWx0LmxNM1BFbmNGUFtpXS5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICBvUmVzdWx0LmxNM1BFbmNGUFtpXS5WYWxPdHJhQ2xhc2kgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9SZXN1bHQuSWRFc3RhZG8gPSBcIlJWXCI7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9nT2ZmbGluZShvUmVzdWx0LCBudWxsKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdHJ1aXJCRExvZyhmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vYmRPZmZMaW5lTG9nLkRlc3Ryb3koZnVuY2lvblJlc3ApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cnVpckJET2ZmKGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZXN0cm95KGZ1bmNpb25SZXNwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU3VtYXJDdGl2byhpZG0zOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyB2YXIgc1BhcnQxO1xyXG4gICAgICAgIC8vIHZhciBzUGFydDI7XHJcblxyXG4gICAgICAgIC8vIHNQYXJ0MSA9IGlkbTMuc3Vic3RyaW5nKDAsIDgpO1xyXG4gICAgICAgIC8vIHNQYXJ0MiA9IGlkbTMuc3Vic3RyaW5nKDgsIGlkbTMubGVuZ3RoKTtcclxuICAgICAgICAvLyBzUGFydDIgPSArc1BhcnQyICsgMTtcclxuICAgICAgICAvLyBpZG0zID0gc1BhcnQxICsgc1BhcnQyO1xyXG4gICAgICAgIC8vIHJldHVybiBpZG0zO1xyXG4gICAgICAgIHZhciBzUGFydDE7XHJcbiAgICAgICAgdmFyIHNQYXJ0MjtcclxuICAgICAgICBzUGFydDEgPSBpZG0zLnN1YnN0cmluZygwLCA5KTtcclxuICAgICAgICBzUGFydDIgPSBpZG0zLnN1YnN0cmluZyg5KTtcclxuICAgICAgICBzUGFydDIgPSArc1BhcnQyICsgMTtcclxuICAgICAgICBpZG0zID0gc1BhcnQxICsgXCJcIiArIHNQYXJ0MjtcclxuICAgICAgICByZXR1cm4gaWRtMztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdHVhbGl6YXIgZWwgTTMgUHJvY2Vzb3MsIHRlbmllbmRvIGVsIElkIGRlbCBkb2N1bWVudG8gZ3VhcmRhZG8gZW4gbGEgQkQgTm9TUUxcclxuICAgICAqIEBwYXJhbSBpZCBJZCBkZWwgZG9jdW1lbnRvIEJkIE5vU1FMXHJcbiAgICAgKiBAcGFyYW0gb2xNM1Byb2Nlc29zIE0zIFByb2Nlc29zIGEgYWxtYWNlbmFyIC8gQWN0dWFsaXphclxyXG4gICAgICogQHBhcmFtIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyBSZXNwdWVzdGEgZGUgT0suXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRQcm9jZXNvKGlkLCBvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24sIGludGVudG8gPSAwKSB7XHJcblxyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkFkZERvY3VtZW50KGlkLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgLy9SZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MoaWQpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiZXJyb3JcIjogZXJyb3IsIFwib2xNM1Byb2Nlc29zXCI6IG9sTTNQcm9jZXNvcywgXCJJbnRlbnRvXCI6IGludGVudG8sIFwiZnVuY3Rpb25cIjogXCJ1cGRQcm9jZXNvXCIgfSkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZW50byA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuSW5zdGFuY2VBZ2FpbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRQcm9jZXNvKGlkLCBvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcywgMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MoeyBcIkVycm9yXCI6IFwiRXJyb3IgZW4gZ3VhcmRhciBlbiBiYXNlIGRlIGRhdG9zIHBjcGFsLlwiIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemFyIGVsIE0zIFByb2Nlc29zLCB0ZW5pZW5kbyBlbCBJZCBkZWwgZG9jdW1lbnRvIGd1YXJkYWRvIGVuIGxhIEJEIE5vU1FMXHJcbiAgICAgKiBAcGFyYW0gaWQgSWQgZGVsIGRvY3VtZW50byBCZCBOb1NRTFxyXG4gICAgICogQHBhcmFtIG9sTTNQcm9jZXNvcyBNMyBQcm9jZXNvcyBhIGFsbWFjZW5hciAvIEFjdHVhbGl6YXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIHVwZFByb2Nlc29Bc3luYyhpZCwgb2xNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuQWRkRG9jdW1lbnQoaWQudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zKTtcclxuICAgICAgICB0aGlzLkFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zLCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc09mZkxpbmVTaW5Eb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5HZXRBbGxEb2NzT2ZmTGluZVNpbkRvY3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNhclRpY2tldE9mZmxpbmUoaWRrYXRpb3MsIHByb2Nlc28sIG9EYXRhVXNlcjogYW55LCBmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgbE0zUHJvY2Vzb3MgPSBuZXcgQXJyYXk8TTNQcm9jZXNvcz4oKTtcclxuICAgICAgICB2YXIgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgaWRrYXRpb3MpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5WYWxpZGFyVGlja2V0Q2VycmFkbyhwcm9jZXNvKSkge1xyXG4gICAgICAgICAgICBsTTNQcm9jZXNvcy5wdXNoKHByb2Nlc28pO1xyXG5cclxuICAgICAgICAgICAgb00zUmVnU2VydmljZS5SZWdpc3Ryb0V2ZW50b00zT2ZmTGluZShpZGthdGlvcywgdGhpcy5vUG9zdFNlcnZpY2VNMywgbE0zUHJvY2Vzb3MsIG9EYXRhVXNlcikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AodHJ1ZSwgXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIFwiT0tcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHByb2Nlc29zIHF1ZSBzZSBwcm9jZXNhcm9uIG1pZW50cmFzIHNlIGVzdGFiYSBmdWVyYSBkZSBsaW5lYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclByb2Nlc29zQWdyZWdhZG9zT2ZmTGluZShpZGthdGlvcywgb0RhdGFVc2VyOiBhbnksIGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJFbnRybyBWYWxpZGFyUHJvY2Vzb3NBZ3JlZ2Fkb3NPZmZMaW5lXCIpXHJcbiAgICAgICAgdmFyIGxNM1Byb2Nlc29zID0gbmV3IEFycmF5PE0zUHJvY2Vzb3M+KCk7XHJcbiAgICAgICAgdmFyIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIGlka2F0aW9zKTtcclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5HZXRBbGxEb2NzKCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAvLyBoYW5kbGUgcmVzdWx0XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0LnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucm93c1tpXS5pZCAmJiAhcmVzdWx0LnJvd3NbaV0uaWQuc3RhcnRzV2l0aChcIkNUSVZPU1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtM1Byb2Nlc286IE0zUHJvY2Vzb3MgPSByZXN1bHQucm93c1tpXS5kb2M7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVmFsaWRhclRpY2tldENlcnJhZG8obTNQcm9jZXNvKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsTTNQcm9jZXNvcy5wdXNoKHJlc3VsdC5yb3dzW2ldLmRvYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJBbnRlcyBSZWdpc3Ryb0V2ZW50b00zT2ZmTGluZVwiKVxyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lKGlka2F0aW9zLCB0aGlzLm9Qb3N0U2VydmljZU0zLCBsTTNQcm9jZXNvcywgb0RhdGFVc2VyKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJEaW8gUmVzcHVlc3RhIFJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lXCIpXHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh4KVxyXG4gICAgICAgICAgICAgICAgaWYgKHgpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiaWYgMVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkRlbGV0ZUFsbERvY3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcCh0cnVlLCBcIk9LXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiaWYgMlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vUmVzcHVlc3RhIGNvbiBlcnJvcmVzXHJcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZWxldGVBbGxEb2NzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIFwiT0tcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2lvbiBkZSBxdWUgZWwgdGlja2V0IGVzdGEgY2VycmFkby5cclxuICAgICAqIEBwYXJhbSBtM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyVGlja2V0Q2VycmFkbyhtM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgYkNlcnJhZG86IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGlmIChtM1Byb2Nlc28uTTNFTkMgIT0gbnVsbCAmJiBtM1Byb2Nlc28ubE0zUEVuY0ZQICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKG0zUHJvY2VzbyAmJiBtM1Byb2Nlc28uU3ViRXN0YWRvQW50ICE9IFwiRGVjbGluYWRvXCIgJiYgbTNQcm9jZXNvLk0zRU5DLmxlbmd0aCA+IDAgJiYgbTNQcm9jZXNvLmxNM1BFbmNGUC5sZW5ndGggPT0gMCAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDYW50aWRhZFRvdGFsQnlNM1Byb2Nlc28obTNQcm9jZXNvKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGJDZXJyYWRvID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGJDZXJyYWRvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYkNlcnJhZG87XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsQnlNM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgJiYgb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZCA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChkQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHRvZG9zIGxvcyBkb2N1bWVudG9zIE9mZiBsaW5lIHF1ZSBzZSBoYW4gZ3VhcmRhZG8gY29tbyBvZmZsaW5lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0QWxsRG9jc09mZmxpbmUoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGxNM1Byb2Nlc29zID0gbmV3IEFycmF5PE0zUHJvY2Vzb3M+KCk7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5HZXRBbGxEb2NzKCk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0LnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucm93c1tpXS5pZCAhPSBcIkNUSVZPU1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbE0zUHJvY2Vzb3MucHVzaChyZXN1bHQucm93c1tpXS5kb2MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBsTTNQcm9jZXNvcztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdG9kb3MgbG9zIGRvY3VtZW50b3MgT2ZmIGxpbmUgcXVlIHNlIGhhbiBndWFyZGFkbyBjb21vIG9mZmxpbmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRBbGxEb2NzT2ZmbGluZURlbGV0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub1NlcnZpY2VPZmZMaW5lLkdldEFsbERvY3NEZWxldGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZUN0aXZvcyh1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMub1NlcnZpY2VPZmZMaW5lLkRlbGV0ZSh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YikpXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFsbEN0aXZvcyh1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbG9zIGNvbnNlY3V0aXZvcyBxdWUgZXN0YW4gbG9jYWxtZW50ZSB2cyBsb3MgcXVlIGVzdGFuIGVuIGVsIHNlcnZpZG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhY2lvbkN0aXZvc1ZTU2VydmVyKGlrYXRpb3M6IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGlkSHViOiBzdHJpbmcsIGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMuZ2V0QWxsQ3Rpdm9zKHViaWNhY2lvbiwgaWRIdWIpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh4KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgICAgICAgICAgb1NlcnZpY2VNM01hZXN0cm8uVmFsaWRhckN0aXZvc1ZTTG9jYWwodGhpcy5vUG9zdFNlcnZpY2VNMywgaWthdGlvcywgSlNPTi5zdHJpbmdpZnkoeCksIHViaWNhY2lvbiwgaWRIdWIsIGZ1bmNpb25SZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGVsIGNvbnNlY3V0aXZvIGVuIGVsIHF1ZSB2YSwgZWwgcHJvY2VzbyBvZmZsaW5lIHF1ZSByZWNpYmUgY29tbyBwYXJhbWV0cm9cclxuICAgICAqIEBwYXJhbSB1YmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaHViIFxyXG4gICAgICogQHBhcmFtIHNJZFByb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBHZXRDdGl2b09mZkxpbmUodWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgY3Rpdm86IHN0cmluZyA9IFwiMFwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YSA9IGF3YWl0IHRoaXMub1NlcnZpY2VPZmZMaW5lLmdldCh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YikpO1xyXG4gICAgICAgICAgICBpZiAob0RhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvRGF0YUZpbmRlZDogYW55ID0gb0RhdGEuQ3Rpdm9zLmZpbmQoeCA9PiB4LklkUHJvY2VzbyA9PSBzSWRQcm9jZXNvKTtcclxuICAgICAgICAgICAgICAgIGlmIChvRGF0YUZpbmRlZC5DdGl2bykge1xyXG4gICAgICAgICAgICAgICAgICAgIGN0aXZvID0gb0RhdGFGaW5kZWQuQ3Rpdm8uc3Vic3RyaW5nKDkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7IH1cclxuICAgICAgICByZXR1cm4gY3Rpdm87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGFyIGlkIG0zIFxyXG4gICAgICogQHBhcmFtIHNJZE0zIFxyXG4gICAgICogQHBhcmFtIHNJZFByb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlSWRNMyhzSWRNMzogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLmdldCh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YikpLnRoZW4oZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YTogQXJyYXk8YW55PiA9IGRhdGEuQ3Rpdm9zO1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFGaW5kZWQ6IGFueSA9IG9EYXRhLmZpbmQoeCA9PiB4LklkUHJvY2VzbyA9PSBzSWRQcm9jZXNvKTtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3Rpdm9BbnQgPSArb0RhdGFGaW5kZWQuQ3Rpdm8uc3Vic3RyaW5nKDkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGN0aXZvQWN0ID0gK3NJZE0zLnN1YnN0cmluZyg5KTtcclxuICAgICAgICAgICAgICAgIGlmIChjdGl2b0FjdCA+IGN0aXZvQW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0RhdGFGaW5kZWQuQ3Rpdm8gPSBzSWRNMztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9EYXRhLnB1c2goeyBcIklkUHJvY2Vzb1wiOiBzSWRQcm9jZXNvLCBcIkN0aXZvXCI6IHNJZE0zIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5TYXZlQ3Rpdm9zKG9EYXRhLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgICAgIGlmIChzSWRQcm9jZXNvLnRvVXBwZXJDYXNlKCkgPT0gXCJUSUNLRVRWRU5UQVwiKSB7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkN0aXZvVGlja2V0VmVudGFcIiwgc0lkTTMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb0RhdGEgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICBvRGF0YS5wdXNoKHsgXCJJZFByb2Nlc29cIjogc0lkUHJvY2VzbywgXCJDdGl2b1wiOiBzSWRNMyB9KVxyXG4gICAgICAgICAgICB0aGlzLlNhdmVDdGl2b3Mob0RhdGEsIHViaWNhY2lvbiwgaHViKTtcclxuICAgICAgICAgICAgaWYgKHNJZFByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIlRJQ0tFVFZFTlRBXCIpIHtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiQ3Rpdm9UaWNrZXRWZW50YVwiLCBzSWRNMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgY3Rpdm9zLCBJZG0zLlxyXG4gICAgICogQHBhcmFtIG9EYXRhIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFNhdmVDdGl2b3Mob0RhdGE6IEFycmF5PGFueT4sIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZywgaW50ZW50byA9IDApIHtcclxuICAgICAgICB2YXIgb0RhdGFTZW5kID0geyBcIkN0aXZvc1wiOiBvRGF0YSB9XHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuQWRkRG9jdW1lbnQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpLCBvRGF0YVNlbmQpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiT0tcIik7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB2YXIgc0ZlY2hhTm93OiBzdHJpbmcgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZTU1ERFRISG1tc3MnKVxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVycm9yTG9nQ3Rpdm9zXCIgKyBzRmVjaGFOb3csIEpTT04uc3RyaW5naWZ5KHsgXCJlcnJvclwiOiBlcnJvciwgXCJDdGl2b3NcIjogb0RhdGFTZW5kLCBcImZ1bmN0aW9uXCI6IFwiU2F2ZUN0aXZvc1wiIH0pKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZW50byA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNhdmVDdGl2b3Mob0RhdGEsIHViaWNhY2lvbiwgaHViLCAxKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlbGV0ZU9sZERvY3MobWF4RGlhczogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5vYmRPZmZMaW5lTG9nLkRlbGV0ZU9sZERvY3MobWF4RGlhcylcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIElkIG0zLCBjdWFuZG8gZXN0YSBmdWVyYSBkZSBsaW5lYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0SWRNM09mZmxpbmUoaWRrYXRpb3M6IHN0cmluZywgaWRwcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRGF0YUlkTTM7XHJcbiAgICAgICAgdmFyIGlkTTM7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb0RhdGFJZE0zID0gYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSk7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YUZpbmRlZDogYW55ID0gb0RhdGFJZE0zLkN0aXZvcy5maW5kKHggPT4geC5JZFByb2Nlc28gPT0gaWRwcm9jZXNvKTtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gb0RhdGFGaW5kZWQuQ3Rpdm87XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5TdW1hckN0aXZvKGlkTTMpO1xyXG4gICAgICAgICAgICAgICAgaWRNMyA9IHRoaXMudmFsaWRhckF1bWVudG9DdGl2byhpZE0zLCBpZHByb2Nlc28pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWRNMyA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkYXRlLmdldE1vbnRoKCkgKyBcIlwiICsgZGF0ZS5nZXREYXkoKSArIFwiXCIgKyBkYXRlLmdldEhvdXJzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaW51dGVzKCkgKyBcIlwiICsgZGF0ZS5nZXRTZWNvbmRzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5HZXRDdGl2byhpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAvLyBpZE0zID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRhdGUuZ2V0TW9udGgoKSArIFwiXCIgKyBkYXRlLmdldERheSgpICsgXCJcIiArIGRhdGUuZ2V0SG91cnMoKSArIFwiXCIgKyBkYXRlLmdldE1pbnV0ZXMoKSArIFwiXCIgKyBkYXRlLmdldFNlY29uZHMoKSArIFwiXCIgKyBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgICAgICBpZE0zID0gdGhpcy5HZXRDdGl2byhpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpZE0zO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB2YWxpZGFyQXVtZW50b0N0aXZvKGlkTTMsIGlkcHJvY2Vzbykge1xyXG4gICAgICAgIGlmIChpZHByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIlRJQ0tFVFZFTlRBXCIpIHtcclxuICAgICAgICAgICAgbGV0IHVsdGltb0lkTTMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkN0aXZvVGlja2V0VmVudGFcIik7XHJcbiAgICAgICAgICAgIGlmICh1bHRpbW9JZE0zID09IGlkTTMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5TdW1hckN0aXZvKGlkTTMpO1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ0N0aXZvc1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiaWRNM1wiOiBpZE0zLCBcImZ1bmN0aW9uXCI6IFwidmFsaWRhckF1bWVudG9DdGl2b1wiIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaWRNMztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIEdldEN0aXZvKGlka2F0aW9zOiBzdHJpbmcsIGlkcHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgIHZhciBzQ3Rpdm87XHJcbiAgICAgICAgc0N0aXZvID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uR2V0Q3Rpdm9CWVByb2Nlc28odGhpcy5vUG9zdFNlcnZpY2VNMywgaWRrYXRpb3MsIGlkcHJvY2VzbywgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgIHJldHVybiBzQ3Rpdm87XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsbGF2ZSBkZSBwb3VjaERCXHJcbiAgICAgKiBAcGFyYW0gdWJpYyBcclxuICAgICAqIEBwYXJhbSBodWIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRLZXkodWJpYywgaHViKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiQ1RJVk9TX1wiICsgdWJpYyArIGh1YjtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM05vdGlmU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0ZW5lciBsYSBpbmZvcm1hY2lvbiBkZSBsYXMgbm90aWRpY2FjaW9uZXMgcG9yIGh1YlxyXG4gICAqIEBwYXJhbSBzSURLYXRpb3MgRW1wcmVzYVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBNM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0KHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLm9Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM05vdGlmQ29udHJvbGxlci9NM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0L1wiICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnRvUHJvbWlzZSgpO1xyXG4gICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuICAgIGNhdGNoe1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViXHJcbiAgICogQHBhcmFtIHNJREthdGlvcyBFbXByZXNhXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIE0zR2V0TTNOb3RpZmljYWNpb25lc1hIdWJPYmplY3RXaXRoVGltZU91dChzSURLYXRpb3M6IHN0cmluZywgb0RhdGFTZW5kOiBhbnksIHRpbWVPdXQ6IG51bWJlcikge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLm9Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTNUaW1lT3V0KFwiTTNOb3RpZkNvbnRyb2xsZXIvTTNHZXRNM05vdGlmaWNhY2lvbmVzWEh1Yk9iamVjdC9cIiArIHNJREthdGlvcywgb0RhdGFTZW5kLCB0aW1lT3V0KS50b1Byb21pc2UoKTtcclxuICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcbiAgICBjYXRjaHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViIGRlIHVuIGlkUmVwIGRhZG9cclxuICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAqIEBwYXJhbSBkYXRhIFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBtM19nZXRfbm90aWZpY2FjaW9uX3hfaHViX29iamVjdChzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55KSB7XHJcbiAgICAvL3ZhciBkYXRhID0ge1wiaWRfcmVwXCI6XCJcIiwgXCJpZF91YmljYWNpb25cIjpcIlwiLCBcImlkX2h1YlwiOlwiXCJ9XHJcbiAgICB0cnkge1xyXG4gICAgICB2YXIgcmVzcCA9IGF3YWl0IHRoaXMub1Bvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTm90aWZDb250cm9sbGVyL20zX2dldF9ub3RpZmljYWNpb25feF9odWJfb2JqZWN0L1wiICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3ApKTtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbiAgICBjYXRjaHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBndWFyZGFyQ2FtYmlvc0NvbmZpZ3VyYWNpb25JbXByZXNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSwgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNOb3RpZkNvbnRyb2xsZXIvZ3VhcmRhckNhbWJpb3NDb25maWd1cmFjaW9uSW1wcmVzaW9uL1wiICsgc0lES2F0aW9zLnRyaW0oKSwgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICB9LFxyXG4gICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgb0Z1bmNpb25FcnIoZXJyb3JbXCJfYm9keVwiXSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTW9kZWxNM05vdGlme1xyXG4gICAgcHVibGljIElkUmVwOnN0cmluZztcclxuICAgIHB1YmxpYyBJRFViaWNhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRIdWI6c3RyaW5nO1xyXG4gICAgcHVibGljIENvcnJlcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ29uZGljaW9uZXM6c3RyaW5nO1xyXG4gICAgcHVibGljIERhdGE6c3RyaW5nO1xyXG4gICAgcHVibGljIENvbmZJbXA6c3RyaW5nO1xyXG59IiwiZXhwb3J0IGNsYXNzIE0zUHJlc2VudGFjaW9uZXN7XHJcbiAgICBwdWJsaWMgTklWRUxQUlM6c3RyaW5nO1xyXG4gICAgcHVibGljIFZBTE9SOm51bWJlcjtcclxuICAgIHB1YmxpYyBUT1BFOm51bWJlcjtcclxufSIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgcmVzZXJ2ZVNsb3RzIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNM0NvbnN1bHRhcyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIGludmVudGFyaW8sIHRlbmllbmRvIGVuIGN1ZW50YSBsb3MgcGFjayBhc29jaWFkb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIEVtcHJlc2FcclxuICAgICAqIEBwYXJhbSBkYXRhIEpzb24gY29uIGluZm9ybWFjaW9uIGRlIFNLUDEgKE1vZGVsbykgeSBVYmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIE0zX0dFVElOVkVOVEFSSU9CWVBBQ0soc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG4gICAgICAgIHZhciByZXNwID0gYXdhaXQgdGhpcy5Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9NM19HRVRJTlZFTlRBUklPQllQQUNLL1wiICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGFySW52ZW50YXJpb05lZ2F0aXZvUHJvZHVjdG8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNMy92YWxpZGFySW52ZW50YXJpb05lZ2F0aXZvUHJvZHVjdG8vXCIgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgb0Z1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyb3IuZXJyb3IuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBCdXNjYXJDb25jZXB0b0VuTTNTSVUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKXtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9NM19HRVRDb25jZXB0b0Zyb21TSVUvXCIgKyBpZEthdGlvcyArIFwiL1wiICsgZGF0YS5zVWJpY2FjaW9uICsgXCIvXCIgKyBkYXRhLnNDb25jZXB0bywge30pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnJvci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgVEVDTEFTUkFQSURBU3tcclxuICAgIHB1YmxpYyBDb21wb25lbnRlOnN0cmluZztcclxuICAgIHB1YmxpYyBUZWNsYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRnVuY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRFbGVtZW50bzpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hQUkRTU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgaWRrYXRpb3M6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBhcGxTeW5jQ291Y2hBdXRvID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgYXBsUGFxdWV0ZXMgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmlka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGbGFnU3luY0NvdWNoKCkge1xyXG4gICAgICAgIHZhciBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIHZhciBvU1ViaWNhY2lvbjtcclxuICAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgbGV0IGNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gbnVsbCAmJiBjb25maWcuU3luY0NvdWNoQXV0byAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmbGFnID0gY29uZmlnLlN5bmNDb3VjaEF1dG87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgdGhpcy5pZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICBpZiAodGhpcy5pZGthdGlvcykgdGhpcy5HZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiUFJEXCIgKyB0aGlzLmlka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiYWRhcHRlclwiKVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5kYXRhYmFzZS5hZGFwdGVyKTtcclxuICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHRoaXMudmFsaWRhclBhcXVldGVzKClcclxuICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJQYXF1ZXRlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5hcGxQYXF1ZXRlcykge1xyXG4gICAgICAgICAgICBsZXQgdWJpY2FjaW9uID0gdGhpcy5nZXRVYmljYWNpb24oKTtcclxuICAgICAgICAgICAgaWYgKHViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNhXCIgKyB1YmljYWNpb24gKyBcIl9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3luY0NvdWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZGthdGlvcykge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGFyUGFxdWV0ZXMoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRVYmljYWNpb24oKSB7XHJcbiAgICAgICAgbGV0IHNTVWJpY2FjaW9uID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNVYmljYWNpb25cIik7XHJcbiAgICAgICAgbGV0IG9TVWJpY2FjaW9uO1xyXG5cclxuICAgICAgICBpZiAoc1NVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgb1NVYmljYWNpb24gPSBKU09OLnBhcnNlKHNTVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgaWYgKG9TVWJpY2FjaW9uLklEVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1NVYmljYWNpb24uSURVYmljYWNpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldEthdGlvc00zRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIEthdGlvcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnS2F0aW9zXCIgKyB0aGlzLmlka2F0aW9zLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICAgIGlmIChLYXRpb3MgIT09IHVuZGVmaW5lZCAmJiBLYXRpb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgakthdGlvc00zID0gSlNPTi5wYXJzZShLYXRpb3MpO1xyXG4gICAgICAgICAgICBpZiAoakthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3MgJiYgakthdGlvc00zLkthdGlvcy5LYXRpb3NNMykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFwbCA9IGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMuZmluZCh4ID0+IHguTGxhdmUudG9VcHBlckNhc2UoKSA9PSBcIkFQTFBBUVNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBsICYmIGFwbC5WYWxvciA9PSBcIjFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBsUGFxdWV0ZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KGlka2F0aW9zKSB7XHJcbiAgICAgICAgdmFyIHJlc3B1ZXN0YTtcclxuICAgICAgICByZXNwdWVzdGEgPSBhd2FpdCB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKVxyXG4gICAgICAgIHJldHVybiByZXNwdWVzdGFcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hcGxTeW5jQ291Y2hBdXRvID0gdGhpcy5nZXRGbGFnU3luY0NvdWNoKCk7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0aGlzLmFwbFN5bmNDb3VjaEF1dG8sXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmluZm8oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZVByZChpZCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGVBbGxEb2NzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLm1hcChyb3cgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX2lkOiByb3cuaWQsIF9yZXY6IHJvdy5kb2MuX3JldiwgX2RlbGV0ZWQ6IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbihkZWxldGVEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYnVsa0RvY3MoZGVsZXRlRG9jcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaENvZHNQUkRTU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBpZGthdGlvcztcclxuICAgIHByaXZhdGUgYXBsU3luY0NvdWNoQXV0byA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmxhZ1N5bmNDb3VjaCgpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGxldCBjb25maWc7XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uTTNIVUJTICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXSAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IG51bGwgJiYgY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGNvbmZpZy5TeW5jQ291Y2hBdXRvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcblxyXG4gICAgICAgIHRoaXMuaWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJhZGFwdGVyXCIpXHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmRhdGFiYXNlLmFkYXB0ZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBzeW5jQ291Y2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlka2F0aW9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hcGxTeW5jQ291Y2hBdXRvID0gdGhpcy5nZXRGbGFnU3luY0NvdWNoKCk7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0aGlzLmFwbFN5bmNDb3VjaEF1dG8sXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBDT0RTIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gQ09EUyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KCkge1xyXG4gICAgICAgIHZhciByZXNwdWVzdGE7XHJcbiAgICAgICAgcmVzcHVlc3RhID0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hQcm9tb2Npb25lc1NlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHByaXZhdGUgZWxlbWVudFJlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwicHJvbW9jaW9uZXNfXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgICAgICAvL3RoaXMuc3luYyh0aGlzLkdldFNlcnZlcihzSWRrYXRpb3MpKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKHNJZGthdGlvcyk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTMgKyBcInByb21vY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmNXaXRoREIocmVtb3RlRGF0YWJhc2U6IFBvdWNoREIpIHtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIHN5bmNBd2FpdChyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgICAgICB0aGlzLnN5bmNXaXRoREIocmVtb3RlRGF0YWJhc2UpO1xyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YWJhc2UuY29tcGFjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBjaGFuZ2VzKHJlbW90ZTogc3RyaW5nKXtcclxuICAgIC8vICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUpO1xyXG4gICAgLy8gICAgIHJlbW90ZURhdGFiYXNlLmNoYW5nZXMoe1xyXG4gICAgLy8gICAgICAgICBzaW5jZTogJ25vdycsXHJcbiAgICAvLyAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAvLyAgICAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZVxyXG4gICAgLy8gICAgICAgfSkub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChjaGFuZ2UpIHtcclxuICAgIC8vICAgICAgICAgLy8gY2hhbmdlLmlkIGNvbnRhaW5zIHRoZSBkb2MgaWQsIGNoYW5nZS5kb2MgY29udGFpbnMgdGhlIGRvY1xyXG4gICAgLy8gICAgICAgICBpZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgIC8vICAgICAgICAgICAvLyBkb2N1bWVudCB3YXMgZGVsZXRlZFxyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgIC8vIGRvY3VtZW50IHdhcyBhZGRlZC9tb2RpZmllZFxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIGhhbmRsZSBlcnJvcnNcclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGUoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKS50aGVuKGRvYyA9PntcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKGRvYyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlbGVtZW50UmVtb3ZlZCgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmNoYW5nZXMoeyBsaXZlOiB0cnVlLCBzaW5jZTogJ25vdycsIGluY2x1ZGVfZG9jczogdHJ1ZSB9KVxyXG4gICAgICAgIC5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZS5kZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVtLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL3JlbmRlckRvY3NTb21laG93KCk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJlbW92ZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZW07XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCICBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFViaWNhY2lvbmVzU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcz0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJ1YmljYWNpb25lc19cIiArIHNJZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6c3RyaW5nO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInViaWNhY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFVCSUNBQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6c3RyaW5ne1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpe1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZihzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpe1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgIFxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBVQklDQUNJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gVUJJQ0FDSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ2hhbmdlSXRlbSgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmNoYW5nZXMoeyBsaXZlOiB0cnVlLCBzaW5jZTogJ25vdycsIGluY2x1ZGVfZG9jczogdHJ1ZSB9KVxyXG4gICAgICAgIC5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgLy9pZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL3JlbmRlckRvY3NTb21laG93KCk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7aW5jbHVkZV9kb2NzOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7aW5jbHVkZV9kb2NzOiBmYWxzZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zTm90aWZpY2FjaW9uZXNBUFAge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuICAgICAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJub3RpZmljYWNpb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpLnRyaW0oKSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJub3RpZmljYWNpb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpLnRyaW0oKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIEdldERhdGFQb3VjaEJEKGlzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9hcm1hciBrZXkgZGUgZG9jdW1lbnRvIHF1ZSBzZSBxdWllcmUgY29uc3VsdGFyXHJcbiAgICBwdWJsaWMgR2V0S2V5RG9jdW1lbnRvREIoaXNJREthdGlvczogc3RyaW5nLCBpc0RvY3VtZW50bzogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGlzSURLYXRpb3MgKyBcIj9cIiArIGlzRG9jdW1lbnRvO1xyXG4gICAgfVxyXG5cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tCeVRpcG8gfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wYWNrLWJ5LXRpcG9cIjtcclxuaW1wb3J0IHsgTTNQYWNrQnlSZWdsYXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wYWNrLWJ5LXJlZ2xhc1wiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTTNQSXRlbXNXRUIgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTTNQYWNrQnlpcG8ge1xyXG5cclxuXHJcbiAgICBwcml2YXRlIG9wZXJhdG9ycyA9IHtcclxuICAgICAgICAnPCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA8ICtiIH0sXHJcbiAgICAgICAgJz4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgPiArYiB9LFxyXG4gICAgICAgICc8PSc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA8PSArYiB9LFxyXG4gICAgICAgICc+PSc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA+PSArYiB9LFxyXG4gICAgICAgICdJR1VBTCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09IGIgfSxcclxuICAgICAgICAnRElGRic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICE9IGIgfSxcclxuICAgICAgICAnRU4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB9LFxyXG4gICAgICAgICdBTkQnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiIH0sXHJcbiAgICAgICAgJ09SJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfHwgYiB9LFxyXG4gICAgICAgICcqJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRydWUgfSxcclxuICAgICAgICAnTU9EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthICUgK2IgPT0gMCB9LFxyXG4gICAgICAgIC8vIC4uLlxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHNpIGVsIHByb2R1Y3RvIHF1ZSBzZXLDg8KhIGhpam8sIGN1bXBsZSBjb24gbGFzIGNhcmFjdGVyaXN0aWNhc1xyXG4gICAgICogQHBhcmFtIG0zUHJvY1BLRyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJTaUVzVGlwbyhtM1Byb2NQS0c6IFR5cGVNM1ByZEdycCwgcHJvZHVjdG86IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChtM1Byb2NQS0cuTTNQQUNLQllUSVBPLmZpbmQoeCA9PiB4LkRFU1RJTk8gPT0gcHJvZHVjdG8uVElQTykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBsaWNhY2lvbiBkZSByZWdsYXMgZGUgcGFxdWV0ZXMsIHRlbmllbmRvIGVuIGN1ZW50YSBhbCBpbmZvcm1hY2nDg8KzbiBkZWwgcHJvZHVjdG8gaW5ncmVzYWRvLlxyXG4gICAgICogQHBhcmFtIG0zUHJvY1BLRyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0byBcclxuICAgICAqIEBwYXJhbSBvTTNQSXRlbXNXRUIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZW5lcmFWYWxpZGFjaW9uZXMobTNQcm9jUEtHOiBUeXBlTTNQcmRHcnAsIHByb2R1Y3RvOiBUeXBlTTNQcmRHcnAsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYlJlc3A6Ym9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBvTTNQQUNLQllUSVBPOiBNM1ByZFBhY2tCeVRpcG8gPSBtM1Byb2NQS0cuTTNQQUNLQllUSVBPLmZpbmQoeCA9PiB4LkRFU1RJTk8gPT0gcHJvZHVjdG8uVElQTyk7XHJcbiAgICAgICAgICAgIGlmIChvTTNQQUNLQllUSVBPKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgb00zUEFDS0JZVElQTy5NM1BBQ0tSRUdMQVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUGFja0J5UmVnbGFzOiBNM1BhY2tCeVJlZ2xhcyA9IG9NM1BBQ0tCWVRJUE8uTTNQQUNLUkVHTEFTW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2UgZXN0YSB2YWxpZGFuZG8gZWwgcGFwYSBkZWwgcGFxdWV0ZS5cclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLm9wZXJhdG9yc1tvTTNQYWNrQnlSZWdsYXMuT3BlcmFjaW9uXSh0aGlzLkdldFBhcmFtZXRyb3Mob00zUGFja0J5UmVnbGFzLlBhcmFtMSwgbTNQcm9jUEtHKSAsIHRoaXMuR2V0UGFyYW1ldHJvcyhvTTNQYWNrQnlSZWdsYXMuUGFyYW0yLCBtM1Byb2NQS0cpKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhY2lvbkFjY2lvbihvTTNQYWNrQnlSZWdsYXMuQWNjaW9uLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2h7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFjacODwrNuIGRlIGFjY2lvbiBkZSByZWdsYXMgZGUgcGFxdWV0ZS5cclxuICAgICAqIEBwYXJhbSBzQWNjaW9uIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFZhbGlkYWNpb25BY2Npb24oc0FjY2lvbjpzdHJpbmcsIG9NM1BJdGVtc1dFQjpNM1BJdGVtc1dFQil7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBpZihzQWNjaW9uICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvQWNjaW9uOmFueSA9IEpTT04ucGFyc2Uoc0FjY2lvbik7XHJcbiAgICAgICAgICAgICAgICBpZihvQWNjaW9uLkFjY2lvbil7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9BY2Npb24uQWNjaW9uKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNhbnRpZGFkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gb0FjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1jYXRjaChleCl7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpw4PCs24gZGUgcGFyYW1ldHJvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhcyByZWdsYXMuXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1ldHJvIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3RvIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEdldFBhcmFtZXRyb3MocGFyYW1ldHJvOiBzdHJpbmcsIHByb2R1Y3RvOiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICB2YXIgc1BhcmFtOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByZWdsYTogc3RyaW5nID0gcGFyYW1ldHJvLnNwbGl0KFwiX1wiKVswXTtcclxuICAgICAgICAgICAgc3dpdGNoIChyZWdsYS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiQURJXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgc1BhcmFtID0gcHJvZHVjdG8uTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoeCA9PiB4LkFUUklCVVRPID09IHBhcmFtZXRyby5zcGxpdChcIl9cIilbMV0pLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNPTlNUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgc1BhcmFtID0gcGFyYW1ldHJvLnNwbGl0KFwiX1wiKVsxXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVnbGEudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiU0tQXCIpICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJhbSA9IHByb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdW3JlZ2xhXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoe1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNQYXJhbTtcclxuICAgIH1cclxuXHJcblxyXG5cclxufSIsImltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsdHJvc0RpYXJpb09mZkxpbmUge1xyXG4gICAgcHVibGljIEZpbHRyYXJCeUZlY2hhc09mZihEYXRhLCBBZGRUb0RvYzogRnVuY3Rpb24pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcm93czogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgLy92YXIgbmV3Um93cyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgIHZhciBmZWNoYUkgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiRmVjaGFJdENPRkZcIik7XHJcbiAgICAgICAgICAgIHZhciBmZWNoYUYgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiRmVjaGFGdENPRkZcIik7XHJcbiAgICAgICAgICAgIHJvd3MgPSBEYXRhLnJvd3M7XHJcblxyXG4gICAgICAgICAgICBpZiAoZmVjaGFGICYmIGZlY2hhSSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGlGSW5pY2lvID0gdGhpcy5HZXRGZWNoYU51bWJlcihmZWNoYUkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGlGRmluYWwgPSB0aGlzLkdldEZlY2hhTnVtYmVyKGZlY2hhRik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpRkluaWNpbylcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGlGRmluYWwpXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNwOiBhbnkgPSByb3dzW2ldLmRvYztcclxuICAgICAgICAgICAgICAgICAgICBpZiAobTNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmZWNoYVByb2MgPSB0aGlzLkdldEZlY2hhTnVtYmVyKG0zcC5GZWNoYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZmVjaGFQcm9jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoK2ZlY2hhUHJvYyA+PSAraUZJbmljaW8gJiYgK2ZlY2hhUHJvYyA8PSAraUZGaW5hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXdSb3dzLnB1c2gocm93c1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRUb0RvYyhtM3ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmlsdHJhckJ5RmVjaGFzT2ZmXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgRmlsdHJhckJ5VGV4dG8oRGF0YSwgc1RleHRvOiBzdHJpbmcsIEFkZFRvRG9jOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByb3dzOiBBcnJheTxhbnk+O1xyXG5cclxuICAgICAgICAgICAgcm93cyA9IERhdGEucm93cztcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbTNwOiBhbnkgPSByb3dzW2ldLmRvYztcclxuICAgICAgICAgICAgICAgIGlmIChtM3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobTNwLklkTTMuaW5jbHVkZXMoc1RleHRvKSB8fCAobTNwLm5kb2NVQWN0aXZvICYmIG0zcC5uZG9jVUFjdGl2by5pbmNsdWRlcyhzVGV4dG8pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25ld1Jvd3MucHVzaChyb3dzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkVG9Eb2MobTNwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaWx0cmFyQnlGZWNoYXNPZmZcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgR2V0RmVjaGFOdW1iZXIoc2RhdGU6IHN0cmluZykge1xyXG4gICAgICAgIC8vdmFyIGRhdGUgPSBuZXcgRGF0ZShzZGF0ZSk7XHJcbiAgICAgICAgdmFyIGQgPSBtb21lbnQoc2RhdGUpLmZvcm1hdCgnWVlZWU1NREQnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG4vLyBASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFBlcnhpcG8ge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCkge1xyXG5cclxuICAgICAgICBzSWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwicGVyeHRpcG9fXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInBlcnh0aXBvX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBwZXJ4dGlwbyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHJldHJ5OiBmYWxzZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gcGVyeHRpcG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIHBlcnh0aXBvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuLy8gQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ291Y2hEaW5hbUJ5UHJvY2Vzb3Mge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImRpbmFteHByb2NfXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImRpbmFteHByb2NfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIGRpbmFteHByb2NfICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICBcclxufVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV0cnk6IGZhbHNlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBkaW5hbXhwcm9jXyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gZGluYW14cHJvY18gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3Moe2luY2x1ZGVfZG9jczogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YT0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcbn0iXSwibmFtZXMiOlsibW9tZW50IiwiXy5jbG9uZURlZXAiLCJQb3N0U2VydmljZU0zIiwidHNsaWJfMS5fX2RlY29yYXRlIiwidHNsaWJfMS5fX3BhcmFtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNCSSxZQUNZLE1BQ0E7UUFEQSxTQUFJLEdBQUosSUFBSTtRQUNKLGVBQVUsR0FBVixVQUFVO1FBRWxCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQUN2Qjs7OztJQUVNLFlBQVk7O1FBRWYsSUFBSSxJQUFJLENBQU07O1FBQ2QsSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FB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
|
|
12582
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2YtcmVnbGFuZWdvY2lvbTMuanMubWFwIiwic291cmNlcyI6WyJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvQ29udmVydC94bWxUb0pTb24uY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL0RhdGEvbTMtY291Y2gtbWFlc3Ryby50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvRGF0YS9tMy1kYXRhLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL2ZpbHRyb3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vTTNQcmRBZGljaW9uYWxlcy50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL00zUHJkTGlzdGEudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZEdycC50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wLWltcHVlc3Rvcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBkaW5hbWljYXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBlbmMtZnAudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBlbmMtaXRlbXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXAtZW52aW9zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1mLXRyYWJham8udHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXByb2Nlc29zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wcmVjZXBjaW9uLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1vdC1jbGFzaWZpY2FjaW9uZXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLWZlLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXByb2Nlc28uaW50ZXJmYWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL3Byb21vY2lvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtY29uZmlnbHAuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtbG9hZC1sLXByZWNpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9NM01hZXN0cm8uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmVnLXNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXRyeC5pbnRlcmZhY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLWxpc3RhLXByZWNpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL20zLWRpbi1wcm9jZXNvcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZFBhY2tEZXQudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpQWRpY2lvbmFsZXMudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUHJvbW9jaW9uZXMvTW9kZWxzL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNDT05ESVBST01PLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNERVRDT05ESVBST01PLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNFTkNQUk9NTy5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtdWJpY2FjaW9uLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXJlZy1tYXNpdm8uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmVnLW1hc2l2by1ha3ouc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmV2ZXJzby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wZGluYW0tYnktYWN0aXZpZGFkLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL20zLWRpbi1ieS1hY3RpdmlkYWQudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXNhbGRvcy14LWN1ZW50YS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcmVnLXRyeC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvQ3Vwb25lcy9jdXBvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9iZC1vZmZsaW5lLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9iZC1vZmZsaW5lLWxvZy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL3NlcnZpY2UtbTMtbWFlc3Ryby1vZmZsaW5lLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL3NlcnZpY2UtbTMtcHJvY2Vzby1vZmZsaW5lLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1ub3RpZmljYWNpb25lcy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL05vdGlmaWNhY2lvbmVzL00zTm9maXRpY2FjaW9uZXMubW9kZWwudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vbTMtcHJlc2VudGFjaW9uZXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL0NvbnN1bHRhc00zL20zLWNvbnN1bHRhcy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL1ViaWNhY2lvbi9tMy10ZWNsYXMtcmFwaWRhcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9jb3VjaC1wcmRzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtY29kc3ByZC5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLXByb21vY2lvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtdWJpY2FjaW9uZXMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTm90aWZpY2FjaW9uZXMvbm90aWZpY2FjaW9uZXMtbTMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcGFjay1ieS10aXBvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9maWx0cm9zLWRpYXJpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLXBlcnh0aXBvLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLWRpbmFteHByb2Nlc29zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHAsIFJlcXVlc3RPcHRpb25zLCBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cCdcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCdcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cC9zcmMvc3RhdGljX3Jlc3BvbnNlJ1xyXG5pbXBvcnQgeyB0aW1lb3V0LCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBvc3RTZXJ2aWNlTTMge1xyXG4gICAgaWRrYXRpb3M6IHN0cmluZ1xyXG4gICAgc2Vydmlkb3I6IHN0cmluZztcclxuICAgIHNlcnZpZG9yUGVyc29uYXM6IHN0cmluZztcclxuICAgIHNlcnZpZG9yR2VuZXJhbGVzOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvck0zOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvckZFTVg6IHN0cmluZztcclxuICAgIHNlcnZpZG9yRG9jdW1lbnRvczogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JDb250YWJsZTogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JQcmVzdGFtbzogc3RyaW5nO1xyXG4gICAgV2ViQmFzZTogc3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwLFxyXG4gICAgICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5jYXJnYUluaWNpYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FyZ2FJbmljaWFsKCkge1xyXG5cclxuICAgICAgICB2YXIganNvbjogYW55O1xyXG4gICAgICAgIGxldCBzQ29uZmlnSlNPTiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpO1xyXG4gICAgICAgIGlmIChzQ29uZmlnSlNPTikge1xyXG4gICAgICAgICAgICBsZXQgakNvbmZpZ0pTT04gPSBKU09OLnBhcnNlKHNDb25maWdKU09OKTtcclxuICAgICAgICAgICAgaWYgKGpDb25maWdKU09OLlNlcnZpZG9yUGVyc29uYXMpIHtcclxuICAgICAgICAgICAgICAgIGpzb24gPSBqQ29uZmlnSlNPTjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQZXJzb25hcyA9IGpzb24uU2Vydmlkb3JQZXJzb25hcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yID0ganNvbi5TZXJ2aWRvcjtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzID0ganNvbi5TZXJ2aWRvckdlbmVyYWxlcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yTTMgPSBqc29uLlNlcnZpZG9yTTM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckZFTVggPSBqc29uLlNlcnZpZG9yRkVNWDtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyA9IGpzb24uU2Vydmlkb3JEb2N1bWVudG9zO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JDb250YWJsZSA9IGpzb24uU2Vydmlkb3JDb250YWJsZTtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yUHJlc3RhbW8gPSBqc29uLlNlcnZpZG9yUHJlc3RhbW87XHJcbiAgICAgICAgdGhpcy5XZWJCYXNlID0ganNvbi5XZWJCYXNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENvbmZpZ0pzb24oaWRLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwID0gYXdhaXQgdGhpcy5nZXRXaXRoQm9keUdlbmVyYWxlcygnR2VuZXJhbGVzL2dldENvbmZpZ0pzb24vJyArIGlkS2F0aW9zLCBudWxsKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgdmFyIHJlc3B1ZXN0YTogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BPa19nZXRDb25maWdKc29uKHJlc3B1ZXN0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzcE9rX2dldENvbmZpZ0pzb24oanNvbikge1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQZXJzb25hcyA9IGpzb24uU2Vydmlkb3JQZXJzb25hcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yID0ganNvbi5TZXJ2aWRvcjtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzID0ganNvbi5TZXJ2aWRvckdlbmVyYWxlcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yTTMgPSBqc29uLlNlcnZpZG9yTTM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckZFTVggPSBqc29uLlNlcnZpZG9yRkVNWDtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyA9IGpzb24uU2Vydmlkb3JEb2N1bWVudG9zO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JDb250YWJsZSA9IGpzb24uU2Vydmlkb3JDb250YWJsZTtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yUHJlc3RhbW8gPSBqc29uLlNlcnZpZG9yUHJlc3RhbW87XHJcbiAgICAgICAgdGhpcy5XZWJCYXNlID0ganNvbi5XZWJCYXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVSTFNlcnZlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWRvcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVUkxTZXJ2ZXJEb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcztcclxuICAgIH1cclxuXHJcbiAgICAvLy9odHRwR2V0XHJcbiAgICBodHRwR2V0KHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGlTZXJ2aWRvciArIHVybEdldCkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9odHRwR2V0XHJcbiAgICBodHRwR2V0V2l0aFRpbWVPdXQodXJsR2V0OiBzdHJpbmcsIGlTZXJ2aWRvcjogc3RyaW5nLCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0KS5waXBlKFxyXG4gICAgICAgICAgICB0aW1lb3V0KHRpbWVvdXRUaW1lKVxyXG4gICAgICAgICkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGh0dHBHZXRXaXRoQm9keSh1cmxHZXQ6IHN0cmluZywgaVNlcnZpZG9yOiBzdHJpbmcsIHBhcmFtZXRyb3M6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xyXG5cclxuICAgICAgICBoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuXHJcblxyXG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7aGVhZGVyczogaGVhZGVycywgYm9keToge1wiY29ycmVvXCI6IFwicGFyYW1zXCJ9LCBwYXJhbXM6bXlQYXJhbXN9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtZXRyb3NcclxuICAgICAgICAgICAgfSkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBodHRwR2V0V2l0aEJvZHlUaW1lT3V0KHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55LCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG5cclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChpU2Vydmlkb3IgKyB1cmxHZXQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRpbWVvdXQodGltZW91dFRpbWUpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaHR0cF9nZXRfYmxvYih1cmxHZXQ6IHN0cmluZywgaVNlcnZpZG9yOiBzdHJpbmcsIHBhcmFtZXRyb3M6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xyXG5cclxuICAgICAgICAvL2hlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpOyAgICAgICAgXHJcbiAgICAgICAgLy9oZWFkZXJzLmFwcGVuZCgnUmVzcG9uc2UgVHlvZScsICdibG9iJyk7XHJcblxyXG5cclxuICAgICAgICAvL2NvbnN0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoe2hlYWRlcnM6IGhlYWRlcnMsIGJvZHk6IHtcImNvcnJlb1wiOiBcInBhcmFtc1wifSwgcGFyYW1zOm15UGFyYW1zfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGlTZXJ2aWRvciArIHVybEdldCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGh0dHBfZ2V0X2FycmF5YnVmZmVyKHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7ICAgICAgICBcclxuICAgICAgICAvL2hlYWRlcnMuYXBwZW5kKCdSZXNwb25zZSBUeW9lJywgJ2Jsb2InKTtcclxuXHJcblxyXG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7aGVhZGVyczogaGVhZGVycywgYm9keToge1wiY29ycmVvXCI6IFwicGFyYW1zXCJ9LCBwYXJhbXM6bXlQYXJhbXN9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYXJyYXlidWZmZXJcIixcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgZ2V0UHJlc3RhbW8odXJsR2V0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0KHVybEdldCwgdGhpcy5zZXJ2aWRvclByZXN0YW1vKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0V2l0aEJvZHlNM1RpbWVPdXQodXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55LCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5VGltZU91dCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JNMywgcGFyYW1zLCB0aW1lb3V0VGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlQcmVzdGFtbyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0V2l0aEJvZHkodXJsR2V0LCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8sIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFdpdGhCb2R5TTModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5KHVybEdldCwgdGhpcy5zZXJ2aWRvck0zLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFdpdGhCb2R5UGVyc29uYXModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5KHVybEdldCwgdGhpcy5zZXJ2aWRvclBlcnNvbmFzLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFdpdGhCb2R5R2VuZXJhbGVzKHVybEdldDogc3RyaW5nLCBwYXJhbXM6IGFueSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXRXaXRoQm9keSh1cmxHZXQsIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlEb2N1bWVudG8odXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XHJcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoJ3Jlc3BvbnNlVHlwZScsICdSZXNwb25zZUNvbnRlbnRUeXBlLkJsb2InKTtcclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldCh0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyArIHVybEdldCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNcclxuICAgICAgICAgICAgfSkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X2Jsb2JfRG9jdW1lbnRvcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwX2dldF9ibG9iKHVybEdldCwgdGhpcy5zZXJ2aWRvckRvY3VtZW50b3MsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X2FycmF5YnVmZmVyX0RvY3VtZW50b3ModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cF9nZXRfYXJyYXlidWZmZXIodXJsR2V0LCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcywgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQb3N0cyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQZXJzb25hcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yUGVyc29uYXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEdlbmVyYWxlcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNMyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yTTMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE0zV2l0aFRpbWVPdXQodXJsR2V0OiBzdHJpbmcsIHRpbWVPdXQ6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXRXaXRoVGltZU91dCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JNMywgdGltZU91dCk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgZ2V0RG9jdW1lbnRvcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldENvbnRhYmxlKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JDb250YWJsZSk7XHJcbiAgICB9XHJcbiAgICAvLy9FbmQgaHR0cEdldFxyXG5cclxuICAgIGdldFBvc3RzV2l0aE91dEpzb24odXJsR2V0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLnNlcnZpZG9yICsgdXJsR2V0KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5zZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1c1RleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8vcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBcclxuICAgIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5zZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBDYWxsU2VydmljZSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoaVNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMpLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwUHJlc3RhbW9zKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVJlc3BvbnNlSHR0cENhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8pO1xyXG4gICAgfVxyXG4gICAgLy8vRW5kIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwXHJcblxyXG5cclxuICAgIC8vL3Bvc3RTZXJ2aWNlSHR0cE9wdGlvbnNcclxuICAgIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNDYWxsU2VydmljZSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChpU2Vydmlkb3IgKyB1cmxHZXQsIHBhcmFtcywgb3B0aW9ucykubWFwKFxyXG4gICAgICAgICAgICByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwT3B0aW9ucyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCBoZWFkZXJzLCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBPcHRpb25zTTModXJsR2V0OiBzdHJpbmcsIHBhcmFtcywgaGVhZGVycykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNDYWxsU2VydmljZSh1cmxHZXQsIHBhcmFtcywgaGVhZGVycywgdGhpcy5zZXJ2aWRvck0zKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBPcHRpb25zRG9jcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCBoZWFkZXJzLCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vRW5kIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNcclxuXHJcbiAgICAvLy9wb3N0U2VydmljZUh0dHBSZXNGdWxsXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsQ2FsbFNlcnZpY2UodXJsR2V0OiBzdHJpbmcsIHBhcmFtcywgaVNlcnZpZG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGlTZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbCh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbENhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxQZXJzb25hcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VXZWJBcGkodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JQZXJzb25hcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVdlYkFwaSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvck0zKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsRkVNWCh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VXZWJBcGkodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JGRU1YKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsR2VuZXJhbGVzKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZUh0dHBSZXNGdWxsQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxQcmVzdGFtb3ModXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxDYWxsU2VydmljZSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvclByZXN0YW1vKTtcclxuICAgIH1cclxuICAgIC8vL0VuZCBwb3N0U2VydmljZUh0dHBSZXNGdWxsXHJcbiAgICBwb3N0U2VydmljZVdlYkFwaSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcclxuICAgICAgICBoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHsgaGVhZGVyczogaGVhZGVycyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGlTZXJ2aWRvciArIHVybEdldCwgcGFyYW1zLCBvcHRpb25zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIHhtbFRvSnNvblRGe1xyXG5cclxuICAgIGNvbnZlcnRYbWxUb0pzb24oaW5wdXRYbWwpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gcmVxdWlyZSgneG1sMmpzJykucGFyc2VTdHJpbmc7XHJcbiAgICAgICAgY29uc3QgeG1sID0gaW5wdXRYbWw7XHJcbiAgICAgICAgbGV0IHJlc3VsdGFkbztcclxuICAgICAgICBwYXJzZVN0cmluZyh4bWwsIChlcnIsIHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHRhZG89IHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcGxhY2VDaGFyWG1sKGlucHV0WG1sKXtcclxuICAgICAgICBsZXQgZ3QgPSAvJmd0Oy9naTsgICAgICAgIFxyXG4gICAgICAgIGxldCBsdCA9IC8mbHQ7L2dpO1xyXG4gICAgICAgIGxldCBxdW90ID0gLyZxdW90Oy9naTtcclxuICAgICAgICBsZXQgcmVzdWx0YWRvID0gaW5wdXRYbWwucmVwbGFjZShndCxcIj5cIik7XHJcbiAgICAgICAgcmVzdWx0YWRvID0gcmVzdWx0YWRvLnJlcGxhY2UobHQsXCI8XCIpO1xyXG4gICAgICAgIHJlc3VsdGFkbyA9IHJlc3VsdGFkby5yZXBsYWNlKHF1b3QsXCInXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zQ291Y2hNYWVzdHJvIHtcclxuICAgIHB1YmxpYyBvRGF0YU0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuICAgICAgICAgICAgdmFyIHNUaXBvSHViOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgc1RpcG9IdWIgPSB0aGlzLkdldFRpcG9IdWJGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICBpZiAoc0lka2F0aW9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc1RpcG9IdWIgJiYgc1RpcG9IdWIudG9VcHBlckNhc2UoKS50cmltKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tRWNjX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21FY2NfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0VFQ0MhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21fXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0UhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0Z1bmNpb24gcXVlIHRyYWVyYSBlbCB0aXBvIGRlIGh1YlxyXG4gICAgcHVibGljIEdldFRpcG9IdWJGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5UaXBvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1NVYmljYWNpb24uTTNIVUJTWzBdLlRpcG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RGF0YVBvdWNoQkQoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpc0tleSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIC8vIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSk7XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgIC8vICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIC8vIH07XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zMiA9IHtcclxuICAgICAgICAvLyAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAvLyAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICAvLyB9O1xyXG5cclxuICAgICAgICAvLyAvL3RoaXMuYXV0ZW50aWNhY2lvblNlcnZlcihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgLy8gdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgLy8gICAgIG9wdGlvbnMyXHJcbiAgICAgICAgLy8gfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJDb21wbGV0bzpcIiArIGNoYW5nZSlcclxuICAgICAgICAvLyB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgLy8gfSkub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBkb2N1bWVudG8gcXVlIHNlIHF1aWVyZSBjb25zdWx0YXJcclxuICAgIHB1YmxpYyBHZXRLZXlEb2N1bWVudG9EQihpc0lES2F0aW9zOiBzdHJpbmcsIGlzRG9jdW1lbnRvOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaXNJREthdGlvcyArIFwiP1wiICsgaXNEb2N1bWVudG87XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3MnO1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM0RhdGEge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIkNhcnJpdG9Db21wcmFzXCIsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYXIgZW4gQkQgcG91Y2guXHJcbiAgICBwdWJsaWMgQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoaWQ6IHN0cmluZywgZG9jdW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGRvY3VtZW50Ll9pZCA9IGlkO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5fcmV2ID0gcmVzdWx0Ll9yZXY7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0FkaWNpb25hciBlbiBCRCBwb3VjaCwgQXN5bmMuXHJcbiAgICBwdWJsaWMgYXN5bmMgQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXNBc3luYyhpZDogc3RyaW5nLCBkb2N1bWVudDogYW55KSB7XHJcbiAgICAgICAgZG9jdW1lbnQuX2lkID0gaWQ7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0KGlkKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuX3JldiA9IHJlc3VsdC5fcmV2O1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgLy8gICAgIGRvY3VtZW50Ll9yZXYgPSByZXN1bHQuX3JldjtcclxuICAgICAgICAvLyAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICAvLyB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikge1xyXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAvLyAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIEdldERhdGFQb3VjaEJEKGlzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIERlbGV0ZShpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zMiA9IHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL3RoaXMuYXV0ZW50aWNhY2lvblNlcnZlcihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXMsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBJREthdGlvcywgdGRvYyB5IG5kb2MuXHJcbiAgICBwdWJsaWMgR2V0S2V5Q2Fycml0b0NvbXByYXMoaXNJREthdGlvczogc3RyaW5nLCBpc1Rkb2M6IHN0cmluZywgaXNOZG9jOiBzdHJpbmcsIGlzVWJpY2FjaW9uOiBzdHJpbmcsIGlzSWRIdWI6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBcIkNDP1wiICsgaXNJREthdGlvcyArIFwiP1wiICsgaXNVYmljYWNpb24gKyBcIj9cIiArIGlzSWRIdWIgKyBcIj9cIiArIGlzVGRvYyArIFwiP1wiICsgaXNOZG9jO1xyXG4gICAgfVxyXG5cclxuICAgIC8vRGVzdHJ1aXIgeSByZWNvbnN0cnVpciBsYSBiYXNlIGRlIGRhdG9zIHBvdWNoREJcclxuICAgIHB1YmxpYyBSZXNlckJEKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQignQ2Fycml0b0NvbXByYXMnLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBGaWx0cm9zIHtcclxuICAgIHB1YmxpYyBBdHJpYnV0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlzQXRyaWJ1dG86c3RyaW5nLCBpc1ZhbG9yOnN0cmluZyl7XHJcbiAgICAgICAgdGhpcy5BdHJpYnV0byA9IGlzQXRyaWJ1dG87XHJcbiAgICAgICAgdGhpcy5WYWxvciA9IGlzVmFsb3I7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIE0zUHJkQWRpY2lvbmFsZXN7XHJcbiAgICBTS1AxOnN0cmluZztcclxuICAgIEFUUklCVVRPOnN0cmluZztcclxuICAgIFZBTE9SOnN0cmluZztcclxuICAgIE5JVkVMMTpudW1iZXI7XHJcbiAgICBOSVZFTDI6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQcmVzZW50YWNpb25lcyB9IGZyb20gXCIuL20zLXByZXNlbnRhY2lvbmVzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQcmRMaXN0YXtcclxuICAgIElETElTVEE6c3RyaW5nO1xyXG4gICAgU0tVOnN0cmluZztcclxuICAgIExPVEU6c3RyaW5nO1xyXG4gICAgUFJFQ0lPOm51bWJlcjtcclxuICAgIExCOiBudW1iZXI7XHJcbiAgICBMQzogbnVtYmVyO1xyXG4gICAgTEQ6IG51bWJlcjtcclxuICAgIFNVQklORElDRTogc3RyaW5nO1xyXG4gICAgUE9SSUdJTkFMOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgTTNQcmVzZW50YWNpb25lcyA9IG5ldyBBcnJheTxNM1ByZXNlbnRhY2lvbmVzPigpO1xyXG59IiwiaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tEZXQgfSBmcm9tIFwiLi9NM1ByZFBhY2tEZXRcIjtcclxuaW1wb3J0IHsgTTNDb2RzWFBSRCB9IGZyb20gXCIuL00zQ29kc1hQUkQudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tSZWdsYXMgfSBmcm9tIFwiLi9NM1ByZFBhY2tSZWdsYXNcIjtcclxuZXhwb3J0IGNsYXNzIE0zUHJkR2VuZXJhbCB7XHJcbiAgICBTS1U6IHN0cmluZztcclxuICAgIExPVEU6IHN0cmluZztcclxuICAgIE5PTUJSRTE6IHN0cmluZztcclxuICAgIE5PTUJSRUxBUkdPOiBzdHJpbmc7XHJcbiAgICBBQ1QxQ1RCTDogc3RyaW5nO1xyXG4gICAgQUNUMkNUQkw6IHN0cmluZztcclxuICAgIENUQkxEUFJEOiBzdHJpbmc7XHJcbiAgICBDVEJMRElNUFBSRDogc3RyaW5nO1xyXG4gICAgU0tQMTogc3RyaW5nO1xyXG4gICAgU0tQMjogc3RyaW5nO1xyXG4gICAgU0tQMzogc3RyaW5nO1xyXG4gICAgU0tQNDogc3RyaW5nO1xyXG4gICAgU0tQNTogc3RyaW5nO1xyXG4gICAgRElTUE9OSUJMRTogbnVtYmVyO1xyXG4gICAgRElTUE9OSUJMRVJlZjogbnVtYmVyO1xyXG4gICAgTTNQQUNLOiBBcnJheTxNM1ByZFBhY2tEZXQ+ID0gbnVsbDtcclxuICAgIE0zUGFja1JlZ2xhczogQXJyYXk8TTNQcmRQYWNrUmVnbGFzPiA9IG51bGw7XHJcbiAgICBMb00zTGlzdGFQcmVjaW8gPSBuZXcgQXJyYXk8TTNQcmRMaXN0YT4oKTtcclxuICAgIExvTTNQcmRMaXN0YSA9IG5ldyBNM1ByZExpc3RhKCk7XHJcbiAgICBNM0NvZHMgPSBuZXcgQXJyYXk8TTNDb2RzWFBSRD4oKTtcclxuICAgIEltcHVlc3RvcyA9IG5ldyBBcnJheTxNM1BSREltcHVlc3Rvcz4oKTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUFJESW1wdWVzdG9zIHtcclxuICAgIENvZEltcDogc3RyaW5nO1xyXG4gICAgTWV0b2RvbG9naWE6IHN0cmluZztcclxuICAgIFZhbG9yOiBudW1iZXI7XHJcbn0iLCJpbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZEFkaWNpb25hbGVzIH0gZnJvbSBcIi4vTTNQcmRBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zUHJkUGFja0J5VGlwbyB9IGZyb20gXCIuL20zLXBhY2stYnktdGlwb1wiO1xyXG5pbXBvcnQgeyBNM1BVbmlkTWVkaWRhIH0gZnJvbSBcIi4vbTNwLXVuaWQtbWVkaWRhXCI7XHJcbmltcG9ydCB7IE0zUHJkR3JwQXNvY2lhZG8gfSBmcm9tIFwiLi9NM1ByZEdycEFzb2NpYWRvXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVHlwZU0zUHJkR3JwIHtcclxuICAgIFNLUDE6IHN0cmluZztcclxuICAgIFJBVElORzogbnVtYmVyO1xyXG4gICAgRklDSEFURUNOSUNBOiBzdHJpbmc7XHJcbiAgICBNQVJDQTogc3RyaW5nO1xyXG4gICAgQ0xBU0lGSUNBQ0lPTjogc3RyaW5nO1xyXG4gICAgTk9NQlJFOiBzdHJpbmc7XHJcbiAgICBUSVBPOiBzdHJpbmc7XHJcbiAgICBDYW50aWRhZDogbnVtYmVyO1xyXG4gICAgQ2FtcG9zQWRpY2lvbmFsZXM6IHN0cmluZztcclxuICAgIExvTTNQcmRHZW5lcmFsID0gbmV3IEFycmF5PE0zUHJkR2VuZXJhbD4oKTtcclxuICAgIExvTTNQcmRBZGljaW9uYWxlcyA9IG5ldyBBcnJheTxNM1ByZEFkaWNpb25hbGVzPigpO1xyXG4gICAgTTNQQUNLQllUSVBPID0gbmV3IEFycmF5PE0zUHJkUGFja0J5VGlwbz4oKTtcclxuICAgIE0zUHJkR3JwQXNvY2lhZG86QXJyYXk8TTNQcmRHcnBBc29jaWFkbz4gPSBudWxsO1xyXG5cclxuICAgIGxpc3RJbWFnZW5lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICBJbXB1ZXN0b3MgPSBuZXcgQXJyYXk8VHlwZUltcHVlc3Rvc1BSRD4oKTtcclxuICAgIE0zUFVuaWRNZWRpZGE6IE0zUFVuaWRNZWRpZGE7XHJcblxyXG4gICAgZW5jb250cmFkb0xvY2FsOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG5cclxuICAgIH1cclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVHlwZUltcHVlc3Rvc1BSRCB7XHJcbiAgICBDb2RJbXA6IHN0cmluZztcclxuICAgIE1ldG9kb2xvZ2lhOiBzdHJpbmc7XHJcbiAgICBWYWxvcjogc3RyaW5nXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNQSW1wdWVzdG9ze1xyXG4gICAgcHVibGljIFBvcmNlbnRhamU6bnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlcjtcclxuICAgIHB1YmxpYyBMaW1pdGVPcHVlc3RvOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb2RJbXB1ZXN0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQmFzZTpudW1iZXI7XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIE0zUERldGFsbGVJdGVtcyB7XHJcbiAgICBwdWJsaWMgTm9tYnJlQ29uY2VwdG86IHN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQSXRlbXNXRUIge1xyXG4gICAgcHVibGljIGRDYW50aWRhZDogbnVtYmVyO1xyXG4gICAgcHVibGljIGRQcmVjaW9Ub3RhbDogbnVtYmVyO1xyXG4gICAgcHVibGljIEJpc1Byb2R1Y3RvUHJvbW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBCaXNPYnNlcXVpbzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBVbmlkYWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ2xhdmVQcmRTUlY6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ2xhdmVQcmRVbmlkYWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgSWRQcm9jZXNvOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG9ic2VydmFjaW9uOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHB1YmxpYyBTdWJFc3RhZG9fbzogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBFc3RhZG9fbzogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBQYXRoSW1hZ2VuOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHB1YmxpYyBJREVuY1JlcGV0aWRvOiBudW1iZXIgPSAtMTtcclxuICAgIHB1YmxpYyBJREVuY1Byb2Nlc2FkbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgSURFbmNQYWRyZTogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgVGlwb0FncnVwYWNpb246IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ29kaWdvQmFycmFzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIENhbXBvc0FkaWNpb25hbGVzID0gW107XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BEZXRhbGxlQ3Vwb24ge1xyXG4gICAgcHVibGljIElkQ3Vwb246IHN0cmluZztcclxuICAgIHB1YmxpYyBDYW50aWRhZDogbnVtYmVyO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBNM1BEaW5hbWljYXMge1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG59IiwiaW1wb3J0IHsgTTNQRGluYW1CeUFjdGl2aWRhZCB9IGZyb20gXCIuL20zLXBkaW5hbS1ieS1hY3RpdmlkYWRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BFbmNGUCB7XHJcbiAgICBwdWJsaWMgVmFsb3I6bnVtYmVyO1xyXG4gICAgcHVibGljIERlc2NyaXBjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBFc3RhZG86c3RyaW5nO1xyXG4gICAgcHVibGljIElkVGlwb1BhZ286bnVtYmVyOyAvLzE6IEVmZWN0aXZvIDI6IFRhcmpldGEgZGUgY3LDg8KpZGl0byAzOiBUYXJqZXRhIERlYml0byA0OiBQU0VcclxuICAgIHB1YmxpYyBJRDpudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsQ2FtYmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBWYWxPdHJhQ2xhc2k6bnVtYmVyID0wO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxuXHJcblxyXG4gICAgLy9WYXJpYWJsZXMgU29sb0Zyb250XHJcbiAgICBwdWJsaWMgQVBMQ2FtYmlvOnN0cmluZztcclxuICAgIHB1YmxpYyBBUExGaWRlbGl6YWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIGRlamFyX2JvcnJhcjpib29sZWFuID0gdHJ1ZTtcclxuXHJcbn0iLCJpbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUERldGFsbGVDdXBvbiB9IGZyb20gXCIuL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUEltcHVlc3RvcyB9IGZyb20gXCIuL20zLXAtaW1wdWVzdG9zXCI7XHJcbmltcG9ydCB7IFByb21vY2lvbkNvbWJpbmFkYSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM1BFbnZpb3MgfSBmcm9tIFwiLi9tMy1wLWVudmlvc1wiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUEVuY0l0ZW1zIHtcclxuICAgIHB1YmxpYyBJZFByb2R1Y3RvOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgTG90ZTogc3RyaW5nO1xyXG4gICAgcHVibGljIElEOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgT3JkZW46IG51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmU6IHN0cmluZztcclxuICAgIHB1YmxpYyBDb2RpZ29CYXJyYXM6IHN0cmluZztcclxuICAgIHB1YmxpYyBJZEVudmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBESVNQT05JQkxFOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIFBhdGhJbWFnZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTTNERVQgPSBuZXcgQXJyYXk8TTNQRGV0YWxsZUl0ZW1zPigpOyAgICBcclxuICAgIHB1YmxpYyBNM0RldEN1cG9uZXMgPSBuZXcgQXJyYXk8TTNQRGV0YWxsZUN1cG9uPigpO1xyXG4gICAgcHVibGljIE0zUEltcHVlc3RvcyA9IG5ldyBBcnJheTxNM1BJbXB1ZXN0b3M+KCk7XHJcbiAgICBwdWJsaWMgTTNQRGluYW1CeUFjdGl2aWRhZCA9IG5ldyBBcnJheTxNM1BEaW5hbUJ5QWN0aXZpZGFkPigpO1xyXG5cclxuICAgIC8vRXN0YXMgcHJvcGllZGFkZXMgbm8gc29uIHJlcGxpY2EgYSBiYXNlIGRlIGRhdG9zLCBzb24gcGFyYSB1c28gaW50ZXJuby5cclxuICAgIHB1YmxpYyBQcm9tb0NvbWJpbmFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPigpO1xyXG5cclxuICAgIHB1YmxpYyBJZEVuY1BhZHJlOm51bWJlcjtcclxuICAgIHB1YmxpYyBUaXBvQWdydXBhY2lvbjpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdW5pdGFyaWFcclxuICAgIHB1YmxpYyBHZXRQcmljZVVuaXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGVsIHByZWNpbyB1bml0YXJpYSwgY29uIGRlc2N1ZW50b3MgaW5jbHVpZG9zXHJcbiAgICBwdWJsaWMgR2V0UHJpY2VVbml0TmV0bygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdW5pdGFyaWEsIGNvbiBkZXNjdWVudG9zIGluY2x1aWRvc1xyXG4gICAgcHVibGljIFNldFByaWNlVW5pdE5ldG8oaVZhbG9yKSB7XHJcbiAgICAgICAgdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBpVmFsb3I7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdG90YWwuXHJcbiAgICBwdWJsaWMgR2V0UHJpY2VUb3RhbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUEVudmlvc3tcclxuICAgIHB1YmxpYyBJZEVudmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZEZvcm1hRW52aW86bnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZUZFbnZpbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRGlyZWNjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBQYWlzOnN0cmluZztcclxuICAgIHB1YmxpYyBDaXVkYWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxufSIsImV4cG9ydCBjbGFzcyBNM0ZUcmFiYWpve1xyXG4gICAgcHVibGljIElkSHViOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZFViaWM6bnVtYmVyO1xyXG4gICAgcHVibGljIElkSHViUHJlOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZFViaWNQcmU6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tIFwiLi9tMy1wZW5jLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUEVuY0ZQIH0gZnJvbSBcIi4vbTMtcGVuYy1mcFwiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tIFwiLi9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvIH0gZnJvbSBcIi4vbTMtcHJvbS1jb21iXCI7XHJcbmltcG9ydCB7IE0zRlRyYWJham8gfSBmcm9tIFwiLi9tMy1mLXRyYWJham9cIjtcclxuaW1wb3J0IHsgTTNQRW52aW9zIH0gZnJvbSBcIi4vbTMtcC1lbnZpb3NcIjtcclxuaW1wb3J0IHsgTTNQUmVjZXBjaW9uIH0gZnJvbSBcIi4vbTMtcHJlY2VwY2lvblwiO1xyXG5pbXBvcnQgeyBQcm9tb2Npb25Db21iaW5hZGEgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zUHJvbW9Qcm9jZXNhZGEuY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQZXJYUHJvY2VzbyB9IGZyb20gXCIuL20zLXBlci14LXByb2Nlc29cIjtcclxuaW1wb3J0IHsgTTNSZWdpc3Ryb1RyeCB9IGZyb20gXCIuL20zLXJlZy10cnhcIjtcclxuaW1wb3J0IHsgTTNPdENsYXNpZmljYWNpb25lcyB9IGZyb20gXCIuL20zLW90LWNsYXNpZmljYWNpb25lc1wiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG5leHBvcnQgY2xhc3MgTTNQcm9jZXNvcyB7XHJcbiAgICBwdWJsaWMgSWRNMzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRmVjaGE6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG9UZXJjZXJvOm51bWJlcjtcclxuICAgIHB1YmxpYyBURG9jOnN0cmluZztcclxuICAgIHB1YmxpYyBORG9jOnN0cmluZztcclxuICAgIHB1YmxpYyBVYmljMTpudW1iZXI7XHJcbiAgICBwdWJsaWMgVWJpYzI6bnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yTmV0bzpudW1iZXIgPTA7XHJcbiAgICBwdWJsaWMgVmFsb3I6bnVtYmVyID0wO1xyXG4gICAgcHVibGljIFZhbE90cmFDbGFzaTpudW1iZXIgPTA7XHJcbiAgICBwdWJsaWMgU3ViRXN0YWRvRGVzOnN0cmluZztcclxuICAgIHB1YmxpYyBFc3RhZG9EZXM6c3RyaW5nO1xyXG4gICAgcHVibGljIFN1YkVzdGFkb0FudDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRXN0YWRvQW50OnN0cmluZztcclxuICAgIHB1YmxpYyBUTUlkUHJvY2VzbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSUREaWFyaW86c3RyaW5nO1xyXG4gICAgcHVibGljIElERGlhcmlvQ2llcnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBJREh1YjpudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwb1RSWDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTTNFTkMgPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICBwdWJsaWMgTTNPdENsYXNpZmljYWNpb25lcyA9IG5ldyBBcnJheTxNM090Q2xhc2lmaWNhY2lvbmVzPigpO1xyXG4gICAgcHVibGljIGxNM1BEaW5hbWljYXMgPSBuZXcgQXJyYXk8TTNQRGluYW1pY2FzPigpO1xyXG4gICAgcHVibGljIE0zUGVyWFByb2Nlc28gPSBuZXcgQXJyYXk8TTNQZXJYUHJvY2Vzbz4oKTtcclxuICAgIHB1YmxpYyBsTTNQRW5jRlAgPSBuZXcgQXJyYXk8TTNQRW5jRlA+KCk7XHJcbiAgICBwdWJsaWMgTTNGVHJhYmFqbyA9IG5ldyBNM0ZUcmFiYWpvKCk7XHJcbiAgICBwdWJsaWMgTTNQRW52aW9zID0gbmV3IEFycmF5PE0zUEVudmlvcz4oKTtcclxuICAgIHB1YmxpYyBNM1BSZWNlcGNpb24gPSBuZXcgQXJyYXk8TTNQUmVjZXBjaW9uPigpO1xyXG4gICAgcHVibGljIGxNM1JlZ2lzdHJvVHJ4ID0gbmV3IEFycmF5PE0zUmVnaXN0cm9Ucng+KCk7XHJcbiAgICBwdWJsaWMgZXNwZXJhOiBib29sZWFuO1xyXG4gICAgcHVibGljIGZlY2hhSG9yYTogRGF0ZTtcclxuICAgIFxyXG4gICAgcHVibGljIEZlY2hhSG9yYUVzdGFkbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRFc3RhZG86c3RyaW5nO1xyXG5cclxuXHJcbiAgICAvL0VzdGFzIHByb3BpZWRhZGVzIG5vIHNvbiByZXBsaWNhIGEgYmFzZSBkZSBkYXRvcywgc29uIHBhcmEgdXNvIGludGVybm8uXHJcbiAgICAvL3B1YmxpYyBsTTNQcm9tQ29tYmluYWRhID0gbmV3IEFycmF5PE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvPigpO1xyXG5cclxuICAgIHB1YmxpYyBQcm9tb3NDb21iaW5hZGFzID0gbmV3IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4oKTtcclxuXHJcbiAgICBwdWJsaWMgQXBsUGFnb0VuTGluZWE6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBBcGxEZXNkZVNlcnZlcjpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIG5kb2NVQWN0aXZvOnN0cmluZzsgLy9KQUdNIDIwMTkxMDE3IE51ZXZvcyBwYXJhbWV0cm9zLHBhcmEgbGxldmFyIGVsIHJlZ2lzdHJvIGRlbCB1c3VhcmlvIGFjdGl2bywgcXVlIGNyZW8gZXN0ZSBwcm9jZXNvXHJcbiAgICBwdWJsaWMgdGRvY1VBY3Rpdm86c3RyaW5nOy8vSkFHTSAyMDE5MTAxNyBOdWV2b3MgcGFyYW1ldHJvcyxwYXJhIGxsZXZhciBlbCByZWdpc3RybyBkZWwgdXN1YXJpbyBhY3Rpdm8sIHF1ZSBjcmVvIGVzdGUgcHJvY2Vzb1xyXG4gICAgLy9wdWJsaWMgYkFQTENvbWJpbmFkYXNBY3VtOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuRmVjaGEgPW1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUFJlY2VwY2lvbntcclxuICAgIHB1YmxpYyBJZFJlY2VwY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRFbmM6bnVtYmVyO1xyXG4gICAgcHVibGljIENhbnRpZGFkOm51bWJlcjtcclxuICAgIHB1YmxpYyBGZWNoYTpEYXRlOyAgICBcclxuICAgIHB1YmxpYyBNM1BEaW5hbUJ5QWN0aXZpZGFkID0gbmV3IEFycmF5PE0zUERpbmFtQnlBY3RpdmlkYWQ+KCk7XHJcbiAgICBwdWJsaWMgRXN0YWRvOiBzdHJpbmc7XHJcbn0iLCJleHBvcnQgY2xhc3MgTTNQZXJYUHJvY2Vzb3tcclxuICAgIHB1YmxpYyBUaXBvUGVyc29uYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGRvYzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTmRvYzpzdHJpbmc7ICAgIFxyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRGVzY1RpcG9QOnN0cmluZztcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgIE0zT3RDbGFzaWZpY2FjaW9uZXN7XHJcbiAgICBwdWJsaWMgSUQ6bnVtYmVyO1xyXG4gICAgcHVibGljIElkUHJvZHVjdG86c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkOm51bWJlcjtcclxuICAgIHB1YmxpYyBPcmRlbjpudW1iZXI7Ly9WYXJpYWJsZSBkZSBvcmRlbmFtaWVudG8gZW4gZWwgZnJvbnRcclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VNM0ZFIHtcclxuXHJcbiAgICBwdWJsaWMgYWRkX3Byb2Nlc29fZ2VuZXJhckZFKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zRkUvYWRkX3Byb2Nlc29fZ2VuZXJhckZFL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZF9wcm9jZXNvX2dlbmVyYXJOQyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM0ZFL2FkZF9wcm9jZXNvX2dlbmVyYXJOQy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBhZGRQcm9jZXNvR2VuZXJhckZFQXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQganNvbjtcclxuICAgICAgICBsZXQgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNGRS9hZGRfcHJvY2Vzb19nZW5lcmFyRkUvXCIgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVzcClcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJDYXJ0YVBvcnRlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZG0zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbEZFTVgoXCJGRU1YL2dlbmVyYXJDYXJ0YVBvcnRlL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBpZG0zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJGRUFudGljaXBvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsRkVNWChcIkZFTVgvZ2VuZXJhckZFQW50aWNpcG9zL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJOQ0FudGljaXBvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbEZFTVgoXCJGRU1YL2dlbmVyYXJOQ0FudGljaXBvcy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEluZm9GYWN0dXJhRWxlY3Ryb25pY2EoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogaWRfa2F0aW9zLnRyaW0oKSB9O1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zRkUvZ2V0SW5mb0ZhY3R1cmFFbGVjdHJvbmljYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSW5mbylcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRIdG1sRnJvbUZFKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGlkTTM6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZXNwO1xyXG4gICAgICAgIGxldCBkYXRhID0geyAnaWRNMyc6IGlkTTMgfTtcclxuICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM0ZFL2dldEh0bWxGcm9tRkUvJyArIGlkS2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBJVV9JbmZvRmFjdHVyYUVsZWN0cm9uaWNhKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRmFjdHVyYTogYW55LCB1VEFjdGl2bzogc3RyaW5nLCB1TkFjdGl2bzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IGlkX2thdGlvcy50cmltKCksICdvRmFjdHVyYSc6IG9GYWN0dXJhLCAndVRBY3Rpdm8nOiB1VEFjdGl2bywgJ3VOQWN0aXZvJzogdU5BY3Rpdm8gfTtcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zRkUvSVVfSW5mb0ZhY3R1cmFFbGVjdHJvbmljYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsSW5zU2VyaWVzeFViaWMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNGRS9kZWxJbnNTZXJpZXN4VWJpYy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTsgICAgICAgIFxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihKU09OLnBhcnNlKEpTT04ucGFyc2UoZXJyW1wiX2JvZHlcIl0pLk1lc3NhZ2UpLlJFU1BVRVNUQVtcIjBcIl0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQcm9jZXNvU2VydmljZSB7XHJcblxyXG4gICAgcHVibGljIGFkZF9wcm9jZXNvRUEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiUHJvY2Vzb3NNMy9hZGRfcHJvY2Vzb0VBL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBNM0dldF9Qcm9jZXNvc1BvckNhbnRpZGFkKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnUHJvY2Vzb3NNMy9NM0dldF9Qcm9jZXNvc1BvckNhbnRpZGFkLycgKyBzSURLYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9sUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3MgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9sUHJvY2Vzb3MuUkVTUFVFU1RBLlRQLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvbFByb2Nlc29zLlJFU1BVRVNUQS5UUCA9IG5ldyBBcnJheShvbFByb2Nlc29zLlJFU1BVRVNUQS5UUCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBsYSBsaXN0YSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhLCB1biBhcnJheSBkZSBmaWx0cm9zLlxyXG4gICAgcHVibGljIE0zR2V0X0FjdGl2aWRhZGVzWVByb2Nlc29zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL00zR2V0X0FjdGl2aWRhZGVzWVByb2Nlc29zLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvbFByb2Nlc29zO1xyXG4gICAgICAgICAgICBvbFByb2Nlc29zID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgLy9TaSBsYXMgYWN0aXZpZGFkZXMgbm8gdmllbmVuIGNvbW8gdW4gYXJyYXksIGNvbnZlcnRpcmxvXHJcbiAgICAgICAgICAgIGlmIChvbFByb2Nlc29zLlJFU1BVRVNUQS5BQ1RJVklEQURFUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMgPSBuZXcgQXJyYXkob2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1NpIGxvcyBwcm9jZXNvcyBubyB2aWVuZW4gY29tbyB1biBhcnJheSwgY29udmVydGlybG9cclxuICAgICAgICAgICAgb2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMuZm9yRWFjaChBY3RpdmlkYWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjdGl2aWRhZC5QUk9DRVNPUyAhPT0gdW5kZWZpbmVkICYmIEFjdGl2aWRhZC5QUk9DRVNPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIEFjdGl2aWRhZC5QUk9DRVNPUyA9IG5ldyBBcnJheShBY3RpdmlkYWQuUFJPQ0VTT1MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgbGlzdGEgZGUgcHJvZHVjdG8sIHRlbmllbmRvIGVuIGN1ZW50YSwgdW4gYXJyYXkgZGUgZmlsdHJvcy5cclxuICAgIHB1YmxpYyBNM0dldF9NM1Byb2Nlc29zQnlJZFByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIHNJZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldF9NM1Byb2Nlc29zQnlJZFByb2Nlc28vJyArIHNJREthdGlvcyArICcvJyArIHNJZFByb2Nlc28sIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvbFByb2Nlc29zTTM7XHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3NNMyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGFzIGFjdGl2aWRhZGVzIG5vIHZpZW5lbiBjb21vIHVuIGFycmF5LCBjb252ZXJ0aXJsb1xyXG4gICAgICAgICAgICBpZiAob2xQcm9jZXNvc00zLlJFU1BVRVNUQS5TVUJFU1RBRE9TLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvbFByb2Nlc29zTTMuUkVTUFVFU1RBLlNVQkVTVEFET1MgPSBuZXcgQXJyYXkob2xQcm9jZXNvc00zLlJFU1BVRVNUQS5TVUJFU1RBRE9TKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TaSBsb3MgcHJvY2Vzb3Mgbm8gdmllbmVuIGNvbW8gdW4gYXJyYXksIGNvbnZlcnRpcmxvXHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3NNMy5SRVNQVUVTVEEuU1VCRVNUQURPUy5mb3JFYWNoKHN1YnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YnMuTTNQUk9DRVNPUyAhPT0gdW5kZWZpbmVkICYmIHN1YnMuTTNQUk9DRVNPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YnMuTTNQUk9DRVNPUyA9IG5ldyBBcnJheShzdWJzLk0zUFJPQ0VTT1MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvc00zKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgTTNwcm9jZXNvcywgZGVzZGUgZWwgaWRkaWFyaW8uXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0TTNQcm9jZXNvc0J5SWREaWFyaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZERpYXJpbzogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJJZERpYXJpb1wiOiBzSWREaWFyaW8gfTtcclxuICAgICAgICB2YXIgb00zUHJvY2VzbztcclxuICAgICAgICBvTTNQcm9jZXNvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL0dldE0zUHJvY2Vzb3NCeUlkRGlhcmlvLycgKyBzSURLYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIE0zcHJvY2Vzb3MsIFRlbmllbmRvIGVsIElETTMuICAgIFxyXG4gICAgcHVibGljIE0zR2V0X00zUHJvY2Vzb3NCeUlkTTMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJRE0zOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZywgc1ViaWNhY2lvbjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIHViaWNFeHRlcm5vID0gZmFsc2UsIGJBUExQYWdvc1BEID0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgdmFyIG9EYXRhO1xyXG4gICAgICAgIG9EYXRhID0geyBcIklkTTNcIjogc0lETTMsIFwiSWRQcm9jZXNvXCI6IHNJZFByb2Nlc28gfTtcclxuICAgICAgICBpZiAoYkFQTFBhZ29zUEQpIHtcclxuICAgICAgICAgICAgb0RhdGEuYkFQTFBhZ29zUEQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL0dldFByb2Nlc29NM0J5SWRNMy8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IGFueTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgLy9WYWxpZGFyIHF1ZSBsYSB1YmljYWNpb24gYWN0dWFsZXMgdmFsaWRhIHBhcmEgZWwgcHJvY2Vzb1xyXG4gICAgICAgICAgICAvL3BjYXN0cm8sIHNlIGNvbWVudGFyZWEgcG9ycXVlIG5vIGZ1bmNpb25hIGNvbiB0ZiwgcmV0b3JuYSBwYXJhIFRGIFNJRU1QUkUgTlVMTCwgbm8gc2UgbWFuZWphIHViaWNhY2lvbmVzXHJcbiAgICAgICAgICAgIC8vU2UgY29sb2NhIGRpZiBhIDAsIHBvciB2ZXJzaW9uIFRGLCBxdWUgbm8gdXRpbGl6YSBmdW5jaW9uYWxpZGFkIGRlIFViaWNhY2lvbmVzXHJcbiAgICAgICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZS50b1N0cmluZygpICE9IFwiMFwiICYmIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlLnRvU3RyaW5nKCkgIT0gc1ViaWNhY2lvbi50b1N0cmluZygpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXViaWNFeHRlcm5vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b21hIGVsIHByb2Nlc28gcXVlIHRpZW5lIHBvciBkaW5hbWljYSBfSURNM1JldG9tYWRvIGVsIGlkbTMgZW52YWlkbyBwb3IgcGFyYW1ldHJvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lETTMgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb3NCeUlkTTNSZXRvbWFkbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lETTM6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJpZE0zUmV0b21hZG9cIjogc0lETTMgfTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL2dldE0zUHJvY2Vzb3NCeUlkTTNSZXRvbWFkby8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgcHJvY2VzbyBNMywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkIE0zIHkgSWRwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lETTMgXHJcbiAgICAgKiBAcGFyYW0gc0lkUHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBzVWJpY2FjaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNHZXRfTTNQcm9jZXNvc0J5SWRNM0FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSURNMzogc3RyaW5nLFxyXG4gICAgICAgIHNJZFByb2Nlc286IHN0cmluZywgc1ViaWNhY2lvbjogc3RyaW5nLCBiQVBMUGFnb3NQRDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJJZE0zXCI6IHNJRE0zLCBcIklkUHJvY2Vzb1wiOiBzSWRQcm9jZXNvIH07XHJcbiAgICAgICAgdmFyIHJlc3A7XHJcbiAgICAgICAgaWYgKGJBUExQYWdvc1BEKSB7XHJcbiAgICAgICAgICAgIG9EYXRhLmJBUExQYWdvc1BEID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9HZXRQcm9jZXNvTTNCeUlkTTMvJyArIHNJREthdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgcHJvY2VzbyBNMywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkRGlhcmlvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gaWREaWFyaW8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtM19nZXRQcm9jZXNvTTNCeUlkRGlhcmlvQXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGlkRGlhcmlvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0RhdGE7XHJcbiAgICAgICAgb0RhdGEgPSB7IFwiaWREaWFyaW9cIjogaWREaWFyaW8gfTtcclxuICAgICAgICB2YXIgcmVzcDogYW55ID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL20zX2dldFByb2Nlc29NM0J5SWREaWFyaW8vJyArIHNJREthdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIGVzdHVyY3R1cmFzIGRlIGxhcyBjYXB0dXJhcyBkaW5hbWljYXMgYXNvY2lhZGFzIGF1biBwcm9jZW9zIHkgdW4gaWRwcm9jZXNvXHJcbiAgICBwdWJsaWMgbTNfZ2V0X2RhdGFfY2FwdF9kaW5hbShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy8vb0RhdGEgPSB7XCJpZF9wcm9jZXNvXCI6XCJcIixcImlkX3N1Yl9wcm9jZXNvXCI6XCJcIn07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL20zX2dldF9kYXRhX2NhcHRfZGluYW0vJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIFJldG9ybmEgZWwgUlBUZW1wbGF0ZSBwYXJhIGVsIGFybWFkbyBkZWwgUmVwb3J0ZVxyXG4gICAgLy8gICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAvLyAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgLy8gICogQHBhcmFtIGlkX3JlcCBcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIGFzeW5jIGdldF90ZW1wbGF0ZV9yZXBvcnRlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9yZXA6IHN0cmluZykge1xyXG4gICAgLy8gICAgIHZhciBvRGF0YTtcclxuICAgIC8vICAgICB2YXIgcmVzcDtcclxuICAgIC8vICAgICB2YXIgb0pzb247XHJcbiAgICAvLyAgICAgb0RhdGEgPSB7IFwiaWRfcmVwXCI6IGlkX3JlcCB9O1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvZ2V0X3RlbXBsYXRlX3JlcG9ydGUvJyArIGlkX2thdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgLy8gICAgICAgICBvSnNvbiA9IEpTT04ucGFyc2UocmVzcCk7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBvSnNvbjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgY2F0Y2h7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbG9zIHByb2Nlc29zIGFzb2NpYWRvcyBhIHVuYSBwZXJzb25hXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0RhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb0J5UGVyc29uYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL00zR2V0UHJvY2Vzb0J5UGVyc29uYS8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb0J5SWREaWFyaW9DaWVycmUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldFByb2Nlc29CeUlkRGlhcmlvQ2llcnJlLycgKyBpZF9rYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHByb2Nlc29zIE9mZiBsaW5lXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0RhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb3NPZmZMaW5lKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvTTNHZXRQcm9jZXNvc09mZkxpbmUvJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9lbmEgZWwgVERldGFsbGVQcm9jZXNvIGRlIHVuIHByb2Nlc28gZGFkb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM19kZXRhbGxlUHJvY2Vzb0J5UHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9tM19kZXRhbGxlUHJvY2Vzb0J5UHJvY2Vzby8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKS5SRVNQVUVTVEEuRGV0YWxsZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2YWxpZGFyRXhpc3RlbmNpYVByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL3ZhbGlkYXJFeGlzdGVuY2lhUHJvY2Vzby8nICsgaWRLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIG9Qcm9kdWN0bzogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgIHB1YmxpYyBQcmVjaW9Ub3RhbDogbnVtYmVyOyAvL1ByZWNpbyBpbmNsdXllbmRvIGxhcyBwcm9tb2Npb25lc1xyXG4gICAgcHVibGljIFByZWNpb1RvdGFsUHJvbW9jaW9uOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsb3JUb3RhbE1vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIExpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByb21vY2lvbmVzQXNvY2lhZGFzIHtcclxuICAgIHB1YmxpYyBJRFByb21vY2lvbjogbnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZTtcclxuICAgIHB1YmxpYyBWYWxvcjtcclxuICAgIHB1YmxpYyBWYWxvclBvcmNlbnRhamUgPSAwO1xyXG4gICAgcHVibGljIExpc3RPYnNTS1UgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgcHVibGljIFByb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhID0gbnVsbDtcclxuICAgIHB1YmxpYyBWYWxvck1vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIElkQ3Vwb246IHN0cmluZyA9IG51bGw7XHJcbiAgICBwdWJsaWMgUmVnbGE6IHN0cmluZztcclxuICAgIHB1YmxpYyBBcGxpY2FkYTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBUaXBvOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgUmVnbGFPYnNlcTogc3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkT2JzZXE6IG51bWJlcjtcclxuICAgIHB1YmxpYyBmbGFncyA9IHsgZm9ybWFQYWdvOiBmYWxzZSB9O1xyXG4gICAgcHVibGljIGxJZEFjdGl2YVByb21vOiBBcnJheTxudW1iZXI+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUHJvbW9jaW9uQ29tYmluYWRhIHtcclxuICAgIHB1YmxpYyBJZFByb21vY2lvblhQcm9jZXNvOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb25Db21iaW5hZGE6IG51bWJlcjtcclxuICAgIHB1YmxpYyBUaXBvMjogc3RyaW5nO1xyXG4gICAgcHVibGljIE5vbWJyZTogc3RyaW5nO1xyXG4gICAgcHVibGljIEFjY2lvbjogYW55O1xyXG4gICAgLy9wdWJsaWMgSWRDb25kaWNpb246c3RyaW5nOyAvL0VzdG8gcGFyYSBhZ3J1cGFjaW9uIGRlIGxhIHByb21vY2lvbiBkZSBjb21iby5cclxufSIsImV4cG9ydCBjbGFzcyBNYXRoVEYge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByb3VuZChhOiBhbnksIGRlY2ltYWxzOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgbXVsdGlwbG9EZTEwID0gTWF0aC5wb3coMTAsIGRlY2ltYWxzKTtcclxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgrYSAqIG11bHRpcGxvRGUxMCkgLyBtdWx0aXBsb0RlMTA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJvdW5kVjIoYTogYW55LCBkZWNpbWFsczogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoKCsoTWF0aC5yb3VuZCgrKGEgKyAnZScgKyBkZWNpbWFscykpICsgJ2UnICsgLWRlY2ltYWxzKSkudG9GaXhlZChkZWNpbWFscykpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgdG9GaXhlZChudW1iZXIsIGRlY2ltYWxzKSB7XHJcbiAgICAgICAgdmFyIHggPSBNYXRoLnBvdygxMCwgTnVtYmVyKGRlY2ltYWxzKSArIDEpO1xyXG4gICAgICAgIHJldHVybiAoTnVtYmVyKG51bWJlcikgKyAoMSAvIHgpKS50b0ZpeGVkKGRlY2ltYWxzKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgTTNFTkNQUk9NTyB9IGZyb20gJy4vTW9kZWxzL00zRU5DUFJPTU8uY2xhc3MnO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gJy4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGUnO1xyXG5pbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gJy4vTW9kZWxzL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzJztcclxuaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSAnLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlJztcclxuaW1wb3J0IHsgTTNERVRDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNERVRDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgUHJvbW9jaW9uZXNBc29jaWFkYXMsIFByb21vY2lvblByb2Nlc2FkYSwgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSAnLi9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCB7IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvbS1jb21iJztcclxuaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zJztcclxuaW1wb3J0IHsgTTNQRW5jRlAgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWZwJztcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhcyc7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tICcuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgX2l0ZXJhYmxlRGlmZmVyc0ZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jb3JlL3NyYy9hcHBsaWNhdGlvbl9tb2R1bGUnO1xyXG5pbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUEl0ZW1zV0VCIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXMnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRHZW5lcmFsLnR5cGUnO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tICcuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvJztcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlJztcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlJztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcbmV4cG9ydCBjbGFzcyBwcm9tb2Npb25lc1NlcnZpY2Uge1xyXG4gICAgcHVibGljIG9NYXRoVEY6IE1hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHB1YmxpYyBnb0RhdGFVc2VyOiBhbnk7XHJcbiAgICBwdWJsaWMgZ29EYXRhQWRpY2lvbmFsOiBNM1BJdGVtc1dFQjtcclxuICAgIHB1YmxpYyBnb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9EYXRhVXNlcjogYW55LCBvRGF0YUFkaWNpb25hbDogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0aGlzLmdvRGF0YVVzZXIgPSBvRGF0YVVzZXI7XHJcbiAgICAgICAgdGhpcy5nb0RhdGFBZGljaW9uYWwgPSBvRGF0YUFkaWNpb25hbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlcmF0b3JzID0ge1xyXG4gICAgICAgICc8JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPCBiIH0sXHJcbiAgICAgICAgJz4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA+IGIgfSxcclxuICAgICAgICAnPD0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA8PSBiIH0sXHJcbiAgICAgICAgJz49JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPj0gYiB9LFxyXG4gICAgICAgICdJR1VBTCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09IGIgfSxcclxuICAgICAgICAnRElGRic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICE9IGIgfSxcclxuICAgICAgICAnRU4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB9LFxyXG4gICAgICAgICdBTkQnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiIH0sXHJcbiAgICAgICAgJ09SJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfHwgYiB9LFxyXG4gICAgICAgICcqJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRydWUgfSxcclxuICAgICAgICAnTU9EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgJSBiID09IDAgfSxcclxuICAgICAgICAvLyAuLi5cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vVmVyaWZpY2FyIHByb21vY2lvbmVzLCBpbmdyZXNhbmRvIGNvbW8gcGFyYW1ldHJvIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIHZhbGlkYXIsIFViaWNhY2lvblxyXG4gICAgcHVibGljIFZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgbFRpcG9zUHJvbW86IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGFSZXNwcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGFQcm9tb2Npb25lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgdGhpcy5nb00zRU5DUFJPTU8gPSBvTTNFTkNQUk9NTztcclxuICAgICAgICBpZiAob00zRU5DUFJPTU8pIHtcclxuICAgICAgICAgICAgb00zRU5DUFJPTU8uZmlsdGVyKHggPT4gbFRpcG9zUHJvbW8uZmluZChwcm9tbyA9PiB4LlRpcG8gPT0gcHJvbW8pKS5mb3JFYWNoKGVuY2FiZXphZG9Qcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZFZpZ2VuY2lhID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLlZpZ2VuY2lhKTtcclxuICAgICAgICAgICAgICAgIHZhciBkSW5pY2lvID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLkluaWNpbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMDIzLCBzZSBxdWl0YSBUaXBvIE1hbnVhbCwgeSBzZSBkZWphIGVsIG51ZXZvIHBhcmFtZXRyby5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXJFc3RhZG9zRW5jUHJvbW8oZW5jYWJlemFkb1Byb21vKSAmJiAoZW5jYWJlemFkb1Byb21vLkVzdGFkbyAmJiBkVmlnZW5jaWEgPj0gaG95ICYmIGRJbmljaW8gPD0gaG95KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vLy8vLy8gVmFsaWRhY2lvbjogMS4gU2kgZXMgZGlmZXJlbnRlIGEgTWFudWFsLCBubyB2YWxpZGEgVmFyaWFibGUgZXN0YWRvcyBtYW51YWxlcy4gRGUgbG8gY29udHJhcmlvIGxvIHZhbGlkYS4gLS0tIDIuIFNpIGVsIGVzdGFkbyBlbCBlc3RhZG8gZXMgdmVyZGFkZXJvIHkgbGEgdmlnZW5jaWEgZXMgbWF5b3IgbyBpZ3VhbCBhIGxhIGZlY2hhIGRlbCBtb21lbnRvXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaChhZ3J1cGFjaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckFncnVwYWNpb25Qcm9tbyhvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBhZ3J1cGFjaW9uLCBlbmNhYmV6YWRvUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFSZXNwcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2V0SlJlc3BGcm9tQXJyYXkoYVJlc3BzLCBlbmNhYmV6YWRvUHJvbW8uVGlwbywgZW5jYWJlemFkb1Byb21vLlRpcG8yKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVmFsaWRhY2lvbiBkZSBhY2Npb24sIHNpIGV4aXN0ZSwgc2lubyBleGlzdGUgc2UgYWdyZWdhIGRlbCBwYXBhLiBTZSBlbnZpYSBjb21vIHJlZmVyZW5jaWEganJlc3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBlbmNhYmV6YWRvUHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihlbmNhYmV6YWRvUHJvbW8sIGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYVByb21vY2lvbmVzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gYVByb21vY2lvbmVzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhckVzdGFkb3NFbmNQcm9tbyhlbmNhYmV6YWRvUHJvbW86IE0zRU5DUFJPTU8pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZXN0YWRvID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc01hbnVhbCAmJiAhZW5jYWJlemFkb1Byb21vLkVzdGFkb01hbnVhbGVzKSB7XHJcbiAgICAgICAgICAgIGVzdGFkbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc0FwbEN1cG9uICYmICFlbmNhYmV6YWRvUHJvbW8uRXN0YWRvQXBsQ3Vwb24pIHtcclxuICAgICAgICAgICAgZXN0YWRvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXN0YWRvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGFncnVwYWNpb24gZGUgcHJvbW9jaW9uZXMsIGluZ3Jlc2FuZG8gY29tbyBwYXJhbWV0cm8gbGEgaW5mb3JtYWNpb24gZGVsIHByb2R1Y3RvIGEgdmFsaWRhciwgVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQWdydXBhY2lvblByb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGFncnVwYWNpb246IE0zQ09ORElBR1JVUEFDSU9OLCBvTTNFbmNQcm9tbzogTTNFTkNQUk9NTykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaWNpb246IE0zQ09ORElQUk9NTztcclxuICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcztcclxuICAgICAgICAgICAgY29uZGljaW9uID0gYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9baV07XHJcbiAgICAgICAgICAgIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmICghakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEIHx8IGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBcIlJFR0lTVFJPXCIpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG9NM0VuY1Byb21vLlRpcG8gPT0gXCJDT01CSU5BREFcIiAmJiBvTTNFbmNQcm9tby5UaXBvMiA9PSBcIkNPTUJPXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uICYmIGFncnVwYWNpb24uT3BlcmFkb3IudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJPUlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZ3J1cGFjaW9uLk9wZXJhZG9yLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQU5EXCIgJiYgIWpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vTGEgY29uZGljaW9uIE5PIHNlIGN1bXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWdydXBhY2lvbi5PcGVyYWRvci50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIk9SXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9MYSBjb25kaWNpb24gc2UgY3VtcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGRlYmUgZ3VhcmRhciBsYSBpbmZvcm1hY2nDg8Kzbi4gU2kgc2llbXByZSBmdWVyb24gT1IgeSBGQUxTRSwgc2UgZGViZSBjb21wYXJhciBjb21vIHVuIEFORC5cclxuICAgICAgICAgICAgICAgICAgICBhUmVzcHMucHVzaChqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRKUmVzcEZyb21BcnJheShhUmVzcHMsIG9NM0VuY1Byb21vLlRpcG8sIG9NM0VuY1Byb21vLlRpcG8yKTtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbmRpY2lvbiBkZSBwcm9tb2Npb25lcy5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PKSB7XHJcbiAgICAgICAgdmFyIGpBZGljaW9uYWVzO1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqQWRpY2lvbmFlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckNvbmRpY2lvbkNvbnRyYURhdGEob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgY29uZGljaW9uLCBqQWRpY2lvbmFlcyk7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBjb25kaWNpb24uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICB0aGlzLkFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uKTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGEganNvbiBkZSByZXNwdWVzdGEgc2kgc2UgZ2VuZXJvIE9LIGxhIGluZm9ybWFjaW9uIGRlIGxhIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpSZXNwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8pIHtcclxuICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLklEQ29uZGljaW9uID0gY29uZGljaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WZXJpZmljYSBjb25kaWNpb24sIGNvbnRyYSBkYXRhIGluZ3Jlc2FkYS5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25Db250cmFEYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpOiBhbnkge1xyXG4gICAgICAgIHZhciBvYmplY3RGaW5kZWQ7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuRXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvL1ZhIGEgZXN0cnVjdHVyYSBkZSBwcm9kdWN0byBhZGljaW9uYWxcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMb00zUHJkQWRpY2lvbmFsZXNcIjpcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RGaW5kZWQgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaWMgPT4gYWRpYy5BVFJJQlVUTy50cmltKCkgPT0gY29uZGljaW9uLkNvbmNlcHRvLnRyaW0oKSAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oYWRpYy5WQUxPUi50cmltKCksIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKVxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEZpbmRlZC5KQWRpY2lvbmFsZXMgPSBKU09OLnN0cmluZ2lmeShqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9iamVjdEZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUFJEVE9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0sIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUkRHUlBcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvUFJER1JQKG9UeXBlTTNQcmRHcnAsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJNM0RFVENPTkRJUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbi5NM0RFVENPTkRJUFJPTU8sIGNvbmRpY2lvbi5Db25jZXB0bywgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9DRVNPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfUEFHT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJQcm9jZXNvRm9ybWFQYWdvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfTElTVEFQXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLnZlcmlmaWNhclByb2Nlc29MaXN0YVByZWNpbyhvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YSwgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFESUNJT05BTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQ0FSQUNURVJJU1RJQ0FTXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vRXN0YSBwcm9tb2Npw4PCs24gZXN0YSBkaXNlw4PCsWFkYSBwYXJhIHF1ZSBzZWEgcHJvY2VzYWRhIGFsIGZpbmFsIGRlIGxhIHRyYW5zYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24uTTNERVRDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRKUmVzcEZyb21BcnJheShhUmVzcHM6IEFycmF5PGFueT4sIHRpcG8sIHRpcG8yKSB7XHJcbiAgICAgICAgdmFyIGJBUExDb25kaWNpb247XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIGlmIChhUmVzcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvL0xMZWdhIGEgZXN0ZSBwdW50bywgcG9yIGFsZ3VuYSBkZSAyIHJhem9uZXM6IFxyXG4gICAgICAgICAgICAvLzEuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBPUiB5IHRvZG9zIHNvbiBGQUxTRVxyXG4gICAgICAgICAgICAvLzIuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBBTkQgeSB0b2RvcyBzb24gVFJVRVxyXG4gICAgICAgICAgICBiQVBMQ29uZGljaW9uID0gYVJlc3BzLmZpbHRlcihyZXNwID0+IHJlc3AuQVBMQ29uZGljaW9uKTtcclxuICAgICAgICAgICAgaWYgKCFiQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aXBvID09IFwiQ09NQklOQURBXCIgJiYgdGlwbzIgPT0gXCJDT01CT1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFycmVnbG9Db25kaWNpb25lcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGJBUExDb25kaWNpb24uZm9yRWFjaChjb25kaWNpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uLklEQ29uZGljaW9uLmxlbmd0aCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb24uSURDb25kaWNpb24uZm9yRWFjaChpZENvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJlZ2xvQ29uZGljaW9uZXMuZmluZCh4ID0+IHggPT0gaWRDb24pKSBhcnJlZ2xvQ29uZGljaW9uZXMucHVzaChpZENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyZWdsb0NvbmRpY2lvbmVzLmZpbmQoeCA9PiB4ID09IGNvbmRpY2lvbi5JRENvbmRpY2lvbikpIGFycmVnbG9Db25kaWNpb25lcy5wdXNoKGNvbmRpY2lvbi5JRENvbmRpY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBBUExDb25kaWNpb246IHRydWUsIEFjY2lvbjogbnVsbCwgSURDb25kaWNpb246IGFycmVnbG9Db25kaWNpb25lcyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFSZXNwVE1QID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICAvL1ZlcmlmaWNhciBzaSBhbGd1bm8gZGUgbG9zIGFycmVnbG9zIHRpZW5lIGFjY2lvbiBkaWZlcmVudGUgYSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BUTVAgPSBhUmVzcHMuZmlsdGVyKHJlc3AgPT4gcmVzcC5BY2Npb24gIT0gbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFSZXNwVE1QLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc2FyIGVsIHVsdGltbyBpdGVtLCBxdWUgdGVuZ2EgbGEgYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gYVJlc3BUTVBbYVJlc3BUTVAubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSBhUmVzcHNbYVJlc3BzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGEgcHJvbW8gZGVwZW5kZSBkZSBsYSBmb3JtYSBkZSBwYWdvIGHDg8KxYWRlIGVzdGEgaW5mb3JtYWNpw4PCs25cclxuICAgICAgICAgICAgaWYgKGFSZXNwcy5maW5kKHggPT4geC5Gb3JtYVBhZ28pKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcFtcIkZvcm1hUGFnb1wiXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLy9HZW5lcmFyIFJlc3B1ZXN0YSBkZSBjb25kaWNpb24uXHJcbiAgICBwdWJsaWMgR2VuZXJhclJlc3B1ZXN0YShiQVBMUHJvbW86IGJvb2xlYW4sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqUmVzcCA9IHsgXCJBUExDb25kaWNpb25cIjogYkFQTFByb21vLCBcIkFjY2lvblwiOiBudWxsIH07XHJcbiAgICAgICAgaWYgKGpBZGljaW9uYWxlcyAhPSBudWxsICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLkFjY2lvbiA9IGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGxQcmVjaW9zOiBBcnJheTxhbnk+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB2YWxvcmVzOiBBcnJheTxhbnk+ID0gY29tYmkuQWNjaW9uLlZhbG9yZXM7XHJcbiAgICAgICAgICAgIC8vdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IGxQcmVjaW9zLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIGJFbnRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiAoYS5DYW50aWRhZCA8IGIuQ2FudGlkYWQpID8gMSA6ICgoYi5DYW50aWRhZCA8IGEuQ2FudGlkYWQpID8gLTEgOiAwKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLkFwbGljYXJQcm9tb0J5VmFsb3Jlcyh2YWxvcmVzLCBsUHJlY2lvcywgbFByZWNpb3MubGVuZ3RoKTsvL0pBR00gMjAxOTA3MzEsIGZ1bmNpb24gcmVjdXJzaXZhIHBhcmEgY2FsY3VsYXIgbG9zIHByZWNpb3MgbnVldm9zLlxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBsUHJlY2lvczogQXJyYXk8YW55PiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55ID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JlczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5WYWxvcmVzO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiBhLkNhbnRpZGFkIC0gYi5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWxvclByb21vID0gaSA8IHZhbG9yZXMubGVuZ3RoID8gdmFsb3Jlc1tpXS5WYWxvciA6IDBcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSAoKCtsUHJlY2lvc1tpXS5QVU5JVE5FVE8pICogKCgrdmFsb3JQcm9tbykgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBBcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlczogQXJyYXk8YW55PiwgbFByZWNpb3M6IEFycmF5PGFueT4sIHJlc2lkdW9FbnRyYW50ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IHJlc2lkdW9FbnRyYW50ZTsvLyBKQUdNIDIwMTkwNzMxIG51ZXZvIHBhcmFtZXRybyA9IGxQcmVjaW9zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxvcmVzLmxlbmd0aDsgaSsrKSB7Ly9KQUdNIDIwMTkwNzMwIHNlIGFncmVnYSBmdW5jaW9uYWxpZGFkIHBhcmEgcXVlIHNlIHB1ZWRhIHRlbmVyIHZhcmlvcyB2YWxvcmVzLlxyXG4gICAgICAgICAgICB2YXIgaUNhbnRpZGFkUHJvbW86IG51bWJlciA9IHZhbG9yZXNbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHZhciB2YWxvclByb21vOiBudW1iZXIgPSB2YWxvcmVzW2ldLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgICAgIHZhciBSZXNpZHVvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIFJlc2lkdW8gPSBpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlcywgbFByZWNpb3MsIFJlc2lkdW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSArbFByZWNpb3MubGVuZ3RoIC0gK3Jlc2lkdW9FbnRyYW50ZTsgaSA8ICtsUHJlY2lvcy5sZW5ndGggLSArUmVzaWR1bzsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gK2xQcmVjaW9zW2ldLlBVTklUTkVUTyAtICgoK2xQcmVjaW9zW2ldLlBVTklUTkVUTykgKiAoKCt2YWxvclByb21vKSAvIDEwMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFybWFyIG51ZXZvIGFycmVnbG8sIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBhcnJlZ2xvIGVudHJhbnRlLiBTZSByZWNvcnJlIGRlIGF0cmFzIGhhY2lhIGFkZWxhbnRlIHkgc2UgdmEgY3JlYW5kbyBlbCBudWV2byBhcnJlZ2xvXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gcmVzaWR1byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFybWFyTnVldm9BcnJheURlc2RlUmVzaWR1byhsUHJlY2lvczogQXJyYXk8YW55PiwgcmVzaWR1bykge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc1Jlc2lkdW8gPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbFByZWNpb3MubGVuZ3RoIC0gMTsgaSA+IHJlc2lkdW87IGktLSkge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NSZXNpZHVvLnB1c2gobFByZWNpb3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBcm1hck51ZXZvQXJyYXREZXNkZVJlc2lkdW9cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsUHJlY2lvc1Jlc2lkdW87XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcHJvbW9jaW9uZXMgcG9yIHByb2Nlc29zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGVsIE0zIHByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgT2JqZXRvLCBjb24gbGEgaW5mb3JtYWNpb24gZGUgdG9kb3MgbG9zIE0zUHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gT2JqZXRvIGNvbiBpbmZvcm1hY2lvbiBkZSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBkZSBpbmZvcm1hY2lvbiBhZGljaW9uYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGVsIHByb2Nlc28gdGllbmUgdW5hIGZvcm1hIGRlIHBhZ28gcXVlIGN1bXBsYSBjb24gbGEgY29uZGljaW9uIGVudHJhbnRlLCBoYWNlIHVuICBwYXNzIHRydWUsIGxhIGxvZ2ljYSBzZSBoYWNlIGRlc2RlIGxhIGZvcm1hIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJvY2Vzb0Zvcm1hUGFnbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIGxldCBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIGpSZXNwW1wiRm9ybWFQYWdvXCJdID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgdmVyaWZpY2FyUHJvY2Vzb0xpc3RhUHJlY2lvKG9MaXN0YVByZWNpbzogTTNQcmRMaXN0YSwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9MaXN0YVByZWNpb1tjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHByb21vY2lvbmVzIHBvciBwcm9jZXNvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBNMyBwcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIE0zIFByb2Nlc29zIE9iamV0bywgY29uIGxhIGluZm9ybWFjaW9uIGRlIHRvZG9zIGxvcyBNM1Byb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvZHVjdG8ob00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob00zUHJkR2VuZXJhbFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBkZSBwcm9kdWN0byBhZ3J1cGFkby5cclxuICAgICAqIEBwYXJhbSBvVHlwZU0zUHJkR3JwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvZHVjdG9QUkRHUlAob1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob1R5cGVNM1ByZEdycFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBhZGljaW9uYWwsIGVzdGEgaW5mb3JtYWNpb24gYWRpY2lvbmFsIGVzdGEgZW4gdW5hIHZhcmlhYmxlIGdsb2JhbDogZ29EYXRhQWRpY2lvbmFsXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICBpZiAodGhpcy5nb0RhdGFBZGljaW9uYWxbY29uZGljaW9uLkNvbmNlcHRvXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXSh0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIk1PRFwiICYmICt0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dID4gK2NvbmRpY2lvbi5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgaW5mb3JtYWNpb24gY29udHJhIHVzdWFyaW8gZGF0YS5cclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICBpZiAodGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10gIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0odGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10uaW5jbHVkZXMoJywnKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10uc3BsaXQoJywnKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShlbGVtZW50LCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbnRyYSBlbCBkZXRhbGxlIGRlIGxhIGNvbmRpY2nDg8KzblxyXG4gICAgcHVibGljIFZlcmlmaWNhY2lvbk0zRGV0YWxsZUNvbmRpY2lvbihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLFxyXG4gICAgICAgIGRldENvbmRpY2lvbmVzOiBBcnJheTxNM0RFVENPTkRJUFJPTU8+LCBjb25jZXB0b0NvbmRpY2lvbjogc3RyaW5nLCBqQWRpY2lvbmFsZXNDb25kaWNpb24pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIG9kZXRDb25kaWNpb25lc0ZpbmRlZDtcclxuICAgICAgICBzd2l0Y2ggKGNvbmNlcHRvQ29uZGljaW9uLnRyaW0oKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLUDFcIjpcclxuXHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLCBvVHlwZU0zUHJkR3JwLlNLUDEpKTtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9TS1AxKzJcIjpcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIG9UeXBlTTNQcmRHcnAuU0tQMSArIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uU0tQMikpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLVVwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLlNLVS50b1N0cmluZygpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX0RJU1BcIjpcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUudG9TdHJpbmcoKSwgZGV0LlZhbG9yLnRvU3RyaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfVElQT1wiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVHlwZU0zUHJkR3JwLlRJUE8udG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFwiUEVSX1BST0NFU09cIjovLyogU29sbyB2YWxpZGEgdW5hIGRldENvbmRpY2lvblxyXG4gICAgICAgICAgICAgICAgbGV0IHBlclhQcm9jZXNvOiBNM1BlclhQcm9jZXNvO1xyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgcGVyWFByb2Nlc28gPSBvTTNQcm9jZXNvcy5NM1BlclhQcm9jZXNvLmZpbmQoeCA9PiB4LlRpcG9QZXJzb25hID09IGRldENvbmRpY2lvbmVzWzBdLlZhbG9yLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJFTlwiICYmIHBlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXNbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uID09IFwiRElGRlwiICYmICFwZXJYUHJvY2Vzbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzWzBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiQUxNQUNFTlwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvTTNVYmljYWNpb24uSURVYmljYWNpb24udG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiSE9SQVJJT19IT1JBXCI6XHJcbiAgICAgICAgICAgICAgICB2YXIgb1RpbWVOb3c6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVGltZU5vdy5nZXRIb3VycygpLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIkxvTTNQcmRBZGljaW9uYWxlc1wiOlxyXG4gICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuQ29uY2VwdG8gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBWbHJBZGkgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5Db25jZXB0bykuVkFMT1JcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IudG9TdHJpbmcoKSwgVmxyQWRpLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgLy9Qcm9jZXNvc1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb25jZXB0b0NvbmRpY2lvbi5zcGxpdChcIl9cIilbMF0udHJpbSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlBST0NcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gY29uY2VwdG9Db25kaWNpb24uc3BsaXQoXCJfXCIpWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgb00zUHJvY2Vzb3NbcHJvcGVydHldKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVU0VSXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGNvbmNlcHRvQ29uZGljaW9uLnNwbGl0KFwiX1wiKVsxXS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtwcm9wZXJ0eV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJObyBFbnRybyBwb3IgRGV0YWxsZSFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL1ZhbGlkYXIgcmVzcHVlc3RhLCBjb24gb2JqZXRvIGEgdmFsaWRhclxyXG4gICAgcHVibGljIFZhbGlkYXJSZXNwdWVzdGEob2JqZWN0VmFsaWRhdGUpIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGpBZGljaW9uYWxlcztcclxuICAgICAgICBpZiAob2JqZWN0VmFsaWRhdGUpIHtcclxuICAgICAgICAgICAgakFkaWNpb25hbGVzID0gSlNPTi5wYXJzZShvYmplY3RWYWxpZGF0ZS5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MjUgQWdyZWdhciBzZWNjaW9uIGRlIHZhbGlkYWNpb25lcy5cclxuICAgICAgICAgICAgdmFyIGJSZXNwID0gdGhpcy5WYWxpZGFjaW9uZXNCeUpBZGljaW9uYWxlcyhqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIGlmIChiUmVzcCkge1xyXG4gICAgICAgICAgICAgICAgLy9TZSBlbnZpYSBlbiBhZGljaW9uYWxlcywgZWwganNvbiBkZSBsYSBpbmZvcm1hY2lvbiBlbmNvbnRyYWRhIGRlbCBkZXRhbGxlLlxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcmVnbGFzIGNvbmZpZ3VyYWRhcyBkZXNkZSBKU09OIGRlIEFkaWNpb25hbGVzXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhY2lvbmVzQnlKQWRpY2lvbmFsZXMoakFkaWNpb25hbGVzOiBhbnkpIHtcclxuICAgICAgICB2YXIgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlZhbGlkYWNpb25lc0J5SkFkaWNpb25hbGVzXCIpXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTICYmIGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5USVBPKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5USVBPKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlZJR0VOQ0lBXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdGhpcy5WYWxpZGFyVmlnZW5jaWEoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlZBTDEsIGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5WQUwyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqRXJyb3JcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBWYWxpZGFyVmlnZW5jaWEodmFsMTogRGF0ZSwgdmFsMjogRGF0ZSkge1xyXG5cclxuICAgICAgICB2YXIgRmVjaGFBY3R1YWwgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHZhbDEpXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codmFsMilcclxuXHJcbiAgICAgICAgLy8gdmFyIGRWYWwxID0gbmV3IERhdGUodmFsMSk7XHJcbiAgICAgICAgLy8gdmFyIGRWYWwyID0gbmV3IERhdGUodmFsMik7XHJcblxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGRWYWwxKVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGRWYWwyKVxyXG5cclxuXHJcbiAgICAgICAgdmFyIG5GZWNoYUFjdHVhbDogbnVtYmVyID0gK3RoaXMuR2V0RmVjaGFOdW1iZXIoRmVjaGFBY3R1YWwpOyAvLysoRmVjaGFBY3R1YWwuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBGZWNoYUFjdHVhbC5nZXRNb250aCgpICsgXCJcIiArIEZlY2hhQWN0dWFsLmdldERhdGUoKSk7XHJcbiAgICAgICAgdmFyIG5WYWwxOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcih2YWwxKTsgLy8rKGRWYWwxLmdldEZ1bGxZZWFyKCkgKyBcIlwiICsgZFZhbDEuZ2V0TW9udGgoKSArIFwiXCIgKyAoK2RWYWwxLmdldERhdGUoKSArIDEpICk7XHJcbiAgICAgICAgdmFyIG5WYWwyOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcih2YWwyKSAvLysoZFZhbDIuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkVmFsMi5nZXRNb250aCgpICsgXCJcIiArICgrZFZhbDIuZ2V0RGF0ZSgpICsgMSkgKTtcclxuICAgICAgICBpZiAobkZlY2hhQWN0dWFsID49IG5WYWwxICYmIG5GZWNoYUFjdHVhbCA8PSBuVmFsMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RmVjaGFOdW1iZXIoZGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIHZhciBkID0gbW9tZW50KGRhdGUpLmZvcm1hdCgnWVlZWU1NREQnKTtcclxuICAgICAgICByZXR1cm4gZDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WYWxpZGFyIGFjY2lvbiwgc2kgbm8gdGllbmUgY2FyZ2FkYSB1bmEuIEVzdGEgYWNjaW9uIHNlIGNhcmdhIGplcmFycXVpY2FtZW50ZS5cclxuICAgIHB1YmxpYyBWYWxpZGFyQWNjaW9uKGpSZXNwLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIganNvbkFkaWMgPSBKU09OLnBhcnNlKGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgaWYgKGpSZXNwLkFjY2lvbiA9PSBudWxsICYmIGpzb25BZGljLlJPT1QuQWNjaW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgalJlc3AuQWNjaW9uID0ganNvbkFkaWMuUk9PVC5BY2Npb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vUmV0b21hciBpbmZvcm1hY2nDg8KzbiBcclxuICAgIHB1YmxpYyBSZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihvTTNFTkNQUk9NTzogTTNFTkNQUk9NTywgalJlc3ApIHtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24gPSB7fTtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24uTm9tYnJlID0gb00zRU5DUFJPTU8uTm9tYnJlO1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbi5JRCA9IG9NM0VOQ1BST01PLklkUHJvbW9jaW9uO1xyXG4gICAgICAgIC8vU2kgbm8gdHV2byBuaW5ndW5hIGFjY2lvblxyXG4gICAgICAgIGlmIChqUmVzcC5BY2Npb24gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSB7IFwiVGlwbzJcIjogb00zRU5DUFJPTU8uVGlwbzIsIFwiVGlwb1wiOiBvTTNFTkNQUk9NTy5UaXBvIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vIFJldG9tYXIgZGVzZGUgZWwgZW5jYWJlemFkbyBwcm9tbywgc2kgbm8gZXhpc3RlIGVsIHRpcG8geSBUaXBvMlxyXG4gICAgICAgICAgICBpZiAoIWpSZXNwLkFjY2lvbi5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8yID0gb00zRU5DUFJPTU8uVGlwbzI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFqUmVzcC5BY2Npb24uVGlwbykge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8gPSBvTTNFTkNQUk9NTy5UaXBvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIHByb21vY2nDg8KzbiwgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIGFwbGljYXIgbGEgcHJvbW9jaW9uIHkgbGFzIHByb21vY2lvbmVzIGEgYXBsaWNhclxyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9jaW9uKEpQcm9tb2Npb25lczogQXJyYXk8YW55Piwgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGdzSWRLYXRpb3MgPSBudWxsKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICBsZXQgc3BsaXRQcmVjaW8gPSB0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICB2YXIgb0xpc3RhRmluZGVkID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBzcGxpdFByZWNpb1swXSk7XHJcbiAgICAgICAgbGV0IHByZWNpb01vbmVkZXJvID0gMDtcclxuICAgICAgICBsZXQgbGlzdGFBcGxpY2FkYSA9IFwiVmFsb3JcIjtcclxuICAgICAgICBpZiAob0xpc3RhRmluZGVkICYmIHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChzcGxpdFByZWNpb1sxXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxCXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdGFBcGxpY2FkYSA9IFwiTEJcIjtcclxuICAgICAgICAgICAgICAgICAgICBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTGlzdGFGaW5kZWQuTEI7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTENcIjpcclxuICAgICAgICAgICAgICAgICAgICBsaXN0YUFwbGljYWRhID0gXCJMQ1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9MaXN0YUZpbmRlZC5MQztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RhQXBsaWNhZGEgPSBcIkxEXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxEO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgaWYgKGdzSWRLYXRpb3MgIT0gbnVsbCAmJiBnc0lkS2F0aW9zID09IFwiQ1ROXCIpIHtcclxuICAgICAgICAgICAgcHJlY2lvTW9uZWRlcm8gPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKS5QUkVDSU87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTywgcHJlY2lvTW9uZWRlcm8sIGxpc3RhQXBsaWNhZGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gcXVlIHNlIGhhY2VuIHZhbGlkYXMgZGVzcHVlcyBkZSByZWdpc3RyYXIgdG9kb3MgbG9zIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSBKUHJvbW9jaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQWZ0ZXIoSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9NM1Byb2Nlc29zLlZhbG9yTmV0bztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb00zUHJvY2Vzb3MuVmFsb3JOZXRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiBlbiBnZW5lcmFsXHJcbiAgICAgKiBAcGFyYW0gSlByb21vY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIG5QcmVjaW8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lczogQXJyYXk8YW55PiwgblByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgcHJlY2lvTW9uZWRlcm8gPSAwLCBsaXN0YUFwbGljYWRhID0gXCJWYWxvclwiKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzOiBQcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB2YXIgb0xpc3RhUHJvbW9zQXNvYyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxuICAgICAgICBsZXQgcHJlY2lvQXNpZ25hZG8gPSBuUHJlY2lvO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBKUHJvbW9jaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIC8vSlByb21vY2lvbmVzLmZvckVhY2gocHJvbW9jaW9uID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21vY2lvbiA9IEpQcm9tb2Npb25lc1tfaV07XHJcbiAgICAgICAgICAgIC8vIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLkFjY2lvbi5UaXBvMiAhPSBudWxsICYmIHByb21vY2lvbi5BY2Npb24uVGlwbzIgPT0gXCJNT05FREVST1wiICYmIHByZWNpb01vbmVkZXJvID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByZWNpb01vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0J5VGlwbyhwcm9tb2Npb24sIHByZWNpb0FzaWduYWRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTywgbGlzdGFBcGxpY2FkYSk7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MucHVzaChvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlZhbGlkYXJNZWpvclByb21vY2lvbihvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBwcmVjaW9Nb25lZGVybyk7XHJcblxyXG4gICAgICAgIC8vIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5wdXNoKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPCAwKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL0ZTIDIwMTkwNzI1IFJlZG9kbmVvIGRlIGxvcyB2YWxvcmVzIHRvdGFsZXNcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpb24gZGUgbWVqb3Igb3BjaW9uLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIHByb21vY2lvbmVzIHByb2Nlc2FkYXMuXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RhUHJvbW9zQXNvYyBMaXN0YSBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBQcm9tb2Npb24gcHJvY2VzYWRhLCBxdWUgcmV0b3JuYXLDg8KhIGEgZmx1am8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTWVqb3JQcm9tb2Npb24ob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG1vbmVkZXJvOiBudW1iZXIpOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIGxldCBwcm9tb0Fzb2NpYWRhUmVzdHJpbmdpZG8gPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlRpcG8gPT0gXCJSRVNUUklDQ0lPTlwiKTtcclxuICAgICAgICAvL1NpIGVsIHByb2R1Y3RvIGVzdGEgcmVzdHJpbmdpZG8gbGUgZGEgbWF5b3IgcHJpb3JpZGFkIGEgZXN0YSBwcm9tb2Npw4PCs25cclxuICAgICAgICBpZiAoIXByb21vQXNvY2lhZGFSZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAvLzEuIFN1bWEgZGUgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcbiAgICAgICAgICAgIC8vdmFyIGRQcm9tb0FDTTogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgLy9kUHJvbW9BQ00gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTVwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgbGV0IGRQcm9tb0VYQyA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiRVhDXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vQUNNRElOID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJBQ01ESU5cIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIC8vUHJvbW9jaW9uZXMgTm8gQWN1bXVsYWJsZXNcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJvbW9BQ01ESU4gPCBkUHJvbW9FWEMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vRVhDKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9BQ01ESU4ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcblxyXG4gICAgICAgICAgICAvL1JlY29ycmVyIHRvZGFzIGxhcyBwcm9tb2Npb25lcyBBY3VtdWxhYmxlc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiICYmICF4LmZsYWdzLmZvcm1hUGFnbykpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vbmVkZXJvICE9IDAgJiYgcHJvbW8uVGlwbyA9PSBcIk1PTkVERVJPXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCttb25lZGVybykgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCttb25lZGVybykgLSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHByb21vLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBwcm9tby5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tby5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLy8vLy8vRlVOQ0lPTkFMSURBRCBQUk9EUklBIEZVTkNJT05BUiBNw4PCgVMgQURFTEFOVEUsIFNJIFNFIFFVSUVSRSBBR1JVUEFSIExBUyBQUk9NT0NJT05FUyBBQ00gWSBFWENcclxuICAgICAgICAgICAgLy8gaWYoZFByb21vQUNNID09IDAgJiYgZFByb21vRVhDID09IDApe1xyXG4gICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzZSBlbmNvbnRyYXJvbiBwcm9tb2Npb25lcycpO1xyXG4gICAgICAgICAgICAvLyB9ZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgIGlmKGRQcm9tb0FDTSA+IGRQcm9tb0VYQyl7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9HYW5hIHByb21vY2lvbmVzIGFjdW11bGF0aXZhcy5cclxuICAgICAgICAgICAgLy8gICAgICAgICBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIikuZm9yRWFjaCh4ID0+IHguQXBsaWNhZGEgPSB0cnVlKTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gb0xpc3RhUHJvbW9zQXNvYzsvLy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBkUHJvbW9BQ00pICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIGRQcm9tb0FDTSkgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLlZhbG9yTW9uZWRlcm8pLCAwKTtcclxuICAgICAgICAgICAgLy8gICAgIH1lbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vR2FuYSBwcm9tb2Npb25lcyBleGNsdXllbnRlcy5cclxuICAgICAgICAgICAgLy8gICAgICAgICBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykuQXBsaWNhZGEgPSB0cnVlOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvTGlzdGFQcm9tb3NBc29jLy8ucHVzaChvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykpO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gZFByb21vRVhDKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBkUHJvbW9FWEMpICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykuVmFsb3JNb25lZGVybztcclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KHByb21vQXNvY2lhZGFSZXN0cmluZ2lkbyk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gPSAwO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgfVxyXG5cclxuICAgIGFwbGljYVByb21vRVhDKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCB2YWxvclByb21vRVhDOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHJvbW9FeGM6IFByb21vY2lvbmVzQXNvY2lhZGFzO1xyXG4gICAgICAgIGlmICh2YWxvclByb21vRVhDID4gMCkge1xyXG4gICAgICAgICAgICBwcm9tb0V4YyA9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gdmFsb3JQcm9tb0VYQyB8fCB4LlZhbG9yTW9uZWRlcm8gPT0gdmFsb3JQcm9tb0VYQyk7XHJcbiAgICAgICAgICAgIHByb21vRXhjLkFwbGljYWRhID0gdHJ1ZTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBwcm9tb0V4Yy5WYWxvcik7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHByb21vRXhjLlZhbG9yKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gcHJvbW9FeGMuVmFsb3JNb25lZGVybztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhcGxpY2FQcm9tb0FDTURJTihvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgdmFsb3JQcm9tb0FDTURJTjogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHZhbG9yUHJvbW9BQ01ESU4gPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYSA9PSBcIkFDTURJTlwiKSkge1xyXG4gICAgICAgICAgICAgICAgcHJvbW8uQXBsaWNhZGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gcHJvbW8uVmFsb3JNb25lZGVybztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSB2YWxvclByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgdmFsb3JQcm9tb0FDTURJTik7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZWwgbWF4aW1vIHZhbG9yIHNlZ3VuIGxhIHJlZ2xhIGEgY29tcGFyYXJcclxuICAgICAqIEBwYXJhbSBvTGlzdGFQcm9tb3NBc29jIFxyXG4gICAgICogQHBhcmFtIHNSZWdsYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIHNSZWdsYTogc3RyaW5nLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB2YXIgcmVzdWx0OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoc1JlZ2xhKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQUNNXCI6XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVzdWx0ID0gb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IHNSZWdsYSAmJiAheC5mbGFncy5mb3JtYVBhZ28pLnJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuVmFsb3IpLCAwKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJBQ01ESU5cIjpcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJlY2lvQWN0dWFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JUb3RhbERlc2N1ZW50byA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tbyBvZiBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01ESU5cIiAmJiAoIXguZmxhZ3MuZm9ybWFQYWdvIHx8IHguVGlwbyA9PSBcIk1PTkVERVJPXCIpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW8uVmFsb3JQb3JjZW50YWplID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAocHJlY2lvQWN0dWFsICogcHJvbW8uVmFsb3JQb3JjZW50YWplIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb0FjdHVhbCAtPSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbERlc2N1ZW50byArPSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvQWN0dWFsIC09IHByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbERlc2N1ZW50byArPSBwcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxvclRvdGFsRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkVYQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBzUmVnbGEgJiYgKCF4LmZsYWdzLmZvcm1hUGFnbyB8fCB4LlRpcG8gPT0gXCJNT05FREVST1wiKSkubWFwKGZ1bmN0aW9uIChvKSB7IHJldHVybiBvLlZhbG9yID4gby5WYWxvck1vbmVkZXJvID8gby5WYWxvciA6IG8uVmFsb3JNb25lZGVybzsgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhciBwcm9tb2Npb24gc2VndW4gZWwgdGlwbyBcclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQnlUaXBvKHByb21vY2lvbjogYW55LCBQcmVjaW86IG51bWJlciwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGxpc3RhQXBsaWNhZGEgPSBcIlZhbG9yXCIpOiBQcm9tb2Npb25lc0Fzb2NpYWRhcyB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIEFjY2lvbjtcclxuICAgICAgICAgICAgdmFyIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBQcm9tb2Npb25lc0Fzb2NpYWRhcygpO1xyXG4gICAgICAgICAgICBpZiAocHJvbW9jaW9uLkFjY2lvbiAhPSBudWxsICYmIHByb21vY2lvbi5Qcm9tb2Npb24gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSURQcm9tb2Npb24gPSBwcm9tb2Npb24uUHJvbW9jaW9uLklEO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZSA9IHByb21vY2lvbi5Qcm9tb2Npb24uTm9tYnJlO1xyXG4gICAgICAgICAgICAgICAgQWNjaW9uID0gcHJvbW9jaW9uLkFjY2lvbjtcclxuICAgICAgICAgICAgICAgIGlmIChBY2Npb24uUmVnbGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGEgPSBBY2Npb24uUmVnbGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYSA9IFwiRVhDXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlRpcG8gPSBBY2Npb24uVGlwbzI7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsb3JBcGxpY2FyID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2lvbltsaXN0YUFwbGljYWRhXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yQXBsaWNhciA9IEFjY2lvbltsaXN0YUFwbGljYWRhXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fJVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yUG9yY2VudGFqZSA9ICt2YWxvckFwbGljYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gKCtQcmVjaW8pICogKCgrdmFsb3JBcGxpY2FyKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fVkFMT1JcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSB2YWxvckFwbGljYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fRVhBQ1RcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAoK1ByZWNpbykgLSAoK3ZhbG9yQXBsaWNhcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJPQlNFUVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IEFjY2lvbi5PQlNFUVVJT1M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYU9ic2VxID0gQWNjaW9uLlJlZ2xhT2JzZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckNhbnRpZGFkT2JzZXF1aW9zKG9NM0VOQ1BST01PLCBBY2Npb24uT0JTRVFVSU9TLCBvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3ZhbGlkYXIgY2FudGlkYWQgdnMgY2FudGlkYWQgZGUgb2JzcXVpb3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1PTkVERVJPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yTW9uZWRlcm8gPSArQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0ZTIDIwMTkwODI3IFlhIG5vIHNlIGd1YXJkYSBlbCB2YWxvciB0b3RhbCBkZWwgbW9uZWRlcm8gc2kgbm8gdW5pY2FtZW50ZSBlbCBwb3JjZW50YWplLi4uIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqICgoK0FjY2lvbi5WYWxvcikgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQ1VQT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSWRDdXBvbiA9IEFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkFDVElWQV9QUk9NT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5sSWRBY3RpdmFQcm9tbyA9IEFjY2lvbi5WYWxvci5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUkVTVFJJQ0NJT05fUEFHT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJSRVNUUklDQ0lPTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5UaXBvID0gQWNjaW9uLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFwiTU9EX0NBTlRJREFEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vdGhpcy5BcGxpY2FyUmVnbGFNb2RDYW50aWRhZChvUHJvbW9jaW9uZXNBc29jaWFkYXMsIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIEFjY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBY2Npb24uVGlwbyA9PSBcIkNPTUJJTkFEQVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYSA9IG5ldyBQcm9tb2Npb25Db21iaW5hZGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEgPSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSURQcm9tb2Npb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yID0gQWNjaW9uLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5Ob21icmUgPSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTm9tYnJlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5BY2Npb24gPSBBY2Npb247XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQ2FtcG9zQWRpY2lvbmFsZXMob00zRU5DUFJPTU8sIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEsIHByb21vY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb2Npb24uRm9ybWFQYWdvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLmZsYWdzLmZvcm1hUGFnbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gb1Byb21vY2lvbmVzQXNvY2lhZGFzO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBWYWxpZGFyQ2FudGlkYWRPYnNlcXVpb3Mob00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LFxyXG4gICAgICAgIG9ic2VxdWlvczogQXJyYXk8YW55Piwgb1Byb21vY2lvbmVzQXNvY2lhZGFzOiBQcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgdmFyIFZhbG9yQ2FudFBSRDogbnVtYmVyID0gLTE7XHJcbiAgICAgICAgICAgIHZhciBWYWxvckNhbnRQUkRSZWFsOiBudW1iZXIgPSB0aGlzLmdvRGF0YUFkaWNpb25hbC5kQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgcHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBjb25kaXByb21vID0geC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZGlwcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIFZhbG9yQ2FudFBSRCA9ICtjb25kaXByb21vLlZhbG9yXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIFZhbG9yQ2FudFBSRCA9IDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5DYW50aWRhZE9ic2VxID0gVmFsb3JDYW50UFJEXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBjYW1wb3MgYWRpY2lvbmFsZXMgZW4gcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNFTkNQUk9NTyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uQ29tYmluYWRhIFxyXG4gICAgICogQHBhcmFtIHByb21vY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJDYW1wb3NBZGljaW9uYWxlcyhvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSwgcHJvbW9jaW9uOiBhbnkpIHtcclxuICAgICAgICBzd2l0Y2ggKG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIpIHtcclxuICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgLy9BZ3JlZ2FyIENhbnRpZGFkLlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNWYWxvckNhbnRpZGFkOiBzdHJpbmcgPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25kaXByb21vID0geC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpcHJvbW8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc1ZhbG9yQ2FudGlkYWQgPSBjb25kaXByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNWYWxvckNhbnRpZGFkID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5DYW50aWRhZE9ic3EgPSBzVmFsb3JDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiWENBUkFDVEVSSVNUSUNBXCI6XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgICAgICAvLyBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGpBZGljOmFueSA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgIC8vIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLkNsYXNpZmljYWNpb24gPSBqQWRpYy5ST09ULkFjY2lvbi5DYXJhY3RlcmlzdGljYTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiQ09NQk9cIjpcclxuICAgICAgICAgICAgICAgIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLk51bUNvbmRpY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uTnVtQ29uZGljaW9uZXMgPSBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTlswXS5NM0NPTkRJUFJPTU8ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vY2lvbi5JRENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLklkQ29uZGljaW9uID0gcHJvbW9jaW9uLklEQ29uZGljaW9uXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBQcm9jZXNhbWllbnRvIENvbWJpbmFkYSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAvL1Byb2Nlc2FyIHByb21vY2lvbmVzIGNvbWJpbmFkYXNcclxuICAgIHB1YmxpYyBQcm9jZXNhckNvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuUHJvbW9Db21iaW5hZGFzVjIob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9jZXNhckNvbWJpbmFkYVwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1YyIENPTUJJTkFEQVxyXG4gICAgLyoqXHJcbiAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGlzdGEgZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhcyBkZSBNM1Byb2Nlc29zXHJcbiAgICogQHBhcmFtIGlvTTNQcm9jZXNvIE9iamV0byBNMyBQcm9jZXNvcywgZWwgY3VhbCBzZSByZWNvcnJlcsODwqEgbGEgaW5mb3JtYWNpb24gZGUgbGlzdGEgZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAqL1xyXG4gICAgcHVibGljIFByb21vQ29tYmluYWRhc1YyKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICBsZXQgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsID0gXy5jbG9uZURlZXAoaW9NM1Byb2Nlc28uTTNFTkMpO1xyXG5cclxuICAgICAgICBpZiAoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0Q29tYmluYWRhc0Zyb21EaW5hbWljYXMoaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIHZhciBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhc1tpXTtcclxuICAgICAgICAgICAgdmFyIGVzQWN1bXVsYWJsZSA9IHRoaXMuR2V0RXNBY3VtdWxhYmxlUHJvbW8oY29tYmkpXHJcbiAgICAgICAgICAgIC8vL09idGVuZXIgdG9kb3MgbG9zIEVuY2FiZXphZG9zIHF1ZSBhcGxpY2FuIGEgbGEgcHJvbW9jaW9uIGEgbGEgcXVlIHNlIGVzdGEgaXRlcmFuZG9cclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IHRoaXMuR2V0RW5jYWJlemFkb0J5Q29tYmkoY29tYmksIGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgc3dpdGNoIChjb21iaS5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHByb21vY2lvbiBlczogMyBnYXNlb3NhcyBwb3IgJDUwMFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Qcm9jZXNhclByb21vT2JzcUNpZXJyZShsUHJlY2lvcywgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRX1NVTVRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhck9ic2VxU3VtVG90YWwob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiLCBjb21iaSwgbFByZWNpb3MsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiWENBUkFDVEVSSVNUSUNBUEFSQ0lBTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3JkZW5hckxpc3RhRW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyQ2FyYWN0ZXJpc3RpY2FQYXJjaWFsKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJDT01CT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGxDb21ibyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFwbENvbWJvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwbENvbWJvID0gdGhpcy5Qcm9tb2Npb25Db21iaW5hZGFDb21ibyhsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fVkFMT1JUT1RBTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxSZWdsYUNvbWJWYWxvclRvdGFsKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9EX0FQTERFU0NcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvZHVjdG9BcGxEZXNjKG9MaXN0RW5jYWIsIGNvbWJpLCBpb00zUHJvY2VzbywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHByb21vY2lvbiBlcyBwYXJhIDJ4MSwgM3gxLCA0eDIsIC4uLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTGlzdEVuY2FiICYmIG9MaXN0RW5jYWIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlYyhsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vU2UgcmVlc3RhYmxlY2UgbGEgY2FudGlkYWQgb3JpZ2luYWwgcGFyYSBxdWUgbm8gc2UgcXVlZGUgZW4gdW4gYnV2bGUgaW5maW5pdG9cclxuICAgICAgICBmb3IgKGNvbnN0IG9NM1BFbmNPcmlnaW5hbGVzIG9mIGVuY0NvbkxhQ2FudGlkYWRPcmlnaW5hbCkge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRPcmlnaW5hbCA9IG9NM1BFbmNPcmlnaW5hbGVzLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0FjdHVhbCA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklEID09IG9NM1BFbmNPcmlnaW5hbGVzLklEKTtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGNhbnRpZGFkT3JpZ2luYWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9yZGVuYXJMaXN0YUVuYyhvbGlzdGFFbmM6IE0zUEVuY0l0ZW1zW10sIGVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgIGlmIChlc0FjdW11bGFibGUpIG9saXN0YUVuYy5zb3J0KChhLCBiKSA9PiAoK2IuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUTkVUTycpLlZhbG9yKSAtICgrYS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpKTtcclxuICAgICAgICBlbHNlIG9saXN0YUVuYy5zb3J0KChhLCBiKSA9PiAoK2IuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVCcpLlZhbG9yKSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBcGxSZWdsYUNvbWJWYWxvclRvdGFsKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgQWNjaW9uID0gY29tYmkuQWNjaW9uO1xyXG4gICAgICAgIHZhciBjYW50aWRhZERlc2NQcm9tbzogbnVtYmVyID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICBsZXQgcHJlY2lvVG90YWxDb21wcmE6IG51bWJlciA9IGxQcmVjaW9zLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSArIE51bWJlcihiLlBVTklUTkVUTyk7IH0sIDApO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcocHJlY2lvVG90YWxDb21wcmEpO1xyXG4gICAgICAgIGxldCBkZXNjQWN1bSA9IDA7XHJcbiAgICAgICAgbGV0IGRlc2NQcm9kQWN0dWFsO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxQcmVjaW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGRlc2NQcm9kQWN0dWFsID0gKGxQcmVjaW9zW2ldLlBVTklUTkVUTyAvIHByZWNpb1RvdGFsQ29tcHJhKSAqIGNhbnRpZGFkRGVzY1Byb21vIC8vNDBcclxuICAgICAgICAgICAgZGVzY0FjdW0gKz0gZGVzY1Byb2RBY3R1YWw7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gbFByZWNpb3NbaV0uUFVOSVRORVRPIC0gZGVzY1Byb2RBY3R1YWw7XHJcbiAgICAgICAgICAgIC8vIGlmIChjYW50aWRhZERlc2NQcm9tbyA+IDApIHtcclxuICAgICAgICAgICAgLy8gICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gICAgIGlmIChsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPCBjYW50aWRhZERlc2NQcm9tbykge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGNhbnRpZGFkRGVzY1Byb21vIC09IGxQcmVjaW9zW2ldLlBVTklUTkVUTztcclxuICAgICAgICAgICAgLy8gICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSAwO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLT0gY2FudGlkYWREZXNjUHJvbW87XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW50aWRhZERlc2NQcm9tbyA+IGRlc2NBY3VtIHx8IGNhbnRpZGFkRGVzY1Byb21vIDwgZGVzY0FjdW0pIHtcclxuICAgICAgICAgICAgLy9maW5kIGRlbCB1bHRpbW8gXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJFbmNvbnRyZSBkaWZlcmVuY2lhIGVuIHByb21vcyBjb21iaW5hZGFzOiBcIiArIGNhbnRpZGFkRGVzY1Byb21vICsgXCIgdnMgXCIgKyBkZXNjQWN1bSk7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zW2xQcmVjaW9zLmxlbmd0aCAtIDFdLlBVTklUTkVUTyA9IGxQcmVjaW9zW2xQcmVjaW9zLmxlbmd0aCAtIDFdLlBVTklUTkVUTyAtIChjYW50aWRhZERlc2NQcm9tbyAtIGRlc2NBY3VtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsUHJlY2lvcy5maW5kKHggPT4geC5BcGxpY2FkbykpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJPYnNlcVN1bVRvdGFsKHByb2R1Y3Rvc0FwbGljYVByb21vOiBNM1BFbmNJdGVtc1tdLCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCB2YWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICBsZXQgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICBsZXQgY2FudGlkYWRPYnNlcXVpb3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZFByb2R1Y3RvQWN0dWFsID0gMTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBsZXQgdmFsb3JDb21ibyA9IDA7XHJcbiAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBlbmNJdGVtIG9mIHByb2R1Y3Rvc0FwbGljYVByb21vKSB7XHJcbiAgICAgICAgICAgIGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgICAgICBsZXQgcFVuaXRBY3R1YWwgPSArZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRBY3R1YWwgPSArZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB3aGlsZSAoY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA8PSBjYW50aWRhZEFjdHVhbCkge1xyXG4gICAgICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zICs9IHBVbml0QWN0dWFsO1xyXG4gICAgICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCsrO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0b1JldmlzYWRvID0gcHJvZHVjdG9zUmV2aXNhZG9zLmZpbmQoeCA9PiB4LklkID09IGVuY0l0ZW0uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2R1Y3RvUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b1JldmlzYWRvLkNhbnRpZGFkKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MucHVzaCh7IElkOiBlbmNJdGVtLklELCBDYW50aWRhZDogMSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdW1hVmFsb3JQcm9kdWN0b3MgKyBkaWZlcmVuY2lhID49IHZhbG9yUHJvbW8pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckNvbWJvICs9IHN1bWFWYWxvclByb2R1Y3RvcztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIG9NM1Byb2Nlc29zLCBwcm9kdWN0b3NSZXZpc2Fkb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnRpZGFkT2JzZXF1aW9zKys7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IHN1bWFWYWxvclByb2R1Y3RvcyAtIHZhbG9yUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gb00zUmVnU2VydmljZS5sb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8ob00zUHJvY2Vzb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLkFjY2lvbi5Db2RpZ28sIHZhbG9yQ29tYm8sIDEpO1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBvTTNSZWdTZXJ2aWNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3NTdW1Ub3RhbChwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcykge1xyXG4gICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBsZXQgcHJvZEhpam86IE0zUEVuY0l0ZW1zO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBwcm9kUmV2aXNhZG8gb2YgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9kUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSBvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklEID09IHByb2RSZXZpc2Fkby5JZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kSGlqbyA9IF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZS5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ocHJvZEhpam8sIHByb2RSZXZpc2Fkby5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChwcm9kSGlqbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhckFQcm9kdWN0b3NRdWl0YXJDb21iaShvTTNQcm9jZXNvLCBwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm9TdW1Ub3RhbChwcm9kdWN0b3NFbk0zUHJvY2VzbzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpOiBNM1BFbmNJdGVtcyB7XHJcbiAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IHByb2R1Y3Rvc0VuTTNQcm9jZXNvLmZpbmQoeCA9PiB4LklEID09IG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbC5JRClcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gKCtvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yIC0gMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmNsb25lRGVlcChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRMaXN0YVByZWNpb3MobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc0ZpbHRlciA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zLmZpbHRlcih5ID0+IHkuSUQgPT0gb0xpc3RFbmNhYltpXS5JRCkuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zRmlsdGVyLnB1c2goeCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxQcmVjaW9zRmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvbW9jaW9uIGRlIGNvbWJvLCB4IHByb2R1Y3RvcywgeSBwcm9kdWN0b3MsIC4uLiBuIHByb2R1Y3RvcyBcclxuICAgICAqIHBvciAkMTAwMFxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKiBAcGFyYW0gYkVzQWN1bXVsYWJsZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4sIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIGxldCBmbGFnQXBsaWNvUHJvbW8gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgbk51bWVyb0NvbmRpY2lvbmVzOiBudW1iZXIgPSArY29tYmkuQWNjaW9uLk51bUNvbmRpY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JQcm9tbyA9ICtjb21iaS5BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBMaXN0Q29uZGljaW9uZXMgPSBuZXcgQXJyYXk8QXJyYXk8YW55Pj4oKTtcclxuICAgICAgICAgICAgdmFyIG1pbmltb0l0ZW1zOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICBsZXQgcG9yY2VudGFqZVByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHZhbG9yVG90YWxTaW5Qcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZTogTTNSZWdTZXJ2aWNlO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IG5OdW1lcm9Db25kaWNpb25lczsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAvL0J1c2NhciBjb25kaWNpb24gMS5cclxuICAgICAgICAgICAgICAgIHZhciBMaXN0UHJvbW9Db21iaTogQXJyYXk8TTNQRW5jSXRlbXM+ID0gdGhpcy5CdXNjYXJFbmNCeVByb21vWUNvbmQob0xpc3RFbmNhYiwgaS50b1N0cmluZygpLCBjb21iaS5JZFByb21vY2lvbkNvbWJpbmFkYS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIExpc3RDb25kaWNpb25lcy5wdXNoKHRoaXMuR2V0TGlzdGFQcmVjaW9zKGxQcmVjaW9zLCBMaXN0UHJvbW9Db21iaSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpbHRyYXJMaXN0YUNvbmRpY2lvbmVzQ29tYm8oTGlzdENvbmRpY2lvbmVzLCBvTGlzdEVuY2FiKTtcclxuICAgICAgICAgICAgaWYgKExpc3RDb25kaWNpb25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0J1c2NhciBlbCB2YWxvciBtZW5vciBkZSBsYXMgaXRlbXMgYWdyZWdhZGFzXHJcbiAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IExpc3RDb25kaWNpb25lc1swXS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGorKykgey8vQ29taWVuemEgZGVzZGUgMSBwb3JxdWUgZWwgMCB5YSBzZSB2YWxpZG8gZW4gbGEgYW50ZXJpb3IgbGluZWFcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXNQcmVjaW9zOiBBcnJheTxhbnk+ID0gTGlzdENvbmRpY2lvbmVzW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXdNaW4gPSBpdGVtc1ByZWNpb3MubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdNaW4gPCBtaW5pbW9JdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IG5ld01pbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL0xvcyBjb21ib3MgZGViZW4gcHJvY2VzYXJzZSBkZSBhIHVubyBwYXJhIHN1IGNvcnJlY3RvIGZ1bmNpb25hbWllbnRvXHJcbiAgICAgICAgICAgICAgICBpZiAobWluaW1vSXRlbXMgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1vSXRlbXMgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vUmVjb3JyZSB0b2RvcyBsb3MgcHJlY2lvcyBkZSBsb3MgcHJvZHVjdG9zIGRlIGxhIHByb21vIHBhcmEgc2FiZXIgY3VhbCBlcyBlbCB2YWxvciByb2FsIGRlIGxhIHByb21vXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaSA9IExpc3RDb25kaWNpb25lc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IG1pbmltb0l0ZW1zOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuYzogYW55ID0gY29uZGlbbF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5Qcm9tbyArPSArbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9DYWxjdWxhIGVsIHZhbG9yIGRlbCBwb3JjZW50YWplIGRlIGxhIHByb21vIGEgcGFydGlyIGRlbCBjYWxvciBkZWwgY29tYm8geSBkZSBsYSBzdW1hIGRlIGxvcyBwcmVjaW9zIG9yaWdpbmFsZXMgZGUgbG9zIHByb2R1Y3Rvc1xyXG4gICAgICAgICAgICAgICAgcG9yY2VudGFqZVByb21vID0gMTAwIC0gKCtWYWxvclByb21vICogMTAwIC8gdmFsb3JUb3RhbFNpblByb21vKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaSA9IExpc3RDb25kaWNpb25lc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IG1pbmltb0l0ZW1zOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuYzogYW55ID0gY29uZGlbbF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5mb3JFYWNoKHByZWNpbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlY2lvLkluZGljZSA9PSBlbmMuSW5kaWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVjaW8uUHJvbW9BcGxpY2FkYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3IgPSBwcmVjaW8uUFVOSVRORVRPO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Nb2RpZmljYSBlbCBwcmVjaW8gZGUgbG9zIHByb2R1Y3RvcyBhIHN1IG51ZXZvIHZhbG9yIGNvbiBsYSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlBVTklUTkVUTyA9IHZhbG9yIC0gKHZhbG9yICogcG9yY2VudGFqZVByb21vIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlByb21vQXBsaWNhZGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBpb00zUHJvY2VzbywgcHJlY2lvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRW4gbGFzIHByb21vcyBwb3IgY29tYm8gbm8gYXBsaWNhbiBlbCBwcmVjaW8gZGUgbG9zIG90cm9zIHByb2R1Y3RvcyBxdWUgbm8gaGFjZW4gcGFydGUgZGVsIGNvbWJvIDopXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2xQcmVjaW9zLmZpbmQoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LkluZGljZSA9PSBlbmMuSW5kaWNlKS5QVU5JVE5FVE8gPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ0FwbGljb1Byb21vID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdBcGxpY29Qcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbGV0IHByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gY29tYmkuQWNjaW9uLkNvZGlnbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFwcm9kdWN0b1Byb21vQ29tYmlFeGlzdGVudGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZS5sb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8oaW9NM1Byb2Nlc28sIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLkFjY2lvbi5Db2RpZ28sIGNvbWJpLkFjY2lvbi5WYWxvciwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubGltcGlhckVuY0l0ZW1QcmRDb25kaShvTGlzdEVuY2FiKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9tb2Npb25Db21iaW5hZGFDb21ib1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWdBcGxpY29Qcm9tbztcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhsaXN0Q29uZGljaW9uZXM6IEFycmF5PGFueT4sIG9NM1BFbmNJdGVtc0xpc3Q6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0Q29uZGljaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBudWV2YUNvbmRpY2lvbiA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmRpY2lvbiBvZiBsaXN0Q29uZGljaW9uZXNbX2ldKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5jSXRlbSA9IG9NM1BFbmNJdGVtc0xpc3QuZmluZCh4ID0+IHguSUQgPT0gY29uZGljaW9uLklEKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbmNJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRldENhbnRpZGFkID0gZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA9IGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA/IGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldENhbnRpZGFkID4gZW5jSXRlbVtcIlByZENvbmRpXCJdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51ZXZhQ29uZGljaW9uID0gW2NvbmRpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY0l0ZW1bXCJQcmRDb25kaVwiXSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGlzdENvbmRpY2lvbmVzW19pXSA9IG51ZXZhQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsaW1waWFyRW5jSXRlbVByZENvbmRpKG9NM1BFbmNJdGVtc0xpc3Q6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIG9NM1BFbmNJdGVtc0xpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIGVsZW1lbnRbXCJQcmRDb25kaVwiXTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkID0gMSkge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b1F1aXRhcjtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0gPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByb2R1Y3RvUXVpdGFyID0gb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdLmZpbmQoeCA9PiB4LklEID09IG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG9RdWl0YXIpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9RdWl0YXIuQ2FudGlkYWQgKz0gKC0xICogY2FudGlkYWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdLnB1c2goeyBJRDogb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8sIENhbnRpZGFkOiAoLTEgKiBjYW50aWRhZCkgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZ3JlZ2EgZWwgcHJvZHVjdG8gZGUgbGEgbGlzdGEgZGUgZW50cmFkYSBhIHVuIGFycmVnbG8gZGUgcHJvZHVjdG9zIHF1ZSBwb3N0ZXJpb3JtZW50ZSBzZXJhIGxvcyBwcm9kdWN0b3MgaGlqb3MgZGVsIHByb2R1Y3RvIENvbWJvXHJcbiAgICBhZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3MocHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gdGhpcy5nZXRQcm9kdXRvUHJvbW9Db21ibyhvTTNQcm9jZXNvLk0zRU5DLCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpO1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAvL0xhIGNhbnRpZGFkIGRpc21pbnV5ZSBwZXJvIGVzdGUgbW92aW1pZW50byBzZSByZXZlcnNhIGFsIHRlcm1pbmFyIGRlIHZhbGlkYXIgZXN0YSBwcm9tb1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhvTTNQRW5jSXRlbXMsIDEpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0Rpc21pbnV5ZSBlbiB1bm8gbGEgY2FudGlkYWQgZGVsIHByb2R1Y3RvIHkgcmV0b3JuYSB1biBjbG9uIGRlIGVzdGVcclxuICAgIGdldFByb2R1dG9Qcm9tb0NvbWJvKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IHByb2R1Y3Rvc0VuTTNQcm9jZXNvLmZpbmQoeCA9PiB4LklEID09IG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbC5JRClcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gKCtvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yIC0gMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmNsb25lRGVlcChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBlbiBoYXNobWFwIGRlIHByZWNpb3NcclxuICAgICAqIEBwYXJhbSBobWxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIElEIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkdG9IbVByZWNpb3MoaG1sUHJlY2lvczogQXJyYXk8YW55PiwgSUQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBmaW5kZWQ6IGFueSA9IGhtbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gSUQpO1xyXG4gICAgICAgIGlmIChmaW5kZWQpIHtcclxuICAgICAgICAgICAgZmluZGVkLkluZGljZSA9ICtmaW5kZWQuSW5kaWNlICsgKzE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZmluZGVkID0geyBcIklEXCI6IElELCBcIkluZGljZVwiOiAwIH07XHJcbiAgICAgICAgICAgIGhtbFByZWNpb3MucHVzaChmaW5kZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmluZGVkLkluZGljZTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1c2NhciBlbmNhYmV6YWRvcyBxdWUgdGVuZ2EgbGEgcHJvbW9jaW9uIHkgY29uZGljaW9uIGVudmlhZGEgY29tbyBwYXJhbWV0cm9cclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIFxyXG4gICAgICogQHBhcmFtIElkQ29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGlkUHJvbW9jaW9uZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBCdXNjYXJFbmNCeVByb21vWUNvbmQob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBJZENvbmRpY2lvbjogc3RyaW5nLCBpZFByb21vY2lvbmVzOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0VuY0ZpbmRlZCA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob00zUEVuY0l0ZW1zLklkRW5jUGFkcmUpXHJcbiAgICAgICAgICAgICAgICBpZiAoIW9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlIHx8ICEob00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPiAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXRDYW50aWRhZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXQgJiYgZGV0Q2FudGlkYWQgJiYgK2RldENhbnRpZGFkLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbW9zOiBBcnJheTxhbnk+ID0gSlNPTi5wYXJzZShkZXQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbW9GaW5kZWQgPSBwcm9tb3MuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gaWRQcm9tb2Npb25lcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb21vRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZGljaW9uRmluZGVkID0gcHJvbW9GaW5kZWQuQWNjaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaWNpb25GaW5kZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaWNpb25GaW5kZWQuZmluZCh4ID0+IHggPT0gSWRDb25kaWNpb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZCA9PSBJZENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0VuY0ZpbmRlZC5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvRW5jRmluZGVkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpw4PCs24gc2kgbGEgcHJvbW9jacODwrNuIHF1ZSBsbGVnYSBjb21vIHBhcmFtZXRybywgZXMgYWN1bXVsYWJsZSBvIG5vXHJcbiAgICAgKiBAcGFyYW0gcHJvbW9jaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0RXNBY3VtdWxhYmxlUHJvbW8ocHJvbW9jaW9uOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAocHJvbW9jaW9uLkFjY2lvbi5SZWdsYSAmJiBwcm9tb2Npb24uQWNjaW9uLlJlZ2xhID09IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBHZXRFc0FjdW11bGFibGVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhclByb2R1Y3RvQXBsRGVzYyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBlc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICBsZXQgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGxldCBwcm9kc0FwbERlc2N1ZW50bzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IHNrdUFwbERlc2N1ZW50b3M6IEFycmF5PGFueT4gPSBjb21iaS5BY2Npb24uc2t1QXBsRGVzYzsgLy9be1NLVTpcIlhYWFhYWFwifSwge1NLVTpcIllZWVlZWVlcIn1dXHJcbiAgICAgICAgbGV0IG1heE51bURlc2N1ZW50b3MgPSArY29tYmkuQWNjaW9uLm1heE51bURlc2M7XHJcbiAgICAgICAgbGV0IGNvbnREZXNjQXBsaWNhZG9zID0gMDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG1heE51bURlc2N1ZW50b3MpIHtcclxuICAgICAgICAgICAgICAgIC8vQ2FsY3VsYSBlbCBudW1lcm8gbWF4aW1vIGRlIGRlc2NpbmV0b3MgcXVlIHB1ZWRlIGFwbGljYXIgbGEgcHJvbW8gcXVlIGVzIGNvbWJpLkFjY2lvbi5tYXhOdW1EZXNjIG11bHRpcGxpY2FkbyBwb3IgbGEgY2FudGlkYWQgZGUgcHJvZHVjdG9zIHF1ZSBwYWxpY2FuIGxhIHByb21vIGVuIGVsIHByb2Nlc29cclxuICAgICAgICAgICAgICAgIG1heE51bURlc2N1ZW50b3MgPSBvTGlzdEVuY2FiLnJlZHVjZSgoYWNjLCBjdXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjICsgK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgICAgIH0sIDApICogbWF4TnVtRGVzY3VlbnRvcztcclxuXHJcbiAgICAgICAgICAgICAgICAvL0RlIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gZmlsdHJvIGxvcyBwcm9kdWN0b3MgcXVlIGFwbGljYXJhbiBlbCBkZXNjdWVudG8gc2VndW4gbG9zIFNLVSBjb25maWd1cmFkb3MgZW4gY29tYmkuQWNjaW9uLnNrdUFwbERlc2NcclxuICAgICAgICAgICAgICAgIGlvTTNQcm9jZXNvLk0zRU5DLmZvckVhY2gob00zUEVuY0l0ZW1zID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2t1QXBsRGVzY3VlbnRvcy5maW5kKHggPT4geC5TS1UgPT0gb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2RzQXBsRGVzY3VlbnRvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0PDg8KhbGN1bG8gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zIGRlIGxvcyBwcm9kdWN0b3MgYSBsb3MgcXVlIGxhIHByb21vIGFwbGljYXJhIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhwcm9kc0FwbERlc2N1ZW50bywgZXNBY3VtdWxhYmxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0FwbGljYSB0YW50b3MgZGVzY3VlbnRvcyBzZSBwdWVkYW4gYSBwbGFpY2FyIGEgY2FkYSB2YWxvciBkZSBsUHJlY2lvXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY29udERlc2NBcGxpY2Fkb3MgPCBtYXhOdW1EZXNjdWVudG9zICYmIGNvbnREZXNjQXBsaWNhZG9zIDwgbFByZWNpb3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTyAtPSAoK2xQcmVjaW9zW2NvbnREZXNjQXBsaWNhZG9zXS5QVU5JVE5FVE8pICogKCgrY29tYmkuQWNjaW9uLlZhbG9yKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udERlc2NBcGxpY2Fkb3MrKztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL1JlY2FsY3VsYSBsb3MgdmFsb3JlcyBkZWwgcHJvZHVjdG8gYXBsaWNhbmRvIGVsIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIHByb2RzQXBsRGVzY3VlbnRvLCBjb21iaSwgdHJ1ZSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vQ0FOVElEQUQgUE9SIFBST0RVQ1RPXHJcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcclxuICAgICAgICAgICAgICAgIG9MaXN0RW5jYWIuZm9yRWFjaChwcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnREZXNjQXBsaWNhZG9zID0gMFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmRGaW5kZWQgPSBza3VBcGxEZXNjdWVudG9zLmZpbmQoeCA9PiB4LlNLVSA9PSBwcmQuSWRQcm9kdWN0byk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmRGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHNBcGxEZXNjdWVudG8ucHVzaChwcmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0NhbGN1bGEgZWwgbnVtZXJvIG1heGltbyBkZSBkZXNjaW5ldG9zIHF1ZSBwdWVkZSBhcGxpY2FyIGxhIHByb21vIHF1ZSBlcyBjb21iaS5BY2Npb24ubWF4TnVtRGVzYyBtdWx0aXBsaWNhZG8gcG9yIGxhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyBxdWUgcGFsaWNhbiBsYSBwcm9tbyBlbiBlbCBwcm9jZXNvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heE51bURlc2N1ZW50b3MgPSArcHJkLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yICogcHJkRmluZGVkLkNhbnRpZGFkO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQ8ODwqFsY3VsbyBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MgZGUgbG9zIHByb2R1Y3RvcyBhIGxvcyBxdWUgbGEgcHJvbW8gYXBsaWNhcmEgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jQnlQcmQocHJkLCBlc0FjdW11bGFibGUsIGxQcmVjaW9zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQXBsaWNhIHRhbnRvcyBkZXNjdWVudG9zIHNlIHB1ZWRhbiBhIHBsYWljYXIgYSBjYWRhIHZhbG9yIGRlIGxQcmVjaW9cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbnREZXNjQXBsaWNhZG9zIDwgbWF4TnVtRGVzY3VlbnRvcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTyAtPSAoK2xQcmVjaW9zW2NvbnREZXNjQXBsaWNhZG9zXS5QVU5JVE5FVE8pICogKCgrY29tYmkuQWNjaW9uLlZhbG9yKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250RGVzY0FwbGljYWRvcysrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vUmVjYWxjdWxhIGxvcyB2YWxvcmVzIGRlbCBwcm9kdWN0byBhcGxpY2FuZG8gZWwgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHNBcGxEZXNjdWVudG8sIGNvbWJpLCB0cnVlLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBvYnNlcXVpb3MgZW4gZWwgY2llcnJlXHJcbiAgICAgKiBWYWxpZGEgdG9kYSBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGNhbnRpZGFkIGluZ3Jlc2FkYSBlbiBlbCBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAqIFZhbGlkYSBsYSBwcm9tb2Npw4PCs24sIHBvciBjYWRhIGN1YW50b3MgcHJvZHVjdG9zIGluZ3Jlc2Fkb3MsIGN1w4PCoW50b3Mgb2JzZXF1aW9zIHNlIHB1ZWRlbiBkYXIuXHJcbiAgICAgKiBUcmFlIHRvZG9zIGxvcyBvYnNlcXVpb3MgcXVlIHNlIGluZ3Jlc2Fyb24gZW4gZWwgY2Fycml0byBkZSBjb21wcmFzLCBsb3MgbGlzdGFcclxuICAgICAqIGNvbG9jYSBlbiB2YWxvciAwIGxvcyBvYnNlcXVpb3MgcXVlIHNlbGVjY2lvbm8gYXV0b21hdGljYW1lbnRlIGVsIGFsZ29yaXRtb1xyXG4gICAgICogUmVjYWxjdWxvIGRlIHByZWNpb3MsIGltcHVlc3RvcyB5IGRlbWFzIHZhbG9yZXMgdG90YWxlcy5cclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGxvcyBwcm9kdWN0b3MgaW5ncmVzYWRvcyBhbCBjYXJyaXRvIHF1ZSB0aWVuZW4gb2JzZXF1aW9cclxuICAgICAqIEBwYXJhbSBjb21iaSBJbmZvcm1hY2nDg8KzbiBkZSBwcm9tb2Npw4PCs24gZGUgb2JzZXF1aW9zXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gUHJvY2VzbyBjb24gdG9kb3MgbG9zIHByb2R1Y3RvcyBlIGluZm9ybWFjacODwrNuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJQcm9tb09ic3FDaWVycmUob0xpc3RFbmNhYjogQXJyYXk8YW55PiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlvTTNQcm9jZXNvWydQcm9kdWN0b3NDb21iaSddID0gW107XHJcbiAgICAgICAgbGV0IGNhbnRQb3JPYnMgPSArY29tYmkuQWNjaW9uLkNhbnRpZGFkT2JzcTsgLy9Qb3IgY2FkYSBjdWFudG9zIHByb2R1Y3RvcyBjb24gbGEgcHJvbW9jacODwrNuIHNlIGRhcsODwqEgZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgbGV0IGNhbnRBZ3JlZ2FkYSA9IDA7XHJcbiAgICAgICAgbGV0IHN1bWFWYWxvclByb2R1Y3RvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkT2JzZXF1aW9zID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JDb21ibyA9IDA7XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgbTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub0xpc3RhT2JzZXF1aW9zID0gY29tYmkuQWNjaW9uLk9CU0VRVUlPUztcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub2JzZXF1aW9zQ2FudGlkYWQgPSAwXHJcbiAgICAgICAgLy8gdmFyIGNhbnRPYnNlcXVpb3M6IG51bWJlciA9IDA7IC8vQ2FudGlkYWQgZGUgb2JzZXF1aW9zIHF1ZSBzZSBkYXLDg8KhIHBvciBlc3RhIGNvbXByYS5cclxuXHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJvZHVjdG8gb2Ygb0xpc3RFbmNhYikge1xyXG4gICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgKz0gcHJvZHVjdG8uUFVOSVRORVRPO1xyXG4gICAgICAgICAgICBjYW50QWdyZWdhZGErKztcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvUmV2aXNhZG8gPSBwcm9kdWN0b3NSZXZpc2Fkb3MuZmluZCh4ID0+IHguSWQgPT0gcHJvZHVjdG8uSUQpO1xyXG4gICAgICAgICAgICBpZiAocHJvZHVjdG9SZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdG9SZXZpc2Fkby5DYW50aWRhZCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdG9zUmV2aXNhZG9zLnB1c2goeyBJZDogcHJvZHVjdG8uSUQsIENhbnRpZGFkOiAxIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FudEFncmVnYWRhID09PSBjYW50UG9yT2JzKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxvckNvbWJvICs9IHN1bWFWYWxvclByb2R1Y3RvcztcclxuICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zU3VtVG90YWwocHJvZHVjdG9zSGlqb3NEZWxDb21ibywgaW9NM1Byb2Nlc28sIHByb2R1Y3Rvc1JldmlzYWRvcyk7XHJcbiAgICAgICAgICAgICAgICBjYW50aWRhZE9ic2VxdWlvcysrO1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgICAgICAgICBjYW50QWdyZWdhZGEgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY29tYmkuQWNjaW9uLkNvZGlnbykgY29uc29sZS5lcnJvcignRWwgY8ODwrNkaWdvIGRlbCBjb21ibyBubyBlc3RhIGNvbmZpZ3VyYWRvIGVuIE0zREVUQ09ORElQUk9NTycpXHJcbiAgICAgICAgaWYgKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ubGVuZ3RoID4gMCAmJiBjb21iaS5BY2Npb24uQ29kaWdvKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gbTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhpb00zUHJvY2VzbywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgdmFsb3JDb21ibywgMSk7XHJcbiAgICAgICAgICAgIG0zUmVnU2VydmljZS5hcm1hckxpc3RhT2JzZXF1aW9zQ29tYmlTS1UoY29tYmksIHByb2R1Y3RvQ29tYm8sIGNhbnRpZGFkT2JzZXF1aW9zKTtcclxuICAgICAgICAgICAgaW9NM1Byb2Nlc29bXCJvTTNSZWdTZXJ2aWNlXCJdID0gbTNSZWdTZXJ2aWNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwbGljYXIgcmVnbGFzLCByZXNwZWN0byBhIGxhIGNhbnRpZGFkIGluZ3Jlc2FkYS5cclxuICAgICogQHBhcmFtIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyBcclxuICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAqL1xyXG4gICAgcHVibGljIEFwbGljYXJSZWdsYU1vZENhbnRpZGFkKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgQWNjaW9uID0gY29tYmkuQWNjaW9uO1xyXG5cclxuICAgICAgICB2YXIgaUNhbnRpZGFkUHJvbW86IG51bWJlciA9IEFjY2lvbi5DYW50aWRhZDsgLy9FamVtcGxvIDogM1xyXG4gICAgICAgIC8vdmFyIGlDYW50aWRhZEFQTFByb21vOiBudW1iZXI7IC8vTnVtZXJvIHJlYWwgZGUgYXBsaWNhY2lvbiBkZSBwcm9tb2Npb25lcywgU2kgYXBsaWNhIHJlc3RhIGVsIHJlc2lkdW8uXHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlcjsgLy9DYW50aWRhZCByZWFsIGluZ3Jlc2FkYS5cclxuICAgICAgICB2YXIgVmFsb3JQcm9tbzogbnVtYmVyID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIHZhciB2YWxvclByb21vVW5pdDogbnVtYmVyID0gKCtWYWxvclByb21vKSAvICgraUNhbnRpZGFkUHJvbW8pXHJcbiAgICAgICAgaUNhbnRpZGFkUmVhbCA9IGxQcmVjaW9zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgPj0gaUNhbnRpZGFkUHJvbW8pIHsgLy9KQUdNIDIwMTkwNDI2IFNFIENBTUJJQSwgQU5URVMgRVNUQUJBIExBIEZVTkNJT05BTElEQUQgREUgQ0FOVElEQUQgUkVBTCBWUyBDQU5USURBRCBQUk9NT0NJT04uXHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9pQ2FudGlkYWRBUExQcm9tbyA9IGlDYW50aWRhZFJlYWwgLyBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciBSZXNpZHVvOiBudW1iZXIgPSBpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgICAgICBpQ2FudGlkYWRSZWFsID0gaUNhbnRpZGFkUmVhbCAtIFJlc2lkdW87XHJcbiAgICAgICAgICAgICAgICAvL2lDYW50aWRhZEFQTFByb21vID0gaUNhbnRpZGFkUmVhbCAvIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlDYW50aWRhZFJlYWw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxQcmVjaW9zW2ldLlBVTklUTkVUTyA+IHZhbG9yUHJvbW9Vbml0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gdmFsb3JQcm9tb1VuaXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChsUHJlY2lvcy5maW5kKHggPT4geC5BcGxpY2FkbykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJBcGxpY2FyUmVnbGFNb2RDYW50aWRhZFwiKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhcmdhciBjb21iaW5hZGFzIGRlc2RlIGRpbmFtaWNhc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0Q29tYmluYWRhc0Zyb21EaW5hbWljYXMoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgc0NvbWJpbmFkYSA9IGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiQ09NQklOQURBXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB2YXIgb0NvbWJpbmFkYSA9IEpTT04ucGFyc2Uoc0NvbWJpbmFkYSk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzID0gb0NvbWJpbmFkYTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGEgZGluYW1pY2FzIHByb2Nlc28gZGUgY29tYmluYWRhc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBvTTNQRGluYW1pY2FzRmluZGVkOiBNM1BEaW5hbWljYXM7XHJcbiAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZCA9IGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiQ09NQklOQURBXCIpO1xyXG4gICAgICAgIGlmIChvTTNQRGluYW1pY2FzRmluZGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPiA9IEpTT04ucGFyc2Uob00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvcik7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyUHJvbW8ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvUHJvbW9Db21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBhcnJQcm9tb1tpXS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9Qcm9tb0NvbWJpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5wdXNoKGFyclByb21vW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gXCJDT01CSU5BREFcIjtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG5cclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhciBwcm9tb2Npb25lcywgc2VndW4gbGEgbGlzdGEgZGUgcHJlY2lvcyBkaXZpZGlkYS5cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBMaXN0YSBkZSBwcmVjaW9zLCBjb250cmEgZXN0ZSBvYmpldG8gc2UgaXRlcmFyw4PCoSB5IHNlIG9yZGVuYXLDg8KhIGRlIG1heW9yIGEgbWVub3JcclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIFxyXG4gICAgICogQHBhcmFtIGNvbWJpIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgVGlwb1Byb21vID0gY29tYmkuVGlwbzI7XHJcbiAgICAgICAgdmFyIGl4OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBpeTogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgeDogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMV1cclxuICAgICAgICB2YXIgeTogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMF0gLSAoK3gpO1xyXG4gICAgICAgIHZhciByZXNpZHVvWDogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgYkVudHJvOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgcmVzaWR1b1ggPSAreC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXTtcclxuICAgICAgICAgICAgeCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8vU2UgaXRlcmEgZWwgYXJyZWdsbyBkZSBwcmluY2lwaW8gYSBmaW4geSBkZSBmaW4gYSBwcmluY2lwaW8uLi4gXHJcbiAgICAgICAgLy8vQ29uZm9ybWUgc2UgcmVjb3JyZSBlbCBhcnJlZ2xvIGRlIGZpbiBhIHByaW5pY2lvLCBzZSB2YSBkYW5kbyBsYSBwcm9tb2Npw4PCs24gYSBsb3MgcHJvZHVjdG9zIGRlIG1lbm9yIHZhbG9yLlxyXG4gICAgICAgIC8vL1NpIGxhIHByb21vY2nDg8KzbiBlc3RhIGluY29tcGxldGEsIGxvcyBwcm9kdWN0b3MgZGUgbGEgbWl0YWQgcXVlZGFuIHNpbiBwcm9tb2Npw4PCs24gXHJcbiAgICAgICAgdmFyIGk6IG51bWJlciA9IDA7XHJcbiAgICAgICAgbFByZWNpb3MgPSBsUHJlY2lvcy5zb3J0KChhLCBiKSA9PiBhLlBVTklUTkVUTyA8IGIuUFVOSVRORVRPID8gMSA6IGEuUFVOSVRORVRPID4gYi5QVU5JVE5FVE8gPyAtMSA6IDApXHJcbiAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdmFyIGogPSArbFByZWNpb3MubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgd2hpbGUgKGkgPCBsUHJlY2lvcy5sZW5ndGggJiYgaiA+PSBpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaXggPSAwO1xyXG4gICAgICAgICAgICAgICAgaXkgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIHdoaWxlIChpeCA8IHgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaXgrKztcclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaXkgPCB5ICYmIGogPj0gaSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzaWR1b1ggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiRW50cm8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tqXS5QVU5JVE5FVE8gPSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJFbnRybyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vL1BhcmEgbGFzIHByb21vY2lvbiBjb21vOiAyWDEuNSwgLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vRXN0YSBzb3BvcnRhbmRvIHNvbG8gcGFyYTogMlgxLjVcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3Nbal0uUFVOSVRORVRPID0gK2xQcmVjaW9zW2pdLlBVTklUTkVUTyAqICgrcmVzaWR1b1ggLyAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGl5Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgai0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0NhbGN1bGFyIHByZWNpb3MgdG90YWxlc1xyXG4gICAgICAgICAgICAvL1RlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MuXHJcbiAgICAgICAgICAgIC8vSkdBTSAyMDE5MTAyMywgZnVuY2lvbmFsaWRhZCBkZSBxdWUgc29sbyBlbnRyYSBhY8ODwqEgY3VhbmRvIHNlIGNhbWJpbyBhbGd1biBwcmVjaW9cclxuICAgICAgICAgICAgaWYgKGJFbnRybykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBmYWxzZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAvLyBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgLy8gICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgLy8gICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5cclxuICAgICAgICAgICAgLy8gICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoK2FjYykgKyAoK2N1ci5QVU5JVE5FVE8pLCAwKTtcclxuXHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLlNldFZhbG9yUHJvbW9jaW9uZXMoZW5jKTtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuQWdyZWdhckxpc3RhUHJvbW8oZW5jLCBjb21iaSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGFyIHByZWNpbyB0b3RhbCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGRlIHByZWNpb3MgYSB0ZW5lciBlbiBjdWVudGFcclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgUHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJBcGxWYWxpZGE6IGJvb2xlYW4sIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvL0NhbGN1bGFyIHByZWNpb3MgdG90YWxlc1xyXG4gICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgICAgICB2YXIgZFZhbG9yUHJvbW9BbnQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy92YXIgZFZhbG9yUHJvbW9BbnRBY3VtOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVmFsb3JBY3Q6IG51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9OdWV2byA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5cclxuICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG4gICAgICAgICAgICB2YXIgcHJlY2lvVG90YWxBbnRlcmlvcjtcclxuICAgICAgICAgICAgcHJlY2lvVG90YWxBbnRlcmlvciA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDcxOCBTRSBRVUlUQSBWQUxJREFDSU9OLCBQT1IgRkxVSk8gUVVFIFNJIFNFIERFVlVFTFZFIFRSQUUgTEEgUFJPTU8sIFBFUk8gU0kgU0UgQk9SUkEuIGlmIChkUHJlY2lvTnVldm8gPCBwcmVjaW9Ub3RhbEFudGVyaW9yKSB7IC8vIFNlIGFncmVnYSB2YWxpZGFjaW9uIGRlIHByZWNpbywgcGFyYSBlc2NvZ2VyIGVsIG1lam9yLiBObyBwdWVkZW4gYSB2ZXIgMiBwcm9tb2Npb25lcy5cclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gZFByZWNpb051ZXZvO1xyXG4gICAgICAgICAgICAvL2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFJFQUxcIikuVmFsb3IgPSBkUHJlY2lvTnVldm87XHJcbiAgICAgICAgICAgIC8vTGltcGlhciBwcm9tb2Npb25lc1xyXG4gICAgICAgICAgICBpZiAoKHRoaXMuVmFsaWRhclNpVG9kb3NBUExQcm9tb0NvbWJpbmFkYShsUHJlY2lvcywgZW5jKSB8fCAhYkFwbFZhbGlkYSkgJiYgIWJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIikuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuUXVpdGFyTGFzUHJvbW9zRGlyZWN0YXMoZW5jKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUXVpdGFyTGFzUHJvbW9zQ29tYmluYWRhcyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIk5PTUJfUFJPTU9DXCIpLlZhbG9yID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIC8vIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIGRWYWxvckFjdCA9ICgoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcikgLSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JQcm9tb0FudCA9IHRoaXMuR2V0VmFsb3JQcm9tb0FudGVyaW9yKGxQcmVjaW9zLCBlbmMpO1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yQWN0ID0gdGhpcy5HZXRWYWxvclByb21vQUN0KGVuYywgZFZhbG9yUHJvbW9BbnQsIGRQcmVjaW9OdWV2bywgcHJlY2lvVG90YWxBbnRlcmlvciwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgc2UgYWdyZWdhIHBhcmEgcHJvbW9jaW9uZXMgYWN1bXVsYWJsZXMuIGFjdW11bGFiXHJcbiAgICAgICAgICAgICAgICBpZiAoIWJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKS5WYWxvciA9IGRWYWxvclByb21vQW50LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRXMgYWN1bXVsYWJsZSwgdXRpbGl6YXIgbGEgaW5mb3JtYWNpw4PCs24gXHJcbiAgICAgICAgICAgICAgICAgICAgZFZhbG9yUHJvbW9BbnQgPSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvciAtIHByZWNpb1RvdGFsQW50ZXJpb3IpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMsIGRWYWxvckFjdCArIGRWYWxvclByb21vQW50KTtcclxuICAgICAgICAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpLCBkVmFsb3JBY3QpO1xyXG4gICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9Vbml0RnJvbVRvdGFsKGVuYywgZFByZWNpb051ZXZvKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zRGlyZWN0YXMoZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maWx0ZXIoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlZBTF9QUk9NT0NfXCIpKS5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkZXQuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zQ29tYmluYWRhcyhlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbHRlcih4ID0+IHguTm9tYnJlQ29uY2VwdG8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiVkFMX1BST19DT01CSV9cIikpLmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhciBwcmVjaW8gdW5pdGFyaW8sIGEgcGFydGlyIGRlIHVuIG51ZXZvIHByZWNpbyBUb3RhbC5cclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gbmV3UHJpY2UgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvVW5pdEZyb21Ub3RhbChlbmM6IE0zUEVuY0l0ZW1zLCBuZXdQcmljZTogbnVtYmVyKSB7XHJcbiAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA9ICgrbmV3UHJpY2UgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBzaSB0b2RvcyBsb3MgcHJlY2lvcyBkZSB1biBwcm9kdWN0byBzZSBjYW1iaWFyb24gbyBuby5cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBMaXN0YSBjb24gdG9kb3MgbG9zIGl0ZW1zXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclNpVG9kb3NBUExQcm9tb0NvbWJpbmFkYShsUHJlY2lvczogQXJyYXk8YW55PiwgZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIC8vQ2hlY2ssIHNpIGFsZ3VubyBkZSBsYSBsaXN0YSBkZSBwcmVjaW8gZXMgaWd1YWwgYWwgcHJlY2lvIGFudGVyaW9yXHJcbiAgICAgICAgdmFyIHByZWNpb0FudGVyaW9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZpbmQoeCA9PiB4LlBVTklUTkVUTyA9PSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIGlmIChwcmVjaW9BbnRlcmlvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvcmVzIGRlIHByb21vY2lvbmVzIGRlcGVuZGllbmRvIGRlbCBudW1lcm8gZGUgaXRlbXMgcXVlIG5vIHNlIG1vZGlmaWNhcm9uXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FudGVyaW9yKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRWYWxvciA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIG51bWVyb0l0ZW1zID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5QVU5JVE5FVE8gPT0gZFZhbG9yKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHZhciBkVW5pdFByb21vID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiVlVOSVRQUk9NT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICtudW1lcm9JdGVtcyAqICtkVW5pdFByb21vO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIGRlIGxhIHByb21vY2lvbiBxdWUgc2UgZXN0YSBwcm9jZXNhbmRvIGFjdHVhbG1lbnRlXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIHZhbG9yUHJvbW9BbnQgXHJcbiAgICAgKiBAcGFyYW0gdmFsb3RUb3RhbE51ZXZvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FDdChlbmM6IE0zUEVuY0l0ZW1zLCB2YWxvclByb21vQW50OiBudW1iZXIsIHZhbG90VG90YWxOdWV2bzogbnVtYmVyLCBwcmVjaW9Ub3RhbEFudDogbnVtYmVyLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yVG90YWxTaW5EdG86IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUHJvbW9BY3Q6IG51bWJlcjtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzMwIHNpIHZpZW5lIGFjdW11bGFibGUgdXRpbGl6YXIgZWwgcHJlY2lvIGFudGVyaW9yLCB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgZHRvLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpbkR0byA9IHByZWNpb1RvdGFsQW50O1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG90VG90YWxOdWV2bztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5EdG8gPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG9yUHJvbW9BbnQgLSArdmFsb3RUb3RhbE51ZXZvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHZhbG9yUHJvbW9BY3Q7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBHZXRWYWxvclByb21vQUN0OiBcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRlYXIgZWwgdmFsb3IgZGUgbGEgcHJvbW9jaW9uXHJcbiAgICAgKiBAcGFyYW0gZW5jIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNldFZhbG9yUHJvbW9jaW9uZXMoZW5jOiBNM1BFbmNJdGVtcywgdmFsb3JQcm9tbzogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9lbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9ICgoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcikgLSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIC8vRlMgMjAxOTA3MjUgUmVkb25kZW8gZGVsIHZhbG9yIGRlIHByb21vY2lvblxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9IChNYXRoLnJvdW5kKHZhbG9yUHJvbW8gKiAxMDApIC8gMTAwKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MTggU2UgYWdyZWdhIGVsIHZhbG9yIHVuaXRhcmlvIGRlIGxhIHByb21vY2nDg8KzblxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVlVOSVRQUk9NT1wiKS5WYWxvciA9ICgrKE1hdGgucm91bmQodmFsb3JQcm9tbyAqIDEwMCkgLyAxMDApIC8gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikudG9TdHJpbmcoKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vICAvKipcclxuICAgIC8vICAqIFNldGVhciBlbCB2YWxvciBkZSBsYSBwcm9tb2Npb25cclxuICAgIC8vICAqIEBwYXJhbSBlbmMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgLy8gICovXHJcbiAgICAvLyBwdWJsaWMgU2V0VmFsb3JQcm9tb2Npb25lc0Zyb21MaXN0YVByZWNpb3MoZW5jOiBNM1BFbmNJdGVtcywgbFByZWNpb3M6IEFycmF5PGFueT4pIHtcclxuICAgIC8vICAgICB0cnkge1xyXG4gICAgLy8gICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEICYmIHguUFVOSVRORVRPID09IGRWYWxvcilcclxuICAgIC8vICAgICB9IGNhdGNoe1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlY0JldGEobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSkge1xyXG4gICAgLy8gICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBUaXBvUHJvbW8gPSBjb21iaS5UaXBvMjtcclxuICAgIC8vICAgICAgICAgdmFyIGlTaXplUHJlYzogbnVtYmVyID0gbFByZWNpb3MubGVuZ3RoO1xyXG4gICAgLy8gICAgICAgICB2YXIgaU1pdGFkOiBudW1iZXI7XHJcblxyXG4gICAgLy8gICAgICAgICB2YXIgcmVzaWR1b1g6IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgICAgIHZhciB4OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVsxXVxyXG4gICAgLy8gICAgICAgICB2YXIgeTogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMF0gLSAoK3gpO1xyXG4gICAgLy8gICAgICAgICB2YXIgaUR0bzogbnVtYmVyO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKHgudG9TdHJpbmcoKS5zcGxpdChcIi5cIikubGVuZ3RoID4gMSkge1xyXG4gICAgLy8gICAgICAgICAgICAgcmVzaWR1b1ggPSAreC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgaU1pdGFkID0gKCt5KSAvICgraVNpemVQcmVjKTtcclxuICAgIC8vICAgICAgICAgaU1pdGFkID0gTWF0aC5jZWlsKCgraU1pdGFkKSAqICgreCkpIC0gMTtcclxuXHJcbiAgICAvLyAgICAgICAgIGxQcmVjaW9zID0gbFByZWNpb3Muc29ydCgoYSwgYikgPT4gYS5QVU5JVE5FVE8gPCBiLlBVTklUTkVUTyA/IDEgOiBhLlBVTklUTkVUTyA+IGIuUFVOSVRORVRPID8gLTEgOiAwKVxyXG5cclxuICAgIC8vICAgICAgICAgdmFyIGlYID0gMDtcclxuICAgIC8vICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgICAgIGlEdG8gPSBpTWl0YWQ7XHJcbiAgICAvLyAgICAgICAgICAgICB3aGlsZSAoaUR0byA8IGlTaXplUHJlYykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChyZXNpZHVvWCA9PSAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyA9IDA7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlEdG8rKztcclxuICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLy9QYXJhIGxhcyBwcm9tb2Npb24gY29tbzogMlgxLjUsIC4uLlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvL0VzdGEgc29wb3J0YW5kbyBzb2xvIHBhcmE6IDJYMS41XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gKiAoK3Jlc2lkdW9YIC8gMTApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZShpWCA8IHgpe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gK2xQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyAqICgrcmVzaWR1b1ggLyAxMCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpWCsrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyAgICAgaUR0bysrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIGlYID0gMDtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgICAgICAvL0NhbGN1bGFyIHByZWNpb3MgdG90YWxlc1xyXG4gICAgLy8gICAgICAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgLy8gICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKCthY2MpICsgKCtjdXIuUFVOSVRORVRPKSwgMCk7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBsaXN0YSBkZSBkZXRhbGxlIGVsOiAgTk9NQl9QUk9NT0MsIFZBTF9QUk9NT0MgeSBJRF9QUk9NT0NcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZ3JlZ2FyTGlzdGFQcm9tbyhlbmM6IE0zUEVuY0l0ZW1zLCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBkVmFsb3JQcm9tb0NvbWJpOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZGV0Tm9tYnJlczogc3RyaW5nO1xyXG4gICAgICAgIHZhciBkZXRWYWxvcmVzOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIGRldElkczogc3RyaW5nO1xyXG5cclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtc05hbWVzOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtc1ZhbHM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zSWRzOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuXHJcblxyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcyA9IGVuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIk5PTUJfUFJPX0NPTUJJXCIpO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzID0gZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKTtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzID0gZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpO1xyXG5cclxuICAgICAgICBpZiAob00zUERldGFsbGVJdGVtc05hbWVzKSB7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5Ob21icmVDb25jZXB0byA9IFwiTk9NQl9QUk9fQ09NQklcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscy5Ob21icmVDb25jZXB0byA9IFwiVkFMX1BST19DT01CSVwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuTm9tYnJlQ29uY2VwdG8gPSBcIklEX1BST19DT01CSVwiXHJcblxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yID0gXCJcIlxyXG5cclxuICAgICAgICAgICAgZW5jLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtc05hbWVzKVxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zVmFscylcclxuICAgICAgICAgICAgZW5jLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtc0lkcylcclxuXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yID0gb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yICsgY29tYmkuTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgKyBjb21iaS5JZFByb21vY2lvbkNvbWJpbmFkYSArIFwiLFwiO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yID0gb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgKyBkVmFsb3JQcm9tb0NvbWJpLnRvU3RyaW5nKCkgKyBcIixcIjtcclxuXHJcbiAgICAgICAgLy9BaG9yYSBzZSBhZ3JlZ2EgdW5hIGRpbmFtaWNhIHBvciBhdHJpYnV0byBkZSBsYSBwcm9tbyBwYXJhIGZhY2lsaXRhciBsYSByZXRvbWEgZGUgZXN0YSBpbmZvcm1hY2nDg8KzblxyXG4gICAgICAgIGxldCBsaXN0Tm9tYnJlID0gb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGxldCBsaXN0SWQgPSBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGxldCBsaXN0VmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvci5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RJZC5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiTk9NQl9QUk9fQ09NQklfXCIgKyBfaSk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsaXphck9DcmVhclBEaW5hbWljYShlbmMuTTNERVQsIGxpc3ROb21icmVbX2ldLCBcIklEX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiVkFMX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWN0dWFsaXphck9DcmVhclBEaW5hbWljYShhcnJheURpbmFtaWNhczogQXJyYXk8TTNQRGV0YWxsZUl0ZW1zPiwgbm9tYnJlRGluYW1pY2E6IHN0cmluZywgVmFsb3JEaW5hbWljYTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IG9NM1BEZXRhbGxlSXRlbXMgPSBhcnJheURpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBub21icmVEaW5hbWljYSk7XHJcbiAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IFZhbG9yRGluYW1pY2E7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gbm9tYnJlRGluYW1pY2E7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBWYWxvckRpbmFtaWNhO1xyXG4gICAgICAgICAgICBhcnJheURpbmFtaWNhcy5wdXNoKG9NM1BEZXRhbGxlSXRlbXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbGEgbGlzdGEgZGUgZW5jYWJlemFkb3MsIHF1ZSBhcGxpY2FuIGEgbGEgbGlzdGEgY29tYmluYWRhIHF1ZSB0aWVuZVxyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Db21iaW5hZGEgT2JqZXRvIGRlIHByb21vY2lvbiBjb21iaWFuZGFcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBPYmpldG8gZGUgTTNQcm9jZXNvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0RW5jYWJlemFkb0J5Q29tYmkob1Byb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgICAgIG9MaXN0RW5jYWIgPSBpb00zUHJvY2Vzby5NM0VOQy5maWx0ZXIoZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlbmMuUHJvbW9Db21iaW5hZGFzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNldFByb21vQ29tYmluYWRhRU5DKGVuYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIShlbmMuSWRFbmNQYWRyZSA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuYy5Qcm9tb0NvbWJpbmFkYXMgJiYgK2VuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTEyMDggc2UgY2FtYmlhIHZhbGlkYWNpb24sIHBhcmEgcXVlIHRlbmdhIGVuIGN1ZW50YSBjdWFscXVpZXIgcHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gZW5jLlByb21vQ29tYmluYWRhcy5sZW5ndGggPiAwICYmIGVuYy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jLlByb21vQ29tYmluYWRhcy5sZW5ndGggPiAwICYmIGVuYy5Qcm9tb0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTGlzdEVuY2FiO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFNldFByb21vQ29tYmluYWRhRU5DKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJPTU9DT01CSVwiKVxyXG4gICAgICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyA9IEpTT04ucGFyc2Uob00zUERldGFsbGVJdGVtcy5WYWxvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXIgbGlzdGEgZGUgcHJlY2lvcyB5IGlkIGRlIGVuY2FiZXphZG8sIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBsaXN0YSBkZSBlbmNhYmV6YWRvc1xyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcm9jZXNhclxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvLy9EZXNBY29wbGFyIGxpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgdmFyIGxQcmVjaW9zID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICB2YXIgbkNhbnRpZGFkOiBudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBuUHJlY2lvVW5pdDogbnVtYmVyO1xyXG4gICAgICAgICAgICBuQ2FudGlkYWQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzMwIHZhbGlkYSBzaSBsYSBwcm9tb2Npb24gZXMgYWN1bXVsYWJsZS5cclxuICAgICAgICAgICAgaWYgKGJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgIG5QcmVjaW9Vbml0ID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3JcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5QcmVjaW9Vbml0ID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbkNhbnRpZGFkOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zLnB1c2goeyBcIkluZGljZVwiOiBqLCBcIlBVTklUTkVUT1wiOiBuUHJlY2lvVW5pdCwgXCJJRFwiOiBlbmMuSUQgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxQcmVjaW9zO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmNCeVByZChlbmM6IE0zUEVuY0l0ZW1zLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuLCBsUHJlY2lvczogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgICAgIHZhciBuUHJlY2lvVW5pdDogbnVtYmVyO1xyXG4gICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAgICAgaWYgKGJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5QcmVjaW9Vbml0ID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvclxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zLnB1c2goeyBcIkluZGljZVwiOiBqLCBcIlBVTklUTkVUT1wiOiBuUHJlY2lvVW5pdCwgXCJJRFwiOiBlbmMuSUQsIFwiSURQUk9EVUNUT1wiOiBlbmMuSWRQcm9kdWN0byB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgIC8vICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyAgICAgLy8vRGVzQWNvcGxhciBsaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByZWNpb3MgdG90YWxlc1xyXG4gICAgLy8gICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAvLyAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgLy8gICAgICAgICB2YXIgblByZWNpb1VuaXQ6IG51bWJlcjtcclxuICAgIC8vICAgICAgICAgbkNhbnRpZGFkID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAvLyAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3JcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsUHJlY2lvcy5wdXNoKHsgXCJJbmRpY2VcIjogaiwgXCJQVU5JVE5FVE9cIjogblByZWNpb1VuaXQsIFwiSURcIjogZW5jLklEIH0pO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBsUHJlY2lvcztcclxuXHJcbiAgICAvLyB9XHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vRklOIFYyIENPTUJJTkFEQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogUHJvY2VzYXJDb21iaW5hZGFYcG9yWVxyXG4gICAgKiBQcm9jZXNhciBwcm9tb2Npb24gY29tYmluYWRhIHF1ZSBzZSBsbGV2YW4geCBwcm9kdWN0b3MgcG9yIGVsIHByZWNpb24gZGUgeSBwcm9kdWN0b3MuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhWHBvclkob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG86IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdmFyIG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgdmFyIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvO1xyXG5cclxuICAgICAgICAvL1ZhbGlkYSBzaSBlbCBwcm9kdWN0byBhZ3JlZ2FkbywgdGllbmUgdW5hIG1pc21hIHByb21vY2lvbiBhY3RpdmEgZW4gbGEgZmFjdHVyYS5cclxuICAgICAgICAvLyBpZiAob00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSAhPSBudWxsICYmIG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vICAgICBtM0NvbWJpbmFkYXhQcm9jZXNvID0gb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYS5maW5kKGNvbWJpbmFkYXMgPT4gY29tYmluYWRhcy5JZFByb21vY2lvbiA9PSBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSAmJiBjb21iaW5hZGFzLlRlcm1pbmFkYSA9PSBmYWxzZSk7XHJcbiAgICAgICAgLy8gICAgIC8vVmFsaWRhIHNpIHlhIGV4aXN0ZSB1biBwcm9jZXNvLlxyXG4gICAgICAgIC8vICAgICBpZiAobTNDb21iaW5hZGF4UHJvY2VzbyAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvblhQcm9jZXNvID0gbTNDb21iaW5hZGF4UHJvY2Vzby5JZFByb21vY2lvblhQcm9jZXNvO1xyXG4gICAgICAgIC8vICAgICAgICAgLy9UcmFlIGxvcyBFbmNhYmV6YWRvcyBjb24gbGEgcHJvbW9jaW9uIFxyXG4gICAgICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jcyA9PiBlbmNzLlByb21vQ29tYmluYWRhcyAhPSBudWxsICYmIGVuY3MuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jcy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25YUHJvY2VzbyA9PSBtM0NvbWJpbmFkYXhQcm9jZXNvLklkUHJvbW9jaW9uWFByb2Nlc28pO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJvbW9YUG9yWShtM0VuY3NDb25Qcm9tbywgbTNDb21iaW5hZGF4UHJvY2Vzbyk7XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLkFncmVnYXJQcm9tb2Npb25Db21iaW5hZGFBUHJvY2VzbyhvTTNQcm9jZXNvcywgbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSA9IG5ldyBBcnJheTxNM1Byb21Db21iaW5hZGFYUHJvY2Vzbz4oKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyUHJvbW9jaW9uQ29tYmluYWRhQVByb2Nlc28ob00zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG8uUHJvbW9Db21iaW5hZGFzWzBdKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vcmVjYWxjdWxhciBwcm9tb2Npb24sIGRlcGVuZGllbmRvIGRlIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBlbmNhYmV6YWRvcy5cclxuICAgIC8vMS5WYWxpZGFyIHNpIHlhIGVzdGFuIHRvZG9zIGxvcyBpdGVtcyBwYXJhIHJlY2FsY3VsYXIgbGEgcHJvbW9jaW9uXHJcbiAgICAvLzIuIE9yZGVuYXIgbG9zIGVuY2FiZXphZG9zIGRlIG1heW9yIGEgbWVub3IgcHJlY2lvLlxyXG4gICAgLy8zLiBEZWphciBlbCBwcmVjaW8gZGUgbG9zIGl0ZW1zIGRlIG1lbm9yIHByZWNpb24gZW4gMFxyXG4gICAgLy8gcHVibGljIFJlY2FsY3VsYXJQcm9tb1hQb3JZKG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz4sIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvKSB7XHJcbiAgICAvLyAgICAgdmFyIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYTtcclxuICAgIC8vICAgICB2YXIgdmFyeDogbnVtYmVyO1xyXG4gICAgLy8gICAgIHZhciB2YXJ5OiBudW1iZXI7XHJcbiAgICAvLyAgICAgdmFyIHBhcnRlRGVjWTogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICBvUHJvbW9jaW9uQ29tYmluYWRhID0gbTNFbmNzQ29uUHJvbW9bMF0uUHJvbW9Db21iaW5hZGFzWzBdO1xyXG5cclxuICAgIC8vICAgICB2YXJ4ID0gcGFyc2VGbG9hdChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiX1wiKVsxXS5zcGxpdChcIlhcIilbMF0pO1xyXG4gICAgLy8gICAgIHZhcnkgPSBwYXJzZUZsb2F0KG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkuc3BsaXQoXCJfXCIpWzFdLnNwbGl0KFwiWFwiKVsxXSk7XHJcblxyXG4gICAgLy8gICAgIGlmIChTdHJpbmcodmFyeSkuaW5jbHVkZXMoXCIuXCIpKSB7XHJcbiAgICAvLyAgICAgICAgIHBhcnRlRGVjWSA9IHBhcnNlRmxvYXQob1Byb21vY2lvbkNvbWJpbmFkYS5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKS5zcGxpdChcIl9cIilbMV0uc3BsaXQoXCJYXCIpWzFdLnNwbGl0KFwiLlwiKVsxXSk7XHJcbiAgICAvLyAgICAgICAgIHZhcnkgPSBwYXJzZUZsb2F0KFN0cmluZyh2YXJ5KS5zcGxpdChcIi5cIilbMF0pO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgaWYgKHZhcnggPT0gbTNFbmNzQ29uUHJvbW8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgICAgIG0zQ29tYmluYWRheFByb2Nlc28uVGVybWluYWRhID0gdHJ1ZTtcclxuICAgIC8vICAgICAgICAgLy9PcmRlbmFyIGxvcyBlbmNhYmV6YWRvcyBwb3IgcHJlY2lvIG1heW9yIGEgbWVub3JcclxuICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBtM0VuY3NDb25Qcm9tby5zb3J0KChhLCBiKSA9PlxyXG4gICAgLy8gICAgICAgICAgICAgKGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yIDwgYi5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpID8gMSA6XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgKChiLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA8IGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSA/IC0xIDogMCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtM0VuY3NDb25Qcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgLy9WYWxpZGEgc2kgeWEgXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAocGFydGVEZWNZICE9IDAgJiYgKCtpKSA9PSAoK3ZhcnkpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFydGVEZWNZKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSAoKCttM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpICogKCsoK3BhcnRlRGVjWSkgLyAxMDApKS50b1N0cmluZygpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIGlmICgoK2kpICsgMSA+IHZhcnkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBcIjBcIjtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBDb21iaW5hZGEgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHRvdGFsIGRlIHB1bnRvcyBkZSBmaWRlbGl6YWNpb24gZW4gbGEgdHJhbnNhY2Npw4PCs24gcmVkb25kZWFkb3MgaGFjw4PCrWEgYWJham9cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF90b3RhbF9maWRlbGl6YWNpb24ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgdG90YWxfZmlkZWxpemFjaW9uID0gMDtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRvdGFsX2ZpZGVsaXphY2lvbiA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiRklERUxJWkFDSU9OXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoKCgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkZJREVMSVpBQ0lPTlwiKS5WYWxvcikgLyAxMDApICogKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IpKSwgMClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZSByZWRvbmRlYXJhIG5vIGFjYSBzaW5vIGVuIGxhIHN1bWEgdG90YWwgZGVsIGZpZGVsaXphY2lvbiBkZSBjYWRhIGZvcm1hIGRlIHBhZ29cclxuICAgICAgICByZXR1cm4gdG90YWxfZmlkZWxpemFjaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBlbCB2YWxvciBkZWwgZmlkZWxpemFjaW9uIGRlIHVuIHByb2Nlc28sIGV2YWx1YW5kbyBjYWRhIGZvcm1hIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPikge1xyXG5cclxuICAgICAgICB2YXIgcGFnb190b3RhbF9wcm9jZXNvOiBudW1iZXIgPSBwcm9jZXNvLlZhbG9yTmV0bztcclxuICAgICAgICAvL3ZhciBtYXhfdmFsdWVfZmlkZWxpemFjaW9uOiBudW1iZXIgPSB0aGlzLmdldF90b3RhbF9maWRlbGl6YWNpb24ocHJvY2Vzbyk7XHJcbiAgICAgICAgdmFyIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgICB2YXIgbGlzdF9jb25kaV9wcm9tbyA9IHRoaXMuZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RfZW5jX3Byb21vLCBcIlBBR09cIiwgXCJNT05FREVST1wiKTtcclxuXHJcbiAgICAgICAgaWYgKHByb2Nlc28ubE0zUEVuY0ZQKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBwcm9jZXNvLmxNM1BFbmNGUC5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBmb3JtYV9wYWdvOiBNM1BFbmNGUCA9IHByb2Nlc28ubE0zUEVuY0ZQW19pXTtcclxuICAgICAgICAgICAgICAgIGxldCBwcm9tb0FwbGljYWRhOiBNM0NPTkRJUFJPTU87XHJcbiAgICAgICAgICAgICAgICBsZXQgYXBsaWNhX2ZpZGVsaXphY2lvbiA9IHRoaXMudmFsaWRhdGVfY29uZGlfYnlfZm9ybWFfcGFnbyhmb3JtYV9wYWdvLCBsaXN0X2NvbmRpX3Byb21vKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXBsaWNhX2ZpZGVsaXphY2lvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yUGFnbyA9IGZvcm1hX3BhZ28uVmFsb3IgLSBmb3JtYV9wYWdvLlZhbENhbWJpbztcclxuICAgICAgICAgICAgICAgICAgICByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiArPSB0aGlzLmNhbGN1bGF0ZV9maWRlbGl6YWNpb25fYnlfZm9ybWFfcGFnbyhwYWdvX3RvdGFsX3Byb2Nlc28sIHByb2Nlc28uTTNFTkMsIHZhbG9yUGFnbywgYXBsaWNhX2ZpZGVsaXphY2lvbiwgbGlzdF9lbmNfcHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiAocmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPiBtYXhfdmFsdWVfZmlkZWxpemFjaW9uKSB7XHJcbiAgICAgICAgLy8gICAgIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uID0gbWF4X3ZhbHVlX2ZpZGVsaXphY2lvbjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgcmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPSB0aGlzLm9NYXRoVEYucm91bmQocmVhbF92YWx1ZV9maWRlbGl6YWNpb24sIDIpO1xyXG4gICAgICAgIHJldHVybiByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGFzIHJlc3RyaWNjaW9uZXMgQWN0aXZhcyBkZSB0aXBvIGRlIHBhZ28gYSBwYXJ0aXIgZGUgQXJyYXk8TTNDT05ESVBST01PPlxyXG4gICAgICogQHBhcmFtIGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkbyAuXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zRW5jSXRlbSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXMobGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvOiBBcnJheTxNM0NPTkRJUFJPTU8+LCBsaXN0TTNFbmNJdGVtOiBBcnJheTxNM1BFbmNJdGVtcz4pOiBBcnJheTxNM0NPTkRJUFJPTU8+IHtcclxuICAgICAgICBsZXQgcmVzdHJpY2Npb25lc0FjdGl2YXMgPSBuZXcgQXJyYXk8TTNDT05ESVBST01PPigpO1xyXG4gICAgICAgIGlmIChsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdE0zRW5jSXRlbS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBsaXN0TTNEZXQgPSBsaXN0TTNFbmNJdGVtW19pXS5NM0RFVDtcclxuICAgICAgICAgICAgICAgIGlmICgrbGlzdE0zRW5jSXRlbVtfaV0uTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkUHJvbW9jaW9uZXMgPSBsaXN0TTNEZXQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9NT0NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkUHJvbW9jaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkUHJvbW8gPSBpZFByb21vY2lvbmVzLlZhbG9yLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2sgPSAwOyBfayA8IGlkUHJvbW8ubGVuZ3RoOyBfaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW8gPSAraWRQcm9tb1tfa107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlQcm9tbyA9IGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkby5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGlQcm9tbyAmJiAhcmVzdHJpY2Npb25lc0FjdGl2YXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gcHJvbW8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY2Npb25lc0FjdGl2YXMucHVzaChjb25kaVByb21vKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN0cmljY2lvbmVzQWN0aXZhcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGFzIHJlc3RyaWNjaW9uZXMgQWN0aXZhcyBwYXJhIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gYWN0dWFsXHJcbiAgICAgKiBAcGFyYW0gbGlzdEVuY1Byb21vIFxyXG4gICAgICogQHBhcmFtIGxpc3RNM0VuY0l0ZW0gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSZXN0cmljY2lvbmVzVGlwb1BhZ29BY3RpdmFzRnJvbUVuY1Byb21vKGxpc3RFbmNQcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4sIGxpc3RNM0VuY0l0ZW06IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIGxldCBsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8gPSB0aGlzLmdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0RW5jUHJvbW8sIFwiUEFHT1wiLCBcIlJFU1RSSUNDSU9OX1BBR09cIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXMobGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvLCBsaXN0TTNFbmNJdGVtKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxvcyBtb3ZpbWllbnRvcyByZWFsaXphZG9zIHBvciB1biBtM3NhbGRvc3hjdWVudGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dldF9tb3ZpbWllbnRvc19maWRlbGl6YWNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy92YXIgZGF0YSA9IHsgXCJpZF9tM1wiOiBpZG0zLCBcImlkX3Byb2Nlc29cIjogcHJvY2VzbyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL20zX2dldF9tb3ZpbWllbnRvc19maWRlbGl6YWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgbW92cyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdmFyIHJlc3BfbW92czogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgaWYgKCFtb3ZzLk1PVlMuTU9WLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgIHJlc3BfbW92cy5wdXNoKG1vdnMuTU9WUy5NT1YpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzID0gbW92cy5NT1ZTLk1PVjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3BfbW92cyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGxhIGZvcm1hIGRlIHBhZ28gY3VtcGxlIGFsZ3VuYSBjb25kaWNpb24gZGUgZmlkZWxpemFjaW9uXHJcbiAgICAgKiBAcGFyYW0gZm9ybWFfcGFnbyBcclxuICAgICAqIEBwYXJhbSBsaXN0X2NvbmRpX3Byb21vOiBsaXN0YWRvIGRlIGNvbmRpY2lvbmVzIGRlIGZpZGVsaXphY2lvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhdGVfY29uZGlfYnlfZm9ybWFfcGFnbyhmb3JtYV9wYWdvOiBNM1BFbmNGUCwgbGlzdF9jb25kaV9wcm9tbzogQXJyYXk8TTNDT05ESVBST01PPikge1xyXG4gICAgICAgIC8vcmV0dXJuIGxpc3RfY29uZGlfcHJvbW9bMF07XHJcbiAgICAgICAgbGV0IHByb21vc0FwbGljYWRhcyA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RfY29uZGlfcHJvbW8ubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaV9wcm9tbyA9IGxpc3RfY29uZGlfcHJvbW9bX2ldO1xyXG4gICAgICAgICAgICB2YXIgakFkaWNpb25hbGVzID0gSlNPTi5wYXJzZShjb25kaV9wcm9tby5KQWRpY2lvbmFsZXMpO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChjb25kaV9wcm9tby5Db25jZXB0by50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJJRF9QQUdPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TaSBlbCBvcGVyYWRvciBlcyBESUZGIGNyZWEgdW5hIGV4cHJlc2lvbiByZWd1bGEgcGFyYSBleGNsdWlyIGxvIHRpcG9kZXBhZ28gY29uZmlndXJhZG9zXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEgJiYgakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gJiYgakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJESUZGXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGlfcHJvbW8uVmFsb3IgPSBcIl4oPyEoXCIgKyBjb25kaV9wcm9tby5WYWxvciArIFwiKVxcXFxiKVxcXFx3KyRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpX3Byb21vLlZhbG9yID0gXCJeKFwiICsgY29uZGlfcHJvbW8uVmFsb3IgKyBcIikkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoY29uZGlfcHJvbW8uVmFsb3IsIFwiaVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUudGVzdChmb3JtYV9wYWdvLklkVGlwb1BhZ28udG9TdHJpbmcoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW9zQXBsaWNhZGFzLnB1c2goY29uZGlfcHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvbW9zQXBsaWNhZGFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCBsaXN0YWRvIGRlIGNvbmRpY2lvbmVzIHZhbGlkYXMgcGFyYSB1bmEgYWN0aXZpZGFkIGRhZGFcclxuICAgICAqIEBwYXJhbSBsaXN0X2VuY19wcm9tbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4sIGFjdGl2aWRhZDogc3RyaW5nLCB0aXBvMjogc3RyaW5nKTogQXJyYXk8TTNDT05ESVBST01PPiB7XHJcbiAgICAgICAgdmFyIGxpc3RfY29uZGlfcHJvbW86IEFycmF5PE0zQ09ORElQUk9NTz4gPSBuZXcgQXJyYXk8TTNDT05ESVBST01PPigpO1xyXG4gICAgICAgIHZhciBob3kgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAobGlzdF9lbmNfcHJvbW8pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgX2sgPSAwOyBfayA8IGxpc3RfZW5jX3Byb21vLmxlbmd0aDsgX2srKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVuY2FiZXphZG9Qcm9tbyA9IGxpc3RfZW5jX3Byb21vW19rXTtcclxuICAgICAgICAgICAgICAgIHZhciBkVmlnZW5jaWEgPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uVmlnZW5jaWEpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRJbmljaW8gPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uSW5pY2lvKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbmNhYmV6YWRvUHJvbW8uRXN0YWRvICYmIGRWaWdlbmNpYSA+PSBob3kgJiYgZEluaWNpbyA8PSBob3kgJiYgZW5jYWJlemFkb1Byb21vLlRpcG8yID09IHRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGVuY2FiZXphZG9Qcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpX2FncnVwYWNpb24gPSBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT05bX2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2ogPSAwOyBfaiA8IGNvbmRpX2FncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgX2orKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpX3Byb21vID0gY29uZGlfYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9bX2pdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BQ1RJVklEQUQgPT0gYWN0aXZpZGFkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfY29uZGlfcHJvbW8ucHVzaChjb25kaV9wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGlzdF9jb25kaV9wcm9tbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGEgZWwgdmFsb3IgZGVsIGZpZGVsaXphY2lvbiBkZSB1bmEgZm9ybWEgZGUgcGFnbyBkZSBhY3VlcmRvIGEgc3UgcG9yY2VudGFqZSByZXNwZWN0byBlbCB2YWxvciB0b3RhbCBkZWwgcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIHBhZ29fdG90YWxfcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBtYXhfdmFsdWVfZmlkZWxpemFjaW9uIFxyXG4gICAgICogQHBhcmFtIHZhbHVlX2Zvcm1hX3BhZ28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYWxjdWxhdGVfZmlkZWxpemFjaW9uX2J5X2Zvcm1hX3BhZ28ocGFnb190b3RhbF9wcm9jZXNvOiBudW1iZXIsIGxpc3RNM0VuYzogTTNQRW5jSXRlbXNbXSwgdmFsdWVfZm9ybWFfcGFnbzogbnVtYmVyLCBwcm9tb3NBcGxpY2FkYTogQXJyYXk8TTNDT05ESVBST01PPiwgbGlzdF9lbmNfcHJvbW86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcbiAgICAgICAgbGV0IGxpc3RQcm9tb3NBcGxpY2FkYXM7XHJcbiAgICAgICAgbGV0IGRldGFsbGVJZFByb21vYztcclxuICAgICAgICBsZXQgdmFsb3JGaWRlbGl6YWNpb24gPSAwO1xyXG4gICAgICAgIGxldCBwZXJjZW50X2Zvcm1hX3BhZ286IG51bWJlciA9IHZhbHVlX2Zvcm1hX3BhZ28gLyBwYWdvX3RvdGFsX3Byb2Nlc287XHJcbiAgICAgICAgdmFyIHByZWNpb1Byb2R1Y3RvID0gMDtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdE0zRW5jKSB7XHJcbiAgICAgICAgICAgIGxpc3RQcm9tb3NBcGxpY2FkYXMgPSBbXTtcclxuICAgICAgICAgICAgZGV0YWxsZUlkUHJvbW9jID0gaXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST01PQ1wiKTtcclxuICAgICAgICAgICAgcHJlY2lvUHJvZHVjdG8gPSAraXRlbS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgbGV0IHByZWNpb1NSID0gaXRlbS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9TUlwiKTtcclxuICAgICAgICAgICAgaWYgKHByZWNpb1NSICE9IG51bGwgJiYgcHJlY2lvU1IuVmFsb3IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcHJlY2lvUHJvZHVjdG8gPSArcHJlY2lvU1IuVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRldGFsbGVJZFByb21vYyAmJiBkZXRhbGxlSWRQcm9tb2MuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIGxpc3RQcm9tb3NBcGxpY2FkYXMgPSBkZXRhbGxlSWRQcm9tb2MuVmFsb3Iuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW9BcGwgb2YgcHJvbW9zQXBsaWNhZGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChsaXN0UHJvbW9zQXBsaWNhZGFzLmZpbmQoeCA9PiAreCA9PSBwcm9tb0FwbC5JZFByb21vY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW8gPSBsaXN0X2VuY19wcm9tby5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tb0FwbC5JZFByb21vY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yID0gdGhpcy52YWxpZGFyUmVkb25kZW8ocHJvbW8sIHByZWNpb1Byb2R1Y3RvICogdGhpcy5nZXRQb3JjZW50YWplRmlkZWxpemFjaW9uRnJvbUVuY1Byb21vKHByb21vKSAvIDEwMCkgKiAocGVyY2VudF9mb3JtYV9wYWdvKTtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckZpZGVsaXphY2lvbiArPSB2YWxvcjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsb3JGaWRlbGl6YWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UG9yY2VudGFqZUZpZGVsaXphY2lvbkZyb21FbmNQcm9tbyhwcm9tbykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24gJiYgakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJSZWRvbmRlbyhwcm9tbywgdmFsb3I6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24gJiYgakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlJlZG9uZGVvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yLCArakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlJlZG9uZGVvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hIHVuYSBkaW5hbWljYSBjb24gZWwgdmFsb3IgZGUgbGEgZmlkZWxpemFjacODwrNuIGRlIGRpY2hvIHByb2Nlc28geSByZXRvcm5hIGRpY2hvIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkX2RpbmFtaWNhX2ZpZGVsaXphY2lvbl90b19wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPik6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIHZhciB2YWx1ZV9maWRlbGl6YWNpb24gPSAwXHJcbiAgICAgICAgaWYgKGxpc3RfZW5jX3Byb21vKSB7XHJcbiAgICAgICAgICAgIHZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMuZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc28sIGxpc3RfZW5jX3Byb21vKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZV9maWRlbGl6YWNpb24gPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYV9maWRlbGl6YWNpb246IE0zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLk5vbWJyZSA9IFwiRklERUxJWkFDSU9OXCJcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLlZhbG9yID0gdmFsdWVfZmlkZWxpemFjaW9uLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChkaW5hbWljYV9maWRlbGl6YWNpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBkb2N1bWVudG8gZGUgZmlkZWxpemFjaW9uIGVuIGxhIHRhYmxhIE0zU2FsZG9zWEN1ZW50YVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRvIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9kb2NfZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvdmFsaWRhdGVfZG9jX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzYWxkb194X2N1ZW50YTtcclxuICAgICAgICAgICAgc2FsZG9feF9jdWVudGEgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkuUkVTUFVFU1RBLk0zU2FsZG9zWEN1ZW50YTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHNhbGRvX3hfY3VlbnRhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgZWwgc2FsZG8gc3VtYW5kb2xlIGVsIHZhbG9yIGVudmlhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdHVhbGl6YXJfc2FsZG9fZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9kYXRhID0ge1wiZG9jdW1lbnRvXCI6ZG9jdW1lbnRvLCBcInZhbG9yX21vdmltaWVudG9cIjp2YWxvcl9tb3ZpZW50bywgXCJwYWdvXCI6cGFnbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9hY3R1YWxpemFyX3NhbGRvX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEucGFnby5pZERpYXJpbyA9IHJlc3BbXCJfYm9keVwiXS5yZXBsYWNlKCdcIicsICcnKS5yZXBsYWNlKCdcIicsICcnKTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKGRhdGEucGFnbyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSBVbiBib25vIGRlIGRldm9sdWNpb24gcG9yIGVsIHZhbG9yIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgPSB7XCJwcm9jZXNvXCIscHJvY2VzbyxcInZhbG9yXCI6dmFsb3J9XHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dlbmVyYXJfYm9ub19kZXZvbHVjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9ib25vX2Rldm9sdWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWEgdW4gbnVldm8gcmVnaXN0cm8gZW4gbGEgdGFibGEgU2FsZG9YQ3VlbnRhXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM0luc2VydFNhbGRvWEN1ZW50YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vdmFyIGRhdGEgPSB7ICdEb2N1bWVudG8nOiB0aGlzLmRvY3VtZW50bywgJ1REb2NUaXR1bGFyJzogJzUnLCAnTkRvY1RpdHVsYXInOiB0aGlzLm5kb2NfY2xpZW50ZSwgJ05vbUN1ZW50YSc6ICdGSURFTElaQUNJT04nLCAnVmFsQ3VlbnRhJzogMCB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9tM0luc2VydFNhbGRvWEN1ZW50YS9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKE0zRU5DOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICBpZiAoTTNFTkMpIHtcclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZCA9IE0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChkQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvdWNoQ29uZmlnTFBTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBpZGthdGlvczogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBwcml2YXRlIGFwbFN5bmNDb3VjaEF1dG8gPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRGbGFnU3luY0NvdWNoKCkge1xyXG4gICAgICAgIHZhciBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIHZhciBvU1ViaWNhY2lvbjtcclxuICAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgbGV0IGNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gbnVsbCAmJiBjb25maWcuU3luY0NvdWNoQXV0byAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmbGFnID0gY29uZmlnLlN5bmNDb3VjaEF1dG87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgdGhpcy5pZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJDb25maWdMUF9cIiArIHRoaXMuaWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJhZGFwdGVyXCIpXHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmRhdGFiYXNlLmFkYXB0ZXIpO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgLy8gdGhpcy52YWxpZGFyUGFxdWV0ZXMoKVxyXG4gICAgICAgIHRoaXMuc3luY0NvdWNoKCk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIENPTkZJR0xQICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vIHZhbGlkYXJQYXF1ZXRlcygpIHtcclxuICAgIC8vICAgICBpZiAodGhpcy5hcGxQYXF1ZXRlcykge1xyXG4gICAgLy8gICAgICAgICBsZXQgdWJpY2FjaW9uID0gdGhpcy5nZXRVYmljYWNpb24oKTtcclxuICAgIC8vICAgICAgICAgaWYgKHViaWNhY2lvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNhXCIgKyB1YmljYWNpb24gKyBcIl9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgc3luY0NvdWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZGthdGlvcykge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImNvbmZpZ2xwX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VWJpY2FjaW9uKCkge1xyXG4gICAgICAgIGxldCBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIGxldCBvU1ViaWNhY2lvbjtcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5JRFViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TVWJpY2FjaW9uLklEVWJpY2FjaW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIC8vIHB1YmxpYyBHZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCkge1xyXG4gICAgLy8gICAgIHZhciBLYXRpb3MgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnS2F0aW9zXCIgKyB0aGlzLmlka2F0aW9zLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgLy8gICAgIGlmIChLYXRpb3MgIT09IHVuZGVmaW5lZCAmJiBLYXRpb3MgIT0gbnVsbCkge1xyXG4gICAgLy8gICAgICAgICB2YXIgakthdGlvc00zID0gSlNPTi5wYXJzZShLYXRpb3MpO1xyXG4gICAgLy8gICAgICAgICBpZiAoakthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3NNMyAmJiBqS2F0aW9zTTMuS2F0aW9zTTMuYXBsUGFxcykge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5hcGxQYXF1ZXRlcyA9IGpLYXRpb3NNMy5LYXRpb3NNMy5hcGxQYXFzXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlc3Ryb3koaWRrYXRpb3MpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmFwbFN5bmNDb3VjaEF1dG8gPSB0aGlzLmdldEZsYWdTeW5jQ291Y2goKTtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRoaXMuYXBsU3luY0NvdWNoQXV0byxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBDT05GSUdMUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gQ09ORklHTFAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmluZm8oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZUxwKGlkKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaWQpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlbGV0ZUFsbERvY3MoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pLnRoZW4oYWxsRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxEb2NzLnJvd3MubWFwKHJvdyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBfaWQ6IHJvdy5pZCwgX3Jldjogcm93LmRvYy5fcmV2LCBfZGVsZXRlZDogdHJ1ZSB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS50aGVuKGRlbGV0ZURvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5idWxrRG9jcyhkZWxldGVEb2NzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG59IiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgeyBDb3VjaENvbmZpZ0xQU2VydmljZSB9IGZyb20gXCIuLi9PZmZsaW5lL2NvdWNoLWNvbmZpZ2xwLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTWF0aFRGIH0gZnJvbSBcIi4uL01pc2NlbGFuZWEvTWF0aFRGLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zUHJkQWRpY2lvbmFsZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEFkaWNpb25hbGVzLnR5cGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvIHtcclxuICAgIHByaXZhdGUgb01hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHByaXZhdGUgZ3NpZGthdGlvczogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBhcGxQcmVjaW9zRGluYW1pY29zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWRrYXRpb3MpIHtcclxuICAgICAgICB0aGlzLmdzaWRrYXRpb3MgPSBpZGthdGlvcztcclxuICAgICAgICB0aGlzLkdldEthdGlvc00zRnJvbVNlc3Npb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICBsZXQgS2F0aW9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJDb25maWdLYXRpb3NcIiArIHRoaXMuZ3NpZGthdGlvcy50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoS2F0aW9zICE9PSB1bmRlZmluZWQgJiYgS2F0aW9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIGpLYXRpb3NNMyA9IEpTT04ucGFyc2UoS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYgKGpLYXRpb3NNMyAmJiBqS2F0aW9zTTMuS2F0aW9zICYmIGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBhcGwgPSBqS2F0aW9zTTMuS2F0aW9zLkthdGlvc00zLmZpbmQoeCA9PiB4LkxsYXZlLnRvVXBwZXJDYXNlKCkgPT0gXCJBUExMUERJTkFNSUNPU1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChhcGwgJiYgYXBsLlZhbG9yID09IFwiMVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcGxQcmVjaW9zRGluYW1pY29zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy9Bc2lnbmFyIGxpc3RhIGRlIHByZWNpb3MsIHNlZ3VuIGxpc3RhIGRlIHByZWNpb3MgYXNvY2lhZG8gYSB1c3VhcmlvIHBvciBjYWRhIHVqbm8gZGUgIGxvcyBwcm9kdWN0b3MgaGlqb3NcclxuICAgIHB1YmxpYyBhc3luYyBBc2lnbmFyTGlzdGFQcmVjaW9NM1BhY2soUHJvZHVjdG9NYWVzdHJvOiBUeXBlTTNQcmRHcnAsIG9EYXRhVXNlcjogYW55LCBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG9NM1ByZEdycEFzb2NpYWRvIG9mIFByb2R1Y3RvTWFlc3Ryby5NM1ByZEdycEFzb2NpYWRvKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuQXNpZ25hckxpc3RhUHJlY2lvKG9NM1ByZEdycEFzb2NpYWRvLk0zR1JQLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmRHZW5lcmFsIG9mIFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbCkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG0zUGFjayBvZiBwcmRHZW5lcmFsLk0zUEFDSykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW8obTNQYWNrLk0zR1JQLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL0FzaWduYXIgbGlzdGEgZGUgcHJlY2lvcywgc2VndW4gbGlzdGEgZGUgcHJlY2lvcyBhc29jaWFkbyBhIHVzdWFyaW8uXHJcbiAgICBwdWJsaWMgYXN5bmMgQXNpZ25hckxpc3RhUHJlY2lvKFByb2R1Y3RvTWFlc3RybzogVHlwZU0zUHJkR3JwLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICB0aGlzLkdldEthdGlvc00zRnJvbVNlc3Npb24oKTtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT09IHVuZGVmaW5lZCAmJiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvICE9IC0xICYmIFByb2R1Y3RvTWFlc3Rybykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHByZEdybCA9IFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbFtpXTtcclxuICAgICAgICAgICAgICAgIGxldCBzcGxpdFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8uc3BsaXQoXCItXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IHByZEdybC5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBzcGxpdFByZWNpb1swXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob0xpc3RhRmluZGVkICYmIHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXBsUHJlY2lvc0RpbmFtaWNvcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNwbGl0UHJlY2lvWzFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTEJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IG9MaXN0YUZpbmRlZC5MQztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJMRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MaXN0YUZpbmRlZC5QUkVDSU8gPSBvTGlzdGFGaW5kZWQuTEQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9Db3VjaENvbmZpZ0xQU2VydmljZSA9IG5ldyBDb3VjaENvbmZpZ0xQU2VydmljZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RhQ291Y2ggPSBhd2FpdCBvQ291Y2hDb25maWdMUFNlcnZpY2UuZ2V0KHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpDb25maWdMUCA9IEpTT04ucGFyc2UobGlzdGFDb3VjaC5KQ29uZmlndXJhY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakNvbmZpZ0xQICYmIGpDb25maWdMUC5GYWN0b3JlcyAmJiBqQ29uZmlnTFAuRmFjdG9yZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmYWN0b3IgPSBwYXJzZUZsb2F0KGpDb25maWdMUC5GYWN0b3Jlcy5maW5kKHggPT4geC5Ob21icmUgPT0gc3BsaXRQcmVjaW9bMV0pLkZhY3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IHRoaXMub01hdGhURi5yb3VuZChvTGlzdGFGaW5kZWQuUFJFQ0lPICogZmFjdG9yLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuTTNQcmVzZW50YWNpb25lcy5mb3JFYWNoKHByZXNlbnRhY2lvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhY2lvbi5WQUxPUiA9IHRoaXMub01hdGhURi5yb3VuZChwcmVzZW50YWNpb24uVkFMT1IgKiBmYWN0b3IsIDIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGVuIGFzaWduYXJsaXN0YXByZWNpbzogXCIgKyBFeC5tZXNzYWdlICsgXCIgLSBcIiArIHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvTGlzdGFGaW5kZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZEdybC5Mb00zUHJkTGlzdGEgPSBvTGlzdGFGaW5kZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuVmFsaWRhckRhdGFGcm9tSW52ZW50YXJpbyhwcmRHcmwsIG9EYXRhVXNlciwgb1Bvc3RTZXJ2aWNlTTMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBvTTNQcmRBZGljaW9uYWxlcyA9IG5ldyBNM1ByZEFkaWNpb25hbGVzKCk7XHJcbiAgICAgICAgICAgIG9NM1ByZEFkaWNpb25hbGVzLkFUUklCVVRPID0gXCJMSVNUQVBSRUNJT1wiO1xyXG4gICAgICAgICAgICBvTTNQcmRBZGljaW9uYWxlcy5WQUxPUiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW87XHJcbiAgICAgICAgICAgIFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkQWRpY2lvbmFsZXMucHVzaChvTTNQcmRBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChQcm9kdWN0b01hZXN0cm8pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW9NM1BhY2soUHJvZHVjdG9NYWVzdHJvLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEFzaWduYXJMaXN0YVByZWNpb0FHZW5lcmFsKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbyAhPT0gdW5kZWZpbmVkICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT0gLTEpIHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IHByZEdybC5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvKTtcclxuICAgICAgICAgICAgaWYgKG9MaXN0YUZpbmRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb0xpc3RhRmluZGVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5WYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybCwgb0RhdGFVc2VyLCBvUG9zdFNlcnZpY2VNMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBWYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICB2YXIgc0xpc3RhOiBzdHJpbmcgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIC8vVmFsaWRhciBzaSBlcyB1biB2YWxvciBkZSBpbnZlbnRhcmlvLlxyXG4gICAgICAgIGlmIChzTGlzdGEuc3BsaXQoJ18nKVswXSA9PSBcIklOVlwiKSB7XHJcbiAgICAgICAgICAgIHZhciBqRGF0YTogYW55ID0geyBcInViaWNhY2lvblwiOiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBcInNrdVwiOiBwcmRHcmwuU0tVLCBcImxvdGVcIjogcHJkR3JsLkxPVEUsIFwiY29uY2VwdG9cIjogc0xpc3RhLnNwbGl0KCdfJylbMV0gfTtcclxuICAgICAgICAgICAgdmFyIHByZWNpbyA9IGF3YWl0IG9NM1JlZ1NlcnZpY2UuR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYihvUG9zdFNlcnZpY2VNMywgdGhpcy5nc2lka2F0aW9zLCBqRGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChwcmVjaW8gJiYgcHJlY2lvICE9IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQcmRMaXN0YSA9IG5ldyBNM1ByZExpc3RhKCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcmRMaXN0YS5JRExJU1RBID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLkxPVEUgPSBwcmRHcmwuTE9URTtcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlBSRUNJTyA9IHByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlNLVSA9IHByZEdybC5TS1U7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb00zUHJkTGlzdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG4vL2ltcG9ydCB7IHNlc3Npb25XRTggfSBmcm9tIFwiLi4vLi4vLi4vU2Vzc2lvbi9zZXNzaW9uLmNsYXNzXCI7XHJcbmltcG9ydCB7IEZpbHRyb3MgfSBmcm9tIFwiLi4vTWFlc3Ryby9maWx0cm9zXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgU2VydmljZUxpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZUxvYWRMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxvYWQtbC1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IHsgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyDDicK1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX3BsYXRmb3JtX2Jyb3dzZXJfYSB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTTNNYWVzdHJvIHtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb3NQb3JDcmVkaXRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRNM1Byb2Nlc29zUG9yQ3JlZGl0by8nICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb0J5SWRQcmVzdGFtbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkUHJlc3RhbW86IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvZ2V0TTNQcm9jZXNvQnlJZFByZXN0YW1vLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRQcmVzdGFtbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IGFueTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG4gICAgLy9yYWUgZWwgVElQTywgU0tQMSwgTk9NQlJFIGRlIGxhIHRhYmxhIHByZGdycFxyXG4gICAgcHVibGljIG0zR2V0UFJER1JQKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0TTNQUkRHUlAvJyArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gSlNPTi5wYXJzZShyZXNwKTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob0RhdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgY2FudGlkYWQgZGlzcG9uaWJsZSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIFNLUDEgeSBsYSB1YmljYWNpw4PCs24uXHJcbiAgICAvL0xhIGRhdGEgZGViZSB0ZW5lciB1bmEgZXN0cnVjdHVyYToge1wiVUJJQ0FDSU9OXCI6XCIxMTExXCIsIFwiU0tQMVwiOlwiOTk5OWFcIn1cclxuICAgIHB1YmxpYyBNM0dldENhbnRpZGFkQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXRDYW50aWRhZEJ5U0tQMS8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBvRGF0YSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdmFyIGdvRGF0YURpc3A6IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIGlmIChvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vTm8gZXMgYXJyYXlcclxuICAgICAgICAgICAgICAgIGdvRGF0YURpc3AgPSBuZXcgQXJyYXk8YW55PihvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ29EYXRhRGlzcCA9IG9EYXRhLlJFU1BVRVNUQS5ESVNQT05JQklMSURBRDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhnb0RhdGFEaXNwKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhnb0RhdGFEaXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBHZXRMaXN0YVByZFhGaWx0cm9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9sRmlsdHJvczogQXJyYXk8RmlsdHJvcz4sIHNJRExpc3RhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGlkVWJpY2FjaW9uID0gXCItMVwiLCBAT3B0aW9uYWwoKSBhcGxVbHRpbW9GaWx0cm8gPSB0cnVlLCBAT3B0aW9uYWwoKSB0b3BMaW1pdCA9IFwiMFwiLCBAT3B0aW9uYWwoKSBmaWx0cmFySW52VWJpYyA9IFwiMFwiKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhU2VuZDtcclxuICAgICAgICBvRGF0YVNlbmQgPSB7IFwiRmlsdHJvc1wiOiBKU09OLnN0cmluZ2lmeShvbEZpbHRyb3MpLCBcIklkTGlzdGFcIjogc0lETGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiYXBsVWx0aW1vRmlsdHJvXCI6IGFwbFVsdGltb0ZpbHRybywgXCJ0b3BMaW1pdFwiOiB0b3BMaW1pdCwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIGlmIChvbEZpbHRyb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTGlzdFBSREZpbHRyb3MvJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwLCBvbEZpbHRyb3MpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvRnVuY2lvbkVycihcIk5vIGhheSBmaWx0cm9zIHBhcmEgbGEgYnVzcXVlZGFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0NhdGVnb3JpYTogc3RyaW5nLCBvRGF0YUNsYXNpZmljYWNpb24sIElkTGlzdGE6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgQE9wdGlvbmFsKCkgaWRVYmljYWNpb24gPSBcIi0xXCIsIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG4gICAgICAgIHZhciBvbEZpbHRyb3M6IEFycmF5PEZpbHRyb3M+O1xyXG4gICAgICAgIHZhciBvRGF0YVNlbmQ7XHJcbiAgICAgICAgb2xGaWx0cm9zID0gdGhpcy5GaW5kRmlsdGVySW5DbGFzaWZpY2FjaW9uKHNDYXRlZ29yaWEsIHNJREthdGlvcywgb0RhdGFDbGFzaWZpY2FjaW9uKTtcclxuXHJcbiAgICAgICAgb0RhdGFTZW5kID0geyBcIkZpbHRyb3NcIjogSlNPTi5zdHJpbmdpZnkob2xGaWx0cm9zKSwgXCJJZExpc3RhXCI6IElkTGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiZmlsdHJhckludlViaWNcIjogZmlsdHJhckludlViaWMgfTtcclxuICAgICAgICBpZiAob2xGaWx0cm9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vR2V0X0xpc3RQUkRGaWx0cm9zLycgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgb2xGaWx0cm9zKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiTm8gaGF5IGZpbHRyb3MgcGFyYSBsYSBidXNxdWVkYVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfS8vRW5kIEdldExpc3RhUHJkWENhdGVnb3JpYVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWFXaXRoT3V0RmlsdGVycyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzQ2F0ZWdvcmlhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlDbGFzaWZpY2FjaW9uLycgKyBzSURLYXRpb3MgKyAnLycgKyBzQ2F0ZWdvcmlhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgbnVsbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0TGlzdGFQcmRYQ2F0ZWdvcmlhXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBlbCBub21icmUgbyBkZXNjcmlwY2nDg8Kzbi5cclxuICAgIEdldExpc3RhUHJkWE5vbWJyZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FyZ2FyTGlzdFByZEJ5R2VuZXJpYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2Nhcmdhckxpc3RQcmRCeUdlbmVyaWMvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vY2FyZ2FyIGluZm9ybWFjaW9uIGRlIGNsYXNpZmljYWNpb25cclxuICAgIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBqc29uUmVzcCxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vdmFyIG9zZXNzaW9uV0U4ID0gbmV3IHNlc3Npb25XRTgoKTtcclxuXHJcbiAgICAgICAgLy9qc29uUmVzcCA9IG9zZXNzaW9uV0U4LkdldERhdGFDTEFTSUZJQ0FDSU9OKHNJREthdGlvcyk7XHJcbiAgICAgICAgaWYgKGpzb25SZXNwID09PSB1bmRlZmluZWQgfHwganNvblJlc3AgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL00zR2V0Q2xhc2lmaWNhY2lvbi9cIiArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAganNvblJlc3AgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQXJyYXlDbGFzaWZpY2FjaW9uKGpzb25SZXNwKTtcclxuICAgICAgICAgICAgICAgIC8vb3Nlc3Npb25XRTguU2V0RGF0YUNMQVNJRklDQUNJT04oanNvblJlc3AsIHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfS8vRW5kIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uXHJcblxyXG4gICAgLy9WYWxpZGFyIHF1ZSBsYSBjbGFzaWZpY2FjaW9uLCBlc3RlbiBjb21vIGFycmF5LlxyXG4gICAgVmFsaWRhckFycmF5Q2xhc2lmaWNhY2lvbihvRGF0YUNsYXMpIHtcclxuICAgICAgICB0aGlzLlJlY3Vyc2l2ZUNvbnZlcnRBcnJheShvRGF0YUNsYXMuUkVTUFVFU1RBLkNMQVNJRklDQUNJT05FUyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQXBsaWNhciBmaWx0cm9zIGEgbGEgY2F0ZWdvcmlhIGVudHJhbnRlLlxyXG4gICAgRmluZEZpbHRlckluQ2xhc2lmaWNhY2lvbihzQ2xhc0ZpbmQ6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhQ2xhc2lmaWNhY2lvbikge1xyXG4gICAgICAgIHZhciBzQ2xhc2lmaWNhY2lvbjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgb0RhdGFGaWx0cmFkYTtcclxuICAgICAgICAvL3ZhciBvc2Vzc2lvbldFOCA9IG5ldyBzZXNzaW9uV0U4KCk7XHJcbiAgICAgICAgdmFyIG9sRmlsdHJvcyA9IG5ldyBBcnJheTxGaWx0cm9zPigpO1xyXG4gICAgICAgIHZhciBvRmlsdHJvczogRmlsdHJvcztcclxuICAgICAgICB2YXIgZmlsdHJvQXRyaWJ1dG86IHN0cmluZztcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhzQ2xhc0ZpbmQpO1xyXG4gICAgICAgIC8vb0RhdGFDbGFzaWZpY2FjaW9uID0gb3Nlc3Npb25XRTguR2V0RGF0YUNMQVNJRklDQUNJT04oc0lES2F0aW9zKTtcclxuXHJcbiAgICAgICAgb0RhdGFGaWx0cmFkYSA9IG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTO1xyXG5cclxuICAgICAgICBpZiAoc0NsYXNGaW5kLmxlbmd0aCAlIDMgPT0gMCkge1xyXG4gICAgICAgICAgICB3aGlsZSAoc0NsYXNGaW5kICE9IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBzQ2xhc2lmaWNhY2lvbiA9IHNDbGFzaWZpY2FjaW9uICsgc0NsYXNGaW5kLnN1YnN0cmluZygwLCAzKTtcclxuICAgICAgICAgICAgICAgIHNDbGFzRmluZCA9IHNDbGFzRmluZC5zdWJzdHJpbmcoMyk7XHJcbiAgICAgICAgICAgICAgICBvRGF0YUZpbHRyYWRhID0gb0RhdGFGaWx0cmFkYS5DQVRFR09SSUEuZmluZChmaWx0cm8gPT4gZmlsdHJvLkNMQVNJRklDQUNJT04udG9TdHJpbmcoKSA9PSBzQ2xhc2lmaWNhY2lvbi50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmaWx0cm9BdHJpYnV0byA9IG9EYXRhRmlsdHJhZGEuQVRSSUJVVE87XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRyb0F0cmlidXRvLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJST09UXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0ZpbHRyb3MgPSBuZXcgRmlsdHJvcyhvRGF0YUZpbHRyYWRhLkFUUklCVVRPLCBvRGF0YUZpbHRyYWRhLkRlc2NyaXBjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBvbEZpbHRyb3MucHVzaChvRmlsdHJvcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIC8vb0RhdGFSZXNwQ2xhID0gdGhpcy5SZWN1cnNpdmVDbGFzaWZpY2FjaW9uKG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTLkNBVEVHT1JJQSwgc0NsYXNGaW5kKTtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cob0RhdGFSZXNwQ2xhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2xGaWx0cm9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVjdXJzaXZpZGFkLCBwYXJhIHZhbGlkYXIgcXVlIHRvZG9zIGxvcyBub2Rvcywgc2VhbiB0aXBvIGFycmF5XHJcbiAgICBSZWN1cnNpdmVDb252ZXJ0QXJyYXkob0RhdGFDbGFzKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhQ2xhcy5DQVRFR09SSUEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAob0RhdGFDbGFzLkNBVEVHT1JJQS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQSA9IG5ldyBBcnJheShvRGF0YUNsYXMuQ0FURUdPUklBKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KG9EYXRhQ2xhcy5DQVRFR09SSUFbMF0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQS5mb3JFYWNoKGNsYXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KGNsYXMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYSB1biBwcm9kdWN0b1xyXG4gICAgbTNBZGRQcm9kdWN0byhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgdGRvY1VBY3Rpdm86IHN0cmluZywgbmRvY1VBY3Rpdm86IHN0cmluZywgb00zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIGRpc2FibGVkV2ViOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB2YXIgZGF0YTtcclxuICAgICAgICBkYXRhID0geyAnc1Rkb2NVc3VhcmlvJzogdGRvY1VBY3Rpdm8sICdzTmRvY1VzdWFyaW8nOiBuZG9jVUFjdGl2bywgJ29NM1ByZEdycCc6IG9NM1ByZEdycCwgJ2Rpc2FibGVkV2ViJzogZGlzYWJsZWRXZWIgfTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vYWRkUHJvZHVjdG8vXCIgKyBzSURLYXRpb3MudHJpbSgpLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gcG9yIFNLUDEuXHJcbiAgICBNM0dldFByb2R1Y3RvQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vTTNHZXRQcm9kdWN0b0J5U0tQMS9cIiArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG86IGFueSA9IHJlc3A7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhwcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIHJhbmRvbSBwb3IgU0tQMS5cclxuICAgIE0zR2V0UHJvZHVjdG9SYW5kb21CeVNLUDEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTWFlc3Ryby9NM0dldFByb2R1Y3RvUmFuZG9tQnlTS1AxL1wiICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBwb3IgU0tQMS5cclxuICAgIE0zR2V0Q2F0QXNvY2lhZGFzQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBza3AxOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoXCJNM01hZXN0cm8vTTNHZXRDYXRBc29jaWFkYXNCeVNLUDEvXCIgKyBzSURLYXRpb3MgKyAnLycgKyBza3AxKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vR2V0IEltYWdlbmVzIGVudmlhbmRvIGVuIGxhIG9EYXRhOiB7XCJQYXRoXCI6XCJ4eHhcIiwgXCJTS1VcIjpcIlNLVXh4eFwifVxyXG4gICAgcHVibGljIE0zR2V0SW1hZ2VuZXNCeVBhdGgoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTTNNdWx0aW1lZGlhQnlQYXRoLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9vYnRlbmVyIGluZm9ybWFjaW9uIGRlIHBsYW50aWxsYXMsIGRlc2RlIHNlcnZpZG9yLi4uIFxyXG4gICAgR2V0X00zU0tQbGFudGlsbGFCeVNLVUlEKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBTS1VJRDogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL0dldF9NM1NLUGxhbnRpbGxhQnlTS1VJRC9cIiArIHNJREthdGlvcyArIFwiL1wiICsgU0tVSUQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpw4PCs24gZGUgcHJvZHVjdG9zLCBkZXNkZSBjb2RpZ28gZGUgYmFycmFzXHJcbiAgICBHZXRJbmZvQnlGaWx0ZXJDb2RlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzRmlsdGVyQ29kZTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiRklMVEVSQ09ERVwiOiBzRmlsdGVyQ29kZSB9O1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFNLUDFQcmRzQnlGaWx0ZXJzQ29kZS8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0SW5mb0J5RmlsdGVyQ29kZSBcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZFViaWNhY2lvbjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9NM1ViaWNhY2lvbmVzLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zVWJpY2FjaW9uZXNcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXNDb21wbGV0YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkVWJpY2FjaW9uOiBzdHJpbmcsIHNJZEh1Yjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zV2l0aFRpbWVPdXQoJ00zTWFlc3Ryby9nZXRfTTNVYmljYWNpb25lc0NvbXBsZXRhLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24gKyAnLycgKyBzSWRIdWIsIDEwMDAwKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9NM1ViaWNhY2lvbmVzQ29tcGxldGFcclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIHB1YmxpYyBNM0dldFByb2R1Y3RvQnlTS1UoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhQb3N0U2VydmljZU0zKTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFByb2R1Y3RvQnlTS1UvJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIFBvc3RTZXJ2aWNlTTMpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIGFzeW5jIE0zR2V0UHJvZHVjdG9CeVNLVUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzU0tVOiBzdHJpbmcsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIFViaWNhY2lvbjogc3RyaW5nID0gXCItMVwiLCBzQXBsRXhjOiBzdHJpbmcgPSBcIjFcIikge1xyXG4gICAgICAgIHZhciBkYXRhO1xyXG4gICAgICAgIHZhciByZXNwO1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGRhdGEgPSB7ICdTS1UnOiBzU0tVLCBcIlVCSUNBQ0lPTlwiOiBVYmljYWNpb24gPT0gXCItMVwiID8gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiA6IFViaWNhY2lvbiwgJ0FwbEV4Yyc6IHNBcGxFeGMgfTtcclxuICAgICAgICBpZiAob0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSBkYXRhLmZlY2hhTFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbztcclxuXHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0UHJvZHVjdG9CeVNLVS8nICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ocmVzcCwgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIGVzcGVjZmljbyB0ZW5pZW5kbyBlbiBjdWVudGEgY29kaWdvLlxyXG4gICAgYXN5bmMgR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8oc0lES2F0aW9zKTtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgYXdhaXQgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gb1Byb2R1Y3RvO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1RyYWUgbG9zIHJlZ2lzdHJvcyBxdWUgc2UgZW5jdWVudHJlbiBlbiBNM1Byb2Nlc29zIHF1ZSBzZSBlbmN1ZW50cmVuIGNvbiBlc3RhZG9nZW5lcmFsIHByb2Nlc29cclxuICAgIE0zZ2V0UmVnaXN0cm9zRW5Qcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRfUmVnaXN0cm9zRW5Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JTb2R5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRpZW5lIGVsIHRvcCAyMCBkZSBwcm9kdWN0b3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIGdldF9NM1ByZEdycEJ5Tm9tYnJlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzTm9tYnJlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X00zUHJkR3JwQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLk0zR1JQO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zUHJkR3JwQnlOb21icmVcclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIHB1YmxpYyBHZXRNM1ByZEFncnVwYWRvQnlOb21icmUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNOb21icmU6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfbTNfcHJkX2J5X25vbWJyZV9hZ3J1cGFkby8nICsgc0lES2F0aW9zICsgJy8nICsgc05vbWJyZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuTTNHUlA7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG8geSBxdWUgbm8gZXN0ZW4gZXhsY3VpZG9zIChNM0V4Y1ByZFhVYmljKVxyXG4gICAgcHVibGljIGdldF9tM19wcmRfYnlfbm9tYnJlX2FncnVwYWRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL2RhdGEgPSB7bm9tYnJlOidhc2Rhc2QnLCBpZFViaWNhY2lvbjonMSd9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X20zX3ByZF9ieV9ub21icmVfYWdydXBhZG8vJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShTdHJpbmcocmVzcCkpLlJFU1BVRVNUQS5NM0dSUDtcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLl9ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yICYmIGVyci5lcnJvci5NZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIHBhdGggYmFzZSBkb25kZSBzZSBlbmN1ZW50cmEgYWxvamFkYXMgbGFzIGltYWdlbmVzIGVuIGVsIHNlcnZpZG9yXHJcbiAgICBwdWJsaWMgZ2V0X1BhdGhTZXJ2aWRvckltYWdlbmVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9QYXRoU2Vydmlkb3JJbWFnZW5lcy8nICsgc0lES2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwKVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9QYXRoU2Vydmlkb3JJbWFnZW5lc1xyXG5cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gZXNwZWNmaWNvIHRlbmllbmRvIGVuIGN1ZW50YSBjb2RpZ28uXHJcbiAgICBHZXRfTTNQcm9kdWN0b0VzcGVjQnlDb2RlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB2YXIgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8gPSBuZXcgU2VydmljZUxvYWRMaXN0YVByZWNpbyhzSURLYXRpb3MpO1xyXG5cclxuICAgICAgICBpZiAob0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSBkYXRhLmZlY2hhTFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbztcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIFBvc3RTZXJ2aWNlTTMpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnJvci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZVRpbWVPdXQoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgdGltZW91dFRpbWU6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0VGltZSAhPSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YVVzZXIgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbykgZGF0YS5mZWNoYUxQcmVjaW8gPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW87XHJcbiAgICAgICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNM1RpbWVPdXQoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSwgdGltZW91dFRpbWUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICAgICAgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnJvci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRfRG9jc0Zyb21Db3VjaE1hZXN0cm8ob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3Rybywgc0lkS2F0aW9zOiBzdHJpbmcsIHNEb2M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ2V0X0RvY3NGcm9tQ291Y2hNYWVzdHJvXCIpXHJcbiAgICAgICAgdmFyIHNJZEtleURvYyA9IG9NM0NvdWNoTWFlc3Ryby5HZXRLZXlEb2N1bWVudG9EQihzSWRLYXRpb3MsIHNEb2MpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHNJZEtleURvYylcclxuICAgICAgICBvTTNDb3VjaE1hZXN0cm8uR2V0RGF0YVBvdWNoQkQoc0lkS2V5RG9jKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzdWx0KTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRQcm9kdWN0b0VzcGVjQnlDb2RlRnJvbUNvdWNoKGpQcm9kdWN0c0NvdWNoOiBhbnksIHNDb2RlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGpQcm9kdWN0c0ZpbCA9IGpQcm9kdWN0c0NvdWNoLmZpbmQoeCA9PiB4LkxvTTNQcmRHZW5lcmFsICE9IHVuZGVmaW5lZCAmJiB4LkxvTTNQcmRHZW5lcmFsLmZpbmQodyA9PiB3Lk0zQ29kcyAhPSB1bmRlZmluZWQgJiYgdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpICE9IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RfY2xvbmUgPSBfLmNsb25lRGVlcChqUHJvZHVjdHNGaWwpO1xyXG5cclxuICAgICAgICBpZiAoalByb2R1Y3RzRmlsICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB2YXIgalByZEVzcCA9IGpQcm9kdWN0c0ZpbC5Mb00zUHJkR2VuZXJhbC5maW5kKHcgPT4gdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHByb2R1Y3RfY2xvbmUuTG9NM1ByZEdlbmVyYWwgPSBbXTtcclxuICAgICAgICAgICAgcHJvZHVjdF9jbG9uZS5Mb00zUHJkR2VuZXJhbC5wdXNoKGpQcmRFc3ApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInByb2R1Y3RfY2xvbmVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocHJvZHVjdF9jbG9uZSlcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0X2Nsb25lKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnJvcihcIk5vIHNlIGVuY29udHLDg8KzIG51bmfDg8K6biByZWdpc3Ryby5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxvcyBUaXBvcyBkZSBwcm9jZXNvcyBkZXNkZSBlbCBzZXJ2aWRvclxyXG4gICAgcHVibGljIGdldF9UaXBvc1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgYWN0aXZpZGFkOiBzdHJpbmcgPSAnVmVudGFzJykge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X1RpcG9zUHJvY2Vzby8nICsgc0lES2F0aW9zICsgJy8nICsgYWN0aXZpZGFkKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9UaXBvc1Byb2Nlc29cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIEluZm8gZGUgdW4gcHJvY2VzbyBhIHBhcnRpciBkZSB1biBpZFByb2Nlc28geSB1biBJZE0zXHJcbiAgICBwdWJsaWMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXRfSW5mb1BlcnNvbmFfUHJvY2Vzby8nICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UoU3RyaW5nKHJlc3ApKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9JbmZvUHJvY2Vzb1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBsYSBJbmZvIGRlIHVuIHByb2Nlc28gYSBwYXJ0aXIgZGUgdW4gaWRQcm9jZXNvIHkgdW4gSWRNMyBkZSBtYW5lcmEgc2luY3LDg8KzbmljYVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGpEYXRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc29fYXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICB2YXIganNvbjtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldF9JbmZvUGVyc29uYV9Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVzcClcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgdW4gcHJvZHVjdG8gYWdydXBhZG8sIHRlbmllbmRvIHVuYSBsaXN0YSBkZSBwcm9kdWN0byBhZ3J1cGFkb3MgeSB1biBza3VcclxuICAgIHB1YmxpYyBHZXRNM1ByZEdycEZyb21MaXN0KExpc3RQcmQ6IEFycmF5PFR5cGVNM1ByZEdycD4sIHNrdSk6IFR5cGVNM1ByZEdycCB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9UeXBlTTNQcmRHcnBSZXN1bHQ6IFR5cGVNM1ByZEdycDtcclxuICAgICAgICAgICAgb1R5cGVNM1ByZEdycFJlc3VsdCA9IExpc3RQcmQuZmluZChwcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBwcmQuTG9NM1ByZEdlbmVyYWwuZm9yRWFjaChwcmQgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJkLlNLVSA9PT0gc2t1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9UeXBlTTNQcmRHcnBSZXN1bHQuTG9NM1ByZEdlbmVyYWwgPSBvVHlwZU0zUHJkR3JwUmVzdWx0LkxvTTNQcmRHZW5lcmFsLmZpbHRlcihnZW4gPT4gZ2VuLlNLVSA9PSBza3UpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1R5cGVNM1ByZEdycFJlc3VsdDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0ZW5lciBkZSB1bmEgbGlzdGEgZGUgdWJpY2FjaW9uZXMsIHVuYSB1YmljYWNpb24gZW4gcGFydGljdWxhciwgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgR2V0VWJpY2FjaW9uRnJvbUxpc3QoTGlzdFViaWM6IEFycmF5PE0zVWJpY2FjaW9uPiwgc0lkVWJpYykge1xyXG4gICAgICAgIHZhciBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uO1xyXG4gICAgICAgIG9NM1ViaWNhY2lvbiA9IExpc3RVYmljLmZpbmQodWJpYyA9PiB1YmljLklEVWJpY2FjaW9uID09IHNJZFViaWMpO1xyXG4gICAgICAgIHJldHVybiBvTTNVYmljYWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aWVuZSBsb3MgZGF0b3MgZGUgZmFjdHVyYWNpb24gdGFsIGNvbW8gZWwgY29kaWdvIHBvc3RhbCB5IGVsIHJlZ2ltZW4gZmlzY2FsIGFzb2NpYWRvIGEgdW4gUkZDXHJcbiAgICBwdWJsaWMgZ2V0RGF0b3NGYWN0dXJhY2lvbkZyb21SRkMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXREYXRvc0ZhY3R1cmFjaW9uRnJvbVJGQy8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0RGF0b3NGYWN0dXJhY2lvbkZyb21SRkNcclxuXHJcbiAgICBwdWJsaWMgYWN0dWFsaXphclJGQyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nLCBvRGF0YSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM01hZXN0cm8vYWN0dWFsaXphclJGQy8nICsgSWRLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocG9zdHMgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHBvc3RzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIFhtbCBkZSBjb25maWd1cmFjaW9uIGRlIGxhIGVtcHJlc2EgYSBwYXJ0aXIgZGVsIGlkdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBnZXRfWG1sQ29uZmlnX3hfSWRVYmljYWNpb25cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIFhtbCBkZSBjb25maWd1cmFjaW9uIGRlIGxhIGVtcHJlc2EgYSBwYXJ0aXIgZGVsIGlkdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgZ2V0Q0ZESXNYUHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldENGRElzWFByb2Nlc28vJyArIHNJREthdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9YbWxDb25maWdfeF9JZFViaWNhY2lvblxyXG5cclxuICAgIC8vL09idGllbmUgbG9zIGF0cmlidXRvcyBlbiBtM2NsYXNpZmljYSBhIHBhcnRpciBkZSB1biBpZGthdGlvc1xyXG4gICAgZ2V0X2NsYXNpZmljYXRpb25fYXR0cmlidXRlcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfY2xhc2lmaWNhdGlvbl9hdHRyaWJ1dGVzLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuQVRUUklCVVRFUztcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsYXMgY2F0ZWdvcmlhcyBlbiBtM2NsYXNpZmljYSBhIHBhcnRpciBkZSB1biBpZGthdGlvcyB5IHVuIGF0cmlidXRvXHJcbiAgICBnZXRfY2xhc2lmaWNhdGlvbl9jYXRlZ29yaWVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfY2xhc2lmaWNhdGlvbl9jYXRlZ29yaWVzLycgKyBpZF9rYXRpb3MgKyBcIi9cIiArIGF0dHJpYnV0ZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgalJlc3AgPSBKU09OLnBhcnNlKHJlc3ApLlJFU1BVRVNUQS5DQVRFR09SSUVTO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9wY2lvbmVzQWRpY2lvbmFsZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0T3BjaW9uZXNBZGljaW9uYWxlcy8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkFUVFJJQlVURVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBdHJpYnV0b3NBZGljaW9uYWxlcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgYXR0cmlidXRlOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0QXRyaWJ1dG9zQWRpY2lvbmFsZXMvJyArIGlkX2thdGlvcyArIFwiL1wiICsgYXR0cmlidXRlKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkNBVEVHT1JJRVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsYSBpbmZvcm1hY2lvbiBkZSB0aXBvcyBkZSBlbnZpby5cclxuICAgIE0zR2V0Rm9ybWFzRW52aW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vTTNHZXRGb3JtYXNFbnZpby8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBqc1Jlc3A7XHJcbiAgICAgICAgICAgIGpzUmVzcCA9IEpTT04ucGFyc2UocmVzcCk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soanNSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBnZXRfdWJpY2FjaW9uZXNfY29tcGxldGUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X3ViaWNhY2lvbmVzX2NvbXBsZXRlLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBnZXRfdWJpY2FjaW9uZXNfc2ltcGxlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF91YmljYWNpb25lc19zaW1wbGUvJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBhc3luYyBNM0dFVF9MSVNUQVBSRUNJT1NfQVN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb1JlY0xpc3RhUHJlYzogYW55O1xyXG5cclxuICAgICAgICBvUmVjTGlzdGFQcmVjID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR0VUX0xJU1RBUFJFQ0lPUy8nICsgaWRfa2F0aW9zKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gb1JlY0xpc3RhUHJlY1swXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0RW5jYWJlemFkb0xpc3Rhc1ByZWNpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByZXNwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvR2V0Q29uZmlnTFAvJyArIHNJREthdGlvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVnaXN0cmFyQ29sb25pYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nLCBzQ29sb25pYTogc3RyaW5nLCBzQ29kUG9zdGFsLCBzVGVsZWZvbm86IHN0cmluZywgbmRvYzogc3RyaW5nLCBzTGluZWExOiBzdHJpbmcsIHNDb2Rlc3RhZG86IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YVNlbmQ7XHJcbiAgICAgICAgb0RhdGFTZW5kID0geyBcInNDb2xvbmlhXCI6IHNDb2xvbmlhLCBcInNDb2RQb3N0YWxcIjogc0NvZFBvc3RhbCwgXCJzVGVsZWZvbm9cIjogc1RlbGVmb25vLCBcIm5kb2NcIjogbmRvYywgXCJzTGluZWExXCI6IHNMaW5lYTEsIFwic0NvZGVzdGFkb1wiOiBzQ29kZXN0YWRvIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zTWFlc3Ryby9yZWdpc3RyYXJDb2xvbmlhLycgKyBJZEthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocG9zdHMgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0ZW5lciBwcm9tb2Npb25lcyBcclxuICAgIHB1YmxpYyBhc3luYyBNM19HZXRQcm9tb2Npb25lc01hZXN0cm9Bc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvUmVjTGlzdGFQcmVjOiBhbnk7XHJcblxyXG4gICAgICAgIG9SZWNMaXN0YVByZWMgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vTTNfR2V0UHJvbW9jaW9uZXNNYWVzdHJvLycgKyBpZF9rYXRpb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiBvUmVjTGlzdGFQcmVjO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRlbmVyIERpbmFtaWNhcyBwb3IgYWN0aXZpZGFkIFxyXG4gICAgcHVibGljIGFzeW5jIE0zR2V0RGluQnlBY3RpdmlkYWQoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXREaW5CeUFjdGl2aWRhZC8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBqc1Jlc3A6YW55ID0gcmVzcDtcclxuICAgICAgICAgICAgLy9qc1Jlc3AgPSBKU09OLnBhcnNlKGpzUmVzcCk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgLy8gdmFyIG9SZWNMaXN0YVByZWM6IGFueTtcclxuXHJcbiAgICAgICAgLy8gb1JlY0xpc3RhUHJlYyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0RGluQnlBY3RpdmlkYWQvJyArIGlkX2thdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIC8vIHJldHVybiBvUmVjTGlzdGFQcmVjO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYSBpbmZvIGJhc2ljYSBkZSBsYXMgdWJpY2FjaW9uZXMgY29uIEh1YiB0aXBvIFdFQiBhY3Rpdm9zIGVuIGVsIG1vbWVudG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIGdldFViaWNhY2lvbmVzV2ViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0VWJpY2FjaW9uZXNXZWIvJyArIGlkS2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIFJldG9ybmEgbGEgaW5mbyBiYXNpY2EgZGUgbGFzIHViaWNhY2lvbmVzIGNvbiBIdWIgdGlwbyBXRUIgYWN0aXZvcyBlbiBlbCBtb21lbnRvIHF1ZSBhYmFycXVlbiB1biBjb2Rwb3N0YWwgZW4gY29uY3JldG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgZ2V0VWJpY2FjaW9uZXNCeUNvZFBvc3RhbChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL2RhdGEgPSB7IFwiY29kUG9zdGFsXCI6IHN0cmluZyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldFViaWNhY2lvbmVzQnlDb2RQb3N0YWwvJyArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHBhdGggZGUgbGEgZmFjdHVyYSBlbGVjdHLDg8KzbmljYSBhIHBhcnRpciBkZSB1biBJZERpYXJpbyBhc29jaWFkbyBhbCBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UGF0aEZFRnJvbURpYXJpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCB0aXBvR2VuZXJhY2lvbjogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0UGF0aEZFRnJvbURpYXJpby8nICsgaWRLYXRpb3MgKyAnLycgKyB0aXBvR2VuZXJhY2lvbiwgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3RhOiBhbnkgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcHVlc3RhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERpYXJpb0FkaWNpb25hbGVzeERpYXJpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlHZW5lcmFsZXMoJ0RpYXJpby9nZXREaWFyaW9BZGljaW9uYWxlc3hEaWFyaW8vJyArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciByZXNwdWVzdGE6IGFueSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwdWVzdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhc3luYyBJVV9IdWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9IdWI6IGFueSwgdVRBY3Rpdm86IHN0cmluZywgdU5BY3Rpdm86IHN0cmluZykge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBpZF9rYXRpb3MudHJpbSgpLCAnb0h1Yic6IG9IdWIsICd1VEFjdGl2byc6IHVUQWN0aXZvLCAndU5BY3Rpdm8nOiB1TkFjdGl2byB9O1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNNYWVzdHJvL0lVX0h1YicsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBjdGl2byBkZXNkZSBzZXJ2aWRvclxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGlkcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSB1YmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaHViIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBHZXRDdGl2b0JZUHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRwcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRwcm9jZXNvJzogaWRwcm9jZXNvLCAndWJpY2FjaW9uJzogdWJpY2FjaW9uLCAnaHViJzogaHViIH07XHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvR2V0Q3Rpdm9CWVByb2Nlc28vJyArIGlkX2thdGlvcy50cmltKCksIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIFZhbGlkYXJDdGl2b3NWU0xvY2FsKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGluZlByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nLCBmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTMvVmFsaWRhckN0aXZvc1ZTTG9jYWwvJyArIGlkX2thdGlvcyArICcvJyArIHViaWNhY2lvbiArICcvJyArIGh1YiwgaW5mUHJvY2Vzbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBmdW5jaW9uUmVzcChyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKHsgXCJlcnJvclwiOiBlcnJvciB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgR2VuZXJhckF1dG9yaXphY2lvbkN1ZW50YXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgZGF0YSkge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG5cclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zL0dlbmVyYXJBdXRvcml6YWNpb25DdWVudGFzJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mb1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGVsIGNvZGlnbyBpbmdyZXNhZG8gY29ycmVzcG9uZGUgYWwgZG9jdW1lbnRvIHkgc2kgZWwgY29kaWdvIGVzdGEgZW4gZXN0YWRvIGFjdGl2b1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgdmFsaWRhY2lvbkF1dG9yaXphY2lvbk0zQ3VlbnRhcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBkYXRhKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcblxyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTMvdmFsaWRhY2lvbkF1dG9yaXphY2lvbk0zQ3VlbnRhcycsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgVmVyaWZpY2FyUGFnb1RhcmpldGFCQlZBKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSWRLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBqRGF0YSA9IHsgXCJJZGthdGlvc1wiOiBzSURLYXRpb3MsIFwiaWRLZXlcIjogc0lkS2V5IH1cclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9WZXJpZmljYXJQYWdvVGFyamV0YUJCVkEnLCBqRGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mbztcclxuICAgIH0vL0VuZCBnZXRfSW5mb1Byb2Nlc29cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZTIDIwMTkwODEzOiBSZXRvcm5hIGxvcyBjb2RpZ29zIGRlIGxvcyBTS1Aoc2twVG9GaW5kKSB5IHN1IHJlc3BlY3Rpdm8gc2lnbmlmaWNhZG8gcGFyYSB1biBwcm9kdWN0byBkYWRvXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwY2lvblNLUHMoaWRLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMyxcclxuICAgICAgICBkYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy9sZXQgZGF0YSA9IHtcIlNLUDFcIjpcIlNLUDFcIiwgU0tQVG9GaW5kOiAyIH19O1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9nZXREZXNjcmlwY2lvblNLUHMvXCIgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soZGF0YS5TS1AxLCBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgZ2V0VG90YWxlc0NpZXJyZUNhamEocG9zdFNlcnZpY2U6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBzdWJpY2FjaW9uOiBzdHJpbmcsIHNodWI6IHN0cmluZywgc3VzdWFyaW86IHN0cmluZywgc0ZlY2hhSTogc3RyaW5nLCBzRmVjaGFGOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc2Vjb3BjaW9uZXM6IGFueTtcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogc0lkS2F0aW9zLCAndWJpY2FjaW9uJzogc3ViaWNhY2lvbiwgJ2h1Yic6IHNodWIsICd1c3VhcmlvJzogc3VzdWFyaW8sICdGZWNoYUknOiBzRmVjaGFJLCAnRmVjaGFGJzogc0ZlY2hhRiB9XHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBhd2FpdCBwb3N0U2VydmljZS5nZXRXaXRoQm9keU0zKCdNMy9nZXRUb3RhbGVzQ2llcnJlQ2FqYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBKU09OLnBhcnNlKHNlY29wY2lvbmVzKVxyXG4gICAgICAgIHJldHVybiBzZWNvcGNpb25lc1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENpZXJyZXN4VWJpY2FjaW9uKHBvc3RTZXJ2aWNlOiBQb3N0U2VydmljZU0zLCBzSWRLYXRpb3M6IHN0cmluZywgc3ViaWNhY2lvbjogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHNGZWNoYTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNlY29wY2lvbmVzOiBhbnk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IHNJZEthdGlvcywgJ3ViaWNhY2lvbic6IHN1YmljYWNpb24sICdpZFByb2Nlc28nOiBzSWRQcm9jZXNvLCAnRmVjaGEnOiBzRmVjaGEgfVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gYXdhaXQgcG9zdFNlcnZpY2UuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0Q2llcnJlc3hVYmljYWNpb24nLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gSlNPTi5wYXJzZShzZWNvcGNpb25lcylcclxuICAgICAgICByZXR1cm4gc2Vjb3BjaW9uZXNcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRDaWVycmVzeEVtcHJlc2EocG9zdFNlcnZpY2U6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHNGZWNoYTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNlY29wY2lvbmVzOiBhbnk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IHNJZEthdGlvcywgJ2lkUHJvY2Vzbyc6IHNJZFByb2Nlc28sICdGZWNoYSc6IHNGZWNoYSB9XHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBhd2FpdCBwb3N0U2VydmljZS5nZXRXaXRoQm9keU0zKCdNMy9nZXRDaWVycmVzeEVtcHJlc2EnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gSlNPTi5wYXJzZShzZWNvcGNpb25lcylcclxuICAgICAgICByZXR1cm4gc2Vjb3BjaW9uZXNcclxuICAgIH1cclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIHNpbXVsYXJwYWdvRW5saW5lYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkTTM6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNMy9WYWxpZGFjaW9uUGFnb0ludGVncmFjaW9uVGVzdC8nICsgc0lES2F0aW9zICsgJy8nICsgc0lkTTMgKyAnLycgKyBzSWRQcm9jZXNvKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmFsaWRhclByZHNNaXNtb1Byb3ZlZWRvcihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgbm9tYnJlQWRpY2lvbmFsUHJvdmVlZG9yOiBzdHJpbmcsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vdmFsaWRhclByZHNNaXNtb1Byb3ZlZWRvci9cIiArIGlkX2thdGlvcyArIFwiL1wiICsgbm9tYnJlQWRpY2lvbmFsUHJvdmVlZG9yLCBvTTNQcm9jZXNvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHZhbGlkYXJQcmRzTWlzbW9Qcm92ZWVkb3JcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShlcnJbJ19ib2R5J10pLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0Z1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNNYWVzdHJvL3ZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvL1wiICsgaWRfa2F0aW9zLCBvTTNQcm9jZXNvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uUmVzcChKU09OLnBhcnNlKEpTT04ucGFyc2UoZXJyWydfYm9keSddKS5NZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2YWxpZGFyUmVzdHJpY2Npb25JbnZOZWdhdGl2b1YyKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBwcmRzOiBhbnksIG9GdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby92YWxpZGFyUmVzdHJpY2Npb25JbnZOZWdhdGl2b1YyL1wiICsgaWRfa2F0aW9zLCBwcmRzKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpKVxyXG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzcClcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uUmVzcChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvVjJcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShlcnJbJ19ib2R5J10pLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZhbGlkYXJFZmVjdGl2b0VuQ2FqYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgdWJpaHViOiBhbnksIG9GdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby92YWxpZGFyRWZlY3Rpdm9FbkNhamEvXCIgKyBpZF9rYXRpb3MsIHViaWh1Yikuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXNwWydfYm9keSddKS50b1N0cmluZygpKSlcclxuICAgICAgICAgICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlc3ApXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvblJlc3AoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB2YWxpZGFyRWZlY3Rpdm9FbkNhamFcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShlcnJbJ19ib2R5J10pLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldEluZm9QcmRHYXN0b3NFbnZpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuXHJcbiAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby9nZXRJbmZvUHJkR2FzdG9zRW52aW8vXCIgKyBpZF9rYXRpb3MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpLlJFU1BVRVNUQVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhIHVuYSBzYWxkb3hjdWVudGEgYWxlYXRvcmlvIHBvciBlbCB2YWxvciBkYWRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhID0ge1wicHJvY2Vzb1wiLHByb2Nlc28sXCJ2YWxvclwiOnZhbG9yLFwibm9tYnJlRG9jXCI6IG5vbWJyZURvY31cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG0zX2dlbmVyYXJfTTNTWENfYWxlYXRvcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9NM1NYQ19hbGVhdG9yaW8vXCIgKyBpZGthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04ucGFyc2UocmVzcFsnX2JvZHknXSkudG9TdHJpbmcoKSkuUkVTUFVFU1RBO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgdW4gY29uY2VwdG8gZGVsIE0zX3NhbGRvc0l0ZW1VYlxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTTNfYWN0dWFsaXphckNvbmNlcHRvU0lVKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9NM19hY3R1YWxpemFyQ29uY2VwdG9TSVUvXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2Vzb0FsQ2llcnJlVWJpYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvcHJvY2Vzb0FsQ2llcnJlVWJpYy9cIiArIGlkX2thdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApXHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvciAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcHJvY2Vzb0FsQ2llcnJlVWJpY1wiKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldF9Qcm9jZXNvc0FiaWVydG9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBqRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X1Byb2Nlc29zQWJpZXJ0b3MvJyArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKFN0cmluZyhyZXNwKSkuUkVTUFVFU1RBKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBnZXRfUHJvY2Vzb3NBYmllcnRvc1wiKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBnZXRfSW5mb1Byb2Nlc29cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5pbXBvcnQgeyBNM1BFbmNJdGVtcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR2VuZXJhbC50eXBlXCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgTTNQRGV0YWxsZUl0ZW1zLCBNM1BJdGVtc1dFQiwgTTNQRGV0YWxsZUN1cG9uIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM0RhdGEgfSBmcm9tIFwiLi4vRGF0YS9tMy1kYXRhXCI7XHJcbmltcG9ydCB7IERFRkFVTFRfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvZGVmYXVsdF92YWx1ZV9hY2Nlc3NvclwiO1xyXG5pbXBvcnQgeyB4bWxUb0pzb25URiB9IGZyb20gXCIuLi8uLi9Db252ZXJ0L3htbFRvSlNvbi5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM1BJbXB1ZXN0b3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcC1pbXB1ZXN0b3NcIjtcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBNM0VOQ1BST01PIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM0VOQ1BST01PLmNsYXNzXCI7XHJcbmltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgcHJvbW9jaW9uZXNTZXJ2aWNlIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL3Byb21vY2lvbmVzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgUHJvbW9jaW9uUHJvY2VzYWRhLCBQcm9tb2Npb25lc0Fzb2NpYWRhcywgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM1Byb21vUHJvY2VzYWRhLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4vTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkaW5hbWljYXNcIjtcclxuaW1wb3J0IHsgU2VydmljZUxpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZUxvYWRMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxvYWQtbC1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBhIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjNcIjtcclxuaW1wb3J0IHsgTTNQcmVzZW50YWNpb25lcyB9IGZyb20gXCIuLi9NYWVzdHJvL20zLXByZXNlbnRhY2lvbmVzXCI7XHJcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gXCJAYW5ndWxhci9jb21waWxlci9zcmMvdXRpbFwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tEZXQgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZFBhY2tEZXRcIjtcclxuaW1wb3J0IHsgTTNQcmRBZGljaW9uYWxlcyB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkQWRpY2lvbmFsZXMudHlwZVwiO1xyXG5pbXBvcnQgeyBNM090Q2xhc2lmaWNhY2lvbmVzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLW90LWNsYXNpZmljYWNpb25lc1wiO1xyXG5pbXBvcnQgeyBNM1ByZExpc3RhIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlXCI7XHJcbmltcG9ydCB7IE1hdGhURiB9IGZyb20gXCIuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzc1wiO1xyXG5pbXBvcnQgeyBFQ0FOQ0VMRUQgfSBmcm9tIFwiY29uc3RhbnRzXCI7XHJcbmltcG9ydCAqIGFzIHhtbDJqcyBmcm9tICd4bWwyanMnO1xyXG5cclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxudmFyIGJpZ0RlY2ltYWwgPSByZXF1aXJlKCdqcy1iaWctZGVjaW1hbCcpO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnU2VydmljZSB7XHJcbiAgICBwdWJsaWMgb01hdGhURjogTWF0aFRGID0gbmV3IE1hdGhURigpO1xyXG4gICAgcHJpdmF0ZSBvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvO1xyXG4gICAgcHVibGljIG9MaXN0YU9ic2VxdWlvczogQXJyYXk8YW55PiA9IG51bGw7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9zRXhjOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9PUHJvbW86IG51bWJlciA9IC0xO1xyXG4gICAgcHVibGljIG9ic2VxdWlvc0NhbnRpZGFkOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGxJZEFjdGl2YVByb21vID0gW107XHJcbiAgICBwcml2YXRlIEdvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMztcclxuICAgIHByaXZhdGUgZ3NJZGthdGlvcztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihpb00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybywgSXNQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSWRrYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub00zQ291Y2hNYWVzdHJvID0gaW9NM0NvdWNoTWFlc3RybztcclxuICAgICAgICB0aGlzLkdvUG9zdFNlcnZpY2VNMyA9IElzUG9zdFNlcnZpY2VNMztcclxuICAgICAgICB0aGlzLmdzSWRrYXRpb3MgPSBzSWRrYXRpb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICogVmFsaWRhciBudW1lcm8gZGUgaXRlbXMgYWdyZWdhZG9zLiBzaSBlcyBtYXlvciBhIDEuMDAwIHByZW5kZSBwYXJhbWV0cm8gXHJcbiAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhck51bWVyb0l0ZW1zKG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvbE0zUHJvY2Vzb3MuTTNFTkMubGVuZ3RoID4gMTAwMCkge1xyXG4gICAgICAgICAgICBvbE0zUHJvY2Vzb3MuQXBsRGVzZGVTZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICBvbE0zUHJvY2Vzb3MuTTNFTkMgPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBQcm9jZXNhbWllbnRvU2VydmljZShzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGFwbFJldG9tYXJJbmZvOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuVmFsaWRhck51bWVyb0l0ZW1zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICB0aGlzLlJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLCBhcGxSZXRvbWFySW5mbyk7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvUmVnaXN0cm9FdmVudG9NMy9cIiArIHNJREthdGlvcyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvTTNQcm9jZXNvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSWRNMyA9IG9Kc29uLlJFU1BVRVNUQS5JRE0zO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpbyA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJTztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW9DaWVycmUgPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU9DSUVSUkVcclxuXHJcbiAgICAgICAgICAgIC8vQWN0dWFsaXphY2lvbiBkZSBlc3RhZG9zLlxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLkVzdGFkb0RlcztcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb0pzb24uUkVTUFVFU1RBKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBwcm9jZXNhbWllbnRvX3NlcnZpY2VfYXN5bmMoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBhcGxSZXRvbWFySW5mbzogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLlJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLCBhcGxSZXRvbWFySW5mbyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvUmVnaXN0cm9FdmVudG9NMy9cIiArIHNJREthdGlvcyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvTTNQcm9jZXNvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JZE0zID0gb0pzb24uUkVTUFVFU1RBLklETTM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPO1xyXG5cclxuICAgICAgICAgICAgLy9BY3R1YWxpemFjaW9uIGRlIGVzdGFkb3MuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuRXN0YWRvRGVzO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIFJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogQXJyYXk8TTNQcm9jZXNvcz4sIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zT2ZmTGluZS9cIiArIHNJREthdGlvcyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvTTNQcm9jZXNvcykudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLy9SZXRvbWFyIGluZm9ybWFjaW9uIHBhcmEgZWwgcHJvY2Vzby5cclxuICAgIHB1YmxpYyBSZXRvbWFySW5mb3JtYWNpb24ob0RhdGFVc2VyOiBhbnksIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBhcGxSZXRvbWFySW5mbzogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChvRGF0YVVzZXIgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5JZE0zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuSWRNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChhcGxSZXRvbWFySW5mbykge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQjtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9PSB1bmRlZmluZWQgfHwgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmVcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vUHJvY2VzYW1pZW50byBkZSBkYXRvcyBlbiBiYXNlIGRlIGRhdG9zIHBvdWNoREIuXHJcbiAgICBwdWJsaWMgUHJvY2VzYW1pZW50b1NlcnZpY2VQb3VjaERCKG9NM0RhdGE6IE0zRGF0YSwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHZhciBwcm9kdWN0VW5pdFNlbGVjdGVkOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgcHJvZHVjdFVuaXRTZWxlY3RlZCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXTtcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAvL0NhcmdhciBkZXRhbGxlIGRlIGl0ZW1zXHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKS50aGVuKGFzeW5jIHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gcmVzdWx0O1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy52YWxpZGFyRXhpc3RhUHJvZHVjdG8ob00zUHJvY2Vzb3MuTTNFTkMsIHByb2R1Y3RVbml0U2VsZWN0ZWQsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGlmIChjYW50aWRhZF9hY3R1YWwgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9sZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy5nZXRDYW50aWRhZChvTTNQcm9jZXNvcywgcHJvZHVjdFVuaXRTZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gKCtjYW50aWRhZF9hY3R1YWwpICsgK29NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9sZXQgTTNFbmMgPSB0aGlzLmdldF9NM0VOQ19ieV9pZHByZF9sb3RlKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVSwgcHJvZHVjdFVuaXRTZWxlY3RlZC5MT1RFKTtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVICYmIHByb2QuTG90ZSA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUgJiYgIShwcm9kLklkRW5jUGFkcmUgPiAwKSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhvRGF0YUNhcnJpdG9Db21wcmFzKTtcclxuICAgICAgICB9LCBhc3luYyBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvRGF0YVVzZXIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGlvTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkb1wiKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWdyZWdhciBhIGNhcnJpdG8gcHJvZHVjdG8uXHJcbiAgICBwdWJsaWMgYWRkdG9jYXJ0KG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsLCB2YWxvckRlc2N1ZW50byA9IDApIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zID0gaW9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHZhciBwcm9kdWN0VW5pdFNlbGVjdGVkOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgcHJvZHVjdFVuaXRTZWxlY3RlZCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXTtcclxuICAgICAgICAvL0pBR00gMjAxOTA3MjIgc2UgYWdyZWdhIHBhcmEgY3VhbmRvIGVzIGVsIHByaW1lciBwcm9kdWN0byBxdWUgc2UgYWdyZWdhcsODwqFcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNFTkMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb0RhdGFVc2VyLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBpb00zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMudmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM1Byb2Nlc29zLk0zRU5DLCBwcm9kdWN0VW5pdFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICBpZiAoY2FudGlkYWRfYWN0dWFsICE9IDApIHtcclxuICAgICAgICAgICAgICAgIC8vbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMuZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9ICgrY2FudGlkYWRfYWN0dWFsKSArIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIocHJvZCA9PiAhKHByb2QuSWRQcm9kdWN0byA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVSAmJiBwcm9kLkxvdGUgPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5MT1RFICYmICEocHJvZC5JZEVuY1BhZHJlID4gMCkpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLCB2YWxvckRlc2N1ZW50byk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnVuY2lvbk9LKVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQsIHZhbG9yRGVzY3VlbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vVmFsaWRhIHF1ZSBleGlzdGEgcHJvZHVjdG8gZW4gbG9zIGVuY2FiZXphZG9zLiBUcnVlOiBTaSBleGlzdGUsIEZhbHNlIGRlIG90cm8gbW9kb1xyXG4gICAgLy8gU2UgY2FtYmlhIGZ1bmNpb25hbGlkYWQgZGUgcmV0dXJuLlxyXG4gICAgcHVibGljIHZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNMaXN0YUVuYzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQcmRHcmw6IE0zUHJkR2VuZXJhbCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQik6IG51bWJlciB7XHJcbiAgICAgICAgdmFyIG9FbmM6IE0zUEVuY0l0ZW1zID0gbnVsbDtcclxuICAgICAgICB2YXIgY2FudGlkYWQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSAtMTtcclxuICAgICAgICBpZiAob00zTGlzdGFFbmMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcmRHcmwgIT09IHVuZGVmaW5lZCAmJiBvTTNMaXN0YUVuYy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICBvRW5jID0gb00zTGlzdGFFbmMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gb00zUHJkR3JsLlNLVSAmJiAhZW5jLklkRW5jUGFkcmUgJiYgdGhpcy5nZXRDYW50aWRhZFBvc2l0aXZhKGVuYykpO1xyXG4gICAgICAgICAgICBpZiAob0VuYyAhPT0gdW5kZWZpbmVkICYmIG9FbmMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzE3IFZhbGlkYXIgYWhvcmEgZWwgcHJlY2lvLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXNHZW5lcmFsKG9NM1ByZEdybCwgK29FbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5WYWxpZGFyUHJlY2lvc1ByZHMob0VuYywgb00zUHJkR3JsLkxvTTNQcmRMaXN0YSkgJiYgIXRoaXMuVmFsaWRhckVzdGFQYXF1ZXRlKG9FbmMsIG9NM0xpc3RhRW5jKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gb0VuYy5JRDtcclxuICAgICAgICAgICAgICAgICAgICBjYW50aWRhZCA9ICtvRW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW50aWRhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDYW50aWRhZFBvc2l0aXZhKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgY2FudGlkYWQgPSAwO1xyXG4gICAgICAgIGxldCBkZXRDYW50aWRhZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpXHJcblxyXG4gICAgICAgIGlmIChkZXRDYW50aWRhZCkge1xyXG4gICAgICAgICAgICBjYW50aWRhZCA9ICtkZXRDYW50aWRhZC5WYWxvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW50aWRhZCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBxdWUgZWwgZW5jYWJlemFkbyBjb24gZWwgcHJvZHVjdG8gYWdyZWdhZG8sIHNlYSB1biBwYXF1ZXRlXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIG9NM0xpc3RhRW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhckVzdGFQYXF1ZXRlKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9NM0xpc3RhRW5jOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAob00zTGlzdGFFbmMuZmluZCh4ID0+IHguSWRFbmNQYWRyZSA9PSBvTTNQRW5jSXRlbXMuSUQpKSB7XHJcbiAgICAgICAgICAgICAgICBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgbG9zIHByZWNpb3MgZGUgbG9zIHByb2R1Y3Rvc1xyXG4gICAgICogQHBhcmFtIG9FbmMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJkTGlzdGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyUHJlY2lvc1ByZHMob0VuYzogTTNQRW5jSXRlbXMsIG9NM1ByZExpc3RhOiBNM1ByZExpc3RhKSB7XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9FbmM6IG51bWJlciA9ICtvRW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBkUHJlY2lvTGlzdDogbnVtYmVyID0gb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRQcmVjaW9MaXN0ID09IGRQcmVjaW9FbmMpIHtcclxuICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBWYWxpZGFyUHJlY2lvc1ByZHNcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCB0aXBvVWJpY2FjaW9uOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb25cclxuICAgICAgICAsIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIgPSBudWxsKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vSURIVUJcclxuICAgICAgICBpZiAodGlwb1ViaWNhY2lvbi50b1VwcGVyQ2FzZSgpID09IFwiV0VCXCIpIHtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICAgICAgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0bykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2sob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgbTNVYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBtM1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2sob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgaWYgKG0zVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBsb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQikge1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQiA9IG9NM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyh0aGlzLmdzSWRrYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgdGhpcy5Qcm9jUHJvbW9BZnRlckFkZFRvQ2FydChvTTNQcm9jZXNvcywgb0RhdGFVc2VyLCBsb00zUEl0ZW1zV0VCLCBtM1ViaWNhY2lvbiwgdHJ1ZSkudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHgpO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cob0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhc0FzeW5jKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coeClcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkbyBlbiBwcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2tcIik7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5vRW5jYWJlemFkb00zQ29tcG9uZW50LlJlY2FyZ2FyQ2Fycml0bygpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLkxvYWRDYXJ0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyB1cGRhdGVBUG91Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIHRpcG9VYmljYWNpb246IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvL0lESFVCXHJcbiAgICAgICAgaWYgKHRpcG9VYmljYWNpb24udG9VcHBlckNhc2UoKSA9PSBcIldFQlwiKSB7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZWxldGVNM1Byb2Nlc28ob00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgYXdhaXQgb00zRGF0YS5EZWxldGUoc0tleUNhcnJpdG8pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9FbGltaW5hciBkb2N1bWVudG8gZGUgY291Y2gvcG91Y2gsIGluaWNpbyB5IGFjdHVhbFxyXG4gICAgcHVibGljIERlbERvY3NTdGFydEFuZEN1cnJlbnQob00zRGF0YTogTTNEYXRhLCBzSURLYXRpb3M6IHN0cmluZywgb2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBVYmljYWNpb25DdXJyZW50LCBIdWJDdXJyZW50KSB7XHJcbiAgICAgICAgLy9FbGltaW5hciBJbmljaWFsXHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSAhPT0gdW5kZWZpbmVkICYmIG9sTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YVVzZXIgPSB7IFwiVXN1YXJpb1Npc3RlbWFcIjogeyBcIlRET0NcIjogb2xNM1Byb2Nlc29zLlREb2MsIFwiTkRPQ1wiOiBvbE0zUHJvY2Vzb3MuTkRvYywgXCJVQklDQUNJT05cIjogb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIFwiSURIVUJcIjogb2xNM1Byb2Nlc29zLklESHViIH0gfVxyXG4gICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVsZXRlIHN0YXJ0XCIpO1xyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgLy9FbGltaW5hciBhY3R1YWxcclxuICAgICAgICAgICAgb0RhdGFVc2VyID0geyBcIlVzdWFyaW9TaXN0ZW1hXCI6IHsgXCJURE9DXCI6IG9sTTNQcm9jZXNvcy5URG9jLCBcIk5ET0NcIjogb2xNM1Byb2Nlc29zLk5Eb2MsIFwiVUJJQ0FDSU9OXCI6IFViaWNhY2lvbkN1cnJlbnQudG9TdHJpbmcoKSwgXCJJREhVQlwiOiBIdWJDdXJyZW50IH0gfVxyXG4gICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVsZXRlIGN1cnJlbnRcIik7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q2Fycml0b0NvbXByYXNQb3VjaERCKG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB2YXIgb00zUHJvY2VzbztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgb00zUHJvY2VzbyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVHJhc2xhZGFyIGluZm9ybWFjacODwrNuIGRlIGNhcnJpdG8sIGRvcyB1c3Vhcmlvc1xyXG4gICAgcHVibGljIGFzeW5jIE1vdmVDYXJ0SW50b1VzZXIoc0lES2F0aW9zOiBzdHJpbmcsIG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyT3JpZ2VuOiBhbnksIG9EYXRhVXNlckRlc3Rpbm86IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0b09yaWdlbjtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG9EZXN0aW5vO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0b09yaWdlbiA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvRGVzdGlubyA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICBsZXQgb00zUHJvY2VzbyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG9PcmlnZW4pO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzby5URG9jID0gb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5URE9DO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvLk5Eb2MgPSBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLk5ET0M7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvW1wiX3JldlwiXTtcclxuICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0b0Rlc3Rpbm8sIG9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGFyIHByZWNpb3MgdG90YWxlcyB5IGRlIGJhc2VcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsO1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWxCYXNlO1xyXG4gICAgICAgIC8vIHZhciBkVmFsb3I6IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy8gdmFyIGRWYWxvck5ldG86IG51bWJlciA9IDA7XHJcblxyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbCA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciAvLygrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSAqICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbEJhc2UgPSB0aGlzLkNhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKGVuYywgZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMQkFTRVwiKS5WYWxvciA9IFN0cmluZyhNYXRoLnJvdW5kKGRQcmVjaW9Ub3RhbEJhc2UgKiAxMDApIC8gMTAwKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yID0gKCtkVmFsb3IpICsgKCtkUHJlY2lvVG90YWxCYXNlKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yTmV0byA9ICgrZFZhbG9yTmV0bykgKyAoK2RQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuUmVjYWxjdWxvSW1wdWVzdG9zKGVuYywgZFByZWNpb1RvdGFsQmFzZSk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy8gLy9vTTNQcm9jZXNvcy5WYWxvciA9IGRWYWxvcjtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBkVmFsb3JOZXRvO1xyXG4gICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1JlY2FsY3VsYXIgcHJlY2lvcy4gcmVjb3JyaWVuZG8gbG9zIGVuY2FiZXphZG9zLlxyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIHZhbG9yID0gMDtcclxuICAgICAgICB2YXIgVmFsb3JOZXRvID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MTAxMCBzZSBjYW1iaWEgZWwgdmFsb3IgZGVsIHByZWNpbyB1bml0YXJpbyBiYXNlLCB5YSBxdWUgYWwgbW9tZW50byBkZSBsbGFtYXIgbGEgZnVuY2nDg8KzbiBWYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc29cclxuICAgICAgICAgICAgLy8gc2UgcmVjYWxjdWxvIGVsIHByZWNpbyB0b3RhbCwgZGVwZW5kaWVuZG8gZGUgZXN0ZSB2YWxvci5cclxuICAgICAgICAgICAgbGV0IHBUb3RhbEJhc2UgPSB0aGlzLkNhbGN1bGF0ZVByZWNpb0Jhc2UoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNUQkxESU1QUFJEXCIpLlZhbG9yLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vTWF0aFRGLnJvdW5kKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciwgMikpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZEVuYyA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGlmICgrZENhbnRpZGFkRW5jICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9VTklUQkFTRVwiKS5WYWxvciA9ICgrcFRvdGFsQmFzZSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIikuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhlbmMsICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVjYWxjdWxhck0zUHJvY2VzbyhvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYWxjdWxhciBwcmVjaW8gYmFzZSBkZSB1biBwcmVjaW8sIHRlbmllbmRvIGVsIHZhbG9yIHRvdGFsIG8gbmV0by5cclxuICAgIHB1YmxpYyBDYWxjdWxhclByZWNpb0Jhc2VGcm9tUHJvY2VzbyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkUHJlY2lvTmV0bzogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGRWYWxvckltcHVlc3RvOiBudW1iZXIgPSAxO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgZFZhbG9ySW1wdWVzdG8gPSAoK2RWYWxvckltcHVlc3RvKSArICgraW1wLlBvcmNlbnRhamUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKCtkUHJlY2lvTmV0bykgLyAoK2RWYWxvckltcHVlc3RvKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZWNhbGN1bG8gZGUgdmFsb3IgZGUgaW1wdWVzdG9zLCBjdWFuZG8gY2FtYmlhIGVsIHZhbG9yLiBTZWEgcG9yIGNhbnRpZGFkLCBlbGltaW5hY2nDg8Kzbi4uLlxyXG4gICAgLy8gcHVibGljIFJlY2FsY3Vsb0ltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkUHJlY2lvQmFzZTogbnVtYmVyKSB7XHJcbiAgICAvLyAgICAgdmFyIGRUb3RhbEltcHVlc3RvOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgLy8gICAgICAgICBpbXAuVmFsb3IgPSAoK2RQcmVjaW9CYXNlKSAqICgraW1wLlBvcmNlbnRhamUpO1xyXG4gICAgLy8gICAgICAgICAvL0pBR00gMjAxODA5MTIgbnVldm8gY29uY2VwdG9cclxuICAgIC8vICAgICAgICAgaW1wLkJhc2UgPSBkUHJlY2lvQmFzZTtcclxuICAgIC8vICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSAoK2RUb3RhbEltcHVlc3RvKSArICgraW1wLlZhbG9yKTtcclxuICAgIC8vICAgICAgICAgLy9TdW1hIGRlIHByZWNpbyBiYXNlIFxyXG4gICAgLy8gICAgICAgICBkUHJlY2lvQmFzZSA9ICgrZFByZWNpb0Jhc2UpICsgKCtpbXAuVmFsb3IpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICAgIGRUb3RhbEltcHVlc3RvID0gTWF0aC5yb3VuZChkVG90YWxJbXB1ZXN0byAqIDEwMCkgLyAxMDA7XHJcbiAgICAvLyAgICAgb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMSU1QVUVTVE9TXCIpLlZhbG9yID0gZFRvdGFsSW1wdWVzdG8udG9TdHJpbmcoKTtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhY2lvbiBudWV2byBNMyBwcm9jZXNvcywgZXN0ZSB2YSB2YWNpbyBzaW4gbmlzaXF1aWVyYSBNM1BFbmNJdGVtcy4gXHJcbiAgICAgKiBTZSB1dGlsaXphIHByaW5jaXBhbG1lbnRlIHBhcmEgbGFzIGNyZWFjaW9uIGRlc2RlIDAgdW4gTTMgUHJvY2Vzby4gUXVlIHBhc2EgZGUgZXN0YWRvcyAnJyBhbCBwcmltZXIgZXN0YWRvXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIGlkcHJvY2Vzb19kZXN0aW5vIFxyXG4gICAgICogQHBhcmFtIHRkb2MgXHJcbiAgICAgKiBAcGFyYW0gbmRvYyBcclxuICAgICAqIEBwYXJhbSBlc3RhZG9zX2Z1dHVyb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRIdWIgXHJcbiAgICAgKiBAcGFyYW0gaWRVYmljYWNpb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDcmVhdGVNM05ld1Byb2Nlc29FbXB0eShpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkcHJvY2Vzb19kZXN0aW5vOiBzdHJpbmcsIHRkb2M6IHN0cmluZywgbmRvYzogc3RyaW5nLFxyXG4gICAgICAgIGVzdGFkb3NfZnV0dXJvczogQXJyYXk8YW55PiwgaWRIdWI6IHN0cmluZywgaWRVYmljYWNpb246IHN0cmluZykge1xyXG5cclxuICAgICAgICBpb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBpZHByb2Nlc29fZGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gXCJcIjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gXCJcIjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gZXN0YWRvc19mdXR1cm9zWzBdLkVfRGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID0gZXN0YWRvc19mdXR1cm9zWzBdLlNFX0Rlc3Rpbm87XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSAraWRIdWI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gK2lkVWJpY2FjaW9uO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5JREh1YiA9ICtpZEh1YjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVWJpYzEgPSAraWRVYmljYWNpb247XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlREb2MgPSB0ZG9jO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5ORG9jID0gbmRvYztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVGlwb1RlcmNlcm8gPSAxO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5VYmljMiA9IC0xO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlID0gLTE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlID0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DdWFuZG8gc2UgYWdyZWdhIHBvciBwcmltZXJhIHZleiBhbCBjYXJyaXRvIGRlIGNvbXByYS5cclxuICAgIHB1YmxpYyBMb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9EYXRhVXNlcjogYW55LCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgLy9zSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTlxyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvcztcclxuICAgICAgICBpZiAoaW9NM1Byb2Nlc29zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBuZXcgTTNQcm9jZXNvcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuRmVjaGEgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVGlwb1RlcmNlcm8gPSAxO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlREb2MgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQztcclxuICAgICAgICBvTTNQcm9jZXNvcy5ORG9jID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0M7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVWJpYzEgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlViaWMyID0gLTE7XHJcbiAgICAgICAgLy8vQUdSRUdBUiBOVUVWQSBGVU5DSU9OQUxJREFEIERFIEhVQlMuIEZMVUpPIERFIFRSQUJBSk9cclxuICAgICAgICBvTTNQcm9jZXNvcy5JREh1YiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb00zUHJvY2Vzb3MuSURIdWI7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvTTNQcm9jZXNvcy5VYmljMTtcclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YlByZSA9IC0xO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlID0gLTE7XHJcblxyXG4gICAgICAgIC8vL0ZJTiBBR1JFR0FSIE5VRVZBIEZVTkNJT05BTElEQUQgREUgSFVCUy4gRkxVSk8gREUgVFJBQkFKT1xyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IFwiXCI7XHJcblxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPT0gXCJcIiAmJiBpb00zUHJvY2Vzb3MgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBcIlJlZ2lzdHJvXCI7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IFwiQWN0aXZvXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob00zUEl0ZW1zV0VCLlN1YkVzdGFkb19vICE9IFwiXCIgJiYgb00zUEl0ZW1zV0VCLkVzdGFkb19vICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID0gb00zUEl0ZW1zV0VCLlN1YkVzdGFkb19vO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBvTTNQSXRlbXNXRUIuRXN0YWRvX287XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gPT0gXCJcIiAmJiBpb00zUHJvY2Vzb3MgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IFwiTTNFQ0NcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSWRQcm9jZXNvICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gb00zUEl0ZW1zV0VCLklkUHJvY2VzbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpKTtcclxuICAgICAgICB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBudWxsLCAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yID0gb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsO1xyXG5cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgLy90aGlzLlByb2Nlc2FtaWVudG9TZXJ2aWNlKFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQ2FyZ2FyIG51ZXZvcyBhZGljaW9uYWxlcyBhZGljaW9uYWxlc1xyXG4gICAgcHVibGljIExvYWRBZGljaW9uYWxlcyhvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBwcm9kdWN0OiBUeXBlTTNQcmRHcnApOiBNM1BJdGVtc1dFQiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLkNsYXZlUHJkU1JWID0gcHJvZHVjdC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IFwiQ0xBVkVQUk9EU0VSVlwiKS5WQUxPUjtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLkNsYXZlUHJkVW5pZGFkID0gcHJvZHVjdC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IFwiQ0xBVkVVTklEQURcIikuVkFMT1I7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5VbmlkYWQgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJVTklEQURcIikuVkFMT1I7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb00zUEl0ZW1zV0VCO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIHByb2Nlc29zLCByZXRvbWFuZG8gZGVzZGUgZGF0YVxyXG4gICAgcHVibGljIExvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsLCB2YWxvckRlc2N1ZW50byA9IDApOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvciA9ICgrb00zUHJvY2Vzb3MuVmFsb3IpICsgKCtvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvTTNQcm9jZXNvcy5WYWxvcjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPT0gXCJcIiAmJiBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpKTtcclxuICAgICAgICB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBudWxsLCB2YWxvckRlc2N1ZW50bywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKVxyXG5cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIExvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9lbmNhYmV6YWRvSXRlbXM6IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvUGFkcmVNM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIHZhbG9yRGVzY3VlbnRvID0gMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsKSB7XHJcblxyXG4gICAgICAgIC8vVmFsaWRhY2lvbiBkZSBJbnZlbnRhcmlvLlxyXG4gICAgICAgIGxldCBhZGlWZW50YU5lZyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZCh4ID0+IHguQVRSSUJVVE8gPT0gXCJWRU5UQU5FR1wiKVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXSkge1xyXG4gICAgICAgICAgICBkZWxldGUgb00zUHJvY2Vzb3NbXCJJbnZlbnRhcmlvRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5UTUlkUHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiTTNFQ0NcIiAmJiBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRSA8IG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgJiYgb00zVWJpY2FjaW9uLk0zSFVCU1swXS5UaXBvID09IFwiV0VCXCIgJiYgIShhZGlWZW50YU5lZyAmJiBhZGlWZW50YU5lZy5WQUxPUikpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NbXCJJbnZlbnRhcmlvRXJyb3JcIl0gPSAnTm8gaGF5IGludmVudGFyaW8gcGFyYSBhZ3JlZ2FyICcgKyBvTTNQSXRlbXNXRUIuZENhbnRpZGFkICsgJyBJdGVtcyc7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRTtcclxuICAgICAgICB9IC8vZWxzZSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBvTTNQRW5jSXRlbXMgPSB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmxJdGVtKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb1BhZHJlTTNQRW5jSXRlbXMsIHZhbG9yRGVzY3VlbnRvKTtcclxuXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvc1tcIk1lbnNhamVFcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9QYWRyZU0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIC8vVGllbmUgdW4gZW5jYWJlemFkbyBwYWRyZS5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPSBvUGFkcmVNM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIHZhciBvbE0zUHJkUGFja0RldDogQXJyYXk8TTNQcmRQYWNrRGV0PjtcclxuICAgICAgICAgICAgb2xNM1ByZFBhY2tEZXQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTTNQQUNLXHJcbiAgICAgICAgICAgIGlmIChvbE0zUHJkUGFja0RldCAmJiBvbE0zUHJkUGFja0RldC5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9sZXQgdmFsb3JEZXNjdWVudG9QYWNrID0gdGhpcy5jYWxjdWxhclBvcmNlbnRhamVEZXNjdWVudG9Db21ibyhwcm9kR1JQU2VsZWN0ZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2xNM1ByZFBhY2tEZXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUHJkUGFja0RldDogTTNQcmRQYWNrRGV0ID0gb2xNM1ByZFBhY2tEZXRbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhY2tNM1BJdGVtc1dFQjogTTNQSXRlbXNXRUI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQcmRQYWNrRGV0Lm9NM1BJdGVtc1dFQikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIgPSBvTTNQcmRQYWNrRGV0Lm9NM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQiA9IE9iamVjdC5hc3NpZ24oe30sIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBvTTNQcmRQYWNrRGV0LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuUGF0aEltYWdlbiA9IG9NM1ByZFBhY2tEZXQuZ3NQYXRoSW1hZ2VuO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBwYWNrTTNQSXRlbXNXRUIuZENhbnRpZGFkICogb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMuQ2FsY3VsYXJQcmVjaW9zUENLRyhvTTNQcmRQYWNrRGV0KTtcclxuICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgaSArIDI7IC8vRXN0byBmdW5jaW9uYSBzaSB0aWVuZSBzb2xvIDIgbml2ZWxlc1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2kgZXN0byBzZSBjdW1wbGUgZXN0ZSBwcm9kdWN0byBlcyB1biBwYWNrIHkgdGllbmUgcHJvZHVjdG9zIGFzb2NpYWRvcy5cclxuICAgICAgICAgICAgICAgICAgICBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmRHZW5lcmFsID0gb00zUHJkUGFja0RldC5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5NM0NvZHMuZmluZCh4ID0+IHguSWRDb2RpZ28gPT0gXCJVUENcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmRHZW5lcmFsICYmIHByZEdlbmVyYWwuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5Db2RpZ29CYXJyYXMgPSBwcmRHZW5lcmFsLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwibm8gYcODwrFhZGkgY29kaWdvIGRlIGJhcnJhcyBhIHByb2R1Y3RvIGhpam86IFwiICsgb00zUHJkUGFja0RldC5TS1VISUpPKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIG9NM1ByZFBhY2tEZXQuTTNHUlAsIG9NM1Byb2Nlc29zLk0zRU5DLCBwYWNrTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUEVuY0l0ZW1zLCAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MjMsIGVzdG8gZXMgY3VhbmRvIHNlIG1vZGlmaWNhIGxhIGNhbnRpZGFkIGRlIHByb2RjdXRvcyBleGlzdGVudGVzLlxyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JRCA9IG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5IGVudmlvIGRlIHBhZHJlIGRlc2RlIGluc3RydWNjaW9uIG1hcyBhcnJpYmFcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JREVuY1BhZHJlICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA9IG9NM1BJdGVtc1dFQi5JREVuY1BhZHJlO1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlRpcG9BZ3J1cGFjaW9uID0gb00zUEl0ZW1zV0VCLlRpcG9BZ3J1cGFjaW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQgJiYgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZC5mb3JFYWNoKGRpbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUERpbmFtQnlBY3RpdmlkYWQucHVzaCh7Li4uIGRpbn0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIk1lbnNhamVFcnJvclwiXSA9IG9NM1BFbmNJdGVtc1tcIk1lbnNhamVFcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUHJvY2VzYWRvID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgIC8vfVxyXG4gICAgfVxyXG5cclxuICAgIGNhbGN1bGFyUG9yY2VudGFqZURlc2N1ZW50b0NvbWJvKHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwKSB7XHJcbiAgICAgICAgbGV0IHZhbG9yRGVzY3VlbnRvUGFjayA9IDA7XHJcbiAgICAgICAgbGV0IHZhbG9ySXRlbXNDb21ib1N1bWEgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckZpbmFsQ29tYm8gPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTztcclxuXHJcbiAgICAgICAgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLk0zUEFDSy5mb3JFYWNoKHByZFBhY2sgPT4ge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWQgPSBwcmRQYWNrLk0zR1JQLkNhbnRpZGFkID8gcHJkUGFjay5NM0dSUC5DYW50aWRhZCA6IDE7XHJcbiAgICAgICAgICAgIGxldCBpbmZOaXZlbGVzUHJjaW8gPSB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlcyhwcmRQYWNrLk0zR1JQLCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuSURMSVNUQSlcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8pXHJcbiAgICAgICAgICAgIHZhbG9ySXRlbXNDb21ib1N1bWEgKz0gKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyAqIGNhbnRpZGFkKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHZhbG9ySXRlbXNDb21ib1N1bWEgPiB2YWxvckZpbmFsQ29tYm8pIHtcclxuICAgICAgICAgICAgdmFsb3JEZXNjdWVudG9QYWNrID0gMTAwIC0gKHZhbG9yRmluYWxDb21ibyAqIDEwMCAvIHZhbG9ySXRlbXNDb21ib1N1bWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmRlYnVnKHZhbG9yRGVzY3VlbnRvUGFjaylcclxuICAgICAgICByZXR1cm4gdmFsb3JEZXNjdWVudG9QYWNrO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsY3VsbyBkZSBwcmVjaW9zIGRlIGhpam9zIGRlbCBwYXF1ZXRlXHJcbiAgICAgKiBAcGFyYW0gb00zUHJkUGFja0RldCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJlY2lvc1BDS0cob00zUHJkUGFja0RldDogTTNQcmRQYWNrRGV0KSB7XHJcbiAgICAgICAgb00zUHJkUGFja0RldC5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9hZE0zUEVuY0l0ZW1zRnJvbVByb21vY2lvbkNvbWJvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvZGlnbzogc3RyaW5nLCB2YWxvciwgZENhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9Db21ibyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLklkUHJvZHVjdG8gPSBjb2RpZ287XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5Mb3RlID0gXCIxXCI7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDg8KzZ2ljYSBhbnRlcmlvciwgc2UgaGFjZSByZW1vdmUgZGUgaXRlbS4geSBsb3MgSUQgcXVlZGFiYW4gcmVwZXRpZG9zLlxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uT3JkZW4gPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5Ob21icmUgPSBgQ29tYm8gLSAke3Byb2R1Y3Rvc0hpam9zRGVsQ29tYm8ubWFwKHg9PiB4LklkUHJvZHVjdG8pLmpvaW4oJy0nKX1gO1xyXG5cclxuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERFRISDptbTpzcycpLCBcIkZFQ0hBSU5cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwidHJ1ZVwiLCBcIkVTUFJPRFBST01PQ09NQk9cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwidHJ1ZVwiLCBcIkVTUFJPRFBST01PXCIpKTsgLy8gVFJVRS0+IFNJIEVTIFVOIFBST0RVQ1RPIFBPUiBQUk9NT0NJT04sIEZBTFNFLT4gREUgT1RSTyBNT0RPXHJcbiAgICAgICAgLy9EZXRhbGxlcyBkZSBmYWN0dXJhIGVsZWN0cm9uaWNhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJFTkNQUk9NT1wiLCBcIlRJUE9fUFJEXCIpKTtcclxuICAgICAgICAvKipGSU4gSU5GT1JNQUNJT04gR0VORVJBTCAqL1xyXG5cclxuICAgICAgICAvLyoqIElOSUNJTyBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBSRUNJT1VOSVRCQVNFXCIpKTsgLy9QcmVjaW8gU2luIGltcHVlc3Rvc1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUU0lOSU1QVUVTVE9cIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyBZIHNpbiBJbXB1ZXN0b3NcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVFwiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvICAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRORVRPXCIpKTsvL0NvbiBkZXNjdWVudG8gaW5jbHVpZG8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVlVOSVRQUk9NT1wiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlVOSVRGSURFTFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAvLyoqIEZJTiBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkQ2FudGlkYWQudG9TdHJpbmcoKSwgXCJDQU5USURBRFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIkZJREVMSVpBQ0lPTlwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxQUk9NT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiQ1RCTERJTVBQUkRcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiU1VCVE9UQUxcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxCQVNFXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMXCIpKTtcclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMucHVzaChwcm9kdWN0b0NvbWJvKTtcclxuICAgICAgICBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmZvckVhY2gocHJvZHVjdG8gPT4ge1xyXG4gICAgICAgICAgICBwcm9kdWN0by5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDg8KzZ2ljYSBhbnRlcmlvciwgc2UgaGFjZSByZW1vdmUgZGUgaXRlbS4geSBsb3MgSUQgcXVlZGFiYW4gcmVwZXRpZG9zLlxyXG4gICAgICAgICAgICBwcm9kdWN0by5JZEVuY1BhZHJlID0gcHJvZHVjdG9Db21iby5JRDtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMucHVzaChwcm9kdWN0byk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVjYWxjdWxhck0zUHJvY2VzbyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RvQ29tYm87XHJcbiAgICB9XHJcblxyXG4gICAgcmVjYWxjdWxhck0zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NBcGxTdW1hVmFsb3IgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIob00zRU5DID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldENhbnRpZGFkID0gb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGxldCBkZXRFc1ByZENvbWJvID0gb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiRVNQUk9EUFJPTU9DT01CT1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRldENhbnRpZGFkICYmICtkZXRDYW50aWRhZC5WYWxvciA+IDAgJiYgIShkZXRFc1ByZENvbWJvICYmIGRldEVzUHJkQ29tYm8uVmFsb3IgPT0gXCJ0cnVlXCIpXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgPSAwO1xyXG5cclxuICAgICAgICAvL2ZvciAoY29uc3Qgb00zRU5DIG9mIHRoaXMub00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAhZW5jLklkRW5jUGFkcmUgfHwgZW5jLklkRW5jUGFkcmUgPD0gMCkpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG9NM0VOQyBvZiBwcm9kdWN0b3NBcGxTdW1hVmFsb3IpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvICs9ICtvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgKz0gK29NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlNVQlRPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBNM1Byb2Nlc28gZW5jYWJlemFkbyBpdGVtcywgZGVzZGUgcHJvZHVjdG8gZ2VuZXJhbFxyXG4gICAgcHVibGljIExvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmxJdGVtKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvZW5jYWJlemFkb0l0ZW1zOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb1BhZHJlTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zID0gdW5kZWZpbmVkLCB2YWxvckRlc2N1ZW50byA9IDApOiBNM1BFbmNJdGVtcyB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuICAgICAgICB2YXIgb00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHZhciBkUFJFQ0lPVW5pdEJhc2UgPSAwO1xyXG4gICAgICAgIHZhciBpbmZOaXZlbGVzUHJjaW87XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYTtcclxuICAgICAgICB2YXIgZFRvdGFsSW1wdWVzdG9zVG90YWw6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRVbml0YXJpb01vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVW5pdGFyaW9Qcm9tbzogbnVtYmVyID0gMDtcclxuICAgICAgICAvL1ZlcmlmaWNhciBlbCBwcmVjaW8gYSB1c2FyLCB1c2FuZG8gbGEgbG9naWNhIGRlIG5pdmVsZXMgZGUgcHJlY2lvcy5cclxuICAgICAgICBpbmZOaXZlbGVzUHJjaW8gPSB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlcyhwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG4gICAgICAgIGlmICh2YWxvckRlc2N1ZW50byA+IDApIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPICogdmFsb3JEZXNjdWVudG8gLyAxMDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyAtIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gdGhpcy5DYWxjdWxhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vVmFsaWRhIHNpIGVsIHByb2R1Y3RvIGVzdMODwqEgcmVzdGluZ2lkb1xyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGFyUHJvZHVjdG9SZXN0cmluZ2lkbyhvUHJvbW9jaW9uUHJvY2VzYWRhKSkge1xyXG4gICAgICAgICAgICB0aGlzLkFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXMob00zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtcyk7XHJcblxyXG4gICAgICAgICAgICAvL0NhbGN1bG8gZGVsIHRvdGFsIGRlIHB1bnRvcyB5IGVsIHZhbG9yIHRvdGFsIGRlIGxhIHByb21vY2nDg8KzbiBwb3IgbGEgY3FhbnRpZGFkIGRlIHByb2R1Y3RvcyBkZSBsYSBtaXNtYSByZWZlcmVuY2lhXHJcbiAgICAgICAgICAgIGRVbml0YXJpb01vbmVkZXJvID0gb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm87IC8vVW5pdGFyaW8gTW9uZWRlcm9cclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vTm8gc2UgdXRpbGl6YSwgc2UgZGVqYSBwYXJhIHVzb3MgYWRlbGFudGVcclxuXHJcbiAgICAgICAgICAgIGRVbml0YXJpb1Byb21vID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjsgLy9Qcm9tb2Npb24gdW5pdGFyaW9cclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24sIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpOyAvL05vIHNlIHV0aWxpemEsIHNlIGRlamEgcGFyYSB1c29zIGFkZWxhbnRlXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RldEN1cG9uZXMgPSB0aGlzLmdldF9saXN0X2N1cG9uZXNfZnJvbV9wcm9tbyhvUHJvbW9jaW9uUHJvY2VzYWRhLCArb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL0NhbGN1bG8gZGUgcHJlY2lvIHRvdGFsLCBkZXNwdWVzIGRlIHByb21vY2lvbmVzXHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwgPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FyZ2FyIHByb2R1Y3RvIFxyXG4gICAgICAgICAgICBvTTNQcmRHZW5lcmFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8gPSBvTTNQcmRHZW5lcmFsLlNLVTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLkxvdGUgPSBvTTNQcmRHZW5lcmFsLkxPVEU7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9lbmNhYmV6YWRvSXRlbXMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMODwrNnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5PcmRlbiA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9lbmNhYmV6YWRvSXRlbXMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTm9tYnJlID0gb00zUHJkR2VuZXJhbC5OT01CUkUxO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuRElTUE9OSUJMRSA9IG9NM1ByZEdlbmVyYWwuRElTUE9OSUJMRTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlBhdGhJbWFnZSA9IG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuQ29kaWdvQmFycmFzID0gb00zUEl0ZW1zV0VCLkNvZGlnb0JhcnJhcztcclxuICAgICAgICAgICAgaWYgKG9NM1ViaWNhY2lvbiAmJiBvTTNVYmljYWNpb24uTTNVYmlBZGljaW9uYWxlcyl7XHJcbiAgICAgICAgICAgICAgICBsZXQgdWJpSW1wRmlqbyA9IG9NM1ViaWNhY2lvbi5NM1ViaUFkaWNpb25hbGVzLmZpbmQoeCA9PiB4LkF0cmlidXRvID09IFwiSU1QRklKT1wiKTtcclxuICAgICAgICAgICAgICAgIGlmICh1YmlJbXBGaWpvICYmIHViaUltcEZpam8uVmFsb3IgIT0gXCJcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCA9IHViaUltcEZpam8uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHBUb3RhbEJhc2UgPSB0aGlzLkNhbGN1bGF0ZVByZWNpb0Jhc2Uob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgdGhpcy5vTWF0aFRGLnJvdW5kKGJpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCksIDIpKTtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZFBSRUNJT1VuaXRCYXNlID0gcFRvdGFsQmFzZSAvIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkUFJFQ0lPVW5pdEJhc2UgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkVG90YWxJbXB1ZXN0b3NUb3RhbCA9IHRoaXMuTG9hZE0zUEltcHVlc3Rvc0Zyb21QcmRHcmwob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgb00zUEVuY0l0ZW1zLCBwVG90YWxCYXNlLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkLCBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKTtcclxuICAgICAgICAgICAgLyoqIElOSUNJTyBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERFRISDptbTpzcycpLCBcIkZFQ0hBSU5cIikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkJpc09ic2VxdWlvLnRvU3RyaW5nKCksIFwiRVNPQlNFUVVJT1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5TS1AxLCBcIlBSRF9FU1RJTE9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQsIFwiQ1RCTERJTVBQUkRcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5vYnNlcnZhY2lvbi50b1N0cmluZygpLCBcIk9CU0VSVkFDSU9OXCIpKTsgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuLCBcIlBBVEhJTUFHRU5cIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkJpc1Byb2R1Y3RvUHJvbW8udG9TdHJpbmcoKSwgXCJFU1BST0RQUk9NT1wiKSk7IC8vIFRSVUUtPiBTSSBFUyBVTiBQUk9EVUNUTyBQT1IgUFJPTU9DSU9OLCBGQUxTRS0+IERFIE9UUk8gTU9ET1xyXG4gICAgICAgICAgICAvL0RldGFsbGVzIGRlIGZhY3R1cmEgZWxlY3Ryb25pY2FcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShwcm9kR1JQU2VsZWN0ZWQuVElQTywgXCJUSVBPX1BSRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLlVuaWRhZCwgXCJVTklEQURcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DbGF2ZVByZFNSViwgXCJDTEFWRVBST0RTRVJWXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2xhdmVQcmRVbmlkYWQsIFwiQ0xBVkVVTklEQURcIikpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZEl0ZW1zSW50ZXJmYXoob00zUEVuY0l0ZW1zLCBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgdGhpcy5BZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zLCBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICB0aGlzLmNhbXBvc0FkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQilcclxuICAgICAgICAgICAgdGhpcy5Mb2FkRGV0YWxsZU5pdmVsZXNQcmVjaW8oaW5mTml2ZWxlc1ByY2lvLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZEluZm9Qcm9tb2Npb25lc0FEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vIExpc3RhIGRlIFByb21vY2lvbmVzIFxyXG4gICAgICAgICAgICAvKipGSU4gSU5GT1JNQUNJT04gR0VORVJBTCAqL1xyXG5cclxuICAgICAgICAgICAgLy8qKiBJTklDSU8gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkUFJFQ0lPVW5pdEJhc2UudG9TdHJpbmcoKSwgXCJQUkVDSU9VTklUQkFTRVwiKSk7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3NcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVG90YWxJbXB1ZXN0b3NUb3RhbC50b1N0cmluZygpLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgodGhpcy5vTWF0aFRGLnJvdW5kKHRoaXMuR2V0VW5pdGFyaW9CeVRvdGFsKG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJUT1RBTElNUFVFU1RPU1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPIC0gK2RUb3RhbEltcHVlc3Rvc1VuaXRhcmlvKS50b1N0cmluZygpLCBcIlBVTklUU0lOSU1QVUVTVE9cIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyBZIHNpbiBJbXB1ZXN0b3MgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCtkUFJFQ0lPVW5pdEJhc2UgKyArZFVuaXRhcmlvUHJvbW8pLnRvU3RyaW5nKCksIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3RvcyAvLy0tLS0tLSBOdW5jYSBDYW1iaWEgLy9GUyAyMDE5MDcyNSBDb3JyZWNjaW9uIGVuIGxhIGZvbXJhIGRlIGNhbGN1bGFybG9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8udG9TdHJpbmcoKSwgXCJQVU5JVFwiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvICAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbC50b1N0cmluZygpLCBcIlBVTklUTkVUT1wiKSk7Ly9Db24gZGVzY3VlbnRvIGluY2x1aWRvLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRVbml0YXJpb01vbmVkZXJvLnRvU3RyaW5nKCksIFwiVU5JVEZJREVMXCIpKTsvL1VuaXRhcmlvIGZpZGVsaXphY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFVuaXRhcmlvUHJvbW8udG9TdHJpbmcoKSwgXCJWVU5JVFBST01PXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdzSWRrYXRpb3MgPT0gXCJDVE5cIikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpc3RhU1IgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM0xpc3RhUHJlY2lvLmZpbmQoeCA9PiB4LklETElTVEEgPT0gXCIyXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RhU1IpIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZCh4ID0+IHguSURMSVNUQSA9PSBcIjJcIikuUFJFQ0lPLnRvU3RyaW5nKCksIFwiUFJFQ0lPU1JcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vKiogRklOIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcblxyXG4gICAgICAgICAgICAvLyAqKiogSW5mb3JtYWNpb24gZGUgYWNjaW9uZXMgZW4gZWwgY2xpZW50ZSAqKipcclxuICAgICAgICAgICAgaWYgKHByb2RHUlBTZWxlY3RlZC5lbmNvbnRyYWRvTG9jYWwpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJMT0NBTFwiLCBcIkNPTlNVTFRPRU5cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJTRVJWSURPUlwiLCBcIkNPTlNVTFRPRU5cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL2lmICghb1BhZHJlTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgPSAoK29NM1Byb2Nlc29zLlZhbG9yKSArICgrb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlNVQlRPVEFMXCIpLlZhbG9yKSAvLyAoK29NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSAoK29NM1Byb2Nlc29zLlZhbG9yTmV0bykgKyAoK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcik7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgLy9WZXJpZmljYXIgb2JzZXF1aW9zIGRlbCBwcm9kdWN0byBxdWUgc2UgaW5ncmVzbyBhbCBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJPYnNlcXVpb3Mob1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy50dXJuT25Qcm9tb3Mob1Byb21vY2lvblByb2Nlc2FkYSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtc1tcIk1lbnNhamVFcnJvclwiXSA9IFwiUHJvZHVjdG8gUmVzdHJpbmdpZG9cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQRW5jSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIHRydWUgc2kgZXN0ZSBwcm9kdWN0byBzZSBlbmN1ZW50cmEgcmVzdHJpbmdpZG9cclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhclByb2R1Y3RvUmVzdHJpbmdpZG8ob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9tb1Jlc3RyaW5naWRvID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmluZCh4ID0+IHguVGlwbyA9PSBcIlJFU1RSSUNDSU9OXCIpO1xyXG4gICAgICAgICAgICBpZiAocHJvbW9SZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgICAvKipcclxuICAgICAqIEV4Y2x1eWUgdG9kb3MgbG9zIGltcHVlc3RvcyBkZWphbmRvIHNvbG8gZWwgRklKTyBzaSBlcyBkZSBsYSB1YmljYWNpb24gZGFkYSBcclxuICAgICAqL1xyXG4gICAgIHB1YmxpYyBHZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShsaXN0YSwgYXRyaWJ1dG8pIHtcclxuICAgICAgICBpZiAobGlzdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgbGlzdElEID0gbGlzdGEubWFwKHggPT4geFthdHJpYnV0b10pO1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgbGlzdElEKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsb3JlcyBDYWxjdWxhZG9zIHBvciBwcm9jZXNvLlxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBkQ2FudGlkYWQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZENhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICAvKiogSU5JQ0lPIFZBTE9SRVMgRElOQU1JQ09TICovXHJcbiAgICAgICAgLy8gdmFyIGRUb3RhbEltcHVlc3RvcyA9ICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsU2luRHRvID0gdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRcIilcclxuICAgICAgICAvLyB2YXIgZFN1YlRvdGFsID0gTWF0aC5yb3VuZCgoK2RQcmVjaW9Ub3RhbFNpbkR0byAtICtkVG90YWxJbXB1ZXN0b3MpICogMTAwKSAvIDEwMDtcclxuXHJcbiAgICAgICAgbGV0IHN1YlRvdGFsID0gMDtcclxuICAgICAgICBsZXQgcHJlY2lvVG90YWxTaW5EdG8gPSAwO1xyXG4gICAgICAgIGxldCB0b3RhbEltcHVlc3Rvc1xyXG4gICAgICAgIC8vQWdyZWdhciBJbXB1ZXN0b3NcclxuICAgICAgICB0b3RhbEltcHVlc3RvcyA9IHRoaXMuYWdyZWdhckltcHVlc3RvKG9NM1BFbmNJdGVtcywgZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgLy9GUyAyMDE5MDcyNSBBcnJlZ2xvIGVuIGVsIGNhbGN1bG8gZGUgdG90YWxlcyBlbiBjYXNvIGRlIGhhYmVyIGltcHVlc3Rvc1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy9TdWJ0b3RhbCBTdW1hcyBkZSBsYXMgYmFzZXNcclxuICAgICAgICAgICAgc3ViVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoKCh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBSRUNJT1VOSVRCQVNFXCIpLCAyKSkgKyAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlZVTklUUFJPTU9cIikpKSwgMik7XHJcbiAgICAgICAgICAgIHRvdGFsSW1wdWVzdG9zID0gdGhpcy5nZXRWYWxvclRvdGFsRnJvbUltcHVlc3RvcyhvTTNQRW5jSXRlbXMsIFwiVmFsb3JcIik7XHJcbiAgICAgICAgICAgIHByZWNpb1RvdGFsU2luRHRvID0gc3ViVG90YWwgKyB0b3RhbEltcHVlc3RvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vU2UgYXN1bWUgcXVlIG5vIGhheSBpbXB1ZXN0b3MgZW50b25jZXMgZWwgc3ViVG90YWwgZXMgaWd1YWwgYWwgcHJlY2lvVG90YWxTaW5EdG9cclxuICAgICAgICAgICAgcHJlY2lvVG90YWxTaW5EdG8gPSB0aGlzLm9NYXRoVEYucm91bmQodGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRcIiksIDIpO1xyXG4gICAgICAgICAgICBzdWJUb3RhbCA9IHByZWNpb1RvdGFsU2luRHRvO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBkQ2FudGlkYWQudG9TdHJpbmcoKSwgXCJDQU5USURBRFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKHRvdGFsSW1wdWVzdG9zLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVFU1RPU1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFVuaXRhcmlvQnlUb3RhbChkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJUT1RBTElNUFVFU1RPU1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVTklUXCIpO1xyXG5cclxuICAgICAgICAvL0xhIGZpZGVsaXphY2lvbiBlcyB1biBwb3JjYW50YWplIHBvciBlbmRlIG5vIGRlYmUgbXVsdGlwbGljYXJzZSB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCB0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJVTklURklERUxcIikudG9TdHJpbmcoKSwgXCJGSURFTElaQUNJT05cIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlVOSVRGSURFTFwiKS5WYWxvciwgXCJGSURFTElaQUNJT05cIik7XHJcbiAgICAgICAgLy90aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVE5FVE9cIiksIDIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMXCIpO1xyXG4gICAgICAgIC8vdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVE5FVE9cIikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxSRUFMXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHByZWNpb1RvdGFsU2luRHRvLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxTSU5EVE9cIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgc3ViVG90YWwudG9TdHJpbmcoKSwgXCJTVUJUT1RBTFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyksIFwiRlVUXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlZVTklUUFJPTU9cIiksIDIpKS50b1N0cmluZygpLCBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFJFQ0lPVU5JVEJBU0VcIiksIDIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMQkFTRVwiKTsgLy9QcmVjaW8gU2luIGltcHVlc3RvcyAgICAgICAgXHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgoc3ViVG90YWwgKyArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMSU1QVUVTVE9TXCIpLlZhbG9yIC0gK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIik7XHJcblxyXG4gICAgICAgIC8qKiBGSU4gVkFMT1JFUyBESU5BTUlDT1MgKi9cclxuXHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoID4gMCAmJiBkQ2FudGlkYWQgPT0gMCkgey8vU2kgbGEgY2FudGlkYWQgZXMgMCBzaWduaWZpY2EgcXVlIHNlIGVzdMODwqEgYm9ycmFuZG8gZWwgaXRlbSBvIGVzIHVuIG9ic2VxdWlvLCBwb3IgbG8gcXVlIG5vIHRpZW5lIHNlbnRpZG8gcXVlIHRlbmdhIE0zUEltcHVlc3RvXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxhIHN1bWF0b3JpYSBkZSBsb3MgdmFsb3JlcyBkZSB1biBhdHJpYnV0byBkYWRvIGRlbCBhcnJlZ2xvIGRlIGltcHVlc3Rvc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBhdHJpYnV0byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFZhbG9yVG90YWxGcm9tSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGF0cmlidXRvOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBzdW1hdG9yaWEgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbXB1ZXN0byA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3NbX2ldO1xyXG4gICAgICAgICAgICBzdW1hdG9yaWEgPSBzdW1hdG9yaWEgKyAoK2ltcHVlc3RvW2F0cmlidXRvXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQoc3VtYXRvcmlhLDIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWdyZWdhckltcHVlc3RvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGV0X2N0YmxkX2ltcF9wcmQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1RCTERJTVBQUkRcIik7XHJcbiAgICAgICAgbGV0IGRldF9wcmVjaW9fdW5pdF9iYXNlID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpO1xyXG4gICAgICAgIGxldCB2YWxvclRvdGFsSW1wdWVzdG9zOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGlmIChkZXRfY3RibGRfaW1wX3ByZCAmJiBkZXRfcHJlY2lvX3VuaXRfYmFzZSkge1xyXG4gICAgICAgICAgICB2YWxvclRvdGFsSW1wdWVzdG9zID0gdGhpcy5Mb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChkZXRfY3RibGRfaW1wX3ByZC5WYWxvciwgb00zUEVuY0l0ZW1zLCArYmlnRGVjaW1hbC5tdWx0aXBseShkZXRfcHJlY2lvX3VuaXRfYmFzZS5WYWxvciwgY2FudGlkYWQpLCBjYW50aWRhZCwgK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yVG90YWxJbXB1ZXN0b3MsMik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBJbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIHZhbG9yOiBzdHJpbmcsIHNDb25jZXB0bzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9EZXQ6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICBvRGV0ID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBzQ29uY2VwdG8pO1xyXG4gICAgICAgIGlmIChvRGV0KSB7XHJcbiAgICAgICAgICAgIC8vIEV4aXN0ZSBBY3R1YWxpemFcclxuICAgICAgICAgICAgb0RldC5WYWxvciA9IHZhbG9yO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vTm8gZXhpc3RlIGFncmVnYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLnRvU3RyaW5nKCksIHNDb25jZXB0bykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3IgdG90YWxcclxuICAgICAqIEBwYXJhbSBjYW50aWRhZCBOdWV2YSBDYW50aWRhZCBcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gRGVzY1VuaXRhcmlvIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEdldFRvdGFsQnlVbml0YXJpbyhjYW50aWRhZDogbnVtYmVyLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBEZXNjVW5pdGFyaW86IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB1bml0YXJpbyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gRGVzY1VuaXRhcmlvKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICtiaWdEZWNpbWFsLm11bHRpcGx5KHVuaXRhcmlvLCBjYW50aWRhZCk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3IgdW5pdGFyaW9cclxuICAgICAqIEBwYXJhbSBjYW50aWRhZCBcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gRGVzY1RvdGFsIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEdldFVuaXRhcmlvQnlUb3RhbChjYW50aWRhZDogbnVtYmVyLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBEZXNjVG90YWw6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICgrY2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHRvdGFsID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBEZXNjVG90YWwpLlZhbG9yO1xyXG4gICAgICAgICAgICByZXR1cm4gK3RvdGFsIC8gK2NhbnRpZGFkO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZXMgcmVsYWNpb25hZG9zIGNvbiBsYSBpbmZvcm1hY2lvbiBkZSBzdyBleHRlcm5vLlxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgZ3VhcmRhcsODwqEgbG9zIG51ZXZvcyBhdHJpYnV0b3MuXHJcbiAgICAgKiBAcGFyYW0gb0FkaWNpb25hbGVzIERlc2RlIGRvbmRlIHNlIHNhY2Fyw4PCoSBsYSBpbmZvcm1hY2nDg8Kzbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEl0ZW1zSW50ZXJmYXoob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb0FkaWNpb25hbGVzOiBBcnJheTxNM1ByZEFkaWNpb25hbGVzPikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvQWRpY2lvbmFsZXNGaWx0ZXI6IEFycmF5PE0zUHJkQWRpY2lvbmFsZXM+O1xyXG4gICAgICAgICAgICBvQWRpY2lvbmFsZXNGaWx0ZXIgPSBvQWRpY2lvbmFsZXMuZmlsdGVyKGEgPT4gYS5BVFJJQlVUTy5zdGFydHNXaXRoKFwiQ1NJQV9cIikpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9BZGljaW9uYWxlc0ZpbHRlci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvQWRpY2lvbmFsZXNGaWx0ZXJbaV0uVkFMT1IsIG9BZGljaW9uYWxlc0ZpbHRlcltpXS5BVFJJQlVUTykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBkZXRhbGxlcyBcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgT2JqZXRvIGRvbmRlIHNlIGd1YXJkYXLDg8KhIGxvcyBudWV2b3MgYXRyaWJ1dG9zLlxyXG4gICAgICogQHBhcmFtIG9BZGljaW9uYWxlcyBEZXNkZSBkb25kZSBzZSBzYWNhcsODwqEgbGEgaW5mb3JtYWNpw4PCs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb0FkaWNpb25hbGVzOiBBcnJheTxNM1ByZEFkaWNpb25hbGVzPikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0FkaWNpb25hbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9BZGljaW9uYWxlc1tpXS5WQUxPUiwgXCJBRENfXCIgKyBvQWRpY2lvbmFsZXNbaV0uQVRSSUJVVE8pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjYW1wb3NBZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlc1tpXS5WQUxPUiwgXCJDQU1BRENfXCIgKyBvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXNbaV0uQVRSSUJVVE8pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIE5vbWJyZSwgSUQuIGEgZGV0YWxsZSBkZWwgZW5jYWJlemFkbyBkZSBwcm9kdWN0byBhZ3JlZ2Fkb1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgSW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMgcHJvY2VzYWRhc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBFbmNhYmV6YWRvIGRlIGl0ZW1zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGlDYW50aWRhZDogbnVtYmVyLCBhcGxpY2FkYXMgPSB0cnVlKSB7XHJcbiAgICAgICAgdmFyIHNOb21icmVzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBzSWRzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBzVmFsb3Jlczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0YTtcclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYSAmJiBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAmJiBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChhcGxpY2FkYXMpIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+IHguQXBsaWNhZGEpLmZpbHRlcih4ID0+IHguUHJvbW9jaW9uQ29tYmluYWRhID09IG51bGwpLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNOb21icmVzID0gc05vbWJyZXMgKyBwcm9tby5Ob21icmUgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzSWRzID0gc0lkcyArIHByb21vLklEUHJvbW9jaW9uICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc1ZhbG9yZXMgPSBzVmFsb3JlcyArIGJpZ0RlY2ltYWwubXVsdGlwbHkocHJvbW8uVmFsb3IsIGlDYW50aWRhZCkgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHggPT4gIXguQXBsaWNhZGEpLmZpbHRlcih4ID0+IHguUHJvbW9jaW9uQ29tYmluYWRhID09IG51bGwpLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNOb21icmVzID0gc05vbWJyZXMgKyBwcm9tby5Ob21icmUgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzSWRzID0gc0lkcyArIHByb21vLklEUHJvbW9jaW9uICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc1ZhbG9yZXMgPSBzVmFsb3JlcyArIGJpZ0RlY2ltYWwubXVsdGlwbHkocHJvbW8uVmFsb3IsIGlDYW50aWRhZCkgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGEgPSB7IFwiTk9NQlJFU1wiOiBzTm9tYnJlcywgXCJJRFwiOiBzSWRzLCBcIlZBTE9SRVNcIjogc1ZhbG9yZXMgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBkZXRhbGxlIGRlIHByb21vY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIHNOb21icmVzIFxyXG4gICAgICogQHBhcmFtIHNJZHMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRJbmZvUHJvbW9jaW9uZXNBRGV0YWxsZShvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGlDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLkdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIGlDYW50aWRhZClcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuTk9NQlJFUywgXCJOT01CX1BST01PQ1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5JRCwgXCJJRF9QUk9NT0NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuVkFMT1JFUywgXCJWQUxfUFJPTU9DXCIpKTtcclxuXHJcbiAgICAgICAgICAgIC8vQWhvcmEgc2UgYWdyZWdhIHVuYSBkaW5hbWljYSBwb3IgYXRyaWJ1dG8gZGUgbGEgcHJvbW8gcGFyYSBmYWNpbGl0YXIgbGEgcmV0b21hIGRlIGVzdGEgaW5mb3JtYWNpw4PCs25cclxuICAgICAgICAgICAgbGV0IGxpc3ROb21icmUgPSBkYXRhLk5PTUJSRVMucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIGxldCBsaXN0SWQgPSBkYXRhLklELnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGlzdFZhbG9yID0gZGF0YS5WQUxPUkVTLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RJZC5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdE5vbWJyZVtfaV0sIFwiTk9NQl9QUk9NT0NfXCIgKyBfaSkpO1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0SWRbX2ldLCBcIklEX1BST01PQ19cIiArIF9pKSk7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3RWYWxvcltfaV0sIFwiVkFMX1BST01PQ19cIiArIF9pKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGEgPSB0aGlzLkdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIGlDYW50aWRhZCwgZmFsc2UpXHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLk5PTUJSRVMsIFwiTk9NQl9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuSUQsIFwiSURfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLlZBTE9SRVMsIFwiVkFMX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhcmdhciBhIGRldGFsbGUgaW5mb3JtYWNpb24gZGUgbml2ZWxlcyBkZSBwcmVjaW9cclxuICAgICAqIEBwYXJhbSBpbmZOaXZlbGVzUHJjaW8gSW5mb3JtYWNpb24gZGUgbml2ZWxlcyBkZSBwcmVjaW9cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgT2JqZXRvIGRvbmRlIHNlIGNhcmdhcsODwqEgbGEgaW5mb3JtYWNpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWREZXRhbGxlTml2ZWxlc1ByZWNpbyhpbmZOaXZlbGVzUHJjaW8sIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAoaW5mTml2ZWxlc1ByY2lvICYmIGluZk5pdmVsZXNQcmNpby5OSVZFTCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoaW5mTml2ZWxlc1ByY2lvLk5JVkVMLCBcIk5JVkVMUFJFQ0lPXCIpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgY29uIHF1ZSBuaXZlbCBkZSBwcmVjaW8gdmEgYSB0cmFiYWphclxyXG4gICAgICogQHBhcmFtIHByb2RHUlBTZWxlY3RlZCBFbCBwcm9kdWN0byBpbmdyZXNhZG9cclxuICAgICAqIEBwYXJhbSBpQ2FudGlkYWQgTGEgY2FudGlkYWQgZGUgcHJvZHVjdG9zIHF1ZSB2YSBhIGluZ3Jlc2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIGlDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9NM1ByZXNlbnRhY2lvbmVzOiBNM1ByZXNlbnRhY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgalJlc3BOaXZlbGVzID0ge307XHJcbiAgICAgICAgICAgIGlmIChwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMgJiZcclxuICAgICAgICAgICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJlc2VudGFjaW9uZXMgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZmluZCh4ID0+IGlDYW50aWRhZCA+PSB4LlRPUEUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1ByZXNlbnRhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTTNQcmVzZW50YWNpb25lcy5WQUxPUjtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcE5pdmVsZXMgPSB7IFwiUFJFQ0lPXCI6IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SLCBcIk5JVkVMXCI6IG9NM1ByZXNlbnRhY2lvbmVzLk5JVkVMUFJTIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGpSZXNwTml2ZWxlcztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJQcmVjaW9CeU5pdmVsZXNHZW5lcmFsKG9NM1ByZEdlbmVyYWw6IE0zUHJkR2VuZXJhbCwgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJlc2VudGFjaW9uZXM6IE0zUHJlc2VudGFjaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcE5pdmVsZXMgPSB7fTtcclxuICAgICAgICAgICAgaWYgKG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMgJiYgb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJlc2VudGFjaW9uZXMgPSBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmZpbmQoeCA9PiBpQ2FudGlkYWQgPj0geC5UT1BFKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQcmVzZW50YWNpb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwTml2ZWxlcyA9IHsgXCJQUkVDSU9cIjogb00zUHJlc2VudGFjaW9uZXMuVkFMT1IsIFwiTklWRUxcIjogb00zUHJlc2VudGFjaW9uZXMuTklWRUxQUlMgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4galJlc3BOaXZlbGVzO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxvcyBjdXBvbmVzIGdlbmVyYWRvcyBkZSBsYSBsaXN0YSBkZSBwcm9tb3Byb2Nlc2FkYXNcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X2xpc3RfY3Vwb25lc19mcm9tX3Byb21vKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgY2FudGlkYWQ6IG51bWJlcik6IEFycmF5PE0zUERldGFsbGVDdXBvbj4ge1xyXG4gICAgICAgIHZhciBsaXN0X2N1cG9uZXMgPSBBcnJheTxNM1BEZXRhbGxlQ3Vwb24+KCk7XHJcblxyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvbW9fYXNvY2lhZGEgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhc1tfaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vX2Fzb2NpYWRhLklkQ3Vwb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY3Vwb24gPSBuZXcgTTNQRGV0YWxsZUN1cG9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3Vwb24uSWRDdXBvbiA9IHByb21vX2Fzb2NpYWRhLklkQ3Vwb247XHJcbiAgICAgICAgICAgICAgICAgICAgY3Vwb24uQ2FudGlkYWQgPSBjYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0X2N1cG9uZXMucHVzaChjdXBvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0X2N1cG9uZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Bc2lnbmFyIGEgcHJvbW9jaW9uZXMgY29tYmlhbmFzIGRlc2RlIGxvIHF1ZSBzZSBlbmNvbnRyw4PCsyBhbCBlbmNhYmV6YWRvIGl0ZW0sIGRlbCBwcm9kdWN0byBzZWxlY2Npb25hZG9cclxuICAgIHB1YmxpYyBBc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYSAhPSBudWxsICYmIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZm9yRWFjaChwcm9tb0FzbyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9Bc28uUHJvbW9jaW9uQ29tYmluYWRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGFncmVnYSBwcm9tb2Npb24gY29tYmluYWRhIGEgZW5jYWJlemFkbyBkZSBpdGVtcy5cclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzLnB1c2gocHJvbW9Bc28uUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICAvLy9BZ3JlZ2FyIHByb21vY2lvbmVzIGNvbWJpbmFkYXNcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IEpTT04uc3RyaW5naWZ5KG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShKU09OLnN0cmluZ2lmeShvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzKSwgXCJQUk9NT0NPTUJJXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Bc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzQU0zUHJvY2VzbyhvTTNQcm9jZXNvcywgcHJvbW9Bc28uUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNpZ25hciBwcm9tb2Npb25lcyBjb21iaWFuZGFzIGEgTTMgUHJvY2VzbywgZXN0ZSwgdmFsaWRhIHF1ZSBubyBleGlzdGEgdW4gcHJvbW9jaW9uIGFudGVyaW9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhc0FNM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSkge1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcykge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzID0gbmV3IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSkpIHtcclxuICAgICAgICAgICAgLy8vLy8vLyBleGlzdGVcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLy8vLy8gTm8gRXhpc3RlXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMucHVzaChvUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMpIHtcclxuICAgICAgICAgICAgdGhpcy5BZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGEgZGluYW1pY2FzIHByb2Nlc28gZGUgY29tYmluYWRhc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBvTTNQRGluYW1pY2FzRmluZGVkOiBNM1BEaW5hbWljYXM7XHJcbiAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZCA9IGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiQ09NQklOQURBXCIpO1xyXG4gICAgICAgIGlmIChvTTNQRGluYW1pY2FzRmluZGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPiA9IEpTT04ucGFyc2Uob00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvcik7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyUHJvbW8ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvUHJvbW9Db21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBhcnJQcm9tb1tpXS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9Qcm9tb0NvbWJpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5wdXNoKGFyclByb21vW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gXCJDT01CSU5BREFcIjtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG5cclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9DYWxjdWxvIGRlIHByb21vY2lvbmVzXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgdmFyIGxUaXBvcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJESVJFQ1RBXCIpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiQ09NQklOQURBXCIpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiTU9ORURFUk9cIik7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJNQU5VQUxcIik7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG9NM0VOQ1BST01PICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQik7XHJcblxyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW8gPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGxUaXBvcyk7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhclByb21vY2lvbihhcnJQcm9tbywgcHJvZEdSUFNlbGVjdGVkLCBvTTNFTkNQUk9NTywgdGhpcy5nc0lka2F0aW9zKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gaGF5IGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIG9ic2VxdWlvcyB5IGFncmVnYXJsb3MuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyT2JzZXF1aW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+O1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHByb21vID0+IHByb21vLkxpc3RPYnNTS1UgIT0gbnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyclByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwgJiYgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID09IC0xXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvbW8uTGlzdE9ic1NLVS5sZW5ndGgpIHByb21vLkxpc3RPYnNTS1UgPSBbcHJvbW8uTGlzdE9ic1NLVV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGFTaVRpZW5lT3RyYVByb21vKHByb21vLCBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXF1aW9PUHJvbW8gPSBwcm9tby5JRFByb21vY2lvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFybWFyTGlzdGFPYnNlcXVpb3NTS1UocHJvbW8sIG9NM1BFbmNJdGVtcywgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdHVybk9uUHJvbW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+O1xyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIocHJvbW8gPT4gcHJvbW8ubElkQWN0aXZhUHJvbW8gJiYgcHJvbW8ubElkQWN0aXZhUHJvbW8ubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyclByb21vY2lvbmVzQXNvY2lhZGFzICYmIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sSWRBY3RpdmFQcm9tbyA9IHRoaXMubElkQWN0aXZhUHJvbW8uY29uY2F0KHByb21vLmxJZEFjdGl2YVByb21vKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUR1cGxpY2F0ZXModGhpcy5sSWRBY3RpdmFQcm9tbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUR1cGxpY2F0ZXMoYXJyOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdmFyIHVuaXF1ZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh1bmlxdWUuaW5kZXhPZihhcnJbaV0pID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdW5pcXVlLnB1c2goYXJyW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcm1hckxpc3RhT2JzZXF1aW9zU0tVKHByb21vOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBjYW50aWRhZFJlYWwgPSBNYXRoLmZsb29yKGNhbnRpZGFkIC8gcHJvbW8uQ2FudGlkYWRPYnNlcSk7XHJcbiAgICAgICAgaWYgKHByb21vLlJlZ2xhT2JzZXEgPT0gXCJFWENcIikge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IGNhbnRpZGFkUmVhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpbyhwcm9tbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgcHJvbW8uTGlzdE9ic1NLVS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5DYW50aWRhZCA9IGNhbnRpZGFkUmVhbCAqICtlbGVtZW50LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBwcm9tby5MaXN0T2JzU0tVO1xyXG4gICAgfVxyXG5cclxuICAgIGFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW86IFByb21vY2lvbmVzQXNvY2lhZGFzLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKHByb21vLkxpc3RPYnNTS1UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcm9tby5MaXN0T2JzU0tVLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlkRW5jUGFkcmUgPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcm1hckxpc3RhT2JzZXF1aW9zQ29tYmlTS1UoY29tYmksIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoY29tYmkuQWNjaW9uLlJlZ2xhT2JzZXEgPT0gXCJFWENcIikge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8oY29tYmkuQWNjaW9uLk9CU0VRVUlPUywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8oY29tYmkuQWNjaW9uLk9CU0VRVUlPUywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgY29tYmkuQWNjaW9uLk9CU0VRVUlPUy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5DYW50aWRhZCA9IGNhbnRpZGFkICogK2VsZW1lbnQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9MaXN0YU9ic2VxdWlvcyA9IGNvbWJpLkFjY2lvbi5PQlNFUVVJT1M7XHJcbiAgICB9XHJcblxyXG4gICAgYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpb0NvbWJpbmFkbyhvYnNlcXVpb3MsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAob2JzZXF1aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb2JzZXF1aW9zLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlkRW5jUGFkcmUgPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1JldG9ybmEgdHJ1ZSBzaSBoYXkgb3RyYSBwcm9tbyBhcGxpY2FkYSBkb25kZSBuaSBsYSBwcm9tbyBkZSBvYnNlcXVpbyBvIGxhIGFwbGljYWRhIHNvbiBmaWphcyB5IHVuYSBkZSBsYXMgZG9zIGVzIEVYQ1xyXG4gICAgdmFsaWRhU2lUaWVuZU90cmFQcm9tbyhwcm9tb09ic2VxdWlvOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChwcm9tb09ic2VxdWlvLlJlZ2xhICE9IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgbGV0IG9Qcm9tb3NOb09ic2VxdWlvcyA9IGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+IHguSURQcm9tb2Npb24gIT0gcHJvbW9PYnNlcXVpby5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW8gb2Ygb1Byb21vc05vT2JzZXF1aW9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW8uUmVnbGEgIT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9tby5BcGxpY2FkYSAmJiAocHJvbW8uUmVnbGEgPT0gXCJFWENcIiB8fCBwcm9tb09ic2VxdWlvLlJlZ2xhID09IFwiRVhDXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL3Byb2Nlc2FtaWVudG8gZGUgb2JzZXF1aW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgUHJvY2VzYXJPYnNlcXVpb3Mob0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID0gLTE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvcyAhPSBudWxsICYmIHRoaXMub0xpc3RhT2JzZXF1aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vTGlzdGFPYnNlcXVpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uU0tVKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDgxMCB2YWxpZGEsIGN1YW50b3MgcHJvZHVjdG9zIHNlIGFncmVnYSBlbiBlbCBvYnNlcXVpby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLkNhbnRpZGFkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gdGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMTEyIHNlIGFncmVnIGZ1bmNpb25hbGlkYWQgZGUgb2JzZXF1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5CaXNPYnNlcXVpbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1BhZHJlID0gdGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uaWRFbmNQYWRyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlRpcG9BZ3J1cGFjaW9uID0gXCJPQlNRXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuR3VhcmRhclByb21vY2lvbih0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXSwgb0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0d1YXJkYXIgcHJvbW9jaW9uIHNlZ3VuIHVuIHNrdVxyXG4gICAgLy8xLiBCdXNjYXIgZWwgcHJvZHVjdG8gc2VndW4gZWwgc2t1XHJcbiAgICAvLzIuIEFncmVnYXIgZWwgcHJvZHVjdG8gYSBtM3Byb2Nlc29zXHJcbiAgICAvLzMuIEFncmVnYXIgYWwgY2Fycml0byBkZSBjb21wcmFzLlxyXG4gICAgcHVibGljIGFzeW5jIEd1YXJkYXJQcm9tb2Npb24ocHJvbW8sIG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy8gMjAxODExMjEgIHZhciBzS2V5Q2Fycml0bztcclxuICAgICAgICAvLyAyMDE4MTEyMSB2YXIgb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHByb2Nlc29Qcm9tbztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vIDIwMTgxMTIxIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcblxyXG4gICAgICAgIC8vIDIwMTgxMTIxIG9NM1Byb2Nlc29zID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcbiAgICAgICAgcHJvY2Vzb1Byb21vID0gYXdhaXQgdGhpcy5BZGljaW9uYXJQcm9tb2Npb25BUHJvY2Vzbyhwcm9tbywgb00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBFbkxpbmVhLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBwb3VjaCBEQlxyXG4gICAgICAgIC8vIDIwMTgxMTIxICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBwcm9jZXNvUHJvbW8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsb3MgcHJvZHVjdG8gc2VndW4gc3UgU0tVLCBzYWNhbmRvIGxhIGluZm9ybWFjaW9uIGRlc2RlIHBvdWNoREIuXHJcbiAgICBwdWJsaWMgYXN5bmMgQWRpY2lvbmFyUHJvbW9jaW9uQVByb2Nlc28ocHJvbW8sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgdGhpcy5HZXRQcm9kdWN0b0J5U0tVKHByb21vLlNLVSwgRW5MaW5lYSwgb00zUHJvY2Vzb3MsIG9EYXRhVXNlcik7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhvUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChvUHJvZHVjdG8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvL1lhIG5vIHNlIGRlamEgcHJlY2lvIGNlcm8gc2lubyBxdWUgY29tbyBlcyBvYnNlcXVpbyBzaW11bGEgdW4gZGVzY3VlbnRvIGRlbCAxMDAlIFxyXG4gICAgICAgICAgICAvL1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgICAgICAgICAvL0FncmVnYXIgYSBtM3Byb2Nlc29zIGVsIG9ic2VxdWlvLlxyXG4gICAgICAgICAgICAvL29NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIG9Qcm9kdWN0bywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG51bGwsIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLmFkZHRvY2FydChvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0bywgbnVsbCwgbnVsbCwgb0RhdGFVc2VyLCB0aGlzLmdzSWRrYXRpb3MsIG9NM1ViaWNhY2lvbiwgbnVsbCwgb00zUHJvY2Vzb3MsIG51bGwsIDEwMCk7Ly8qU2UgbWFuZGEgdmFsb3IgZGUgZGVzY3Vlbm50byAxMDAgJVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIHNlZ3VuIGVsIFNLVVxyXG4gICAgcHVibGljIGFzeW5jIEdldFByb2R1Y3RvQnlTS1Uoc1NLVSwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55LCBkaXNwb25pYmxlTTNFbmMgPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICB2YXIgcHJvZHVjdG9zO1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8odGhpcy5nc0lka2F0aW9zKTtcclxuXHJcbiAgICAgICAgLy9vU2VydmljZUxpc3RhUHJlY2lvLkdlbmVyYXRlRGF0YVZhbGlkYWNpb24ob0RhdGFVc2VyLCBvTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbyk7XHJcbiAgICAgICAgaWYgKCFFbkxpbmVhICYmICFvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIHtcclxuICAgICAgICAgICAgdmFyIHNJRFByb2R1Y3RvcyA9IHRoaXMuZ3NJZGthdGlvcyArIFwiP1BSRFwiO1xyXG4gICAgICAgICAgICBwcm9kdWN0b3MgPSBhd2FpdCB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoc0lEUHJvZHVjdG9zKTtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvID0gb1NlcnZpY2VNM01hZXN0cm8uR2V0TTNQcmRHcnBGcm9tTGlzdChwcm9kdWN0b3MuTTNMaXN0UHJvZHVjdG9zLk0zR1JQLCBzU0tVKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyh0aGlzLkdvUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lka2F0aW9zLCBzU0tVLCBvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPD0gMCAmJiBkaXNwb25pYmxlTTNFbmMpIHtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPSBkaXNwb25pYmxlTTNFbmM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIHRoaXMuR29Qb3N0U2VydmljZU0zKTtcclxuICAgICAgICAvL29TZXJ2aWNlTGlzdGFQcmVjaW8uVmFsaWRhckxpc3RhUHJlY2lvcyhvUHJvZHVjdG8sIHRoaXMuR29Qb3N0U2VydmljZU0zLCB0aGlzLmdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHJldHVybiBvUHJvZHVjdG87XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYWxjdWxhciBwcmVjaW8gc2luIGltcHVlc3Rvcy4gTGEgZm9ybWEgZXMgY2FsY3VsYXIgdG9kbyBlbCB2YWxvciBkZWwgaW1wdWVzdG8uIEVKOiAxMjAuMDkgLyAxLjE2LiBTaSBlbCB2YWxvciBkZWwgaW1wdWVzdG8gZXM6IDE2JVxyXG4gICAgcHVibGljIENhbGN1bGF0ZVByZWNpb0Jhc2UoQ1RCTERJTVBQUkQ6IHN0cmluZywgZFZhbG9yTmV0bzogbnVtYmVyKSB7XHJcbiAgICAgICAgLy92YXIgZFZhbG9ySW1wdWVzdG86IG51bWJlciA9IDE7XHJcbiAgICAgICAgdmFyIGRWYWxvckJhc2U6IG51bWJlciA9IGRWYWxvck5ldG87XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG94bWxUb0pzb25URiA9IG5ldyB4bWxUb0pzb25URigpO1xyXG4gICAgICAgICAgICB2YXIgakltcHVlc3RvcztcclxuICAgICAgICAgICAgaWYgKENUQkxESU1QUFJEICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGpJbXB1ZXN0b3MgPSBveG1sVG9Kc29uVEYuY29udmVydFhtbFRvSnNvbihDVEJMRElNUFBSRCk7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9KQUdNICAyMDE5MDYyNiBDYW1iaW8gZGUgY2FsY3VsbyBkZSBiYXNlIGRlIGxvcyBpbXB1ZXN0b3MuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcC4kLk1ldG9kb2xvZ2lhID09IFwiUE9SQ0VOVEFKRVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRWYWxvckJhc2UgPSAoK2RWYWxvckJhc2UpIC8gKDEgKyAraW1wLiQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZFZhbG9yQmFzZSA9ICgrZFZhbG9yQmFzZSkgLSAoK2ltcC4kLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9NM1BFbmNJdGVtcy5NM0ltcHVlc3Rvcyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2F0Y2hcIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vcmV0dXJuICgoK2RWYWxvck5ldG8pIC8gKCtkVmFsb3JJbXB1ZXN0bykpO1xyXG4gICAgICAgIHJldHVybiBkVmFsb3JCYXNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIGluZm9ybWFjacODwrNuIGRlIGltcHVlc3RvcywgZGVzZGUgZWwgcHJvZHVjdG8gZ2VuZXJhbFxyXG4gICAgcHVibGljIExvYWRNM1BJbXB1ZXN0b3NGcm9tUHJkR3JsKENUQkxESU1QUFJEOiBzdHJpbmcsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsXHJcbiAgICAgICAgZFZhbG9yTmV0bzogbnVtYmVyLCBjYW50aWRhZDogbnVtYmVyLCB2YWxvclRvdGFsUHJvZHVjdG9Vbml0OiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb3htbFRvSnNvblRGID0gbmV3IHhtbFRvSnNvblRGKCk7XHJcbiAgICAgICAgICAgIHZhciBvTTNQSW1wdWVzdG9zOiBNM1BJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgIGxldCB2YWxvckJhc2VUb3RhbCA9IHRoaXMub01hdGhURi5yb3VuZChkVmFsb3JOZXRvLCA0KTtcclxuICAgICAgICAgICAgbGV0IHZhbG9yTmV0b1RvdGFsID0gdmFsb3JCYXNlVG90YWw7XHJcbiAgICAgICAgICAgIGxldCB2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yVG90YWxQcm9kdWN0b1VuaXQsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgdmFyIGpJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgIHZhciBkVG90YWxJbXB1ZXN0bzogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgaWYgKENUQkxESU1QUFJEICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGpJbXB1ZXN0b3MgPSBveG1sVG9Kc29uVEYuY29udmVydFhtbFRvSnNvbihDVEJMRElNUFBSRCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkwNjI2IENhbWJpbyBlbiBvcmRlbiBkZSBsb3MgaW1wdWVzdG9zLlxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yUmVhbEltcCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGltcCA9IGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MgPSBuZXcgTTNQSW1wdWVzdG9zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5Db2RJbXB1ZXN0byA9IGltcC4kLkNvZEltcDtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLlBvcmNlbnRhamUgPSBpbXAuJC5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wLiQuTWV0b2RvbG9naWEgPT0gXCJQT1JDRU5UQUpFXCIpIHsvL1BPUkNFTlRBSkVcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JSZWFsSW1wID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkoaW1wLiQuVmFsb3IsIHZhbG9yTmV0b1RvdGFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5WYWxvciA9IHRoaXMub01hdGhURi5yb3VuZCh2YWxvclJlYWxJbXAsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob00zUEltcHVlc3Rvcy5WYWxvciA8IHZhbG9yUmVhbEltcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguY2VpbCgrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguZmxvb3IoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHsvL0ZJSk9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JSZWFsSW1wID0gK2ltcC4kLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLlZhbG9yID0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yUmVhbEltcCwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChvTTNQSW1wdWVzdG9zLlZhbG9yIDwgdmFsb3JSZWFsSW1wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5jZWlsKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5mbG9vcigrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTgwOTEyIE51ZXZvIGNvbmNlcHRvIGRlIGJhc2VcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkJhc2UgPSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JOZXRvVG90YWwsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRUb3RhbEltcHVlc3RvID0gdGhpcy5vTWF0aFRGLnJvdW5kKCgrZFRvdGFsSW1wdWVzdG8pLDIpICsgdGhpcy5vTWF0aFRGLnJvdW5kKCgrb00zUEltcHVlc3Rvcy5WYWxvciksMik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTgwOTEyIFN1bWEgZGUgVmFsb3IgTmV0b1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yTmV0b1RvdGFsID0gdGhpcy5vTWF0aFRGLnJvdW5kKCgrdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yTmV0b1RvdGFsLCAyKSkgKyB0aGlzLm9NYXRoVEYucm91bmQoKCtvTTNQSW1wdWVzdG9zLlZhbG9yKSwyKSwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8vU29sbyBhZGljaW9uZSBhIGltcHVlc3RvcywgY3VhbmRvIGVzIHRvdGFsIGltcHVlc3Rvc1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbXBFeGlzdGU6IE0zUEltcHVlc3RvcztcclxuICAgICAgICAgICAgICAgICAgICBpbXBFeGlzdGUgPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZpbmQoaW1wID0+IGltcC5Db2RJbXB1ZXN0byA9PSBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wRXhpc3RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQm9ycmEgZW4gaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5maWx0ZXIoaW1wID0+IGltcC5Db2RJbXB1ZXN0byAhPSBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5wdXNoKG9NM1BJbXB1ZXN0b3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8uZm9yRWFjaChpbXAgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MjYgc2UgYWdyZWdhIHZhbGlkYWNpb24sIHlhIHF1ZSBlc3RhYmEgcXVlZGFuZG8gbGEgcmVzdGEsIGNvbiB2YWxvcmVzIGNvbW86IDAuMDAwMDAwMDAwMDEgPSAxLjE1NjQ1NjQ1NjRlODQ1IEVKXHJcbiAgICAgICAgICAgIGlmIChkVG90YWxJbXB1ZXN0byAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0RpZmVyZW5jaWEgcmVkb25kZWFkYSBhIGRvcyBkZWNpbWFsZXNcclxuICAgICAgICAgICAgICAgIGRUb3RhbEltcHVlc3RvID0gdGhpcy5vTWF0aFRGLnJvdW5kKGRUb3RhbEltcHVlc3RvLCAyKTtcclxuICAgICAgICAgICAgICAgIGxldCBkaWZlcmVuY2lhID0gdGhpcy5vTWF0aFRGLnJvdW5kKCgrdmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgLSArdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yQmFzZVRvdGFsLDIpIC0gK2RUb3RhbEltcHVlc3RvKSwgMik7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oZGlmZXJlbmNpYSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gdGhpcy5vTWF0aFRGLnJvdW5kKCsoK3ZhbG9yVG90YWxQcm9kdWN0b1RvdGFsIC0gK3RoaXMub01hdGhURi5yb3VuZCh2YWxvckJhc2VUb3RhbCwgMikgLSArZFRvdGFsSW1wdWVzdG8pLnRvRml4ZWQoNCksMik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hanVzdGFkb3JEZUltcHVlc3RvcyhvTTNQRW5jSXRlbXMsIGRpZmVyZW5jaWEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFwiVE9UQUxJTVBVRVNUT1NcIlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub01hdGhURi5yb3VuZCgodmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgLSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JCYXNlVG90YWwsMikpLCAyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhdGNoXCIpXHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZTIDIwMTkwNzI1XHJcbiAgICAgKiBDb3JyaWdlIGVsIHZhbG9yIHF1ZSB0b21vIGVsIGltcHVlc3RvIGRlc3B1ZXMgZGUgaGFiZXJzZSByZWRvbmRlYWRvXHJcbiAgICAgKiBTaSBhbCByZWNvcnJlciB0b2RvcyBsb3MgaW1wdWVzdG9zIGxhIGRpZmVyZW5jaWEgbm8gc2UgemFuamEsIE5JIE1PRE9TIGVsIGVycm9yIGVzdMODwqEgZW4gb3RyYSBwYXJ0ZVxyXG4gICAgICogU2UgY3JlYSBlc3RhIGZ1bmNpw4PCs24gcGFyYSByZXNvbHZlciBsb3MgZXJyb3JlcyBkZSB0aW1icmFkbyBkZSBmYWN0dXJhIGVsZWN0csODwrNuaWNhXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgRGlmZXJlbmNpYSBxdWUgc2UgZGViZSBzYWxkYXIgcGFyYSBjb25zZWd1aXIgZWwgdmFsb3IgdG90YWwgZGUgaW1wdWVzdG9zIHJlcXVlcmlkb1xyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JEZUltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkaWZlcmVuY2lhOiBudW1iZXIpIHtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW1wdWVzdG8gPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zW19pXTtcclxuICAgICAgICAgICAgLy9TaSBsYSBkaWZlcmVuY2lhIGVzIHBvc2l0aXZhIHF1aWVyZSBkZWNpciBxdWUgbGEgc3VtYSBkZSBsb3MgaW1wdWVzdG9zIGVzIG1lbm9yIGEgbGEgcmVhbFxyXG4gICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vU2kgZWwgaW1wdWVzdG8gc2UgcmVkb25kZW8gaGFjaWEgYWJham8gcXVpZXJlIGRlY2lyIHF1ZSBzZSBwdWRvIHJlZG9uZGVhciBoYWNpYSBhcnJpYmFcclxuICAgICAgICAgICAgICAgIC8vRW50b25jZXMgbG8gXCJyZWRvbmRlYSBoYWNpYSBhcnJpYmFcIiB5IHJlc3RhIHVuYSBjZW50ZXNpbWEgYSBsYSBkaWZlcmVuY2lhXHJcbiAgICAgICAgICAgICAgICBpZiAoaW1wdWVzdG8uVmFsb3IgPCBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uVmFsb3IgPSBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLkJhc2UgPSB0aGlzLm9NYXRoVEYucm91bmQoaW1wdWVzdG8uVmFsb3IgLyBpbXB1ZXN0by5Qb3JjZW50YWplLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gZGlmZXJlbmNpYSAtIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL1NpIFZhbG9yPlZhbG9yUmVhbCBxdWllcmUgZGVjaXIgcXVlIHJlZG9uZGVvIGhhY2lhIGFycmliYSB5IG5vIGRlYmUgbW9kaWZpY2FyIGVzZSB2YWxvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vU2kgbGEgZGlmZXJlbmNpYSBlcyBuZWdhdGl2YSBxdWllcmUgZGVjaXIgcXVlIGxhIHN1bWEgZGUgbG9zIGltcHVlc3RvcyBlcyBtYXlvciBhIGxhIHJlYWxcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL1NpIGVsIGltcHVlc3RvIHNlIHJlZG9uZGVvIGhhY2lhIGFycmliYSBxdWllcmUgZGVjaXIgcXVlIHNlIHB1ZG8gcmVkb25kZWFyIGhhY2lhIGFiYWpvXHJcbiAgICAgICAgICAgICAgICAvL0VudG9uY2VzIGxvIFwicmVkb25kZWEgaGFjaWEgYWJham9cIiB5IHN1bWEgdW5hIGNlbnRlc2ltYSBhIGxhIGRpZmVyZW5jaWFcclxuICAgICAgICAgICAgICAgIGlmIChpbXB1ZXN0by5WYWxvciA+IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5WYWxvciA9IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG87XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uQmFzZSA9IHRoaXMub01hdGhURi5yb3VuZChpbXB1ZXN0by5WYWxvciAvIGltcHVlc3RvLlBvcmNlbnRhamUsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZmVyZW5jaWEgPSBkaWZlcmVuY2lhICsgMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vU2kgVmFsb3I8VmFsb3JSZWFsIHF1aWVyZSBkZWNpciBxdWUgcmVkb25kZW8gaGFjaWEgYWJham8geSBubyBkZWJlIG1vZGlmaWNhciBlc2UgdmFsb3JcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TaSB5YSBzZSBzYWxkbyBsYSBkaWZlcmVuY2lhIHJvbXBlIGVsIGNpY2xvIGRhbmRvIHBvciBjb25jbHVpZG8gZWwgYWp1c3RlXHJcbiAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID09IDApIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vTG9hZCBwb3IgdW5pZGFkIGRldGFsbGUgZGVsIG0zcHJvY2VzbyBpdGVtcy5cclxuICAgIHB1YmxpYyBMb2FkTTNQRGV0YWxsZShzVmFsb3I6IHN0cmluZywgc0NvbmNlcHRvOiBzdHJpbmcpOiBNM1BEZXRhbGxlSXRlbXMge1xyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuTm9tYnJlQ29uY2VwdG8gPSBzQ29uY2VwdG87XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IHNWYWxvcjtcclxuICAgICAgICByZXR1cm4gb00zUERldGFsbGVJdGVtcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9HZW5lcmFyIHByb21vY2lvbiBjb21iaW5hZGFcclxuICAgIHB1YmxpYyBhc3luYyBHZW5lcmFyUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgaWYgKCFvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzIHx8IChvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzICYmICFvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZSA9PSBcIlBVRU5URV9ESUFSSU9cIikpKSB7XHJcbiAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG51bGwpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG9wcm9tb2Npb25lc1NlcnZpY2UuUHJvY2VzYXJDb21iaW5hZGEob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQ29tcGFyZSBNM1Byb2Nlc29zLiAoRmlyc3Q6IEBQYXJhbTogaWxNM1Byb2Nlc29zU1FMIFZTIFNlY29uZDogR2V0IEZyb20gQ291Y2hEQi9Qb3VjaERCKVxyXG4gICAgcHVibGljIGFzeW5jIENvbXBhcmVNM1Byb2Nlc28oc0lES2F0aW9zOiBzdHJpbmcsIG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyOiBhbnksIGlsTTNQcm9jZXNvc1NRTDogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBvUmVzcDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL0dldCBkYXRhLCBmcm9tIFBvdWNoREIvQ291Y2hEQlxyXG4gICAgICAgICAgICB2YXIgUHJvcGVydHlDb21wYXJlID0gW1wiVmFsb3JOZXRvXCIsIFwiVmFsb3JcIl07XHJcbiAgICAgICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3NDT1VDSDogTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgLy9HZXQgZGF0YSwgZnJvbSBQb3VjaERCL0NvdWNoREJcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSCA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG5cclxuICAgICAgICAgICAgLy9TdGFydCBDb21wYXJlXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUHJvcGVydHlDb21wYXJlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaWxNM1Byb2Nlc29zU1FMW1Byb3BlcnR5Q29tcGFyZVtpXV0gIT0gb00zUHJvY2Vzb3NDT1VDSFtQcm9wZXJ0eUNvbXBhcmVbaV1dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJSZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0NvbXBhcmU6IElELCBJZFByb2R1Y3RvIHkgQ0FOVElEQURcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaWxNM1Byb2Nlc29zU1FMLk0zRU5DLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1Byb2Nlc29zQ09VQ0guTTNFTkNbal0uSUQgIT0gaWxNM1Byb2Nlc29zU1FMLk0zRU5DW2pdLklEIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0guTTNFTkNbal0uSWRQcm9kdWN0byAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uSWRQcm9kdWN0byB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNILk0zRU5DW2pdLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgIT0gaWxNM1Byb2Nlc29zU1FMLk0zRU5DW2pdLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvUmVzcCA9IHsgXCJiUmVzcFwiOiBiUmVzcCwgXCJNM1Byb2Nlc29zXCI6IG9NM1Byb2Nlc29zQ09VQ0ggfTtcclxuICAgICAgICAgICAgcmV0dXJuIG9SZXNwO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgQ29tcGFyZU0zUHJvY2Vzb1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgICAgICBvUmVzcCA9IHsgXCJiUmVzcFwiOiB0cnVlLCBcIk0zUHJvY2Vzb3NcIjogbnVsbCB9O1xyXG4gICAgICAgICAgICByZXR1cm4gb1Jlc3A7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BZGljaW9uYXIgY29tZXJjaWFsIGFsIHByb2Nlc28sIGxvIGFkaWNpb25hIGFsIGFycmVnbG8gZGUgZGluYW1pY29zIGFzb2NpYWRvIGFsIHByb2Nlc28uXHJcbiAgICBwdWJsaWMgQWRkQ29tZXJjaWFsVG9NM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFRkb2NDb21lcmNpYWw6IHN0cmluZywgTmRvY0NvbWVyY2lhbDogc3RyaW5nKSB7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIlRDT01FUkNJQUxcIiwgVGRvY0NvbWVyY2lhbCkpO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaCh0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJOQ09NRVJDSUFMXCIsIE5kb2NDb21lcmNpYWwpKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NyZWFjaW9uIHkgcmV0b3JubyBkZSB0dXBsYSBkZSBkaW5hbWljb3MsIGF0YWRvcyBhIHByb2Nlc28gbTMuXHJcbiAgICBwdWJsaWMgQ3JlYXRlVHVwbGFEaW5hbWljYShub21icmUsIHZhbG9yKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBub21icmU7XHJcbiAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IHZhbG9yO1xyXG5cclxuICAgICAgICByZXR1cm4gb00zUERpbmFtaWNhcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vQWN0dWFsaXphIGxhIGNhbnRpZGFkIGRlIFxyXG4gICAgcHVibGljIHNldENhbnRpZGFkQUxMWVVQRENvdWNoKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBpQ2FudGlkYWQpIHtcclxuXHJcbiAgICAgICAgaWYgKGlDYW50aWRhZCA9PSAwICYmIG9NM1Byb2Nlc29zLklERGlhcmlvID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8vQXVuIG5vIGVzdGEgcmVnaXN0cmFkbyBlbCBwcm9jZXNvIGNvbW8gdGFsLCBzZSBwdWVkZSBib3JyYXIgZGUgcmFpelxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBcIldFQlwiLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZCA9PSAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5EZWxldGVNM1Byb2Nlc28ob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5HZXRDYXJyaXRvQ29tcHJhc1BvdWNoREIob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBuZXcgTTNQcm9jZXNvcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gaUNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIFwiV0VCXCIsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy9TZSBjYW50aWRhZCBkZSB1biBwcm9kdWN0byBlc3BlY2lmaWNvXHJcbiAgICBwdWJsaWMgc2V0Q2FudGlkYWRZVVBEQ291Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sXHJcbiAgICAgICAgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCB0aXBvVWJpY2FjaW9uLCBJREVuYyxcclxuICAgICAgICBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgZm9yemFyQm9ycmFkOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgaWYgKChpQ2FudGlkYWQgPT0gMCAmJiBvTTNQcm9jZXNvcy5JRERpYXJpbyA9PT0gdW5kZWZpbmVkICYmIHRpcG9VYmljYWNpb24gPT0gXCJXRUJcIikgfHwgZm9yemFyQm9ycmFkKSB7XHJcbiAgICAgICAgICAgIC8vL0F1biBubyBlc3RhIHJlZ2lzdHJhZG8gZWwgcHJvY2VzbyBjb21vIHRhbCwgc2UgcHVlZGUgYm9ycmFyIGRlIHJhaXpcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIocHJvZCA9PiAhKHByb2QuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIHByb2QuSUQgPT0gSURFbmMpICYmICEocHJvZC5JZEVuY1BhZHJlID09IElERW5jKSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgbG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgICAgICBsb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG0zVWJpY2FjaW9uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBKQUdNIDIwMTkxMDIxLCBubyBoYWNlciBsw4PCs2dpY2EgZGUgcHJvbW9jaW9uZXMgeSB2YXJpb3MsIGN1w4PCoW5kbyBzZSBib3JyYSBlbCBpdGVtLlxyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vU2UgdG9tYSBlbiBjdWVudGEgZWwgcHJkIHkgc3VzIGhpam9zIGNvbiBlbCBJZEVuY1BhZHJlXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+IChlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKSB8fCBlbmMuSWRFbmNQYWRyZSA9PSBJREVuYykuZm9yRWFjaChwcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZC5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGlDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIGVuYy5JRCA9PSBJREVuYykuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7Ly9BbnRpZ3VhIGxvZ2ljYVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG0zVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FudGlkYWRWMihvTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCBJREVuYywgb0RhdGFVc2VyLCBzSURLYXRpb3MsIG0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTykudGhlbihyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbiwgcmVzcC5NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbWJpYXIgY2FudGlkYWQgZGUgbTNwcm9jZXNvXHJcbiAgICAvL0pBR00gMjAxOTEwMTggU2UgYWdyZWdhIG51ZXZhIGZ1bmNpb25hbGlkYWQgYSBsYSBjYW50aWRhZDogXHJcbiAgICAvLzEuU2UgYm9ycmEgZWwgcHJvZHVjdG8gZGUgbGEgbGlzdGEgZGVsIHByb2Nlc29cclxuICAgIC8vMi4gU2UgYWdyZWdhIGRlIG51ZXZvIGVsIHByb2R1Y3RvIGNvbiBsYSBudWV2YSBjYW50aWRhZC5cclxuICAgIHB1YmxpYyBhc3luYyBzZXRDYW50aWRhZFYyKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIElERW5jLCBvRGF0YVVzZXI6IGFueVxyXG4gICAgICAgICwgc0lES2F0aW9zOiBzdHJpbmcsIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcbiAgICAgICAgdmFyIG9Qcm9kdWN0bzogVHlwZU0zUHJkR3JwID0gbnVsbDtcclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IGlDYW50aWRhZDtcclxuICAgICAgICAvL0pBR00gMjAxOTExMTQsIEFncmVnYXIgaW1hZ2VuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiBlbmMuSUQgPT0gSURFbmMpO1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4gPSBvTTNQRW5jSXRlbXMuUGF0aEltYWdlO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAhKGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiAoZW5jLklEID09IElERW5jIHx8IGVuYy5JZEVuY1BhZHJlID09IElERW5jKSkpO1xyXG5cclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCB0aGlzLkdldFByb2R1Y3RvQnlTS1UoaWRQcm9kdWN0bywgdHJ1ZSwgb00zUHJvY2Vzb3MsIG9EYXRhVXNlciwgb00zUEVuY0l0ZW1zLkRJU1BPTklCTEUpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IHRoaXMuTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvKTtcclxuICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuYWRkdG9jYXJ0KG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvLCBudWxsLCBudWxsLCBvRGF0YVVzZXIsIHNJREthdGlvcywgbTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIHsgXCJNM1Byb2Nlc29cIjogb00zUHJvY2Vzb3MsIFwiTTNQSXRlbXNXRUJcIjogb00zUEl0ZW1zV0VCIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X00zRU5DX2J5X2lkcHJkX2xvdGUob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUpOiBNM1BFbmNJdGVtcyB7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSlcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgY2FudGlkYWQgZGUgdW4gZW5jYWJlemFkbywgcHJvZHVjdG8gZXNwZWNpZmljby5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb2R1Y3RvOiBNM1ByZEdlbmVyYWwpIHtcclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gb1Byb2R1Y3RvLlNLVSAmJiBlbmMuTG90ZSA9PSBvUHJvZHVjdG8uTE9URSkuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENhbnRpZGFkVG90YWwob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vUkVHSU9OIERFIFJFQ0VQQ0lPTlxyXG4gICAgLy9TZSBhZ3JlZ2EgYXRyaWJ1dG8gZGUgQ3VycmVudCBjYW50aWRhZCBkZSByZWNlcGNpb25cclxuICAgIHB1YmxpYyBNZXJnZVJlY2VwWUVuYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRSZWNlcGNpb246IG51bWJlcikge1xyXG4gICAgICAgIC8vb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNQUmVjZXBjaW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNQUmVjZXBjaW9uLmZpbHRlcihyZWNlcCA9PiByZWNlcC5JZFJlY2VwY2lvbiA9PSBpZFJlY2VwY2lvbikuZm9yRWFjaChyZWMgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklEID09IHJlYy5JZEVuYykuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHJlYy5DYW50aWRhZC50b1N0cmluZygpLCBcIkNVUkNSRUNcIikpOy8vQ1VSUkVOVCBDQU5USURBRCBSRUNFUENJT05cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRGVqYXIgbG9zIGRlIHRhbGxlcyBkZSBsYSB2YXJpYWJsZTogQ1VSQ1JFQyBlbj0wLCBFc3RvIHBhcmEgZmx1am9zLCBkb25kZSBhZ3JlZ2EgaW5mbyBwcm9jZXNhIHkgYWjDg8KtIG1pc21vIGFncmVnYSBtw4PCoXMuXHJcbiAgICBwdWJsaWMgUmVtb3ZlQ3VyQ1JlYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zICE9IG51bGwgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPSBudWxsKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0RldGFsbGU6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgIG9EZXRhbGxlID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNVUkNSRUNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAob0RldGFsbGUgIT09IHVuZGVmaW5lZCAmJiBvRGV0YWxsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0RldGFsbGUuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vRklOIFJFR0lPTiBERSBSRUNFUENJT05cclxuXHJcbiAgICAvLy8vLy8vUkVHSU9OIEVOVFJFR0FcclxuICAgIC8vU2UgYWdyZWdhIGF0cmlidXRvIGRlIEN1cnJlbnQgY2FudGlkYWQgZGUgZW52aW9cclxuICAgIHB1YmxpYyBNZXJnZUVudHBZRW5jKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERQUkQsIFwiQ1RCTERQUkRcIikpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM1BFbnZpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM1BFbnZpb3MuZm9yRWFjaChlbnYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGxFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgICAgIGxFbmMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+IGVuYy5JZEVudmlvID09IGVudi5JZEVudmlvKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobEVuYyAhPT0gdW5kZWZpbmVkICYmIGxFbmMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxFbmMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciwgXCJDVVJDRU5UXCIpKTsvL0NVUlJFTlQgQ0FOVElEQUQgUkVDRVBDSU9OXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRGVqYXIgbG9zIGRlIHRhbGxlcyBkZSBsYSB2YXJpYWJsZTogQ1VSQ1JFQyBlbj0wLCBFc3RvIHBhcmEgZmx1am9zLCBkb25kZSBhZ3JlZ2EgaW5mbyBwcm9jZXNhIHkgYWjDg8KtIG1pc21vIGFncmVnYSBtw4PCoXMuXHJcbiAgICBwdWJsaWMgUmVtb3ZlQ3VyQ0VudChvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zICE9IG51bGwgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPSBudWxsKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0RldGFsbGU6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgIG9EZXRhbGxlID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNVUkNFTlRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAob0RldGFsbGUgIT09IHVuZGVmaW5lZCAmJiBvRGV0YWxsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0RldGFsbGUuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICB9XHJcbiAgICAvLy8vLy8vRklOIFJFR0lPTiBFTlRSRUdBXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvbW9jaW9uZXMgcXVlIHNlIHByb2Nlc2FuIGRlc3B1ZXMgZGUgYWdyZWdhciBhbCBjYXJyaXRvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gb0RhdGFVc2VyIFxyXG4gICAgICogQHBhcmFtIG9NM1BJdGVtc1dFQiBcclxuICAgICAqIEBwYXJhbSBvTTNVYmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gRW5MaW5lYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIFByb2NQcm9tb0FmdGVyQWRkVG9DYXJ0KG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuUHJvY2VzYXJPYnNlcXVpb3Mob0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYXIgcHJvbW9jaW9uZXMgZGVzcHVlcyBkZSBmaW5hbGl6YXIgZWwgcmVnaXN0cm9cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2NQcm9tb0FmdGVyRmluYWxpemFyKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55KSB7XHJcblxyXG4gICAgICAgIHRoaXMuR2VuZXJhclByb21vQ29tYmluYWRhKG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIHRoaXMuUHJvbW9BZnRlclByb2Nlc28ob00zUHJvY2Vzb3MsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFByb21vQWZ0ZXJQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgbnVsbCk7XHJcbiAgICAgICAgICAgIHZhciBsVGlwb3NQcm9tbyA9IG5ldyBBcnJheTxTdHJpbmc+KCk7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIGxUaXBvc1Byb21vLnB1c2goXCJBRlRFUlwiKTtcclxuICAgICAgICAgICAgYXJyUHJvbW8gPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBudWxsLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBsVGlwb3NQcm9tbyk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlByb2Nlc2FyUHJvbW9BZnRlcihhcnJQcm9tbywgb00zUHJvY2Vzb3MsIG9NM0VOQ1BST01PKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZEluZm9Qcm9tb2Npb25lc0FEaW5hbWljYXMob00zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMgYSBpbmZvcm1hY2lvbiBkaW5hbWljYSBkZWwgcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRJbmZvUHJvbW9jaW9uZXNBRGluYW1pY2FzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgMCk7XHJcbiAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIlZBTF9QUk9NT0NcIiwgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbi50b1N0cmluZygpKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcblxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzID0gdGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiTk9NQl9QUk9NT0NcIiwgZGF0YS5OT01CUkVTKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcblxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzID0gdGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiSURfUFJPTU9DXCIsIGRhdGEuSUQpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIHByb2Nlc28gYXNvc2lhZG8gYSB1biBpZHByZXN0YW1vc1xyXG4gICAgYXN5bmMgZ2V0X20zX3Byb2Nlc29fYnlfaWRfcHJlc3RhbW9fYXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGlkX3ByZXN0YW1vOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zL2dldE0zUHJvY2Vzb0J5SWRQcmVzdGFtby8nICsgaWRfa2F0aW9zICsgJy8nICsgaWRfcHJlc3RhbW8pLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBHZXRDb25jZXB0b00zU2FsZG9zSXRlbVViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBqRGF0YTogYW55KSB7XHJcbiAgICAgICAgdmFyIHJlc3A7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL0dldENvbmNlcHRvTTNTYWxkb3NJdGVtVWIvJyArIHNJREthdGlvcywgakRhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2EgbyBtb2RpZmljYSBsYSBjYW50aWRhZCBkZSB1biBvYmpldG8gTTNPdENsYXNpZmljYWNpb25lcyBkZW50cm8gZGVsYSBsaXN0YSBkZSB1biBQcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCBcclxuICAgICAqIEBwYXJhbSBjYW50aWRhZCBcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkUHJvZHVjdG9Ub090cmFzQ2xhcyhwcm9kdWN0OiBUeXBlTTNQcmRHcnAsIGNhbnRpZGFkOiBudW1iZXIsIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgZnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyA9IGlvTTNQcm9jZXNvcztcclxuICAgICAgICB2YXIgb00zT3RDbGFzaWZpY2FjaW9uZXM6IE0zT3RDbGFzaWZpY2FjaW9uZXM7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZHVjdC5Mb00zUHJkR2VuZXJhbFswXTtcclxuXHJcbiAgICAgICAgbGV0IHByb2R1Y3RvRXhpc3RlID0gdGhpcy52YWxpZGFyRXhpc3RhT3RyYUNsYXNpZihvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBwcm9kdWN0KTtcclxuICAgICAgICBpZiAocHJvZHVjdG9FeGlzdGUpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuQ2FudGlkYWQgPSBwcm9kdWN0b0V4aXN0ZS5DYW50aWRhZCArIGNhbnRpZGFkO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0V4aXN0ZS5WYWxvciA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KHByb2R1Y3RVbml0U2VsZWN0ZWQuTG9NM1ByZExpc3RhLlBSRUNJTywgcHJvZHVjdG9FeGlzdGUuQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0V4aXN0ZS5PcmRlbiA9IHRoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMgPSBuZXcgTTNPdENsYXNpZmljYWNpb25lcygpO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5DYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5JZFByb2R1Y3RvID0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1U7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLk5vbWJyZSA9IHByb2R1Y3RVbml0U2VsZWN0ZWQuTk9NQlJFMTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuVmFsb3IgPSArYmlnRGVjaW1hbC5tdWx0aXBseShwcm9kdWN0VW5pdFNlbGVjdGVkLkxvTTNQcmRMaXN0YS5QUkVDSU8sIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuSUQgPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiSURcIikgKyAxO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5PcmRlbiA9IHRoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgXCJPcmRlblwiKSArIDE7XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLnB1c2gob00zT3RDbGFzaWZpY2FjaW9uZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpb00zUHJvY2Vzb3MgPSB0aGlzLnJlY2FsY3VsYXJWYWxPdHJhQ2xhc2lNM1Byb2Nlc29zKGlvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVsaW1pbmEgdW4gb2JqZXRvIE0zT3RDbGFzaWZpY2FjaW9uZXMgcG9uaWVuZG8gc3UgdmFsb3IgeSBjYW50aWRhZCBlbiBjZXJvXHJcbiAgICAgKiBAcGFyYW0gb00zT3RDbGFzaWZpY2FjaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBkZWxldGVQcm9kdWN0b0Zyb21PdHJhc0NsYXMob00zT3RDbGFzaWZpY2FjaW9uZXM6IE0zT3RDbGFzaWZpY2FjaW9uZXMsIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b0FjdHVhbCA9IGlvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gb00zT3RDbGFzaWZpY2FjaW9uZXMuSWRQcm9kdWN0byk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RvQWN0dWFsKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvQWN0dWFsLkNhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuVmFsb3IgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpb00zUHJvY2Vzb3MgPSB0aGlzLnJlY2FsY3VsYXJWYWxPdHJhQ2xhc2lNM1Byb2Nlc29zKGlvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIGlvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsY3VsYSBlbCB2YWxvciBkZSBNM1Byb2Nlc29zLlZhbE90cmFDbGFzaSBhIHBhcnRpciBkZSBsYSBzdW1hdG9yaWEgZGUgbG9zIG9iamV0b3MgZGVudHJvIGRlbCBhcnJlZ2xvIE0zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lc1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICByZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlZhbE90cmFDbGFzaSA9IG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMucmVkdWNlKGZ1bmN0aW9uIChzdW1hLCBvTTNPdENsYXNpZmljYWNpb25lcykge1xyXG4gICAgICAgICAgICByZXR1cm4gc3VtYSArIG9NM090Q2xhc2lmaWNhY2lvbmVzLlZhbG9yO1xyXG4gICAgICAgIH0sIDApXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIGxhIGV4aXN0ZW5jaWEgZGUgdW4gcHJvZHVjdG8gZGVudHJvIGRlIHVuIGxhIGxpc3RhIGRlIE0zT3RDbGFzaWZpY2FjaW9uZXNcclxuICAgICAqIEBwYXJhbSBsaXN0TTNPdENsYXNpZmljYWNpb25lcyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0IFxyXG4gICAgICovXHJcbiAgICB2YWxpZGFyRXhpc3RhT3RyYUNsYXNpZihsaXN0TTNPdENsYXNpZmljYWNpb25lczogQXJyYXk8TTNPdENsYXNpZmljYWNpb25lcz4sIHByb2R1Y3Q6IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b0V4aXN0ZSA9IGxpc3RNM090Q2xhc2lmaWNhY2lvbmVzLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gcHJvZHVjdC5Mb00zUHJkR2VuZXJhbFswXS5TS1UpO1xyXG4gICAgICAgIHJldHVybiBwcm9kdWN0b0V4aXN0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBMaW1waWEgbG9zIGRldGFsbGVzIHkgbG9zIGltcHVlc3RvcyBkZSB1biBwcm9kdWN0byBkYWRvIGVuIHVuIHByb2Nlc28gZGUgZGV2b2x1Y2lvblxyXG4gICAqIEBwYXJhbSBwcm9kdWN0b0JvcnJhZG8gXHJcbiAgICogQHBhcmFtIHByb2Nlc29EZXZvbHVjaW9uIFxyXG4gICAqL1xyXG4gICAgZGVsZXRlUHJkRGV2b2x1Y2lvbihwcm9kdWN0b0JvcnJhZG8sIHByb2Nlc29EZXZvbHVjaW9uOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvID0gcHJvY2Vzb0Rldm9sdWNpb24uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBwcm9kdWN0b0JvcnJhZG8uSWRQcm9kdWN0byk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RvKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvLk0zREVULmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4oK2RldC5WYWxvcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXQuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBwcm9kdWN0by5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgaW1wLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgIGltcC5CYXNlID0gMDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWp1c3RhIGxvcyBWYWxvcmVzIGVuIGNhc28gZGUgZW5jb250cmFyIGRpZmVyZW5jaWFzIHBhcmEgcG9kZXIgZ2VuZXJhciBGRVxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JWYWxvcmVzQ0ZESUZyb250KG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSAwO1xyXG4gICAgICAgIGxldCB0b3RhbERlc2N1ZW50b3MgPSB0aGlzLmdldFZhbG9yVG90YWxEZXNjdWVudG9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICBsZXQgdG90YWxJbXBvcnRlSW1wdWVzdG9zID0gdGhpcy5nZXRWYWxvclRvdGFsSW1wb3J0ZUltcHVlc3RvcyhvTTNQcm9jZXNvcyk7XHJcblxyXG4gICAgICAgIGRpZmVyZW5jaWEgPSB0aGlzLm9NYXRoVEYucm91bmQob00zUHJvY2Vzb3MuVmFsb3JOZXRvIC0gKG9NM1Byb2Nlc29zLlZhbG9yICsgdG90YWxJbXBvcnRlSW1wdWVzdG9zIC0gdG90YWxEZXNjdWVudG9zKSwgMyk7XHJcbiAgICAgICAgaWYgKGRpZmVyZW5jaWEgIT0gMCkge1xyXG4gICAgICAgICAgICBpZiAodG90YWxJbXBvcnRlSW1wdWVzdG9zID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hanVzdGFkb3JJbXB1ZXN0b3NDRkRJKGRpZmVyZW5jaWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9yRGVzY3VlbnRvc0NGREkoZGlmZXJlbmNpYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHZhbG9yIHRvdGFsIGRlIHByb21vY2lvbmVzIGFwbGljYWRhcyBlbiBlbCBwcm9jZXNvIGVuIGN1ZXN0acODwrNuXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGdldFZhbG9yVG90YWxEZXNjdWVudG9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdG90YWxEZXNjdWVudG9zID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkZXRhbGxlUHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZVByb21vKSB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbERlc2N1ZW50b3MgKz0gK2RldGFsbGVQcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdG90YWxEZXNjdWVudG9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB2YWxvciB0b3RhbCBkZSBpbXB1ZXN0b3MgY29icmFkb3MgZW4gZWwgcHJvY2VzbyBlbiBjdWVzdGnDg8KzblxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBnZXRWYWxvclRvdGFsSW1wb3J0ZUltcHVlc3RvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICBlbmMuTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIHRvdGFsSW1wb3J0ZUltcHVlc3RvcyArPSAraW1wLlZhbG9yO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsSW1wb3J0ZUltcHVlc3RvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11ZXZlIGVsIHZhbG9yIGRlIHVuIGltcHVlc3RvIGVuIDAuMDEgeSBzdSBjb3JyZXNwb25kaWVudGUgYmFzZSBwYXJhIHF1ZSBjdWFkcmUgbG9zIHZhbG9yZXMgYWwgdGltYnJhciBsYSBGRVxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckltcHVlc3Rvc0NGREkoZGlmZXJlbmNpYTogbnVtYmVyLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBhanVzdG8gPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBlbmMgb2Ygb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW1wIG9mIGVuYy5NM1BJbXB1ZXN0b3MpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IGltcC5WYWxvciArIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSBpbXAuVmFsb3IgLSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaW1wLkJhc2UgPSBpbXAuVmFsb3IgLyBpbXAuUG9yY2VudGFqZTtcclxuICAgICAgICAgICAgICAgIGFqdXN0byA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYWp1c3RvKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11ZXZlIGVsIHZhbG9yIGRlIHVuIGRlc2N1ZW50byBlbiAwLjAxIHBhcmEgcXVlIGN1YWRyZSBsb3MgdmFsb3JlcyBhbCB0aW1icmFyIGxhIEZFXHJcbiAgICAgKiBAcGFyYW0gZGlmZXJlbmNpYSBcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yRGVzY3VlbnRvc0NGREkoZGlmZXJlbmNpYTogbnVtYmVyLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBkZXRhbGxlVG90YWxQcm9tbzogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgIGZvciAobGV0IGVuYyBvZiBvTTNQcm9jZXNvcy5NM0VOQykge1xyXG4gICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tbyA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgICAgIGlmIChkZXRhbGxlVG90YWxQcm9tbyAmJiArZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tby5WYWxvciA9ICgrZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgLSAwLjAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPSAoK2RldGFsbGVUb3RhbFByb21vLlZhbG9yICsgMC4wMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQcmRzR2VuZXJhbEZyb21NM1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lkS2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0UHJkc0dlbmVyYWxGcm9tTTNQcm9jZXNvLycgKyBzSWRLYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLmVycm9yLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNUcngge1xyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZWwgZGlhcmlvIGRlIHRyYW5zYWNjaW9uZXMgZGVzZGUgc2VydmljaW8gcmVzdCBNM1RyeC4gTWljcm9zZXJ2aWNpbyBNMy5cclxuICAgIHB1YmxpYyBNM19HZXREaWFyaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhU2VuZDogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zVHJ4L00zX0dldERpYXJpby8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9EYXRhRGlhcmlvO1xyXG4gICAgICAgICAgICBvRGF0YURpYXJpbyA9IHJlc3A7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YURpYXJpby5SRVNQVUVTVEEuZGF0YS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFEaWFyaW8uUkVTUFVFU1RBLmRhdGEgPSBuZXcgQXJyYXkob0RhdGFEaWFyaW8uUkVTUFVFU1RBLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgZGlhcmlvIGRlIHRyYW5zYWNjaW9uZXMgZGV0YWxsYWRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dldERpYXJpb1RyeChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zVHJ4L20zX2dldERpYXJpb1RyeC8nICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvRGF0YURpYXJpbztcclxuICAgICAgICAgICAgb0RhdGFEaWFyaW8gPSByZXNwO1xyXG4gICAgICAgICAgICBpZiAob0RhdGFEaWFyaW8uUkVTUFVFU1RBLkRpYXJpby5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFEaWFyaW8uUkVTUFVFU1RBLkRpYXJpbyA9IG5ldyBBcnJheShvRGF0YURpYXJpby5SRVNQVUVTVEEuRGlhcmlvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIHRyYW5zYWNjaW9uLlxyXG4gICAgcHVibGljIE0zX0dldEluZm9UUlgoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhU2VuZDogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy9sZXQgZGF0YSA9IHsgJ1RvcCc6IHRvcCB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNUcngvTTNfR2V0SW5mb1RSWC8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9EYXRhVFJYO1xyXG4gICAgICAgICAgICBvRGF0YVRSWCA9IHJlc3A7XHJcblxyXG4gICAgICAgICAgICBpZiAob0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvRGF0YVRSWC5SRVNQVUVTVEEuVElQT1MgPSBuZXcgQXJyYXkob0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TLmZvckVhY2godGlwbyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGlwby5UUlgubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aXBvLlRSWCA9IG5ldyBBcnJheSh0aXBvLlRSWCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob0RhdGFUUlgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG5cclxuXHJcbiAgICAvL0NhbWJpbyBkZSBlc3RhZG8gZGUgdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgQ2FtYmlvRXN0YWRvVWJpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvTTNVYmljYWNpb246IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM1RyeC9DYW1iaW9Fc3RhZG9VYmljYWNpb24vJyArIHNJREthdGlvcywgb00zVWJpY2FjaW9uKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcbiAgICAvL0NhbWJpbyBkZSBlc3RhZG8gZGUgSFVCXHJcbiAgICBwdWJsaWMgQ2FtYmlvRXN0YWRvSHViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvTTNVYmljYWNpb246IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM1RyeC9DYW1iaW9Fc3RhZG9IdWIvJyArIHNJREthdGlvcywgb00zVWJpY2FjaW9uKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuICAgIC8vQ2FtYmlvIGRlIGVzdGFkbyBkZSBIVUJcclxuICAgIHB1YmxpYyBDYW1iaW9ORG9jQWN0aXZvSHViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvTTNVYmljYWNpb246IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM1RyeC9DYW1iaW9ORG9jQWN0aXZvSHViLycgKyBzSURLYXRpb3MsIG9NM1ViaWNhY2lvbikuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcbn0iLCJpbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcmVjTGlzdFByZWNpb3MgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wcmVjLWxpc3QtcHJlY2lvcy50eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZUxpc3RhUHJlY2lvIHtcclxuXHJcbiAgICBwcml2YXRlIGdvRGF0YTogYW55O1xyXG4gICAgcHJpdmF0ZSBnc0lkS2F0aW9zOiBhbnk7XHJcbiAgICBwcml2YXRlIGxQcmVjaW9zU2VsZWN0ZWQ6IHN0cmluZyA9IFwiLTFcIjtcclxuXHJcbiAgICAvL0dlbmVyYXIgSlNPTiBnZW7Dg8KpcmljbywgcGFyYSB2YWxpZGFyIGxhIGxpc3RhIGRlIHByZWNpb1xyXG4gICAgY29uc3RydWN0b3IobG9nZWRfdXNlcjogYW55LCBzSWRQcm9jZXNvOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBvRGF0YSA9IHsgXCJVU0VSXCI6IGxvZ2VkX3VzZXIsIFwiUHJvY2Vzb1wiOiBzSWRQcm9jZXNvIH1cclxuICAgICAgICB0aGlzLmdvRGF0YSA9IG9EYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0TGlzdGFQcmVjaW9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmdzSWRLYXRpb3MgPSBJZEthdGlvcztcclxuICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICAgICAgdmFyIG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcztcclxuICAgICAgICAgICAgb0xpc3RQcmVjTFAgPSB0aGlzLkdldExQcmVjaW9zSW5TdG9yYWdlKElkS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYoIW9MaXN0UHJlY0xQKXtcclxuICAgICAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHRVRfTElTVEFQUkVDSU9TX0FTeW5jKFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2F2ZUxQcmVjaW9zSW5TdG9yYWdlKG9MaXN0UHJlY0xQLElkS2F0aW9zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLlZhbGlkYXJBUExSZWdsYShvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgICAgIC8vdGhpcy5GaW5kTFByZWNpbyhvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxQcmVjaW9zU2VsZWN0ZWQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgbGEgbGlzdGEgZGUgcHJlY2lvcyB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlTFByZWNpb3NJblN0b3JhZ2UobFByZWNpbzphbnksIGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJSZWdQcmVjaW9cIiArIGdzSWRrYXRpb3MsIEpTT04uc3RyaW5naWZ5KGxQcmVjaW8pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgbGEgbGlzdGEgZGUgcHJlY2lvcyB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlQ29uZmlnTFByZWNpb3NJblN0b3JhZ2UobFByZWNpbzphbnksIGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhsUHJlY2lvKTtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwiQ29uZmlnTFBcIiArIGdzSWRrYXRpb3MsIGxQcmVjaW8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKipcclxuICAgICAqIE9idGVuZXIgbGlzdGEgZGUgcHJlY2lvcyBkZXNkZSBzdG9yYWdlIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsbGF2ZTogUmVnUHJlY2lvICsgaWRrYXRpb3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExQcmVjaW9zSW5TdG9yYWdlKGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgdmFyIHNQcmVjaW9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJSZWdQcmVjaW9cIiArIGdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHZhciBvUHJlY2lvczphbnk7XHJcbiAgICAgICAgaWYoc1ByZWNpb3Mpe1xyXG4gICAgICAgICAgICBvUHJlY2lvcyA9IEpTT04ucGFyc2Uoc1ByZWNpb3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1ByZWNpb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRDb25maWdMUHJlY2lvc0luU3RvcmFnZShnc0lka2F0aW9zOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBzUHJlY2lvcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdMUFwiICsgZ3NJZGthdGlvcyk7XHJcbiAgICAgICAgdmFyIG9QcmVjaW9zOmFueTtcclxuICAgICAgICBpZihzUHJlY2lvcyl7XHJcbiAgICAgICAgICAgIG9QcmVjaW9zID0gSlNPTi5wYXJzZShzUHJlY2lvcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJlY2lvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9CdXN1Y2FyIGxhIGxpc3RhIGRlIHByZWNpbywgaW5ncmVzYSBlbCBvYmpldG8gZGUgcHJlY2VuZGVuY2lhIGRlIHJlZ2xhcyBkZSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgRmluZExQcmVjaW8ob0xpc3RQcmVjTFA6IE0zUHJlY0xpc3RQcmVjaW9zKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG9MaXN0UHJlY0xQICE9PSB1bmRlZmluZWQgJiYgb0xpc3RQcmVjTFAgIT0gbnVsbCAmJiBvTGlzdFByZWNMUC5JRCAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQLklEICE9IG51bGwpIHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChvTGlzdFByZWNMUC5QUkVDRURFTkNJQSAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQLlBSRUNFREVOQ0lBICE9IG51bGwgJiYgb0xpc3RQcmVjTFAuUFJFQ0VERU5DSUEubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJlYyBvZiBvTGlzdFByZWNMUC5QUkVDRURFTkNJQSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckFQTFJlZ2xhKHByZWMpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5GaW5kTFByZWNpbyhwcmVjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WYWxpZGFyIHJlZ2xhcywgaW5ncmVzYSBlbCBvYmpldG8gZGUgcHJlY2VuZGVuY2lhIGRlIHJlZ2xhcyBkZSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgVmFsaWRhckFQTFJlZ2xhKG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcyk6IGJvb2xlYW57XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKG9MaXN0UHJlY0xQICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTGlzdFByZWNMUC5Qcm9waWVkYWQpO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChvTGlzdFByZWNMUC5Qcm9waWVkYWQudG9VcHBlckNhc2UoKS50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRU1QUkVTQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdzSWRLYXRpb3MudG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVCSUNBQ0lPTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlBST0NFU09cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nb0RhdGEuUHJvY2Vzby50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkhVQlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hLklESFVCLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hW29MaXN0UHJlY0xQLlByb3BpZWRhZC50b1VwcGVyQ2FzZSgpLnRyaW0oKV0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9Y2F0Y2ggKGV4KXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogXCIgKyBleClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihiUmVzcCl7XHJcbiAgICAgICAgICAgIHRoaXMubFByZWNpb3NTZWxlY3RlZCA9IG9MaXN0UHJlY0xQLkxpc3RhUHJlY2lvcztcclxuICAgICAgICAgICAgdGhpcy5GaW5kTFByZWNpbyhvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIENvbXBhcmUodmFsdWUxLCB2YWx1ZTIpIHtcclxuICAgICAgICBpZiAodmFsdWUxID09IHZhbHVlMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBjb25maWd1cmFjaW9uL2VuY2FiZXphZG8gbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgcHVibGljIGFzeW5jIEdldENvbmZpZ0xpc3RhUHJlY2lvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gSWRLYXRpb3M7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgICAgIHZhciBvTGlzdFByZWNMUDogTTNQcmVjTGlzdFByZWNpb3M7XHJcbiAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gdGhpcy5HZXRDb25maWdMUHJlY2lvc0luU3RvcmFnZShJZEthdGlvcyk7XHJcbiAgICAgICAgICAgIGlmKCFvTGlzdFByZWNMUCl7XHJcbiAgICAgICAgICAgICAgICBvTGlzdFByZWNMUCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLkdldEVuY2FiZXphZG9MaXN0YXNQcmVjaW8oUG9zdFNlcnZpY2VNMywgSWRLYXRpb3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TYXZlQ29uZmlnTFByZWNpb3NJblN0b3JhZ2Uob0xpc3RQcmVjTFAsSWRLYXRpb3MpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiBvTGlzdFByZWNMUDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM0RpblByb2Nlc29ze1xyXG4gICAgcHVibGljIGlkX3Byb2Nlc286c3RyaW5nO1xyXG4gICAgcHVibGljIGlkX3N1Yl9wcm9jZXNvOnN0cmluZztcclxuICAgIHB1YmxpYyBpZF9kaW5hbWljYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGlwb19kaW5hbTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGl0dWxvOnN0cmluZztcclxuICAgIHB1YmxpYyBlc3RydWN0dXJhX2Rlc3Rpbm86IHN0cmluZztcclxuICAgIHB1YmxpYyBWRGVmYXVsdDogc3RyaW5nO1xyXG4gICAgcHVibGljIFJlcXVlcmlkbzpib29sZWFuO1xyXG59IiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1BJdGVtc1dFQiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUHJkUGFja0RldCB7XHJcbiAgICBwdWJsaWMgTE9URTogc3RyaW5nO1xyXG4gICAgcHVibGljIExPVEVISUpPOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgU0tVSElKTzogc3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwb1BhY2s6IHN0cmluZztcclxuICAgIHB1YmxpYyBnc1BhdGhJbWFnZW46IHN0cmluZztcclxuICAgIHB1YmxpYyBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG4gICAgcHVibGljIE0zR1JQID0gbmV3IFR5cGVNM1ByZEdycCgpO1xyXG4gICAgcHVibGljIE9yZGVuOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsb3JBZGljaW9uYWw6IG51bWJlcjtcclxuICAgIHB1YmxpYyBJZEdycDogc3RyaW5nO1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM1ViaUFkaWNpb25hbGVze1xyXG4gICAgcHVibGljIEF0cmlidXRvOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBNM1ViaUFkaWNpb25hbGVzIH0gZnJvbSBcIi4vTTNVYmlBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zSHVicyB9IGZyb20gXCIuL20zLWh1YnMudHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVWJpY2FjaW9ue1xyXG4gICAgcHVibGljIElEVWJpY2FjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG9VYmljYWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIFREb2NBZG1pbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTkRvY0FkbWluOnN0cmluZztcclxuICAgIHB1YmxpYyBKQ29uZmlndXJhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgU2VyaWU6c3RyaW5nO1xyXG4gICAgcHVibGljIEVzdGFkbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgRG9jdW1lbnRvSUQ6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zVWJpQWRpY2lvbmFsZXM6QXJyYXk8TTNVYmlBZGljaW9uYWxlcz47XHJcbiAgICBwdWJsaWMgTTNIVUJTID0gbmV3IEFycmF5PE0zSHVicz4oKTtcclxuICAgIHB1YmxpYyBGZWNoYVRyYWJham86RGF0ZTtcclxuICAgIHB1YmxpYyBBUExVYmljRXh0ZXJuYXM6Qm9vbGVhbjtcclxuICAgIFxyXG59IiwiaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSBcIi4vTTNDT05ESVBST01PLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNDT05ESUFHUlVQQUNJT057XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQWdydXBhY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRDb25kaWNpb25lczpzdHJpbmc7XHJcbiAgICBwdWJsaWMgT3BlcmFkb3I6c3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBNM0NPTkRJUFJPTU86QXJyYXk8TTNDT05ESVBST01PPjtcclxufSIsImltcG9ydCB7IE0zREVUQ09ORElQUk9NTyB9IGZyb20gXCIuL00zREVUQ09ORElQUk9NTy5jbGFzc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zQ09ORElQUk9NT3tcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRDb25kaWNpb246bnVtYmVyO1xyXG4gICAgcHVibGljIENvbmNlcHRvOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSkFkaWNpb25hbGVzOnN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgTTNERVRDT05ESVBST01POiBBcnJheTxNM0RFVENPTkRJUFJPTU8+O1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM0RFVENPTkRJUFJPTU97XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQ29uZGljaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb25jZXB0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG4gICAgcHVibGljIEpBZGljaW9uYWxlczpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gXCIuL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNFTkNQUk9NT3tcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvMjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmlnZW5jaWE6RGF0ZTtcclxuICAgIHB1YmxpYyBJbmljaW86RGF0ZTtcclxuICAgIHB1YmxpYyBFc3RhZG86Ym9vbGVhbjtcclxuICAgIHB1YmxpYyBKQWRpY2lvbmFsZXM6c3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBFc3RhZG9NYW51YWxlczpib29sZWFuID1mYWxzZTtcclxuICAgIHB1YmxpYyBFc01hbnVhbDpib29sZWFuPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgRXN0YWRvQXBsQ3Vwb246Ym9vbGVhbiA9ZmFsc2U7XHJcbiAgICBwdWJsaWMgRXNBcGxDdXBvbjpib29sZWFuPSBmYWxzZTtcclxuICAgIHB1YmxpYyBUb3BlOm51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgTTNDT05ESUFHUlVQQUNJT046QXJyYXk8TTNDT05ESUFHUlVQQUNJT04+O1xyXG59IiwiaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ViaUFkaWNpb25hbGVzIH0gZnJvbSBcInByb2plY3RzL3JlZ2xhbmVnb2Npb20zMS9zcmMvcHVibGljX2FwaVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVWJpY2FjaW9uU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBnb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbjtcclxuICAgIGNvbnN0cnVjdG9yKG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24pIHtcclxuICAgICAgICB0aGlzLmdvTTNVYmljYWNpb24gPSBvTTNVYmljYWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldERpcmVjY2lvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiRElSRUNDSU9OXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRUZWxlZm9ubygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiVEVMRUZPTk9cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExvbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShcIkxPTkdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExhdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiTEFUXCIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIEdldEFkaWNpb25hckJ5QXRyaWJ1dGUoQXRyaWJ1dG86IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvQWRpY2lvbmFsOiBNM1ViaUFkaWNpb25hbGVzID0gdGhpcy5nb00zVWJpY2FjaW9uLk0zVWJpQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkF0cmlidXRvID09IEF0cmlidXRvKTtcclxuICAgICAgICAgICAgaWYgKG9BZGljaW9uYWwgIT09IHVuZGVmaW5lZCAmJiBvQWRpY2lvbmFsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvQWRpY2lvbmFsLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBcIk4vQVwiO1xyXG4gICAgICAgIH1jYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiTi9BXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IE0zUEl0ZW1zV0VCLCBNM1BEZXRhbGxlSXRlbXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM0NvdWNoTWFlc3RybyB9IGZyb20gXCIuLi9EYXRhL20zLWNvdWNoLW1hZXN0cm9cIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGVyLXgtcHJvY2Vzb1wiO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8gfSBmcm9tIFwiLi9tMy1sb2FkLWwtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ291Y2hQUkRTU2VydmljZSB9IGZyb20gXCIuLi9PZmZsaW5lL2NvdWNoLXByZHMuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnTWFzaXZvIHtcclxuXHJcbiAgICBwcml2YXRlIGdzSWRLYXRpb3M6IHN0cmluZztcclxuICAgIHByaXZhdGUgcmVhZGVyOiBGaWxlUmVhZGVyO1xyXG4gICAgcHJpdmF0ZSBzZXBhcmFkb3I6IHN0cmluZyA9IFwiLFwiO1xyXG4gICAgcHJpdmF0ZSBvTTNQcm9jZXNvID0gbmV3IE0zUHJvY2Vzb3MoKTtcclxuICAgIHByaXZhdGUgcHJvZ3Jlc3M6IG51bWJlcjtcclxuICAgIHByaXZhdGUgQ29uZk1hc2l2YTogYW55O1xyXG4gICAgcHVibGljIHJvdW5kZWRfcHJvZ3Jlc3M6IG51bWJlcjtcclxuICAgIHB1YmxpYyBnYkJhckNvZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0cnVjdG9yKGlzSWRLYXRpb3M6IHN0cmluZywgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGlDb25mTWFzaXZhOiBhbnksIGliQmFyY29kZTogYm9vbGVhbixcclxuICAgICAgICBwcml2YXRlIG9Db3VjaFBSRFNTZXJ2aWNlOiBDb3VjaFBSRFNTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5vTTNQcm9jZXNvID0gaW9NM1Byb2Nlc287XHJcbiAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gaXNJZEthdGlvcztcclxuICAgICAgICB0aGlzLkNvbmZNYXNpdmEgPSBpQ29uZk1hc2l2YTtcclxuICAgICAgICB0aGlzLmdiQmFyQ29kZSA9IGliQmFyY29kZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0X3JvdW5kZWRfcHJvZ3Jlc3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm91bmRlZF9wcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICAvLy9BZGljaW9uYXIgcHJvZHVjdG9zIGVuIG1hc2l2b1xyXG4gICAgcHVibGljIGFzeW5jIEFkaWNpb25hck1hc2l2byhvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvRGF0VXNlcjogYW55LCBvRGF0YVByb2M6IGFueSwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLkdldFJlYWRlcihvRGF0YVByb2MpO1xyXG4gICAgICAgIGxldCBjc3Y6IHN0cmluZztcclxuICAgICAgICBpZiAoIXRoaXMucmVhZGVyKSB7XHJcbiAgICAgICAgICAgIGNzdiA9IG9EYXRhUHJvYy5UZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3N2ID0gdGhpcy5yZWFkZXIucmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBjc3Yuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gICAgICAgIHZhciBwcm9jZXNvOiBbTTNQcm9jZXNvcywgc3RyaW5nXSA9IGF3YWl0IHRoaXMuYWRpY2lvbmFyX21hc2l2b19mcm9tX2FycmF5KG9NM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMywgb0RhdFVzZXIsIGFyckNTViwgb00zVWJpY2FjaW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNvcnJlIHkgYWRpY2lvbmEgbG9zIHByb2R1Y3RvcyBlbiB1biBhcnJheSBhIHVuIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvTTNDb3VjaE1hZXN0cm8gXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBvRGF0VXNlciBcclxuICAgICAqIEBwYXJhbSBhcnJDU1YgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGljaW9uYXJfbWFzaXZvX2Zyb21fYXJyYXkob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb0RhdFVzZXI6IGFueSwgYXJyQ1NWOiBBcnJheTxzdHJpbmc+LCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uID0gbnVsbCwgYXBsRXhjOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICBsZXQgdG90YWwgPSBhcnJDU1YubGVuZ3RoO1xyXG4gICAgICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICAgICAgdmFyIHByb2R1Y3Q6IFR5cGVNM1ByZEdycFxyXG4gICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgdmFyIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG9NM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lkS2F0aW9zKTtcclxuICAgICAgICB2YXIgcHJkc0ZhaWxzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGxldCBwcmRmYWlsYWN0dWFsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcbiAgICAgICAgdmFyIHJlc3VsdDogYW55O1xyXG4gICAgICAgIGxldCBhcnJheVJlc3A6IFtNM1Byb2Nlc29zLCBzdHJpbmddID0gW3RoaXMub00zUHJvY2VzbywgXCJcIl07XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHByZGZhaWxhY3R1YWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFyIGxpbmU6IHN0cmluZyA9IGFyckNTVltpXTtcclxuICAgICAgICAgICAgaWYgKGxpbmUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTVjtcclxuICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWID0gdGhpcy5TZXRFc3RydWN0Q1NWKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2JCYXJDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcImZ1ZSBsb2NhbDogXCIgKyBvZXN0cnVjdENTVi5za3UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9Db3VjaFBSRFNTZXJ2aWNlLmdldChvZXN0cnVjdENTVi5za3UpLnRoZW4oYXN5bmMgcHJkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJvYnR1dm8gbG9jYWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8odGhpcy5nc0lkS2F0aW9zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhwcmQuTGlzdENvZHMsIG9EYXRVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJhc2lnbm8gbHAgbG9jYWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmQuTGlzdENvZHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBwcmQuTGlzdENvZHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGFzeW5jIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBscCAtIGludGVudG8gc2VydmVyOiBcIiArIG9lc3RydWN0Q1NWLnNrdSArIFwiOiBcIiArIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0geyBcImlkX3ViaWNhY2lvblwiOiBvRGF0VXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIFwiQ29kaWdvXCI6IG9lc3RydWN0Q1NWLnNrdSB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZUFzeW5jKFBvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZEthdGlvcywgZGF0YSwgb0RhdFVzZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGNhdGNoIGxwOiBcIiArIG9lc3RydWN0Q1NWLnNrdSArIFwiOiBcIiArIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyck1zZzogc3RyaW5nID0gZXJyLnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJkRmFpbCA9IGVyck1zZy5zdWJzdHJpbmcoZXJyTXNnLmluZGV4T2YoXCJDb2RpZ29cIikgKyA3KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmRzRmFpbHMgKz0gcHJkRmFpbCArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZGZhaWxhY3R1YWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob00zVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG9NM1ViaWNhY2lvbiAmJiBvTTNVYmljYWNpb24uSURVYmljYWNpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNVYmljYWNpb24gJiYgb00zVWJpY2FjaW9uLklEVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIG9lc3RydWN0Q1NWLnNrdSwgb0RhdFVzZXIsIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbiwgYXBsRXhjKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIG9lc3RydWN0Q1NWLnNrdSwgb0RhdFVzZXIsIFwiLTFcIiwgYXBsRXhjKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1Zyhwcm9kdWN0KTtcclxuICAgICAgICAgICAgICAgIGlmICghcHJkZmFpbGFjdHVhbCAmJiBwcm9kdWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQcmVjaW9TaUFQbGljYShwcm9kdWN0LCBvZXN0cnVjdENTVik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BZGRQcmRUb00zUHJvY2Vzbyhwcm9kdWN0LCBvZXN0cnVjdENTViwgb00zUmVnU2VydmljZSwgb0RhdFVzZXIsIG9NM1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBwcm9kdWN0IG5vIHNlIGxsZW5vOiBcIiArIG9lc3RydWN0Q1NWLnNrdSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IGNvdW50ICogMTAwIC8gdG90YWw7XHJcbiAgICAgICAgICAgIHRoaXMucm91bmRlZF9wcm9ncmVzcyA9IE1hdGgucm91bmQodGhpcy5wcm9ncmVzcyAqIDEwMCkgLyAxMDBcclxuICAgICAgICB9XHJcbiAgICAgICAgYXJyYXlSZXNwWzBdID0gdGhpcy5vTTNQcm9jZXNvO1xyXG4gICAgICAgIGFycmF5UmVzcFsxXSA9IHByZHNGYWlscztcclxuICAgICAgICByZXR1cm4gYXJyYXlSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FtYmlhciBwcmVjaW8gZGUgcHJvZHVjdG8uXHJcbiAgICBwdWJsaWMgc2V0UHJlY2lvU2lBUGxpY2EocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIGlmIChvZXN0cnVjdENTVi5wcmVjaW8gIT09IE5hTiAmJiBvZXN0cnVjdENTVi5wcmVjaW8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvZXN0cnVjdENTVi5wcmVjaW87XHJcbiAgICAgICAgICAgIHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZm9yRWFjaChvTTNQcmVzZW50YWNpb25lcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiA9IG9lc3RydWN0Q1NWLnByZWNpbztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGEgbTNwcm9jZXNvLCBwcm9kdWN0byBlc3BlY2lmaWNvLCBzZSBlbnZpYSBjYW50aWRhZC5cclxuICAgIHB1YmxpYyBBZGRQcmRUb00zUHJvY2Vzbyhwcm9kdWN0OiBUeXBlTTNQcmRHcnAsIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWLCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2UsIG9EYXRVc2VyOiBhbnksIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24gPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBvZXN0cnVjdENTVi5jYW50aWRhZDtcclxuICAgICAgICBpZiAob2VzdHJ1Y3RDU1YuUGF0aEltYWdlbikge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuUGF0aEltYWdlbiA9IG9lc3RydWN0Q1NWLlBhdGhJbWFnZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IG9NM1JlZ1NlcnZpY2UuTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQiwgcHJvZHVjdCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9NM1Byb2Nlc28uTTNFTkMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgLy8vUHJpbWVyYSB2ZXogXHJcbiAgICAgICAgICAgIC8vL05PIFNFIEVTVEEgRU5WSUFORE8gSU5GT1JNQUNJT04gREUgUFJPTU9DSU9ORVNcclxuICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvID0gb00zUmVnU2VydmljZS5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZHVjdCwgb00zUEl0ZW1zV0VCLCBvRGF0VXNlciwgb00zVWJpY2FjaW9uLCBudWxsLCB0aGlzLm9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAvL0FncmVnYXIgZGluYW1pY2FzXHJcbiAgICAgICAgICAgIHRoaXMuQWRpY2lvbmFyRGluYW1pY2Eob2VzdHJ1Y3RDU1YpO1xyXG4gICAgICAgICAgICB0aGlzLkFkaWNpb25hclBlcnNvbmFzQVByb2Nlc28ob2VzdHJ1Y3RDU1YpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YSh0aGlzLm9NM1Byb2Nlc28sIHByb2R1Y3QsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBudWxsLCBvRGF0VXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuQWRpY2lvbmFyRGV0YWxsZShvZXN0cnVjdENTVik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgY2FwdHVyYXMgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gZGUgbGluZWEgYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJEaW5hbWljYShvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYXMgPSBvZXN0cnVjdENTVi5EaW5hbWljYXNcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW5hbWljYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5sTTNQRGluYW1pY2FzID0gbmV3IEFycmF5PE0zUERpbmFtaWNhcz4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gZGluYW1pY2FzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IGRpbmFtaWNhc1tpXS5WYWxvcjtcclxuICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBkaW5hbWljYVwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgcGVyc29uYXMgYSBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJQZXJzb25hc0FQcm9jZXNvKG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHBlcnNvbmFzID0gb2VzdHJ1Y3RDU1YuUGVyc29uYXM7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGVyc29uYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQZXJYUHJvY2VzbyA9IG5ldyBNM1BlclhQcm9jZXNvKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub00zUHJvY2Vzby5NM1BlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zUGVyWFByb2Nlc28gPSBuZXcgQXJyYXk8TTNQZXJYUHJvY2Vzbz4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9NM1BlclhQcm9jZXNvLlRkb2MgPSBwZXJzb25hc1tpXS5UZG9jO1xyXG4gICAgICAgICAgICAgICAgb00zUGVyWFByb2Nlc28uTmRvYyA9IHBlcnNvbmFzW2ldLk5kb2M7XHJcbiAgICAgICAgICAgICAgICBvTTNQZXJYUHJvY2Vzby5UaXBvUGVyc29uYSA9IHBlcnNvbmFzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zUGVyWFByb2Nlc28ucHVzaChvTTNQZXJYUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBwZXJzb25hc1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZSBhbCB1bHRpbW8gZW5jYWJlemFkbyBhZ3JlZ2Fkby5cclxuICAgICAqIEBwYXJhbSBvZXN0cnVjdENTViBFc3RydWN0dXJhIGNvbiBpbmZvcm1hY2lvbiBkZSBsaW5lYSBhIGFncmVnYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkaWNpb25hckRldGFsbGUob2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZGV0YWxsZXMgPSBvZXN0cnVjdENTVi5NM0RldFxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRldGFsbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gZGV0YWxsZXNbaV0uQXRyaWJ1dG87XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gZGV0YWxsZXNbaV0uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28uTTNFTkNbdGhpcy5vTTNQcm9jZXNvLk0zRU5DLmxlbmd0aCAtIDFdLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMub00zUHJvY2Vzby5NM0VOQy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IG9lc3RydWN0Q1NWLilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgYWRpY2lvbmFyIGRldGFsbGVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRlbmVyIHkgc2V0ZWFyIGxhIGluZm9ybWFjaW9uIGRlIGFyY2hpdm8gQ1NWIHkgc2VwYXJhZG9yLlxyXG4gICAgcHVibGljIEdldFJlYWRlcihvRGF0YVByb2M6IGFueSkge1xyXG4gICAgICAgIHRoaXMucmVhZGVyID0gb0RhdGFQcm9jLkNTVjtcclxuICAgICAgICB0aGlzLnNlcGFyYWRvciA9IG9EYXRhUHJvYy5TZXBhcmFkb3I7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9TZXRlYXIgZXN0cnVjdXRhciBkZSBDU1ZcclxuICAgIHB1YmxpYyBTZXRFc3RydWN0Q1NWKGxpbmU6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTViA9IHsgXCJjYW50aWRhZFwiOiBudWxsLCBcInByZWNpb1wiOiBudWxsLCBcInNrdVwiOiBudWxsLCBcIlBhdGhJbWFnZW5cIjogbnVsbCwgXCJEaW5hbWljYXNcIjogW10sIFwiUGVyc29uYXNcIjogW10sIFwiTTNEZXRcIjogW10gfTtcclxuICAgICAgICAgICAgdmFyIG9BcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBsaW5lLnNwbGl0KHRoaXMuc2VwYXJhZG9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbmZNYXNpdmEgJiYgdGhpcy5Db25mTWFzaXZhLkNvbHVtbmFzKSB7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuRXN0cnVjdER5bmFtaWMob0FyckNTVik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuRXN0cnVjdERlZmF1bHQob0FyckNTVik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvZXN0cnVjdENTVjtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGNyZWFuZG8gZXN0cnVjdHVyYS4gUmV2aXNhciBsaW5lYXNcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXN0cnVjdHVyYSBkaW5hbWljYSBkZSBjYXJndWUgbWFzaXZhXHJcbiAgICAgKiBAcGFyYW0gb0FyckNTViBhcnJlZ2xvIGNvbiBpbmZvcm1hY2lvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEVzdHJ1Y3REeW5hbWljKG9BcnJDU1Y6IEFycmF5PHN0cmluZz4pIHtcclxuICAgICAgICB2YXIgY29sdW1uYXM6IEFycmF5PGFueT4gPSB0aGlzLkNvbmZNYXNpdmEuQ29sdW1uYXM7XHJcbiAgICAgICAgdmFyIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWID0geyBcImNhbnRpZGFkXCI6IG51bGwsIFwicHJlY2lvXCI6IG51bGwsIFwic2t1XCI6IG51bGwsIFwiUGF0aEltYWdlblwiOiBudWxsLCBcIkRpbmFtaWNhc1wiOiBbXSwgXCJQZXJzb25hc1wiOiBbXSwgXCJNM0RldFwiOiBbXSB9O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbmFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uYXNbaV0uRXN0cnVjdHVyYSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNhbnRpZGFkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuY2FudGlkYWQgPSArb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUHJlY2lvXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YucHJlY2lvID0gK29BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlNLVVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLnNrdSA9IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRJTkFNSUNBXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpbiA9IHsgXCJBdHJpYnV0b1wiOiBjb2x1bW5hc1tpXS5BdHJpYnV0bywgXCJWYWxvclwiOiBvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLkRpbmFtaWNhcy5wdXNoKGRpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTTNERVRcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNEZXQgPSB7IFwiQXRyaWJ1dG9cIjogY29sdW1uYXNbaV0uQXRyaWJ1dG8sIFwiVmFsb3JcIjogb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl0gfTtcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5NM0RldC5wdXNoKG0zRGV0KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJUSVBPUEVSU09OQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWxvciA9IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZG9jOiBzdHJpbmcgPSBcIjVcIjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmRvYzogc3RyaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsb3Iuc3BsaXQoXCItXCIpLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRkb2MgPSB2YWxvci5zcGxpdChcIi1cIilbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5kb2MgPSB2YWxvci5zcGxpdChcIi1cIilbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmRvYyA9IHZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBlcnNvbmEgPSB7IFwiQXRyaWJ1dG9cIjogY29sdW1uYXNbaV0uQXRyaWJ1dG8sIFwiVGRvY1wiOiB0ZG9jLCBcIk5kb2NcIjogbmRvYyB9O1xyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLlBlcnNvbmFzLnB1c2gocGVyc29uYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvZXN0cnVjdENTVjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzdHJ1Y3R1cmEgZGVmYXVsdC5cclxuICAgICAqIEBwYXJhbSBvQXJyQ1NWIEFycmVnbG8gY29uIGluZm9ybWFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBFc3RydWN0RGVmYXVsdChvQXJyQ1NWOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICAgICAgdmFyIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWID0geyBcImNhbnRpZGFkXCI6IG51bGwsIFwicHJlY2lvXCI6IG51bGwsIFwic2t1XCI6IG51bGwsIFwiUGF0aEltYWdlblwiOiBudWxsLCBcIkRpbmFtaWNhc1wiOiBbXSwgXCJQZXJzb25hc1wiOiBbXSwgXCJNM0RldFwiOiBbXSB9O1xyXG4gICAgICAgIC8vdmFyIG9BcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBsaW5lLnNwbGl0KHRoaXMuc2VwYXJhZG9yKTtcclxuXHJcbiAgICAgICAgaWYgKG9BcnJDU1YubGVuZ3RoID49IDEpIHtcclxuICAgICAgICAgICAgb2VzdHJ1Y3RDU1Yuc2t1ID0gb0FyckNTVlswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9BcnJDU1YubGVuZ3RoID49IDIpIHtcclxuICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuY2FudGlkYWQgPSArb0FyckNTVlsxXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvQXJyQ1NWLmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgICAgICAgIG9lc3RydWN0Q1NWLnByZWNpbyA9ICtvQXJyQ1NWWzJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob0FyckNTVi5sZW5ndGggPj0gNCkge1xyXG4gICAgICAgICAgICBvZXN0cnVjdENTVi5QYXRoSW1hZ2VuID0gb0FyckNTVlszXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9lc3RydWN0Q1NWO1xyXG4gICAgfVxyXG5cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIGVzdHJ1Y3RDU1Yge1xyXG4gICAgc2t1OiBzdHJpbmc7XHJcbiAgICBjYW50aWRhZDogbnVtYmVyO1xyXG4gICAgcHJlY2lvOiBudW1iZXI7XHJcbiAgICBQYXRoSW1hZ2VuOiBzdHJpbmc7XHJcbiAgICBEaW5hbWljYXM6IEFycmF5PGFueT47XHJcbiAgICBQZXJzb25hczogQXJyYXk8YW55PjtcclxuICAgIE0zRGV0OiBBcnJheTxhbnk+O1xyXG59IiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gXCIuL20zLXJlZy1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUEl0ZW1zV0VCIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGFzeW5jIH0gZnJvbSBcInFcIjtcclxuXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnTWFzaXZvQUtaU2VydmljZSB7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhIHVuIEVuY0l0ZW0geSBwdWVkZSBxdWUgdW5hIGRpbmFtaWNhIGNvbiBlbCBpZHByZXN0YW1vIGEgdW4gcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGlkX3ByZXN0YW1vIFxyXG4gICAgICogQHBhcmFtIG0zUHJkIFxyXG4gICAgICogQHBhcmFtIHVzZXIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGRfZGluYW1pY2FfaWRwcmVzdGFtb190b19wcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9wcmVzdGFtbzogc3RyaW5nLFxyXG4gICAgICAgIG0zUHJkLCB1c2VyLCBvdHJvc1BhcmFtZXRyb3M6IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgcmVzcDtcclxuICAgICAgICB2YXIgcGRpbmFtaWNhID0gbmV3IE0zUERpbmFtaWNhc1xyXG4gICAgICAgIHBkaW5hbWljYS5Ob21icmUgPSBcIklkUHJlc3RhbW9cIjtcclxuICAgICAgICBwZGluYW1pY2EuVmFsb3IgPSBpZF9wcmVzdGFtbztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2VfcHJvY2Vzb19tMzogTTNQcm9jZXNvc1xyXG4gICAgICAgICAgICB2YXIgbTNfcmVnX3NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIGlkX2thdGlvcyk7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlX3Byb2Nlc29fbTMgPSBhd2FpdCBtM19yZWdfc2VydmljZS5nZXRfbTNfcHJvY2Vzb19ieV9pZF9wcmVzdGFtb19hc3luYyhQb3N0U2VydmljZU0zLCBpZF9rYXRpb3MsIGlkX3ByZXN0YW1vKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2UgZGVqYW4gcGVnYWRvcyBsb3MgZXN0YWRvcyBkZSBkZXN0aW5vXHJcbiAgICAgICAgICAgIHJlc3BvbnNlX3Byb2Nlc29fbTMuRXN0YWRvRGVzID0gcmVzcG9uc2VfcHJvY2Vzb19tMy5Fc3RhZG9BbnQ7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlX3Byb2Nlc29fbTMuU3ViRXN0YWRvRGVzID0gcmVzcG9uc2VfcHJvY2Vzb19tMy5TdWJFc3RhZG9BbnQ7XHJcblxyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgdGhpcy5hZGRfcGRpbmFtaWNhX3RvX2V4aXN0aW5nX3Byb2Nlc28oUG9zdFNlcnZpY2VNMywgcmVzcG9uc2VfcHJvY2Vzb19tMywgaWRfa2F0aW9zLCBtM1ByZCwgdXNlciwgcGRpbmFtaWNhLCBvdHJvc1BhcmFtZXRyb3MpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuXHJcbiAgICAgICAgICAgIHJlc3AgPSBhd2FpdCB0aGlzLmFkZF9wZGluYW1pY2FfdG9fbmV3X3Byb2Nlc28oUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zLCBtM1ByZCwgdXNlciwgcGRpbmFtaWNhLCBvdHJvc1BhcmFtZXRyb3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSB1biBFbmNJdGVtIHkgZGluYW1pY2EgY29uIGVsIGlkcHJlc3RhbW8gYSB1biBwcm9jZXNvIG51ZXZvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gbTNQcmQgXHJcbiAgICAgKiBAcGFyYW0gdXNlciBcclxuICAgICAqIEBwYXJhbSBwZGluYW1pY2EgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGRfcGRpbmFtaWNhX3RvX25ld19wcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG0zUHJkOiBhbnksIHVzZXI6IGFueSwgcGRpbmFtaWNhOiBNM1BEaW5hbWljYXMsIG90cm9zUGFyYW1ldHJvczogQXJyYXk8YW55Pikge1xyXG5cclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IHRoaXMuR2V0TTNQSXRlbXNXRUIob3Ryb3NQYXJhbWV0cm9zKTtcclxuICAgICAgICB2YXIgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgaWRfa2F0aW9zKTtcclxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29FbXB0eVBEQihtM1ByZCwgb00zUEl0ZW1zV0VCLCB1c2VyLCBudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICByZXNwb25zZS5sTTNQRGluYW1pY2FzLnB1c2gocGRpbmFtaWNhKTtcclxuXHJcbiAgICAgICAgLy9TZSBkZWphbiBwZWdhZG9zIGxvcyBlc3RhZG9zIGRlIGRlc3Rpbm9cclxuICAgICAgICByZXNwb25zZS5Fc3RhZG9EZXMgPSBcIkFjdGl2b1wiO1xyXG4gICAgICAgIHJlc3BvbnNlLlN1YkVzdGFkb0RlcyA9IFwiUmVnaXN0cm9cIjtcclxuXHJcbiAgICAgICAgdmFyIG0zX3Byb2Nlc28gPSBhd2FpdCBvTTNSZWdTZXJ2aWNlLnByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhpZF9rYXRpb3MsIFBvc3RTZXJ2aWNlTTMsIHJlc3BvbnNlLCB1c2VyKTtcclxuICAgICAgICByZXR1cm4gbTNfcHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSB1biBFbmNJdGVtIGEgdW4gcHJvY2VzbyBleGlzdGVudGVcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIG0zX3Byb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG0zUHJkIFxyXG4gICAgICogQHBhcmFtIHVzZXIgXHJcbiAgICAgKiBAcGFyYW0gcGRpbmFtaWNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGRfcGRpbmFtaWNhX3RvX2V4aXN0aW5nX3Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgbTNfcHJvY2VzbzogTTNQcm9jZXNvcywgaWRfa2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgbTNQcmQ6IGFueSwgdXNlcjogYW55LCBwZGluYW1pY2E6IE0zUERpbmFtaWNhcywgb3Ryb3NQYXJhbWV0cm9zOiBBcnJheTxhbnk+KSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCID0gdGhpcy5HZXRNM1BJdGVtc1dFQihvdHJvc1BhcmFtZXRyb3MpO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBpZF9rYXRpb3MpO1xyXG5cclxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShtM19wcm9jZXNvLCBtM1ByZCwgb00zUEl0ZW1zV0VCLCBudWxsLCBudWxsLCB1c2VyKTtcclxuICAgICAgICByZXNwb25zZS5sTTNQRGluYW1pY2FzLnB1c2gocGRpbmFtaWNhKTtcclxuXHJcbiAgICAgICAgdmFyIG0zX3Byb2Nlc28gPSBhd2FpdCBvTTNSZWdTZXJ2aWNlLnByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhpZF9rYXRpb3MsIFBvc3RTZXJ2aWNlTTMsIHJlc3BvbnNlLCB1c2VyKTtcclxuICAgICAgICByZXR1cm4gbTNfcHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICBHZXRNM1BJdGVtc1dFQihvdHJvc1BhcmFtZXRyb3M6IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IDE7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLklkUHJvY2VzbyA9IFwiTTNWRU5UQVwiO1xyXG4gICAgICAgIG90cm9zUGFyYW1ldHJvcy5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUJbeC5Ob21icmVdID0geC5WYWxvclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIG9NM1BJdGVtc1dFQjtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JldmVyc29TZXJ2e1xyXG5cclxuXHJcbiAgICBcclxuICAgIHB1YmxpYyBQcm9jZXNhclJldmVyc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMyxzSURLYXRpb3M6IHN0cmluZywgdGRvY0FjdGl2bzpzdHJpbmcsIG5kb2NBY3Rpdm86c3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zUmV2ZXJzby9SZXZlcnNhci9cIiArIHNJREthdGlvcyArIFwiL1wiICsgbmRvY0FjdGl2byArIFwiL1wiICsgdGRvY0FjdGl2bywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH0sICk7XHJcbiAgICB9XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIE0zUERpbmFtQnlBY3RpdmlkYWR7XHJcbiAgICBwdWJsaWMgSWREaW5hbWljYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbn0iLCJleHBvcnQgY2xhc3MgTTNEaW5CeUFjdGl2aWRhZHtcclxuICAgIHB1YmxpYyBJREFjdGl2aWRhZDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQWN0aXZpZGFkOnN0cmluZztcclxuICAgIHB1YmxpYyBJRERpbmFtaWNhOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvRGluYW1pY2E6c3RyaW5nO1xyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgUmVxdWVyaWRvOmJvb2xlYW47XHJcbiAgICBwdWJsaWMgQ29uZmlndXJhY2lvbjpzdHJpbmc7XHJcbiAgICAvL1NvbG8gUHJlc2VudGFjaW9uXHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM1NhbGRvc1hDdWVudGF7XHJcbiAgICBwdWJsaWMgRG9jdW1lbnRvOnN0cmluZztcclxuICAgIHB1YmxpYyBURG9jVGl0dWxhcjpudW1iZXI7XHJcbiAgICBwdWJsaWMgTkRvY1RpdHVsYXI6c3RyaW5nO1xyXG4gICAgcHVibGljIE5vbUN1ZW50YTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsQ3VlbnRhOm51bWJlcjtcclxufSIsImltcG9ydCB7IE0zUERpbmFtQnlBY3RpdmlkYWQgfSBmcm9tIFwiLi9tMy1wZGluYW0tYnktYWN0aXZpZGFkXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnaXN0cm9Ucngge1xyXG5cclxuICAgIHB1YmxpYyBBY3RpdmlkYWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIElEOm51bWJlcjtcclxuICAgIHB1YmxpYyBNM1BEaW5hbUJ5QWN0aXZpZGFkID0gbmV3IEFycmF5PE0zUERpbmFtQnlBY3RpdmlkYWQ+KCk7XHJcblxyXG4gICAgLy9BdHJpYnV0b3MgdW5pY28gZGVsIEZyb250XHJcbiAgICBwdWJsaWMgQWN0dWFsOnN0cmluZyA9IHVuZGVmaW5lZFxyXG59IiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgY3Vwb25lc1NlcnZpY2Uge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSB0b2RvcyBsb3MgY3Vwb25lcyBnZW5lcmFkb3MgcG9yIHVuIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dldF9jdXBvbmVzX2dlbmVyYWRvc19ieV9wcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy92YXIgZGF0YSA9IHsgXCJpZF9tM1wiOiBpZG0zLCBcImlkX3Byb2Nlc29cIjogcHJvY2VzbyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL20zX2dldF9jdXBvbmVzX2dlbmVyYWRvc19ieV9wcm9jZXNvL1wiICsgaWRrYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIHZhciBjdXBvbmVzID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgdmFyIHJlc3BfY3Vwb25lczpBcnJheTxhbnk+O1xyXG4gICAgICAgICAgaWYoIWN1cG9uZXMuQ1VQT05FUy5DVVBPTi5sZW5ndGgpe1xyXG4gICAgICAgICAgICByZXNwX2N1cG9uZXMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICByZXNwX2N1cG9uZXMucHVzaChjdXBvbmVzLkNVUE9ORVMuQ1VQT04pO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJlc3BfY3Vwb25lcyA9IGN1cG9uZXMuQ1VQT05FUy5DVVBPTjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgZnVuY2lvbk9LKHJlc3BfY3Vwb25lcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgcHVibGljIGdldEN1cG9uQnlJZERldChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgXHJcbiAgICAgICAgLy92YXIgZGF0YSA9IHsgXCJpZERldEN1cG9uXCI6IGlkRGV0Q3Vwb259O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL2dldEN1cG9uQnlJZERldC9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcbmltcG9ydCB7IGZha2VBc3luYyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XHJcblxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlT2ZmTGluZSB7XHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0FkaWNpb25hciBlbiBCRCBwb3VjaC5cclxuICAgIHB1YmxpYyBBZGREb2N1bWVudChpZDogc3RyaW5nLCBkb2N1bWVudDogYW55KSB7XHJcbiAgICAgICAgZG9jdW1lbnQuX2lkID0gaWQ7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQWRkRG9jdW1lbnRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWRkRG9jdW1lbnQgZW5jb25ydHJvIGRvY3VtZW50XCIpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5fcmV2ID0gcmVzdWx0Ll9yZXY7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5zdGF0dXMpO1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBkb2N1bWVudFtcIl9yZXZcIl07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgRGVzdHJveSgpIHtcclxuICAgIC8vICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgLy8gICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVcIik7XHJcbiAgICAvLyAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgLy8gICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdHJveVRvdGFsKCl7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3NEZWxldGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUsIGRlbGV0ZWQ6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc09mZkxpbmVTaW5Eb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cm95KGZ1bmNpb25SZXA6RnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiT2ZmbGluZUxvZ1wiICsga2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXAoe1wiUmVzcFwiOlwiT0tcIn0pO1xyXG4gICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25SZXAoe1wiUmVzcFwiOlwiRXJyb3JcIiwgXCJEZXNjXCI6ZXJyfSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgRGVsZXRlQWxsRG9jcygpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSkudGhlbihhbGxEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbERvY3Mucm93cy5maWx0ZXIocm93ID0+ICFyb3cuaWQuc3RhcnRzV2l0aChcIkNUSVZPU1wiKSkubWFwKGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGUoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcbmltcG9ydCBwb3VjaGRic2l6ZSBmcm9tICdwb3VjaGRiLXNpemUnO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcbmltcG9ydCB7IE0zRGV2aWNlc1NlcnZpY2UgfSBmcm9tICdzZi1yZWdsYW5lZ29jaW8tZ3JsJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIGJkT2ZmTGluZUxvZyB7XHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgb00zRGV2aWNlc1NlcnZpY2U6TTNEZXZpY2VzU2VydmljZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lTG9nXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGVuIEJEIHBvdWNoLlxyXG4gICAgcHVibGljIEFkZERvY3VtZW50KGlkOiBzdHJpbmcsIGRvY3VtZW50OiBhbnkpIHtcclxuICAgICAgICBkb2N1bWVudC5faWQgPSBpZDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50Ll9yZXYgPSByZXN1bHQuX3JldjtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50LCB7IGZvcmNlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdHJveShmdW5jaW9uUmVwOkZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5kZXN0cm95KCkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVMb2dcIiArIGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uUmVwKHtcIlJlc3BcIjpcIk9LXCJ9KTtcclxuICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBmdW5jaW9uUmVwKHtcIlJlc3BcIjpcIkVycm9yXCIsIFwiRGVzY1wiOmVycn0pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZUluc3RhbmNlKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuY2xvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgSW5zdGFuY2VBZ2FpbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lTG9nXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gY2F0Y2h7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3NEZWxldGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUsIGRlbGV0ZWQ6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlQWxsRG9jcygpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSkudGhlbihhbGxEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbERvY3Mucm93cy5maWx0ZXIocm93ID0+ICFyb3cuaWQuc3RhcnRzV2l0aChcIkNUSVZPU1wiKSkubWFwKGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWxpbWluYSBkZWwgTG9nIGxvcyBkb2NzIGNvbiBmZWNoYSBhbnRlcmlvciBvIGlndWFsIGEge3ttYXhEaWFzfX0gZGUgbGEgZmVjaGEgYWN0dWFsXHJcbiAgICAgKiBTZSBjb25jYXRlbmEgXCIgIDAwOjAwXCIgYSBsYSBmZWNoYSBwb3IgdW4gZXJyb3IgZW4gbGEgZnVuY2lvbmFsaWRhZCBkZSBcIm5ldyBEYXRlKClcIlxyXG4gICAgICogU2UgdXRpbGl6YSAoMTAwMCAqIDM2MDAgKiAyNCkgcGFyYSBjYWxjdWxhciBlbCBudW1lcm8gZGUgbWlsaXNlZ3VuZG9zIGVuIHVuIGTDg8KtYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRGVsZXRlT2xkRG9jcyhtYXhEaWFzOm51bWJlcikge1xyXG4gICAgICAgIC8vbGV0IG1heERpYXMgPSAzO1xyXG5cclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiRGVsZXRlT2xkRG9jc1wiKVxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGFsbERvY3MpXHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9nU29ja2V0KGFsbERvY3MpO1xyXG4gICAgICAgICAgICBhbGxEb2NzLnJvd3MuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoZWxlbWVudC5kb2MuRmVjaGEpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhlbGVtZW50LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG5ldyBEYXRlKGVsZW1lbnQuZG9jLkZlY2hhLnN1YnN0cmluZygwLCAxMCkgKyBcIiAgMDA6MDBcIikpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKERhdGUubm93KCkgLSBuZXcgRGF0ZShlbGVtZW50LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpLmdldFRpbWUoKSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoKERhdGUubm93KCkgLSBuZXcgRGF0ZShlbGVtZW50LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpLmdldFRpbWUoKSkgLyAoMTAwMCAqIDM2MDAgKiAyNCkpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLmZpbHRlcihyb3cgPT4gTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIG5ldyBEYXRlKHJvdy5kb2MuRmVjaGEuc3Vic3RyaW5nKDAsIDEwKSArIFwiICAwMDowMFwiKS5nZXRUaW1lKCkpIC8gKDEwMDAgKiAzNjAwICogMjQpKSA+PSBtYXhEaWFzKVxyXG4gICAgICAgICAgICAubWFwKCByb3cgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9MbGFtYXIgc29ja2V0LiBcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5idWxrRG9jcyhkZWxldGVEb2NzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEFkZExvZ1NvY2tldChvbE0zUHJvY2Vzb3M6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJhbXM6IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIHBhcmFtcyA9IFt7IFwibm9tYnJlXCI6IFwiTTNQcm9jZXNvXCIsIFwidmFsb3JcIjogSlNPTi5zdHJpbmdpZnkob2xNM1Byb2Nlc29zKSB9XTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub00zRGV2aWNlc1NlcnZpY2UuRGV2aWNlX01Qb3ModGhpcy5BZGRMb2dTb2NrZXRPSywgcGFyYW1zLCBcIkxPR00zUHJvY2Vzb3NcIiwgbnVsbClcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBZGRMb2dTb2NrZXRPSyA9KCk9PntcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBEZWxldGUoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiXHJcbmltcG9ydCB7IHZhcmlhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbXBpbGVyL3NyYy9vdXRwdXQvb3V0cHV0X2FzdFwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4uL1NlcnZpY2VzL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFueUFSZWNvcmQgfSBmcm9tIFwiZG5zXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zTWFlc3Ryb09mZmxpbmUge1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBmb3JtYXMgZGUgcGFnb1xyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIElkIGRlIGxhIEVtcHJlc2EgXHJcbiAgICAgKiBAcGFyYW0gcmVzcE9rX2dldF9mb3JtYXNfcGFnbyBGdW5jaW9uIGNvbiByZXNwdWVzdGEgT0tcclxuICAgICAqIEBwYXJhbSByZXNwRXJyb3JfZ2V0X2Zvcm1hc19wYWdvIEZ1bmNpb24gY29uIHJlc3B1ZXN0YSBFUlJPUlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0Rm9ybWFzUGFnbyhpZEthdGlvcywgaWRQcm9jZXNvOiBzdHJpbmcsIHJlc3BPa19nZXRfZm9ybWFzX3BhZ286IEZ1bmN0aW9uLCByZXNwRXJyb3JfZ2V0X2Zvcm1hc19wYWdvOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChcIkZvcm1hc1BhZ29cIikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coeCk7XHJcblxyXG4gICAgICAgICAgICByZXNwT2tfZ2V0X2Zvcm1hc19wYWdvKHRoaXMuRmlsdHJhckJ5UHJvY2VzbyhpZFByb2Nlc28sIHguRm9ybWFzUGFnbykpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgcmVzcEVycm9yX2dldF9mb3JtYXNfcGFnbyhlcnJvcik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbHRyYXIgbGFzIGZvcm1hcyBkZSBwYWdvLCBkZXBlbmRpZW5kbyBsYSBpbmZvcm1hY2lvbiBkZWwgcHJvY2Vzby5cclxuICAgICAqIEBwYXJhbSBpZFByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gZm9ybWFzUGFnbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZpbHRyYXJCeVByb2Nlc28oaWRQcm9jZXNvOiBzdHJpbmcsIGZvcm1hc1BhZ286IEFycmF5PGFueT4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhmb3JtYXNQYWdvKTtcclxuICAgICAgICAgICAgaWYgKGlkUHJvY2VzbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtYXNQYWdvID0gZm9ybWFzUGFnby5maWx0ZXIoeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHguUFJPQ0VTT1MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF4LlBST0NFU09TLmxlbmd0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguUFJPQ0VTT1MgPSBuZXcgQXJyYXk8YW55Pih4LlBST0NFU09TKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHguUFJPQ0VTT1MuZmluZCh5ID0+IHkuSWRQcm9jZXNvID09IGlkUHJvY2VzbykgIT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGZvcm1hc1BhZ28pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBGaWx0cmFyQnlQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXNQYWdvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcm1hc1BhZ287XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEVzdHJ1Y3R1cmEoZXN0OnN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoZXN0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZGluw4PCoW1pY2FzIHBvciBhY3RpdmlkYWRcclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBJZCBkZSBsYSBlbXByZXNhXHJcbiAgICAgKiBAcGFyYW0gTG9hZERpbmFtaWNhc09LIEZ1bmNpb24gZGUgcmVzcHVlc3RhIE9LXHJcbiAgICAgKiBAcGFyYW0gTG9hZERpbmFtaWNhc0Vycm9yIEZ1bmNpb24gZGUgcmVzcHVlc3RhIEVSUk9SXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXREaW5hbWljYXNCeUFDdGl2aWRhZChpZEthdGlvcywgb0RhdGEsIExvYWREaW5hbWljYXNPSzogRnVuY3Rpb24sIExvYWREaW5hbWljYXNFcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgZGluYW1cclxuICAgICAgICB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoXCJESU5CWUFDVFwiKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZGluYW0gPSB4Lk0zRGluQnlBY3RpdmlkYWQ7XHJcbiAgICAgICAgICAgICAgICBkaW5hbSA9IGRpbmFtLmZpbHRlcih4ID0+IHguQWN0aXZpZGFkID09IG9EYXRhLkFjdGl2aWRhZCAmJiB4LklEQWN0aXZpZGFkID09IG9EYXRhLmlkQWN0aXZpZGFkICYmIHguSWRQcm9jZXNvID09IG9EYXRhLmlkUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICBMb2FkRGluYW1pY2FzT0soZGluYW0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoe1xyXG4gICAgICAgICAgICAgICAgZGluYW0gPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICAgICAgTG9hZERpbmFtaWNhc09LKGRpbmFtKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIExvYWREaW5hbWljYXNFcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgdWJpY2FjaW9uZXNcclxuICAgICAqIEBwYXJhbSBzSWRVYmljYWNpb25lcyBJZCBkZSBsYSB1YmljYWNpb24gYSBidXNjYXIgZW4gYmFzZSBkZSBkYXRvcyBOb1NRTFxyXG4gICAgICogQHBhcmFtIG9TZXJ2aWNlTTNNYWVzdHJvIFNlcnZpY2lvIG1hZXN0cm8sIGVzdGEgdGllbmUgZnVuY2lvbmFsaWRhZCBwYXJhIGJ1c2NhciBlc3BlY2lmaWNhbWVudGUgdW4gdWJpY2FjaW9uXHJcbiAgICAgKiBAcGFyYW0gRnVuY2lvbk9LIEZ1bmNpb24gcXVlIHJldG9tYSBsYSBmdW5jaW9uYWxpZGFkIGN1YW5kbyBlcyBPSy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldFViaWNhY2lvbmVzKGlka2F0aW9zOiBzdHJpbmcsIHNJZFViaWNhY2lvbmVzOiBzdHJpbmcsIG9TZXJ2aWNlTTNNYWVzdHJvOiBTZXJ2aWNlTTNNYWVzdHJvLCBGdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9DYXJnYXIgaW5mb3JtYWNpb24gZGUgdWJpY2FjaW9uXHJcbiAgICAgICAgdmFyIG9NM1ViaWNhY2lvbjtcclxuICAgICAgICB2YXIgc0lkVWJpY2FjaW9uZXNDb3VjaCA9IGlka2F0aW9zLnRyaW0oKS50b1VwcGVyQ2FzZSgpICsgXCI/VUJJQ1wiOztcclxuICAgICAgICB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoc0lkVWJpY2FjaW9uZXNDb3VjaCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBvTTNVYmljYWNpb24gPSBvU2VydmljZU0zTWFlc3Ryby5HZXRVYmljYWNpb25Gcm9tTGlzdChyZXN1bHQuTGlzdFViaWNhY2lvbmVzLk0zVUJJQ0FDSU9OLCBzSWRVYmljYWNpb25lcyk7XHJcbiAgICAgICAgICAgIEZ1bmNpb25PSyhvTTNVYmljYWNpb24pO1xyXG5cclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICBcclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIE9idGVuZXIgbGEgaW5mb3JtYWNpb24gZGUgbGFzIHByb21vY2lvbmVzXHJcbiAgICAvLyAgKiBAcGFyYW0gc0lEUHJvbW8gSWQgZGUgbGEgcHJvbW9jaW9uIGEgYnVzY2FyIGVuIGJhc2UgZGUgZGF0b3MgTm9TUUxcclxuICAgIC8vICAqIEBwYXJhbSBGdW5jaW9uT0sgRnVuY2lvbiBxdWUgcmV0b21hIGxhIGZ1bmNpb25hbGlkYWQgY3VhbmRvIGVzIE9LLlxyXG4gICAgLy8gICovXHJcbiAgICAvLyBwdWJsaWMgR2V0UHJvbW9jaW9uZXMoaWRrYXRpb3M6IHN0cmluZywgRnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgLy8gICAgIHZhciBMaXN0UHJvbW87XHJcbiAgICAvLyAgICAgdmFyIHNJRFByb21vID0gaWRrYXRpb3MudHJpbSgpLnRvVXBwZXJDYXNlKCkgKyBcIj9Qcm9tb2Npb25lc1wiO1xyXG4gICAgLy8gICAgIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChzSURQcm9tbykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgLy8gICAgICAgICBpZihyZXN1bHQuTTNFTkNQUk9NTyl7XHJcbiAgICAvLyAgICAgICAgICAgICBMaXN0UHJvbW8gPSByZXN1bHQuTTNFTkNQUk9NTztcclxuICAgIC8vICAgICAgICAgfWVsc2UgaWYocmVzdWx0Lk0zTGlzdEVOQ1BST01PLk0zRU5DUFJPTU8pe1xyXG4gICAgLy8gICAgICAgICAgICAgTGlzdFByb21vID0gcmVzdWx0Lk0zTGlzdEVOQ1BST01PLk0zRU5DUFJPTU87XHJcbiAgICAvLyAgICAgICAgIH1lbHNle1xyXG4gICAgLy8gICAgICAgICAgICAgTGlzdFByb21vID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBGdW5jaW9uT0soTGlzdFByb21vKTtcclxuICAgIC8vICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbGEgaW5mb3JtYWNpb24gc2luY3LDg8KzbmljYW1lbnRlIGRlIHRlbXBsYXRlLiBzZWd1biBlbCByZXBvcnRlIGVudHJhbnRlIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgQXN5bmNnZXRfdGVtcGxhdGVfcmVwb3J0ZShpZGthdGlvczogc3RyaW5nLCBpZHJlcCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZTtcclxuICAgICAgICAgICAgLy92YXIgc0lEID0gaWRrYXRpb3MudHJpbSgpLnRvVXBwZXJDYXNlKCkgKyBcIj9UZW1wbGF0ZXNcIjtcclxuICAgICAgICAgICAgdmFyIHNJRCA9IFwiVEVNUExBVEVTXCI7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlID0gYXdhaXQgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KHNJRCk7XHJcbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5SRVNQVUVTVEEuUlBUZW1wbGF0ZS5sZW5ndGggPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IG5ldyBBcnJheTxhbnk+KHRlbXBsYXRlLlJFU1BVRVNUQS5SUFRlbXBsYXRlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuUkVTUFVFU1RBLlJQVGVtcGxhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8vU2UgY3JlYW4gbG9zIG5vZG9zIHBhZHJlIFJFU1BVRVNUQSB5IFJQVGVtcGxhdGUsIHBhcmEgc2ltdWxhciBpZ3VhbCwgY29tbyBsbyByZXNwb25kZSBzZXJ2aWRvci5cclxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlVW5vID0geyBcIlJFU1BVRVNUQVwiOiB7IFwiUlBUZW1wbGF0ZVwiOiB0ZW1wbGF0ZS5maW5kKHQgPT4gdC5JZFJlcCA9PSBpZHJlcCkgfSB9O1xyXG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVVbm87XHJcbiAgICAgICAgfSBjYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG59ICAgIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VPZmZMaW5lIH0gZnJvbSBcIi4vU2VydmljZS9iZC1vZmZsaW5lLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi4vU2VydmljZXMvbTMtcmVnLXNlcnZpY2VcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi4vU2VydmljZXMvTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgYmRPZmZMaW5lTG9nIH0gZnJvbSBcIi4vU2VydmljZS9iZC1vZmZsaW5lLWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTTNQcm9jZXNvc09mZmxpbmUge1xyXG5cclxuICAgIC8vcHJpdmF0ZSBzS2V5Q3Rpdm9zOiBzdHJpbmcgPSBcIkNUSVZPU1wiO1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvU2VydmljZU9mZkxpbmU6IFNlcnZpY2VPZmZMaW5lLCBwcml2YXRlIG9Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLFxyXG4gICAgICAgIHByaXZhdGUgb2JkT2ZmTGluZUxvZzogYmRPZmZMaW5lTG9nKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBNM1Byb2Nlc29zLCBzZWd1biBlbCBJRCBNM1xyXG4gICAgICogQHBhcmFtIGlkIElkIGRlbCBNb3RvciAzXHJcbiAgICAgKiBAcGFyYW0gUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zIFJlc3B1ZXN0YSBPSyBkZSBnZXQgZGUgTTMgcHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBSZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3MgUmVzcHVlc3RhIEVycm9yIGRlIGdldCBkZSBNMyBwcm9jZXNvc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0UHJvY2Vzb0J5SWQoaWQsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24sIFJlc3BvbnNlRXJyb3JMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL0pBR00gMjAxOTExMDggY2FtYmlvIGRlIGRvbmRlIHRyYWVyIGVsIHByb2Nlc28gbG8gdHJhZSBkZXNkZSBvZmZsaW5lXHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KGlkKS50aGVuKHByb2Nlc28gPT4ge1xyXG4gICAgICAgICAgICAvL3RoaXMub2JkT2ZmTGluZUxvZy5nZXQoaWQpLnRoZW4ocHJvY2VzbyA9PiB7XHJcbiAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhwcm9jZXNvKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIC8vUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zKGVycm9yKTtcclxuICAgICAgICAgICAgdGhpcy5HZXRQcm9jZXNvQnlJZEZyb21Mb2coaWQsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcywgUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldFByb2Nlc29CeUlkRnJvbUxvZyhpZCwgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MTEwOCBjYW1iaW8gZGUgZG9uZGUgdHJhZXIgZWwgcHJvY2VzbyBsbyB0cmFlIGRlc2RlIG9mZmxpbmVcclxuICAgICAgICAvL3RoaXMub1NlcnZpY2VPZmZMaW5lLmdldChpZCkudGhlbihwcm9jZXNvID0+IHtcclxuICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuZ2V0KGlkKS50aGVuKHByb2Nlc28gPT4ge1xyXG4gICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MocHJvY2Vzbyk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBSZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3MoZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIE0zIFByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gaWQgSWQgZGVsIE0zIFByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvbE0zUHJvY2Vzb3MgT2JqZXRvIE0zIFByb2Nlc29zIGEgYWdyZWdhclxyXG4gICAgICogQHBhcmFtIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyBGdW5jaW9uIE9LIHJlc3B1ZXN0YSBxdWUgYXRyYXBhcsODwqEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRQcm9jZXNvKGlka2F0aW9zOiBzdHJpbmcsIG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBpZiAob2xNM1Byb2Nlc29zLklkTTMpIHtcclxuICAgICAgICAgICAgdGhpcy5BZGRUb0RvY09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0SWRNM09mZmxpbmUoaWRrYXRpb3MsIG9sTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbywgb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcy5JREh1Yi50b1N0cmluZygpKS50aGVuKGlkID0+IHtcclxuICAgICAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5JZE0zID0gaWQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZFRvRG9jT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQWRkVG9Eb2NPZmZsaW5lKG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgaW50ZW50byA9IDApIHtcclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5BZGREb2N1bWVudChvbE0zUHJvY2Vzb3MuSWRNMy50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuU2F2ZUlkTTMob2xNM1Byb2Nlc29zLklkTTMsIG9sTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbywgb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcy5JREh1Yi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5BZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuU2F2ZUlkTTMob2xNM1Byb2Nlc29zLklkTTMsIG9sTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbywgb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcy5JREh1Yi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgLy8gICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhvbE0zUHJvY2Vzb3MuSWRNMyk7XHJcbiAgICAgICAgICAgIC8vIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyk7XHJcblxyXG4gICAgICAgICAgICAvL1Jlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhvbE0zUHJvY2Vzb3MuSWRNMyk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZXJyb3JMb2dcIiArIHNGZWNoYU5vdywgSlNPTi5zdHJpbmdpZnkoeyBcImVycm9yXCI6IGVycm9yLCBcIm9sTTNQcm9jZXNvc1wiOiBvbE0zUHJvY2Vzb3MsIFwiSW50ZW50b1wiOiBpbnRlbnRvLCBcImZ1bmN0aW9uXCI6IFwiQWRkVG9Eb2NPZmZsaW5lXCIgfSkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZW50byA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuSW5zdGFuY2VBZ2FpbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRUb0RvY09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MsIDEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKHsgXCJFcnJvclwiOiBcIkVycm9yIGVuIGd1YXJkYXIgZW4gYmFzZSBkZSBkYXRvcyBwY3BhbC5cIiB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgbG9nIG9mZmxpbmUgZGUgcHJvY2Vzb3MuXHJcbiAgICAgKiBAcGFyYW0gb2xNM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24sIGludGVudG86IG51bWJlciA9IDApIHtcclxuICAgICAgICAvL0FncmVnYXIgYSBMb2cgU29ja2V0XHJcbiAgICAgICAgLy90aGlzLkFkZExvZ1NvY2tldChvbE0zUHJvY2Vzb3MpXHJcbiAgICAgICAgLy9yZXR1cm4gdGhpcy5vYmRPZmZMaW5lTG9nLkFkZERvY3VtZW50KG9sTTNQcm9jZXNvcy5JZE0zLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcylcclxuICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuQWRkRG9jdW1lbnQob2xNM1Byb2Nlc29zLklkTTMudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh4KTtcclxuICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKG9sTTNQcm9jZXNvcy5JZE0zKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiZXJyb3JcIjogZXJyb3IsIFwib2xNM1Byb2Nlc29zXCI6IG9sTTNQcm9jZXNvcywgXCJJbnRlbnRvXCI6IGludGVudG8sIFwiZnVuY3Rpb25cIjogXCJBZGRMb2dPZmZsaW5lXCIgfSkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZW50byA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuSW5zdGFuY2VBZ2FpbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zLCAxKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyh7IFwiRXJyb3JcIjogXCJFcnJvciBlbiBndWFyZGFyIGVuIGJhc2UgZGUgZGF0b3MgbG9jYWwuXCIgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBBZGRMb2dTb2NrZXRPSyA9ICgpID0+IHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsb3NlSW5zdGFuY2VMb2dPZmYoKSB7XHJcbiAgICAgICAgdGhpcy5vYmRPZmZMaW5lTG9nLmNsb3NlSW5zdGFuY2UoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldE9mZkxpbmVMb2coKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub2JkT2ZmTGluZUxvZy5HZXRBbGxEb2NzKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXQxRG9jT2ZmTGluZUxvZyhpZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9iZE9mZkxpbmVMb2cuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldmVyc2FyIG0zIHByb2Nlc28sIGVuIGVsIGxvZyBsb2NhbC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFJldmVyc2FyRW5Mb2coaWQpIHtcclxuICAgICAgICB0aGlzLkdldDFEb2NPZmZMaW5lTG9nKGlkKS50aGVuKG9NM1AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb1Jlc3VsdDogTTNQcm9jZXNvcyA9IG9NM1A7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb1Jlc3VsdC5sTTNQRW5jRlAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9SZXN1bHQubE0zUEVuY0ZQW2ldLlZhbENhbWJpbyA9IDA7XHJcbiAgICAgICAgICAgICAgICBvUmVzdWx0LmxNM1BFbmNGUFtpXS5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICBvUmVzdWx0LmxNM1BFbmNGUFtpXS5WYWxPdHJhQ2xhc2kgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9SZXN1bHQuSWRFc3RhZG8gPSBcIlJWXCI7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9nT2ZmbGluZShvUmVzdWx0LCBudWxsKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdHJ1aXJCRExvZyhmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vYmRPZmZMaW5lTG9nLkRlc3Ryb3koZnVuY2lvblJlc3ApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cnVpckJET2ZmKGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZXN0cm95KGZ1bmNpb25SZXNwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU3VtYXJDdGl2byhpZG0zOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyB2YXIgc1BhcnQxO1xyXG4gICAgICAgIC8vIHZhciBzUGFydDI7XHJcblxyXG4gICAgICAgIC8vIHNQYXJ0MSA9IGlkbTMuc3Vic3RyaW5nKDAsIDgpO1xyXG4gICAgICAgIC8vIHNQYXJ0MiA9IGlkbTMuc3Vic3RyaW5nKDgsIGlkbTMubGVuZ3RoKTtcclxuICAgICAgICAvLyBzUGFydDIgPSArc1BhcnQyICsgMTtcclxuICAgICAgICAvLyBpZG0zID0gc1BhcnQxICsgc1BhcnQyO1xyXG4gICAgICAgIC8vIHJldHVybiBpZG0zO1xyXG4gICAgICAgIHZhciBzUGFydDE7XHJcbiAgICAgICAgdmFyIHNQYXJ0MjtcclxuICAgICAgICBzUGFydDEgPSBpZG0zLnN1YnN0cmluZygwLCA5KTtcclxuICAgICAgICBzUGFydDIgPSBpZG0zLnN1YnN0cmluZyg5KTtcclxuICAgICAgICBzUGFydDIgPSArc1BhcnQyICsgMTtcclxuICAgICAgICBpZG0zID0gc1BhcnQxICsgXCJcIiArIHNQYXJ0MjtcclxuICAgICAgICByZXR1cm4gaWRtMztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdHVhbGl6YXIgZWwgTTMgUHJvY2Vzb3MsIHRlbmllbmRvIGVsIElkIGRlbCBkb2N1bWVudG8gZ3VhcmRhZG8gZW4gbGEgQkQgTm9TUUxcclxuICAgICAqIEBwYXJhbSBpZCBJZCBkZWwgZG9jdW1lbnRvIEJkIE5vU1FMXHJcbiAgICAgKiBAcGFyYW0gb2xNM1Byb2Nlc29zIE0zIFByb2Nlc29zIGEgYWxtYWNlbmFyIC8gQWN0dWFsaXphclxyXG4gICAgICogQHBhcmFtIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyBSZXNwdWVzdGEgZGUgT0suXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRQcm9jZXNvKGlkLCBvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24sIGludGVudG8gPSAwKSB7XHJcblxyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkFkZERvY3VtZW50KGlkLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgLy9SZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MoaWQpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiZXJyb3JcIjogZXJyb3IsIFwib2xNM1Byb2Nlc29zXCI6IG9sTTNQcm9jZXNvcywgXCJJbnRlbnRvXCI6IGludGVudG8sIFwiZnVuY3Rpb25cIjogXCJ1cGRQcm9jZXNvXCIgfSkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZW50byA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuSW5zdGFuY2VBZ2FpbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRQcm9jZXNvKGlkLCBvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcywgMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MoeyBcIkVycm9yXCI6IFwiRXJyb3IgZW4gZ3VhcmRhciBlbiBiYXNlIGRlIGRhdG9zIHBjcGFsLlwiIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemFyIGVsIE0zIFByb2Nlc29zLCB0ZW5pZW5kbyBlbCBJZCBkZWwgZG9jdW1lbnRvIGd1YXJkYWRvIGVuIGxhIEJEIE5vU1FMXHJcbiAgICAgKiBAcGFyYW0gaWQgSWQgZGVsIGRvY3VtZW50byBCZCBOb1NRTFxyXG4gICAgICogQHBhcmFtIG9sTTNQcm9jZXNvcyBNMyBQcm9jZXNvcyBhIGFsbWFjZW5hciAvIEFjdHVhbGl6YXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIHVwZFByb2Nlc29Bc3luYyhpZCwgb2xNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuQWRkRG9jdW1lbnQoaWQudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zKTtcclxuICAgICAgICB0aGlzLkFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zLCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc09mZkxpbmVTaW5Eb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5HZXRBbGxEb2NzT2ZmTGluZVNpbkRvY3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNhclRpY2tldE9mZmxpbmUoaWRrYXRpb3MsIHByb2Nlc28sIG9EYXRhVXNlcjogYW55LCBmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgbE0zUHJvY2Vzb3MgPSBuZXcgQXJyYXk8TTNQcm9jZXNvcz4oKTtcclxuICAgICAgICB2YXIgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgaWRrYXRpb3MpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5WYWxpZGFyVGlja2V0Q2VycmFkbyhwcm9jZXNvKSkge1xyXG4gICAgICAgICAgICBsTTNQcm9jZXNvcy5wdXNoKHByb2Nlc28pO1xyXG5cclxuICAgICAgICAgICAgb00zUmVnU2VydmljZS5SZWdpc3Ryb0V2ZW50b00zT2ZmTGluZShpZGthdGlvcywgdGhpcy5vUG9zdFNlcnZpY2VNMywgbE0zUHJvY2Vzb3MsIG9EYXRhVXNlcikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AodHJ1ZSwgXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIFwiT0tcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHByb2Nlc29zIHF1ZSBzZSBwcm9jZXNhcm9uIG1pZW50cmFzIHNlIGVzdGFiYSBmdWVyYSBkZSBsaW5lYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclByb2Nlc29zQWdyZWdhZG9zT2ZmTGluZShpZGthdGlvcywgb0RhdGFVc2VyOiBhbnksIGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJFbnRybyBWYWxpZGFyUHJvY2Vzb3NBZ3JlZ2Fkb3NPZmZMaW5lXCIpXHJcbiAgICAgICAgdmFyIGxNM1Byb2Nlc29zID0gbmV3IEFycmF5PE0zUHJvY2Vzb3M+KCk7XHJcbiAgICAgICAgdmFyIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIGlka2F0aW9zKTtcclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5HZXRBbGxEb2NzKCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAvLyBoYW5kbGUgcmVzdWx0XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0LnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucm93c1tpXS5pZCAmJiAhcmVzdWx0LnJvd3NbaV0uaWQuc3RhcnRzV2l0aChcIkNUSVZPU1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtM1Byb2Nlc286IE0zUHJvY2Vzb3MgPSByZXN1bHQucm93c1tpXS5kb2M7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVmFsaWRhclRpY2tldENlcnJhZG8obTNQcm9jZXNvKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsTTNQcm9jZXNvcy5wdXNoKHJlc3VsdC5yb3dzW2ldLmRvYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJBbnRlcyBSZWdpc3Ryb0V2ZW50b00zT2ZmTGluZVwiKVxyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lKGlka2F0aW9zLCB0aGlzLm9Qb3N0U2VydmljZU0zLCBsTTNQcm9jZXNvcywgb0RhdGFVc2VyKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJEaW8gUmVzcHVlc3RhIFJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lXCIpXHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh4KVxyXG4gICAgICAgICAgICAgICAgaWYgKHgpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiaWYgMVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkRlbGV0ZUFsbERvY3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcCh0cnVlLCBcIk9LXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiaWYgMlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vUmVzcHVlc3RhIGNvbiBlcnJvcmVzXHJcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZWxldGVBbGxEb2NzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIFwiT0tcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2lvbiBkZSBxdWUgZWwgdGlja2V0IGVzdGEgY2VycmFkby5cclxuICAgICAqIEBwYXJhbSBtM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyVGlja2V0Q2VycmFkbyhtM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgYkNlcnJhZG86IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGlmIChtM1Byb2Nlc28uTTNFTkMgIT0gbnVsbCAmJiBtM1Byb2Nlc28ubE0zUEVuY0ZQICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKG0zUHJvY2VzbyAmJiBtM1Byb2Nlc28uU3ViRXN0YWRvQW50ICE9IFwiRGVjbGluYWRvXCIgJiYgbTNQcm9jZXNvLk0zRU5DLmxlbmd0aCA+IDAgJiYgbTNQcm9jZXNvLmxNM1BFbmNGUC5sZW5ndGggPT0gMCAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDYW50aWRhZFRvdGFsQnlNM1Byb2Nlc28obTNQcm9jZXNvKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGJDZXJyYWRvID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGJDZXJyYWRvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYkNlcnJhZG87XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsQnlNM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgJiYgb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZCA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChkQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHRvZG9zIGxvcyBkb2N1bWVudG9zIE9mZiBsaW5lIHF1ZSBzZSBoYW4gZ3VhcmRhZG8gY29tbyBvZmZsaW5lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0QWxsRG9jc09mZmxpbmUoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGxNM1Byb2Nlc29zID0gbmV3IEFycmF5PE0zUHJvY2Vzb3M+KCk7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5HZXRBbGxEb2NzKCk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0LnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucm93c1tpXS5pZCAhPSBcIkNUSVZPU1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbE0zUHJvY2Vzb3MucHVzaChyZXN1bHQucm93c1tpXS5kb2MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBsTTNQcm9jZXNvcztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdG9kb3MgbG9zIGRvY3VtZW50b3MgT2ZmIGxpbmUgcXVlIHNlIGhhbiBndWFyZGFkbyBjb21vIG9mZmxpbmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRBbGxEb2NzT2ZmbGluZURlbGV0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub1NlcnZpY2VPZmZMaW5lLkdldEFsbERvY3NEZWxldGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZUN0aXZvcyh1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMub1NlcnZpY2VPZmZMaW5lLkRlbGV0ZSh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YikpXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFsbEN0aXZvcyh1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbG9zIGNvbnNlY3V0aXZvcyBxdWUgZXN0YW4gbG9jYWxtZW50ZSB2cyBsb3MgcXVlIGVzdGFuIGVuIGVsIHNlcnZpZG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhY2lvbkN0aXZvc1ZTU2VydmVyKGlrYXRpb3M6IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGlkSHViOiBzdHJpbmcsIGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMuZ2V0QWxsQ3Rpdm9zKHViaWNhY2lvbiwgaWRIdWIpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh4KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgICAgICAgICAgb1NlcnZpY2VNM01hZXN0cm8uVmFsaWRhckN0aXZvc1ZTTG9jYWwodGhpcy5vUG9zdFNlcnZpY2VNMywgaWthdGlvcywgSlNPTi5zdHJpbmdpZnkoeCksIHViaWNhY2lvbiwgaWRIdWIsIGZ1bmNpb25SZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGVsIGNvbnNlY3V0aXZvIGVuIGVsIHF1ZSB2YSwgZWwgcHJvY2VzbyBvZmZsaW5lIHF1ZSByZWNpYmUgY29tbyBwYXJhbWV0cm9cclxuICAgICAqIEBwYXJhbSB1YmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaHViIFxyXG4gICAgICogQHBhcmFtIHNJZFByb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBHZXRDdGl2b09mZkxpbmUodWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgY3Rpdm86IHN0cmluZyA9IFwiMFwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YSA9IGF3YWl0IHRoaXMub1NlcnZpY2VPZmZMaW5lLmdldCh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YikpO1xyXG4gICAgICAgICAgICBpZiAob0RhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvRGF0YUZpbmRlZDogYW55ID0gb0RhdGEuQ3Rpdm9zLmZpbmQoeCA9PiB4LklkUHJvY2VzbyA9PSBzSWRQcm9jZXNvKTtcclxuICAgICAgICAgICAgICAgIGlmIChvRGF0YUZpbmRlZC5DdGl2bykge1xyXG4gICAgICAgICAgICAgICAgICAgIGN0aXZvID0gb0RhdGFGaW5kZWQuQ3Rpdm8uc3Vic3RyaW5nKDkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7IH1cclxuICAgICAgICByZXR1cm4gY3Rpdm87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGFyIGlkIG0zIFxyXG4gICAgICogQHBhcmFtIHNJZE0zIFxyXG4gICAgICogQHBhcmFtIHNJZFByb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlSWRNMyhzSWRNMzogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLmdldCh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YikpLnRoZW4oZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YTogQXJyYXk8YW55PiA9IGRhdGEuQ3Rpdm9zO1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFGaW5kZWQ6IGFueSA9IG9EYXRhLmZpbmQoeCA9PiB4LklkUHJvY2VzbyA9PSBzSWRQcm9jZXNvKTtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3Rpdm9BbnQgPSArb0RhdGFGaW5kZWQuQ3Rpdm8uc3Vic3RyaW5nKDkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGN0aXZvQWN0ID0gK3NJZE0zLnN1YnN0cmluZyg5KTtcclxuICAgICAgICAgICAgICAgIGlmIChjdGl2b0FjdCA+IGN0aXZvQW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0RhdGFGaW5kZWQuQ3Rpdm8gPSBzSWRNMztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9EYXRhLnB1c2goeyBcIklkUHJvY2Vzb1wiOiBzSWRQcm9jZXNvLCBcIkN0aXZvXCI6IHNJZE0zIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5TYXZlQ3Rpdm9zKG9EYXRhLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgICAgIGlmIChzSWRQcm9jZXNvLnRvVXBwZXJDYXNlKCkgPT0gXCJUSUNLRVRWRU5UQVwiKSB7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkN0aXZvVGlja2V0VmVudGFcIiwgc0lkTTMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb0RhdGEgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICBvRGF0YS5wdXNoKHsgXCJJZFByb2Nlc29cIjogc0lkUHJvY2VzbywgXCJDdGl2b1wiOiBzSWRNMyB9KVxyXG4gICAgICAgICAgICB0aGlzLlNhdmVDdGl2b3Mob0RhdGEsIHViaWNhY2lvbiwgaHViKTtcclxuICAgICAgICAgICAgaWYgKHNJZFByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIlRJQ0tFVFZFTlRBXCIpIHtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiQ3Rpdm9UaWNrZXRWZW50YVwiLCBzSWRNMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgY3Rpdm9zLCBJZG0zLlxyXG4gICAgICogQHBhcmFtIG9EYXRhIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFNhdmVDdGl2b3Mob0RhdGE6IEFycmF5PGFueT4sIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZywgaW50ZW50byA9IDApIHtcclxuICAgICAgICB2YXIgb0RhdGFTZW5kID0geyBcIkN0aXZvc1wiOiBvRGF0YSB9XHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuQWRkRG9jdW1lbnQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpLCBvRGF0YVNlbmQpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiT0tcIik7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB2YXIgc0ZlY2hhTm93OiBzdHJpbmcgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZTU1ERFRISG1tc3MnKVxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVycm9yTG9nQ3Rpdm9zXCIgKyBzRmVjaGFOb3csIEpTT04uc3RyaW5naWZ5KHsgXCJlcnJvclwiOiBlcnJvciwgXCJDdGl2b3NcIjogb0RhdGFTZW5kLCBcImZ1bmN0aW9uXCI6IFwiU2F2ZUN0aXZvc1wiIH0pKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZW50byA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNhdmVDdGl2b3Mob0RhdGEsIHViaWNhY2lvbiwgaHViLCAxKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlbGV0ZU9sZERvY3MobWF4RGlhczogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5vYmRPZmZMaW5lTG9nLkRlbGV0ZU9sZERvY3MobWF4RGlhcylcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIElkIG0zLCBjdWFuZG8gZXN0YSBmdWVyYSBkZSBsaW5lYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0SWRNM09mZmxpbmUoaWRrYXRpb3M6IHN0cmluZywgaWRwcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRGF0YUlkTTM7XHJcbiAgICAgICAgdmFyIGlkTTM7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb0RhdGFJZE0zID0gYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSk7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YUZpbmRlZDogYW55ID0gb0RhdGFJZE0zLkN0aXZvcy5maW5kKHggPT4geC5JZFByb2Nlc28gPT0gaWRwcm9jZXNvKTtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gb0RhdGFGaW5kZWQuQ3Rpdm87XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5TdW1hckN0aXZvKGlkTTMpO1xyXG4gICAgICAgICAgICAgICAgaWRNMyA9IHRoaXMudmFsaWRhckF1bWVudG9DdGl2byhpZE0zLCBpZHByb2Nlc28pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWRNMyA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkYXRlLmdldE1vbnRoKCkgKyBcIlwiICsgZGF0ZS5nZXREYXkoKSArIFwiXCIgKyBkYXRlLmdldEhvdXJzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaW51dGVzKCkgKyBcIlwiICsgZGF0ZS5nZXRTZWNvbmRzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5HZXRDdGl2byhpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAvLyBpZE0zID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRhdGUuZ2V0TW9udGgoKSArIFwiXCIgKyBkYXRlLmdldERheSgpICsgXCJcIiArIGRhdGUuZ2V0SG91cnMoKSArIFwiXCIgKyBkYXRlLmdldE1pbnV0ZXMoKSArIFwiXCIgKyBkYXRlLmdldFNlY29uZHMoKSArIFwiXCIgKyBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgICAgICBpZE0zID0gdGhpcy5HZXRDdGl2byhpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpZE0zO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB2YWxpZGFyQXVtZW50b0N0aXZvKGlkTTMsIGlkcHJvY2Vzbykge1xyXG4gICAgICAgIGlmIChpZHByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIlRJQ0tFVFZFTlRBXCIpIHtcclxuICAgICAgICAgICAgbGV0IHVsdGltb0lkTTMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkN0aXZvVGlja2V0VmVudGFcIik7XHJcbiAgICAgICAgICAgIGlmICh1bHRpbW9JZE0zID09IGlkTTMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5TdW1hckN0aXZvKGlkTTMpO1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ0N0aXZvc1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiaWRNM1wiOiBpZE0zLCBcImZ1bmN0aW9uXCI6IFwidmFsaWRhckF1bWVudG9DdGl2b1wiIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaWRNMztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIEdldEN0aXZvKGlka2F0aW9zOiBzdHJpbmcsIGlkcHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgIHZhciBzQ3Rpdm87XHJcbiAgICAgICAgc0N0aXZvID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uR2V0Q3Rpdm9CWVByb2Nlc28odGhpcy5vUG9zdFNlcnZpY2VNMywgaWRrYXRpb3MsIGlkcHJvY2VzbywgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgIHJldHVybiBzQ3Rpdm87XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsbGF2ZSBkZSBwb3VjaERCXHJcbiAgICAgKiBAcGFyYW0gdWJpYyBcclxuICAgICAqIEBwYXJhbSBodWIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRLZXkodWJpYywgaHViKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiQ1RJVk9TX1wiICsgdWJpYyArIGh1YjtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM05vdGlmU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0ZW5lciBsYSBpbmZvcm1hY2lvbiBkZSBsYXMgbm90aWRpY2FjaW9uZXMgcG9yIGh1YlxyXG4gICAqIEBwYXJhbSBzSURLYXRpb3MgRW1wcmVzYVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBNM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0KHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLm9Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM05vdGlmQ29udHJvbGxlci9NM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0L1wiICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnRvUHJvbWlzZSgpO1xyXG4gICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuICAgIGNhdGNoe1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViXHJcbiAgICogQHBhcmFtIHNJREthdGlvcyBFbXByZXNhXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIE0zR2V0TTNOb3RpZmljYWNpb25lc1hIdWJPYmplY3RXaXRoVGltZU91dChzSURLYXRpb3M6IHN0cmluZywgb0RhdGFTZW5kOiBhbnksIHRpbWVPdXQ6IG51bWJlcikge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLm9Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTNUaW1lT3V0KFwiTTNOb3RpZkNvbnRyb2xsZXIvTTNHZXRNM05vdGlmaWNhY2lvbmVzWEh1Yk9iamVjdC9cIiArIHNJREthdGlvcywgb0RhdGFTZW5kLCB0aW1lT3V0KS50b1Byb21pc2UoKTtcclxuICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcbiAgICBjYXRjaHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViIGRlIHVuIGlkUmVwIGRhZG9cclxuICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAqIEBwYXJhbSBkYXRhIFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBtM19nZXRfbm90aWZpY2FjaW9uX3hfaHViX29iamVjdChzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55KSB7XHJcbiAgICAvL3ZhciBkYXRhID0ge1wiaWRfcmVwXCI6XCJcIiwgXCJpZF91YmljYWNpb25cIjpcIlwiLCBcImlkX2h1YlwiOlwiXCJ9XHJcbiAgICB0cnkge1xyXG4gICAgICB2YXIgcmVzcCA9IGF3YWl0IHRoaXMub1Bvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTm90aWZDb250cm9sbGVyL20zX2dldF9ub3RpZmljYWNpb25feF9odWJfb2JqZWN0L1wiICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3ApKTtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbiAgICBjYXRjaHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBndWFyZGFyQ2FtYmlvc0NvbmZpZ3VyYWNpb25JbXByZXNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSwgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNOb3RpZkNvbnRyb2xsZXIvZ3VhcmRhckNhbWJpb3NDb25maWd1cmFjaW9uSW1wcmVzaW9uL1wiICsgc0lES2F0aW9zLnRyaW0oKSwgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICB9LFxyXG4gICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgb0Z1bmNpb25FcnIoZXJyb3JbXCJfYm9keVwiXSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTW9kZWxNM05vdGlme1xyXG4gICAgcHVibGljIElkUmVwOnN0cmluZztcclxuICAgIHB1YmxpYyBJRFViaWNhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRIdWI6c3RyaW5nO1xyXG4gICAgcHVibGljIENvcnJlcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ29uZGljaW9uZXM6c3RyaW5nO1xyXG4gICAgcHVibGljIERhdGE6c3RyaW5nO1xyXG4gICAgcHVibGljIENvbmZJbXA6c3RyaW5nO1xyXG59IiwiZXhwb3J0IGNsYXNzIE0zUHJlc2VudGFjaW9uZXN7XHJcbiAgICBwdWJsaWMgTklWRUxQUlM6c3RyaW5nO1xyXG4gICAgcHVibGljIFZBTE9SOm51bWJlcjtcclxuICAgIHB1YmxpYyBUT1BFOm51bWJlcjtcclxufSIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgcmVzZXJ2ZVNsb3RzIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNM0NvbnN1bHRhcyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIGludmVudGFyaW8sIHRlbmllbmRvIGVuIGN1ZW50YSBsb3MgcGFjayBhc29jaWFkb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIEVtcHJlc2FcclxuICAgICAqIEBwYXJhbSBkYXRhIEpzb24gY29uIGluZm9ybWFjaW9uIGRlIFNLUDEgKE1vZGVsbykgeSBVYmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIE0zX0dFVElOVkVOVEFSSU9CWVBBQ0soc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG4gICAgICAgIHZhciByZXNwID0gYXdhaXQgdGhpcy5Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9NM19HRVRJTlZFTlRBUklPQllQQUNLL1wiICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGFySW52ZW50YXJpb05lZ2F0aXZvUHJvZHVjdG8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNMy92YWxpZGFySW52ZW50YXJpb05lZ2F0aXZvUHJvZHVjdG8vXCIgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgb0Z1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyb3IuZXJyb3IuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBCdXNjYXJDb25jZXB0b0VuTTNTSVUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKXtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9NM19HRVRDb25jZXB0b0Zyb21TSVUvXCIgKyBpZEthdGlvcyArIFwiL1wiICsgZGF0YS5zVWJpY2FjaW9uICsgXCIvXCIgKyBkYXRhLnNDb25jZXB0bywge30pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnJvci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgVEVDTEFTUkFQSURBU3tcclxuICAgIHB1YmxpYyBDb21wb25lbnRlOnN0cmluZztcclxuICAgIHB1YmxpYyBUZWNsYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRnVuY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRFbGVtZW50bzpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hQUkRTU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgaWRrYXRpb3M6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBhcGxTeW5jQ291Y2hBdXRvID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgYXBsUGFxdWV0ZXMgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmlka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGbGFnU3luY0NvdWNoKCkge1xyXG4gICAgICAgIHZhciBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIHZhciBvU1ViaWNhY2lvbjtcclxuICAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgbGV0IGNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gbnVsbCAmJiBjb25maWcuU3luY0NvdWNoQXV0byAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmbGFnID0gY29uZmlnLlN5bmNDb3VjaEF1dG87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgdGhpcy5pZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICBpZiAodGhpcy5pZGthdGlvcykgdGhpcy5HZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiUFJEXCIgKyB0aGlzLmlka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiYWRhcHRlclwiKVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5kYXRhYmFzZS5hZGFwdGVyKTtcclxuICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHRoaXMudmFsaWRhclBhcXVldGVzKClcclxuICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJQYXF1ZXRlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5hcGxQYXF1ZXRlcykge1xyXG4gICAgICAgICAgICBsZXQgdWJpY2FjaW9uID0gdGhpcy5nZXRVYmljYWNpb24oKTtcclxuICAgICAgICAgICAgaWYgKHViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNhXCIgKyB1YmljYWNpb24gKyBcIl9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3luY0NvdWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZGthdGlvcykge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGFyUGFxdWV0ZXMoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRVYmljYWNpb24oKSB7XHJcbiAgICAgICAgbGV0IHNTVWJpY2FjaW9uID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNVYmljYWNpb25cIik7XHJcbiAgICAgICAgbGV0IG9TVWJpY2FjaW9uO1xyXG5cclxuICAgICAgICBpZiAoc1NVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgb1NVYmljYWNpb24gPSBKU09OLnBhcnNlKHNTVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgaWYgKG9TVWJpY2FjaW9uLklEVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1NVYmljYWNpb24uSURVYmljYWNpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldEthdGlvc00zRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIEthdGlvcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnS2F0aW9zXCIgKyB0aGlzLmlka2F0aW9zLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICAgIGlmIChLYXRpb3MgIT09IHVuZGVmaW5lZCAmJiBLYXRpb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgakthdGlvc00zID0gSlNPTi5wYXJzZShLYXRpb3MpO1xyXG4gICAgICAgICAgICBpZiAoakthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3MgJiYgakthdGlvc00zLkthdGlvcy5LYXRpb3NNMykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFwbCA9IGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMuZmluZCh4ID0+IHguTGxhdmUudG9VcHBlckNhc2UoKSA9PSBcIkFQTFBBUVNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBsICYmIGFwbC5WYWxvciA9PSBcIjFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBsUGFxdWV0ZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KGlka2F0aW9zKSB7XHJcbiAgICAgICAgdmFyIHJlc3B1ZXN0YTtcclxuICAgICAgICByZXNwdWVzdGEgPSBhd2FpdCB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKVxyXG4gICAgICAgIHJldHVybiByZXNwdWVzdGFcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hcGxTeW5jQ291Y2hBdXRvID0gdGhpcy5nZXRGbGFnU3luY0NvdWNoKCk7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0aGlzLmFwbFN5bmNDb3VjaEF1dG8sXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmluZm8oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZVByZChpZCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGVBbGxEb2NzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLm1hcChyb3cgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX2lkOiByb3cuaWQsIF9yZXY6IHJvdy5kb2MuX3JldiwgX2RlbGV0ZWQ6IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbihkZWxldGVEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYnVsa0RvY3MoZGVsZXRlRG9jcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaENvZHNQUkRTU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBpZGthdGlvcztcclxuICAgIHByaXZhdGUgYXBsU3luY0NvdWNoQXV0byA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmxhZ1N5bmNDb3VjaCgpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGxldCBjb25maWc7XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uTTNIVUJTICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXSAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IG51bGwgJiYgY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGNvbmZpZy5TeW5jQ291Y2hBdXRvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcblxyXG4gICAgICAgIHRoaXMuaWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJhZGFwdGVyXCIpXHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmRhdGFiYXNlLmFkYXB0ZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBzeW5jQ291Y2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlka2F0aW9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hcGxTeW5jQ291Y2hBdXRvID0gdGhpcy5nZXRGbGFnU3luY0NvdWNoKCk7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0aGlzLmFwbFN5bmNDb3VjaEF1dG8sXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBDT0RTIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gQ09EUyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KCkge1xyXG4gICAgICAgIHZhciByZXNwdWVzdGE7XHJcbiAgICAgICAgcmVzcHVlc3RhID0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hQcm9tb2Npb25lc1NlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHByaXZhdGUgZWxlbWVudFJlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwicHJvbW9jaW9uZXNfXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgICAgICAvL3RoaXMuc3luYyh0aGlzLkdldFNlcnZlcihzSWRrYXRpb3MpKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKHNJZGthdGlvcyk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTMgKyBcInByb21vY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmNXaXRoREIocmVtb3RlRGF0YWJhc2U6IFBvdWNoREIpIHtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIHN5bmNBd2FpdChyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgICAgICB0aGlzLnN5bmNXaXRoREIocmVtb3RlRGF0YWJhc2UpO1xyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YWJhc2UuY29tcGFjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBjaGFuZ2VzKHJlbW90ZTogc3RyaW5nKXtcclxuICAgIC8vICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUpO1xyXG4gICAgLy8gICAgIHJlbW90ZURhdGFiYXNlLmNoYW5nZXMoe1xyXG4gICAgLy8gICAgICAgICBzaW5jZTogJ25vdycsXHJcbiAgICAvLyAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAvLyAgICAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZVxyXG4gICAgLy8gICAgICAgfSkub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChjaGFuZ2UpIHtcclxuICAgIC8vICAgICAgICAgLy8gY2hhbmdlLmlkIGNvbnRhaW5zIHRoZSBkb2MgaWQsIGNoYW5nZS5kb2MgY29udGFpbnMgdGhlIGRvY1xyXG4gICAgLy8gICAgICAgICBpZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgIC8vICAgICAgICAgICAvLyBkb2N1bWVudCB3YXMgZGVsZXRlZFxyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgIC8vIGRvY3VtZW50IHdhcyBhZGRlZC9tb2RpZmllZFxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIGhhbmRsZSBlcnJvcnNcclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGUoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKS50aGVuKGRvYyA9PntcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKGRvYyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlbGVtZW50UmVtb3ZlZCgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmNoYW5nZXMoeyBsaXZlOiB0cnVlLCBzaW5jZTogJ25vdycsIGluY2x1ZGVfZG9jczogdHJ1ZSB9KVxyXG4gICAgICAgIC5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZS5kZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVtLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL3JlbmRlckRvY3NTb21laG93KCk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJlbW92ZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZW07XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCICBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFViaWNhY2lvbmVzU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcz0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJ1YmljYWNpb25lc19cIiArIHNJZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6c3RyaW5nO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInViaWNhY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFVCSUNBQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6c3RyaW5ne1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpe1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZihzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpe1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgIFxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBVQklDQUNJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gVUJJQ0FDSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ2hhbmdlSXRlbSgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmNoYW5nZXMoeyBsaXZlOiB0cnVlLCBzaW5jZTogJ25vdycsIGluY2x1ZGVfZG9jczogdHJ1ZSB9KVxyXG4gICAgICAgIC5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgLy9pZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL3JlbmRlckRvY3NTb21laG93KCk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7aW5jbHVkZV9kb2NzOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7aW5jbHVkZV9kb2NzOiBmYWxzZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zTm90aWZpY2FjaW9uZXNBUFAge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuICAgICAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJub3RpZmljYWNpb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpLnRyaW0oKSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJub3RpZmljYWNpb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpLnRyaW0oKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIEdldERhdGFQb3VjaEJEKGlzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9hcm1hciBrZXkgZGUgZG9jdW1lbnRvIHF1ZSBzZSBxdWllcmUgY29uc3VsdGFyXHJcbiAgICBwdWJsaWMgR2V0S2V5RG9jdW1lbnRvREIoaXNJREthdGlvczogc3RyaW5nLCBpc0RvY3VtZW50bzogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGlzSURLYXRpb3MgKyBcIj9cIiArIGlzRG9jdW1lbnRvO1xyXG4gICAgfVxyXG5cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tCeVRpcG8gfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wYWNrLWJ5LXRpcG9cIjtcclxuaW1wb3J0IHsgTTNQYWNrQnlSZWdsYXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wYWNrLWJ5LXJlZ2xhc1wiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTTNQSXRlbXNXRUIgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTTNQYWNrQnlpcG8ge1xyXG5cclxuXHJcbiAgICBwcml2YXRlIG9wZXJhdG9ycyA9IHtcclxuICAgICAgICAnPCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA8ICtiIH0sXHJcbiAgICAgICAgJz4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgPiArYiB9LFxyXG4gICAgICAgICc8PSc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA8PSArYiB9LFxyXG4gICAgICAgICc+PSc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA+PSArYiB9LFxyXG4gICAgICAgICdJR1VBTCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09IGIgfSxcclxuICAgICAgICAnRElGRic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICE9IGIgfSxcclxuICAgICAgICAnRU4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB9LFxyXG4gICAgICAgICdBTkQnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiIH0sXHJcbiAgICAgICAgJ09SJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfHwgYiB9LFxyXG4gICAgICAgICcqJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRydWUgfSxcclxuICAgICAgICAnTU9EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthICUgK2IgPT0gMCB9LFxyXG4gICAgICAgIC8vIC4uLlxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHNpIGVsIHByb2R1Y3RvIHF1ZSBzZXLDg8KhIGhpam8sIGN1bXBsZSBjb24gbGFzIGNhcmFjdGVyaXN0aWNhc1xyXG4gICAgICogQHBhcmFtIG0zUHJvY1BLRyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJTaUVzVGlwbyhtM1Byb2NQS0c6IFR5cGVNM1ByZEdycCwgcHJvZHVjdG86IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChtM1Byb2NQS0cuTTNQQUNLQllUSVBPLmZpbmQoeCA9PiB4LkRFU1RJTk8gPT0gcHJvZHVjdG8uVElQTykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBsaWNhY2lvbiBkZSByZWdsYXMgZGUgcGFxdWV0ZXMsIHRlbmllbmRvIGVuIGN1ZW50YSBhbCBpbmZvcm1hY2nDg8KzbiBkZWwgcHJvZHVjdG8gaW5ncmVzYWRvLlxyXG4gICAgICogQHBhcmFtIG0zUHJvY1BLRyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0byBcclxuICAgICAqIEBwYXJhbSBvTTNQSXRlbXNXRUIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZW5lcmFWYWxpZGFjaW9uZXMobTNQcm9jUEtHOiBUeXBlTTNQcmRHcnAsIHByb2R1Y3RvOiBUeXBlTTNQcmRHcnAsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYlJlc3A6Ym9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBvTTNQQUNLQllUSVBPOiBNM1ByZFBhY2tCeVRpcG8gPSBtM1Byb2NQS0cuTTNQQUNLQllUSVBPLmZpbmQoeCA9PiB4LkRFU1RJTk8gPT0gcHJvZHVjdG8uVElQTyk7XHJcbiAgICAgICAgICAgIGlmIChvTTNQQUNLQllUSVBPKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgb00zUEFDS0JZVElQTy5NM1BBQ0tSRUdMQVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUGFja0J5UmVnbGFzOiBNM1BhY2tCeVJlZ2xhcyA9IG9NM1BBQ0tCWVRJUE8uTTNQQUNLUkVHTEFTW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2UgZXN0YSB2YWxpZGFuZG8gZWwgcGFwYSBkZWwgcGFxdWV0ZS5cclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLm9wZXJhdG9yc1tvTTNQYWNrQnlSZWdsYXMuT3BlcmFjaW9uXSh0aGlzLkdldFBhcmFtZXRyb3Mob00zUGFja0J5UmVnbGFzLlBhcmFtMSwgbTNQcm9jUEtHKSAsIHRoaXMuR2V0UGFyYW1ldHJvcyhvTTNQYWNrQnlSZWdsYXMuUGFyYW0yLCBtM1Byb2NQS0cpKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhY2lvbkFjY2lvbihvTTNQYWNrQnlSZWdsYXMuQWNjaW9uLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2h7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFjacODwrNuIGRlIGFjY2lvbiBkZSByZWdsYXMgZGUgcGFxdWV0ZS5cclxuICAgICAqIEBwYXJhbSBzQWNjaW9uIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFZhbGlkYWNpb25BY2Npb24oc0FjY2lvbjpzdHJpbmcsIG9NM1BJdGVtc1dFQjpNM1BJdGVtc1dFQil7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBpZihzQWNjaW9uICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvQWNjaW9uOmFueSA9IEpTT04ucGFyc2Uoc0FjY2lvbik7XHJcbiAgICAgICAgICAgICAgICBpZihvQWNjaW9uLkFjY2lvbil7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9BY2Npb24uQWNjaW9uKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNhbnRpZGFkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gb0FjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1jYXRjaChleCl7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpw4PCs24gZGUgcGFyYW1ldHJvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhcyByZWdsYXMuXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1ldHJvIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3RvIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEdldFBhcmFtZXRyb3MocGFyYW1ldHJvOiBzdHJpbmcsIHByb2R1Y3RvOiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICB2YXIgc1BhcmFtOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByZWdsYTogc3RyaW5nID0gcGFyYW1ldHJvLnNwbGl0KFwiX1wiKVswXTtcclxuICAgICAgICAgICAgc3dpdGNoIChyZWdsYS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiQURJXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgc1BhcmFtID0gcHJvZHVjdG8uTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoeCA9PiB4LkFUUklCVVRPID09IHBhcmFtZXRyby5zcGxpdChcIl9cIilbMV0pLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNPTlNUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgc1BhcmFtID0gcGFyYW1ldHJvLnNwbGl0KFwiX1wiKVsxXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVnbGEudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiU0tQXCIpICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJhbSA9IHByb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdW3JlZ2xhXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoe1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNQYXJhbTtcclxuICAgIH1cclxuXHJcblxyXG5cclxufSIsImltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsdHJvc0RpYXJpb09mZkxpbmUge1xyXG4gICAgcHVibGljIEZpbHRyYXJCeUZlY2hhc09mZihEYXRhLCBBZGRUb0RvYzogRnVuY3Rpb24pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcm93czogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgLy92YXIgbmV3Um93cyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgIHZhciBmZWNoYUkgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiRmVjaGFJdENPRkZcIik7XHJcbiAgICAgICAgICAgIHZhciBmZWNoYUYgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiRmVjaGFGdENPRkZcIik7XHJcbiAgICAgICAgICAgIHJvd3MgPSBEYXRhLnJvd3M7XHJcblxyXG4gICAgICAgICAgICBpZiAoZmVjaGFGICYmIGZlY2hhSSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGlGSW5pY2lvID0gdGhpcy5HZXRGZWNoYU51bWJlcihmZWNoYUkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGlGRmluYWwgPSB0aGlzLkdldEZlY2hhTnVtYmVyKGZlY2hhRik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpRkluaWNpbylcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGlGRmluYWwpXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNwOiBhbnkgPSByb3dzW2ldLmRvYztcclxuICAgICAgICAgICAgICAgICAgICBpZiAobTNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmZWNoYVByb2MgPSB0aGlzLkdldEZlY2hhTnVtYmVyKG0zcC5GZWNoYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZmVjaGFQcm9jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoK2ZlY2hhUHJvYyA+PSAraUZJbmljaW8gJiYgK2ZlY2hhUHJvYyA8PSAraUZGaW5hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXdSb3dzLnB1c2gocm93c1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRUb0RvYyhtM3ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmlsdHJhckJ5RmVjaGFzT2ZmXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgRmlsdHJhckJ5VGV4dG8oRGF0YSwgc1RleHRvOiBzdHJpbmcsIEFkZFRvRG9jOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByb3dzOiBBcnJheTxhbnk+O1xyXG5cclxuICAgICAgICAgICAgcm93cyA9IERhdGEucm93cztcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbTNwOiBhbnkgPSByb3dzW2ldLmRvYztcclxuICAgICAgICAgICAgICAgIGlmIChtM3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobTNwLklkTTMuaW5jbHVkZXMoc1RleHRvKSB8fCAobTNwLm5kb2NVQWN0aXZvICYmIG0zcC5uZG9jVUFjdGl2by5pbmNsdWRlcyhzVGV4dG8pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25ld1Jvd3MucHVzaChyb3dzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkVG9Eb2MobTNwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaWx0cmFyQnlGZWNoYXNPZmZcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgR2V0RmVjaGFOdW1iZXIoc2RhdGU6IHN0cmluZykge1xyXG4gICAgICAgIC8vdmFyIGRhdGUgPSBuZXcgRGF0ZShzZGF0ZSk7XHJcbiAgICAgICAgdmFyIGQgPSBtb21lbnQoc2RhdGUpLmZvcm1hdCgnWVlZWU1NREQnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG4vLyBASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFBlcnhpcG8ge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCkge1xyXG5cclxuICAgICAgICBzSWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwicGVyeHRpcG9fXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInBlcnh0aXBvX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBwZXJ4dGlwbyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHJldHJ5OiBmYWxzZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gcGVyeHRpcG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIHBlcnh0aXBvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuLy8gQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ291Y2hEaW5hbUJ5UHJvY2Vzb3Mge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImRpbmFteHByb2NfXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImRpbmFteHByb2NfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIGRpbmFteHByb2NfICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICBcclxufVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV0cnk6IGZhbHNlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBkaW5hbXhwcm9jXyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gZGluYW14cHJvY18gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3Moe2luY2x1ZGVfZG9jczogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YT0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcbn0iXSwibmFtZXMiOlsibW9tZW50IiwiXy5jbG9uZURlZXAiLCJQb3N0U2VydmljZU0zIiwidHNsaWJfMS5fX2RlY29yYXRlIiwidHNsaWJfMS5fX3BhcmFtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNCSSxZQUNZLE1BQ0E7UUFEQSxTQUFJLEdBQUosSUFBSTtRQUNKLGVBQVUsR0FBVixVQUFVO1FBRWxCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQUN2Qjs7OztJQUVNLFlBQVk7O1FBRWYsSUFBSSxJQUFJLENBQU07O1FBQ2QsSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZ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QUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTs7UUFDeEMsSUFBSSxDQUFDLEdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBQ2hELElBQUksUUFBUSxHQUFXLENBQUMsQ0FBQzs7UUFDekIsSUFBSSxNQUFNLEdBQVksS0FBSyxDQUFDO1FBRTVCLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3BDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQzs7UUFLRCxJQUFJLENBQUMsR0FBVyxDQUFDLENBQUM7UUFDbEIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ3RHLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O1lBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDN0IsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUVsQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNQLEVBQUUsR0FBRyxDQUFDLENB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
|