sf-reglanegociom3 1.0.12-beta84 → 1.0.12-beta85

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/bundles/sf-reglanegociom3.umd.js +8 -3
  2. package/bundles/sf-reglanegociom3.umd.js.map +1 -1
  3. package/bundles/sf-reglanegociom3.umd.min.js +1 -1
  4. package/bundles/sf-reglanegociom3.umd.min.js.map +1 -1
  5. package/esm2015/lib/rnm3/Services/m3-reg-masivo.service.js +4 -3
  6. package/esm5/lib/rnm3/Services/m3-reg-masivo.service.js +6 -3
  7. package/fesm2015/sf-reglanegociom3.js +4 -3
  8. package/fesm2015/sf-reglanegociom3.js.map +1 -1
  9. package/fesm5/sf-reglanegociom3.js +6 -3
  10. package/fesm5/sf-reglanegociom3.js.map +1 -1
  11. package/lib/rnm3/Services/m3-reg-masivo.service.d.ts +1 -1
  12. package/package.json +1 -1
  13. package/lib/rnm3/Maestro/Notificaciones/M3Nofiticaciones.model.d.ts +0 -10
  14. package/lib/rnm3/Maestro/Ubicacion/M3UbiAdicionales.type.d.ts +0 -4
  15. package/lib/rnm3/Maestro/Ubicacion/M3Ubicacion.type.d.ts +0 -17
  16. package/lib/rnm3/Maestro/Ubicacion/m3-hubs.type.d.ts +0 -12
  17. package/lib/rnm3/Maestro/Ubicacion/m3-teclas-rapidas.d.ts +0 -6
  18. package/lib/rnm3/Offline/Service/bd-offline-log.service.d.ts +0 -27
  19. package/lib/rnm3/Offline/Service/bd-offline.service.d.ts +0 -17
  20. package/lib/rnm3/Offline/Service/filtros-diario.service.d.ts +0 -5
  21. package/lib/rnm3/Promociones/Models/M3CONDIAGRUPACION.class.d.ts +0 -8
  22. package/lib/rnm3/Promociones/Models/M3CONDIPROMO.class.d.ts +0 -9
  23. package/lib/rnm3/Promociones/Models/M3DETCONDIPROMO.class.d.ts +0 -7
  24. package/lib/rnm3/Promociones/Models/M3ENCPROMO.class.d.ts +0 -17
  25. package/lib/rnm3/Promociones/Models/M3PromoProcesada.class.d.ts +0 -32
  26. package/lib/rnm3/Services/ConsultasM3/m3-consultas.service.d.ts +0 -15
@@ -12761,6 +12761,7 @@ var M3RegMasivo = /** @class */ (function () {
12761
12761
  * @param {?} PostServiceM3
12762
12762
  * @param {?} oDatUser
12763
12763
  * @param {?} oDataProc
12764
+ * @param {?=} oM3Ubicacion
12764
12765
  * @return {?}
12765
12766
  */
12766
12767
  M3RegMasivo.prototype.AdicionarMasivo = /**
@@ -12768,9 +12769,11 @@ var M3RegMasivo = /** @class */ (function () {
12768
12769
  * @param {?} PostServiceM3
12769
12770
  * @param {?} oDatUser
12770
12771
  * @param {?} oDataProc
12772
+ * @param {?=} oM3Ubicacion
12771
12773
  * @return {?}
12772
12774
  */
12773
- function (oM3CouchMaestro, PostServiceM3, oDatUser, oDataProc) {
12775
+ function (oM3CouchMaestro, PostServiceM3, oDatUser, oDataProc, oM3Ubicacion) {
12776
+ if (oM3Ubicacion === void 0) { oM3Ubicacion = null; }
12774
12777
  return __awaiter(this, void 0, void 0, function () {
12775
12778
  var csv, arrCSV, proceso;
12776
12779
  return __generator(this, function (_a) {
@@ -12784,7 +12787,7 @@ var M3RegMasivo = /** @class */ (function () {
12784
12787
  csv = this.reader.result.toString();
12785
12788
  }
12786
12789
  arrCSV = csv.split("\n");
12787
- return [4 /*yield*/, this.adicionar_masivo_from_array(oM3CouchMaestro, PostServiceM3, oDatUser, arrCSV)];
12790
+ return [4 /*yield*/, this.adicionar_masivo_from_array(oM3CouchMaestro, PostServiceM3, oDatUser, arrCSV, oM3Ubicacion)];
12788
12791
  case 1:
12789
12792
  proceso = _a.sent();
12790
12793
  return [2 /*return*/, proceso];
@@ -16780,4 +16783,4 @@ var CouchDinamByProcesos = /** @class */ (function () {
16780
16783
 
16781
16784
  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 };
16782
16785
 
16783
- //# 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+IGxQcmUuSURMSVNUQSA9PSBzcGxpdFByZWNpb1swXSk7XHJcbiAgICAgICAgbGV0IHByZWNpb01vbmVkZXJvID0gMDtcclxuICAgICAgICBpZiAob0xpc3RhRmluZGVkICYmIHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChzcGxpdFByZWNpb1sxXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxCXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxDO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxEO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgaWYgKGdzSWRLYXRpb3MgIT0gbnVsbCAmJiBnc0lkS2F0aW9zID09IFwiQ1ROXCIpIHtcclxuICAgICAgICAgICAgcHJlY2lvTW9uZWRlcm8gPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKS5QUkVDSU87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTywgcHJlY2lvTW9uZWRlcm8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gcXVlIHNlIGhhY2VuIHZhbGlkYXMgZGVzcHVlcyBkZSByZWdpc3RyYXIgdG9kb3MgbG9zIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSBKUHJvbW9jaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQWZ0ZXIoSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9NM1Byb2Nlc29zLlZhbG9yTmV0bztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb00zUHJvY2Vzb3MuVmFsb3JOZXRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiBlbiBnZW5lcmFsXHJcbiAgICAgKiBAcGFyYW0gSlByb21vY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIG5QcmVjaW8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lczogQXJyYXk8YW55PiwgblByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgcHJlY2lvTW9uZWRlcm8gPSAwKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzOiBQcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB2YXIgb0xpc3RhUHJvbW9zQXNvYyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxuICAgICAgICBsZXQgcHJlY2lvQXNpZ25hZG8gPSBuUHJlY2lvO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBKUHJvbW9jaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIC8vSlByb21vY2lvbmVzLmZvckVhY2gocHJvbW9jaW9uID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21vY2lvbiA9IEpQcm9tb2Npb25lc1tfaV07XHJcbiAgICAgICAgICAgIC8vIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLkFjY2lvbi5UaXBvMiAhPSBudWxsICYmIHByb21vY2lvbi5BY2Npb24uVGlwbzIgPT0gXCJNT05FREVST1wiICYmIHByZWNpb01vbmVkZXJvID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByZWNpb01vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0J5VGlwbyhwcm9tb2Npb24sIHByZWNpb0FzaWduYWRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MucHVzaChvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlZhbGlkYXJNZWpvclByb21vY2lvbihvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBwcmVjaW9Nb25lZGVybyk7XHJcblxyXG4gICAgICAgIC8vIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5wdXNoKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPCAwKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL0ZTIDIwMTkwNzI1IFJlZG9kbmVvIGRlIGxvcyB2YWxvcmVzIHRvdGFsZXNcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpb24gZGUgbWVqb3Igb3BjaW9uLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIHByb21vY2lvbmVzIHByb2Nlc2FkYXMuXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RhUHJvbW9zQXNvYyBMaXN0YSBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBQcm9tb2Npb24gcHJvY2VzYWRhLCBxdWUgcmV0b3JuYXLDg8KhIGEgZmx1am8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTWVqb3JQcm9tb2Npb24ob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG1vbmVkZXJvOiBudW1iZXIpOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIGxldCBwcm9tb0Fzb2NpYWRhUmVzdHJpbmdpZG8gPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlRpcG8gPT0gXCJSRVNUUklDQ0lPTlwiKTtcclxuICAgICAgICAvL1NpIGVsIHByb2R1Y3RvIGVzdGEgcmVzdHJpbmdpZG8gbGUgZGEgbWF5b3IgcHJpb3JpZGFkIGEgZXN0YSBwcm9tb2Npw4PCs25cclxuICAgICAgICBpZiAoIXByb21vQXNvY2lhZGFSZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAvLzEuIFN1bWEgZGUgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcbiAgICAgICAgICAgIC8vdmFyIGRQcm9tb0FDTTogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgLy9kUHJvbW9BQ00gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTVwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgbGV0IGRQcm9tb0VYQyA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiRVhDXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vQUNNRElOID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJBQ01ESU5cIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIC8vUHJvbW9jaW9uZXMgTm8gQWN1bXVsYWJsZXNcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJvbW9BQ01ESU4gPCBkUHJvbW9FWEMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vRVhDKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9BQ01ESU4ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcblxyXG4gICAgICAgICAgICAvL1JlY29ycmVyIHRvZGFzIGxhcyBwcm9tb2Npb25lcyBBY3VtdWxhYmxlc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiICYmICF4LmZsYWdzLmZvcm1hUGFnbykpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG1vbmVkZXJvICE9IDAgJiYgcHJvbW8uVGlwbyA9PSBcIk1PTkVERVJPXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCttb25lZGVybykgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCttb25lZGVybykgLSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gcHJvbW8uVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHByb21vLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IHByb21vLlZhbG9yTW9uZWRlcm87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vLy8vLy9GVU5DSU9OQUxJREFEIFBST0RSSUEgRlVOQ0lPTkFSIE3Dg8KBUyBBREVMQU5URSwgU0kgU0UgUVVJRVJFIEFHUlVQQVIgTEFTIFBST01PQ0lPTkVTIEFDTSBZIEVYQ1xyXG4gICAgICAgICAgICAvLyBpZihkUHJvbW9BQ00gPT0gMCAmJiBkUHJvbW9FWEMgPT0gMCl7XHJcbiAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlIGVuY29udHJhcm9uIHByb21vY2lvbmVzJyk7XHJcbiAgICAgICAgICAgIC8vIH1lbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgaWYoZFByb21vQUNNID4gZFByb21vRVhDKXtcclxuICAgICAgICAgICAgLy8gICAgICAgICAvL0dhbmEgcHJvbW9jaW9uZXMgYWN1bXVsYXRpdmFzLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKS5mb3JFYWNoKHggPT4geC5BcGxpY2FkYSA9IHRydWUpOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvTGlzdGFQcm9tb3NBc29jOy8vLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIilcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIGRQcm9tb0FDTSkgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgZFByb21vQUNNKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpLnJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuVmFsb3JNb25lZGVybyksIDApO1xyXG4gICAgICAgICAgICAvLyAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9HYW5hIHByb21vY2lvbmVzIGV4Y2x1eWVudGVzLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKS5BcGxpY2FkYSA9IHRydWU7IC8vIE1hcmNhY2lvbiBkZSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBkUHJvbW9FWEMpICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIGRQcm9tb0VYQykgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKS5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4ocHJvbW9Bc29jaWFkYVJlc3RyaW5naWRvKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICB9XHJcblxyXG4gICAgYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIHZhbG9yUHJvbW9FWEM6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwcm9tb0V4YzogUHJvbW9jaW9uZXNBc29jaWFkYXM7XHJcbiAgICAgICAgaWYgKHZhbG9yUHJvbW9FWEMgPiAwKSB7XHJcbiAgICAgICAgICAgIHByb21vRXhjID0gb0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSB2YWxvclByb21vRVhDIHx8IHguVmFsb3JNb25lZGVybyA9PSB2YWxvclByb21vRVhDKTtcclxuICAgICAgICAgICAgcHJvbW9FeGMuQXBsaWNhZGEgPSB0cnVlOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHByb21vRXhjLlZhbG9yKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgcHJvbW9FeGMuVmFsb3IpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tb0V4Yy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFwbGljYVByb21vQUNNRElOKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCB2YWxvclByb21vQUNNRElOOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodmFsb3JQcm9tb0FDTURJTiA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcHJvbW8gb2Ygb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhID09IFwiQUNNRElOXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tby5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHZhbG9yUHJvbW9BQ01ESU4pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyB2YWxvclByb21vQUNNRElOKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBtYXhpbW8gdmFsb3Igc2VndW4gbGEgcmVnbGEgYSBjb21wYXJhclxyXG4gICAgICogQHBhcmFtIG9MaXN0YVByb21vc0Fzb2MgXHJcbiAgICAgKiBAcGFyYW0gc1JlZ2xhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgc1JlZ2xhOiBzdHJpbmcsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHZhciByZXN1bHQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc3dpdGNoIChzUmVnbGEpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNhc2UgXCJBQ01cIjpcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXN1bHQgPSBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gc1JlZ2xhICYmICF4LmZsYWdzLmZvcm1hUGFnbykucmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5WYWxvciksIDApO1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFDTURJTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVjaW9BY3R1YWwgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclRvdGFsRGVzY3VlbnRvID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTURJTlwiICYmICgheC5mbGFncy5mb3JtYVBhZ28gfHwgeC5UaXBvID09IFwiTU9ORURFUk9cIikpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVldm9WYWxvckRlc2N1ZW50byA9IChwcmVjaW9BY3R1YWwgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvQWN0dWFsIC09IG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxvclRvdGFsRGVzY3VlbnRvICs9IG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9BY3R1YWwgLT0gcHJvbW8uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxvclRvdGFsRGVzY3VlbnRvICs9IHByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbG9yVG90YWxEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiRVhDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IHNSZWdsYSAmJiAoIXguZmxhZ3MuZm9ybWFQYWdvIHx8IHguVGlwbyA9PSBcIk1PTkVERVJPXCIpKS5tYXAoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8uVmFsb3IgPiBvLlZhbG9yTW9uZWRlcm8gPyBvLlZhbG9yIDogby5WYWxvck1vbmVkZXJvOyB9KSlcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1Byb2Nlc2FyIHByb21vY2lvbiBzZWd1biBlbCB0aXBvIFxyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9CeVRpcG8ocHJvbW9jaW9uOiBhbnksIFByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPik6IFByb21vY2lvbmVzQXNvY2lhZGFzIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgQWNjaW9uO1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbmV3IFByb21vY2lvbmVzQXNvY2lhZGFzKCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLlByb21vY2lvbiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbiA9IHByb21vY2lvbi5Qcm9tb2Npb24uSUQ7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTm9tYnJlID0gcHJvbW9jaW9uLlByb21vY2lvbi5Ob21icmU7XHJcbiAgICAgICAgICAgICAgICBBY2Npb24gPSBwcm9tb2Npb24uQWNjaW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2lvbi5SZWdsYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYSA9IEFjY2lvbi5SZWdsYTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlJlZ2xhID0gXCJFWENcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMjtcclxuXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fJVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvclBvcmNlbnRhamUgPSArQWNjaW9uLlZhbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9ICgrUHJlY2lvKSAqICgoK0FjY2lvbi5WYWxvcikgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX1ZBTE9SXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX0VYQUNUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gKCtQcmVjaW8pIC0gKCtBY2Npb24uVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBBY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGFPYnNlcSA9IEFjY2lvbi5SZWdsYU9ic2VxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJDYW50aWRhZE9ic2VxdWlvcyhvTTNFTkNQUk9NTywgQWNjaW9uLk9CU0VRVUlPUywgb1Byb21vY2lvbmVzQXNvY2lhZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy92YWxpZGFyIGNhbnRpZGFkIHZzIGNhbnRpZGFkIGRlIG9ic3F1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNT05FREVST1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9GUyAyMDE5MDgyNyBZYSBubyBzZSBndWFyZGEgZWwgdmFsb3IgdG90YWwgZGVsIG1vbmVkZXJvIHNpIG5vIHVuaWNhbWVudGUgZWwgcG9yY2VudGFqZS4uLiBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybyA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgKiAoKCtBY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNVUE9OXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLklkQ3Vwb24gPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJBQ1RJVkFfUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMubElkQWN0aXZhUHJvbW8gPSBBY2Npb24uVmFsb3Iuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJFU1RSSUNDSU9OX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUkVTVFJJQ0NJT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAvL3RoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQob1Byb21vY2lvbmVzQXNvY2lhZGFzLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBBY2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWNjaW9uLlRpcG8gPT0gXCJDT01CSU5BREFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEgPSBuZXcgUHJvbW9jaW9uQ29tYmluYWRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5UaXBvMiA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuTm9tYnJlID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uID0gQWNjaW9uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckNhbXBvc0FkaWNpb25hbGVzKG9NM0VOQ1BST01PLCBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLCBwcm9tb2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLkZvcm1hUGFnbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5mbGFncy5mb3JtYVBhZ28gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmFsaWRhckNhbnRpZGFkT2JzZXF1aW9zKG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPixcclxuICAgICAgICBvYnNlcXVpb3M6IEFycmF5PGFueT4sIG9Qcm9tb2Npb25lc0Fzb2NpYWRhczogUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgIHZhciBWYWxvckNhbnRQUkQ6IG51bWJlciA9IC0xO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JDYW50UFJEUmVhbDogbnVtYmVyID0gdGhpcy5nb0RhdGFBZGljaW9uYWwuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIHByb21vLk0zQ09ORElBR1JVUEFDSU9OLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBWYWxvckNhbnRQUkQgPSAreC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIikuVmFsb3JcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5DYW50aWRhZE9ic2VxID0gVmFsb3JDYW50UFJEXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBjYW1wb3MgYWRpY2lvbmFsZXMgZW4gcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNFTkNQUk9NTyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uQ29tYmluYWRhIFxyXG4gICAgICogQHBhcmFtIHByb21vY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJDYW1wb3NBZGljaW9uYWxlcyhvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSwgcHJvbW9jaW9uOiBhbnkpIHtcclxuICAgICAgICBzd2l0Y2ggKG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIpIHtcclxuICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgLy9BZ3JlZ2FyIENhbnRpZGFkLlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNWYWxvckNhbnRpZGFkOiBzdHJpbmcgPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvckNhbnRpZGFkID0geC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLkNhbnRpZGFkT2JzcSA9IHNWYWxvckNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FcIjpcclxuICAgICAgICAgICAgICAgIC8vIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIC8vIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgakFkaWM6YW55ID0gSlNPTi5wYXJzZShwcm9tby5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uQ2xhc2lmaWNhY2lvbiA9IGpBZGljLlJPT1QuQWNjaW9uLkNhcmFjdGVyaXN0aWNhO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJDT01CT1wiOlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgcHJvbW8gPSBvTTNFTkNQUk9NTy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uTnVtQ29uZGljaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5OdW1Db25kaWNpb25lcyA9IHByb21vLk0zQ09ORElBR1JVUEFDSU9OWzBdLk0zQ09ORElQUk9NTy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLklEQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uSWRDb25kaWNpb24gPSBwcm9tb2Npb24uSURDb25kaWNpb25cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEZpbiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gSW5pY2lvIFByb2Nlc2FtaWVudG8gQ29tYmluYWRhIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vUHJvY2VzYXIgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5Qcm9tb0NvbWJpbmFkYXNWMihvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb2Nlc2FyQ29tYmluYWRhXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vVjIgQ09NQklOQURBXHJcbiAgICAvKipcclxuICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbmVzIGNvbWJpbmFkYXMsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzIGRlIE0zUHJvY2Vzb3NcclxuICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gT2JqZXRvIE0zIFByb2Nlc29zLCBlbCBjdWFsIHNlIHJlY29ycmVyw4PCoSBsYSBpbmZvcm1hY2lvbiBkZSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9Db21iaW5hZGFzVjIoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgIGxldCBlbmNDb25MYUNhbnRpZGFkT3JpZ2luYWwgPSBfLmNsb25lRGVlcChpb00zUHJvY2Vzby5NM0VOQyk7XHJcblxyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5HZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5BZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgdmFyIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzW2ldO1xyXG4gICAgICAgICAgICB2YXIgZXNBY3VtdWxhYmxlID0gdGhpcy5HZXRFc0FjdW11bGFibGVQcm9tbyhjb21iaSlcclxuICAgICAgICAgICAgLy8vT2J0ZW5lciB0b2RvcyBsb3MgRW5jYWJlemFkb3MgcXVlIGFwbGljYW4gYSBsYSBwcm9tb2Npb24gYSBsYSBxdWUgc2UgZXN0YSBpdGVyYW5kb1xyXG4gICAgICAgICAgICBvTGlzdEVuY2FiID0gdGhpcy5HZXRFbmNhYmV6YWRvQnlDb21iaShjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbWJpLlRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTU9EX0NBTlRJREFEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzOiAzIGdhc2Vvc2FzIHBvciAkNTAwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUmVnbGFNb2RDYW50aWRhZChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfQ0lFUlJFXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlByb2Nlc2FyUHJvbW9PYnNxQ2llcnJlKGxQcmVjaW9zLCBjb21iaSwgaW9NM1Byb2Nlc28sIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfU1VNVE9UQUxcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyT2JzZXFTdW1Ub3RhbChvTGlzdEVuY2FiLCBjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlhDQVJBQ1RFUklTVElDQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FQQVJDSUFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlbmFyTGlzdGFFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYiwgY29tYmksIGxQcmVjaW9zLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNPTUJPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwbENvbWJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXBsQ29tYm8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBsQ29tYm8gPSB0aGlzLlByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlLCBpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRUT19WQUxPUlRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBST0RfQVBMREVTQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9kdWN0b0FwbERlc2Mob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzIHBhcmEgMngxLCAzeDEsIDR4MiwgLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9MaXN0RW5jYWIgJiYgb0xpc3RFbmNhYi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZSByZWVzdGFibGVjZSBsYSBjYW50aWRhZCBvcmlnaW5hbCBwYXJhIHF1ZSBubyBzZSBxdWVkZSBlbiB1biBidXZsZSBpbmZpbml0b1xyXG4gICAgICAgIGZvciAoY29uc3Qgb00zUEVuY09yaWdpbmFsZXMgb2YgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsKSB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZE9yaWdpbmFsID0gb00zUEVuY09yaWdpbmFsZXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQWN0dWFsID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY09yaWdpbmFsZXMuSUQpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gY2FudGlkYWRPcmlnaW5hbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3JkZW5hckxpc3RhRW5jKG9saXN0YUVuYzogTTNQRW5jSXRlbXNbXSwgZXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgaWYgKGVzQWN1bXVsYWJsZSkgb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVE5FVE8nKS5WYWxvcikpO1xyXG4gICAgICAgIGVsc2Ugb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVQnKS5WYWxvcikgLSAoK2EuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcbiAgICAgICAgdmFyIGNhbnRpZGFkRGVzY1Byb21vOiBudW1iZXIgPSArQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBwcmVjaW9Ub3RhbENvbXByYTogbnVtYmVyID0gbFByZWNpb3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICsgTnVtYmVyKGIuUFVOSVRORVRPKTsgfSwgMCk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmVjaW9Ub3RhbENvbXByYSk7XHJcbiAgICAgICAgbGV0IGRlc2NBY3VtID0gMDtcclxuICAgICAgICBsZXQgZGVzY1Byb2RBY3R1YWw7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZGVzY1Byb2RBY3R1YWwgPSAobFByZWNpb3NbaV0uUFVOSVRORVRPIC8gcHJlY2lvVG90YWxDb21wcmEpICogY2FudGlkYWREZXNjUHJvbW8gLy80MFxyXG4gICAgICAgICAgICBkZXNjQWN1bSArPSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgLy8gaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAvLyAgICAgaWYgKGxQcmVjaW9zW2ldLlBVTklUTkVUTyA8IGNhbnRpZGFkRGVzY1Byb21vKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gLT0gbFByZWNpb3NbaV0uUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICBlbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyAtPSBjYW50aWRhZERlc2NQcm9tbztcclxuICAgICAgICAgICAgLy8gICAgICAgICBjYW50aWRhZERlc2NQcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gZGVzY0FjdW0gfHwgY2FudGlkYWREZXNjUHJvbW8gPCBkZXNjQWN1bSkge1xyXG4gICAgICAgICAgICAvL2ZpbmQgZGVsIHVsdGltbyBcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkVuY29udHJlIGRpZmVyZW5jaWEgZW4gcHJvbW9zIGNvbWJpbmFkYXM6IFwiICsgY2FudGlkYWREZXNjUHJvbW8gKyBcIiB2cyBcIiArIGRlc2NBY3VtKTtcclxuICAgICAgICAgICAgbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPID0gbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPIC0gKGNhbnRpZGFkRGVzY1Byb21vIC0gZGVzY0FjdW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWRcIilcclxuICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhck9ic2VxU3VtVG90YWwocHJvZHVjdG9zQXBsaWNhUHJvbW86IE0zUEVuY0l0ZW1zW10sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHZhbG9yUHJvbW8gPSArY29tYmkuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZE9ic2VxdWlvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCB2YWxvckNvbWJvID0gMDtcclxuICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGVuY0l0ZW0gb2YgcHJvZHVjdG9zQXBsaWNhUHJvbW8pIHtcclxuICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA9IDE7XHJcbiAgICAgICAgICAgIGxldCBwVW5pdEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHdoaWxlIChjYW50aWRhZFByb2R1Y3RvQWN0dWFsIDw9IGNhbnRpZGFkQWN0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgKz0gcFVuaXRBY3R1YWw7XHJcbiAgICAgICAgICAgICAgICBjYW50aWRhZFByb2R1Y3RvQWN0dWFsKys7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb2R1Y3RvUmV2aXNhZG8gPSBwcm9kdWN0b3NSZXZpc2Fkb3MuZmluZCh4ID0+IHguSWQgPT0gZW5jSXRlbS5JRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZHVjdG9SZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RvUmV2aXNhZG8uQ2FudGlkYWQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcy5wdXNoKHsgSWQ6IGVuY0l0ZW0uSUQsIENhbnRpZGFkOiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHN1bWFWYWxvclByb2R1Y3RvcyArIGRpZmVyZW5jaWEgPj0gdmFsb3JQcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zU3VtVG90YWwocHJvZHVjdG9zSGlqb3NEZWxDb21ibywgb00zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWRPYnNlcXVpb3MrKztcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gc3VtYVZhbG9yUHJvZHVjdG9zIC0gdmFsb3JQcm9tbztcclxuICAgICAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgdmFsb3JDb21ibywgMSk7XHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBwcm9kdWN0b0NvbWJvLCBjYW50aWRhZE9ic2VxdWlvcyk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wib00zUmVnU2VydmljZVwiXSA9IG9NM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUHJvY2VzbzogTTNQcm9jZXNvcywgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCBwcm9kSGlqbzogTTNQRW5jSXRlbXM7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHByb2RSZXZpc2FkbyBvZiBwcm9kdWN0b3NSZXZpc2Fkb3MpIHtcclxuICAgICAgICAgICAgaWYgKHByb2RSZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gcHJvZFJldmlzYWRvLklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9ICgrb00zUERldGFsbGVJdGVtcy5WYWxvciAtIHByb2RSZXZpc2Fkby5DYW50aWRhZCkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2RIaWpvID0gXy5jbG9uZURlZXAob00zUEVuY0l0ZW1zKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2Vzbyhwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zSGlqb3NEZWxDb21iby5wdXNoKHByb2RIaWpvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIHByb2RIaWpvLCBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9kdXRvUHJvbW9Db21ib1N1bVRvdGFsKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExpc3RhUHJlY2lvcyhsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgdmFyIGxQcmVjaW9zRmlsdGVyID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHkgPT4geS5JRCA9PSBvTGlzdEVuY2FiW2ldLklEKS5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NGaWx0ZXIucHVzaCh4KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3NGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9tb2Npb24gZGUgY29tYm8sIHggcHJvZHVjdG9zLCB5IHByb2R1Y3RvcywgLi4uIG4gcHJvZHVjdG9zIFxyXG4gICAgICogcG9yICQxMDAwXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqIEBwYXJhbSBiRXNBY3VtdWxhYmxlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9jaW9uQ29tYmluYWRhQ29tYm8obFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbiwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgbGV0IGZsYWdBcGxpY29Qcm9tbyA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBuTnVtZXJvQ29uZGljaW9uZXM6IG51bWJlciA9ICtjb21iaS5BY2Npb24uTnVtQ29uZGljaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBWYWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIExpc3RDb25kaWNpb25lcyA9IG5ldyBBcnJheTxBcnJheTxhbnk+PigpO1xyXG4gICAgICAgICAgICB2YXIgbWluaW1vSXRlbXM6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwb3JjZW50YWplUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFNpblByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2U7XHJcblxyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbk51bWVyb0NvbmRpY2lvbmVzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGNvbmRpY2lvbiAxLlxyXG4gICAgICAgICAgICAgICAgdmFyIExpc3RQcm9tb0NvbWJpOiBBcnJheTxNM1BFbmNJdGVtcz4gPSB0aGlzLkJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiLCBpLnRvU3RyaW5nKCksIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgTGlzdENvbmRpY2lvbmVzLnB1c2godGhpcy5HZXRMaXN0YVByZWNpb3MobFByZWNpb3MsIExpc3RQcm9tb0NvbWJpKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhMaXN0Q29uZGljaW9uZXMsIG9MaXN0RW5jYWIpO1xyXG4gICAgICAgICAgICBpZiAoTGlzdENvbmRpY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGVsIHZhbG9yIG1lbm9yIGRlIGxhcyBpdGVtcyBhZ3JlZ2FkYXNcclxuICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gTGlzdENvbmRpY2lvbmVzWzBdLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaisrKSB7Ly9Db21pZW56YSBkZXNkZSAxIHBvcnF1ZSBlbCAwIHlhIHNlIHZhbGlkbyBlbiBsYSBhbnRlcmlvciBsaW5lYVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtc1ByZWNpb3M6IEFycmF5PGFueT4gPSBMaXN0Q29uZGljaW9uZXNbal07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld01pbiA9IGl0ZW1zUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01pbiA8IG1pbmltb0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gbmV3TWluO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vTG9zIGNvbWJvcyBkZWJlbiBwcm9jZXNhcnNlIGRlIGEgdW5vIHBhcmEgc3UgY29ycmVjdG8gZnVuY2lvbmFtaWVudG9cclxuICAgICAgICAgICAgICAgIGlmIChtaW5pbW9JdGVtcyA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9SZWNvcnJlIHRvZG9zIGxvcyBwcmVjaW9zIGRlIGxvcyBwcm9kdWN0b3MgZGUgbGEgcHJvbW8gcGFyYSBzYWJlciBjdWFsIGVzIGVsIHZhbG9yIHJvYWwgZGUgbGEgcHJvbW9cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpblByb21vICs9ICtsUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5JbmRpY2UgPT0gZW5jLkluZGljZSkuUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL0NhbGN1bGEgZWwgdmFsb3IgZGVsIHBvcmNlbnRhamUgZGUgbGEgcHJvbW8gYSBwYXJ0aXIgZGVsIGNhbG9yIGRlbCBjb21ibyB5IGRlIGxhIHN1bWEgZGUgbG9zIHByZWNpb3Mgb3JpZ2luYWxlcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgICAgICAgICAgICBwb3JjZW50YWplUHJvbW8gPSAxMDAgLSAoK1ZhbG9yUHJvbW8gKiAxMDAgLyB2YWxvclRvdGFsU2luUHJvbW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZvckVhY2gocHJlY2lvID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVjaW8uSW5kaWNlID09IGVuYy5JbmRpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWNpby5Qcm9tb0FwbGljYWRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWxvciA9IHByZWNpby5QVU5JVE5FVE87XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01vZGlmaWNhIGVsIHByZWNpbyBkZSBsb3MgcHJvZHVjdG9zIGEgc3UgbnVldm8gdmFsb3IgY29uIGxhIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gdmFsb3IgLSAodmFsb3IgKiBwb3JjZW50YWplUHJvbW8gLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUHJvbW9BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGlvTTNQcm9jZXNvLCBwcmVjaW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9FbiBsYXMgcHJvbW9zIHBvciBjb21ibyBubyBhcGxpY2FuIGVsIHByZWNpbyBkZSBsb3Mgb3Ryb3MgcHJvZHVjdG9zIHF1ZSBubyBoYWNlbiBwYXJ0ZSBkZWwgY29tYm8gOilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTyA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnQXBsaWNvUHJvbW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ0FwbGljb1Byb21vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgcHJvZHVjdG9Qcm9tb0NvbWJpRXhpc3RlbnRlID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBjb21iaS5BY2Npb24uQ29kaWdvKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhpb00zUHJvY2VzbywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgY29tYmkuQWNjaW9uLlZhbG9yLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5saW1waWFyRW5jSXRlbVByZENvbmRpKG9MaXN0RW5jYWIpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb21vY2lvbkNvbWJpbmFkYUNvbWJvXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZ0FwbGljb1Byb21vO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmaWx0cmFyTGlzdGFDb25kaWNpb25lc0NvbWJvKGxpc3RDb25kaWNpb25lczogQXJyYXk8YW55Piwgb00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RDb25kaWNpb25lcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgbGV0IG51ZXZhQ29uZGljaW9uID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29uZGljaW9uIG9mIGxpc3RDb25kaWNpb25lc1tfaV0pIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbmNJdGVtID0gb00zUEVuY0l0ZW1zTGlzdC5maW5kKHggPT4geC5JRCA9PSBjb25kaWNpb24uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY0l0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdID0gZW5jSXRlbVtcIlByZENvbmRpXCJdID8gZW5jSXRlbVtcIlByZENvbmRpXCJdIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGV0Q2FudGlkYWQgPiBlbmNJdGVtW1wiUHJkQ29uZGlcIl0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVldmFDb25kaWNpb24gPSBbY29uZGljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaXN0Q29uZGljaW9uZXNbX2ldID0gbnVldmFDb25kaWNpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxpbXBpYXJFbmNJdGVtUHJkQ29uZGkob00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgb00zUEVuY0l0ZW1zTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgZWxlbWVudFtcIlByZENvbmRpXCJdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2VzbzogTTNQcm9jZXNvcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQgPSAxKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvUXVpdGFyO1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvZHVjdG9RdWl0YXIgPSBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0uZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b1F1aXRhcikge1xyXG4gICAgICAgICAgICBwcm9kdWN0b1F1aXRhci5DYW50aWRhZCArPSAoLTEgKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0ucHVzaCh7IElEOiBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0bywgQ2FudGlkYWQ6ICgtMSAqIGNhbnRpZGFkKSB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0FncmVnYSBlbCBwcm9kdWN0byBkZSBsYSBsaXN0YSBkZSBlbnRyYWRhIGEgdW4gYXJyZWdsbyBkZSBwcm9kdWN0b3MgcXVlIHBvc3Rlcmlvcm1lbnRlIHNlcmEgbG9zIHByb2R1Y3RvcyBoaWpvcyBkZWwgcHJvZHVjdG8gQ29tYm9cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSB0aGlzLmdldFByb2R1dG9Qcm9tb0NvbWJvKG9NM1Byb2Nlc28uTTNFTkMsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk7XHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgIC8vTGEgY2FudGlkYWQgZGlzbWludXllIHBlcm8gZXN0ZSBtb3ZpbWllbnRvIHNlIHJldmVyc2EgYWwgdGVybWluYXIgZGUgdmFsaWRhciBlc3RhIHByb21vXHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgMSk7XHJcbiAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLmFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2Vzbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vRGlzbWludXllIGVuIHVubyBsYSBjYW50aWRhZCBkZWwgcHJvZHVjdG8geSByZXRvcm5hIHVuIGNsb24gZGUgZXN0ZVxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm8ocHJvZHVjdG9zRW5NM1Byb2Nlc286IEFycmF5PE0zUEVuY0l0ZW1zPiwgb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NEZWxDb21ibyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGVuIGhhc2htYXAgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGhtbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gSUQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGR0b0htUHJlY2lvcyhobWxQcmVjaW9zOiBBcnJheTxhbnk+LCBJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGZpbmRlZDogYW55ID0gaG1sUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBJRCk7XHJcbiAgICAgICAgaWYgKGZpbmRlZCkge1xyXG4gICAgICAgICAgICBmaW5kZWQuSW5kaWNlID0gK2ZpbmRlZC5JbmRpY2UgKyArMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaW5kZWQgPSB7IFwiSURcIjogSUQsIFwiSW5kaWNlXCI6IDAgfTtcclxuICAgICAgICAgICAgaG1sUHJlY2lvcy5wdXNoKGZpbmRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaW5kZWQuSW5kaWNlO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVzY2FyIGVuY2FiZXphZG9zIHF1ZSB0ZW5nYSBsYSBwcm9tb2Npb24geSBjb25kaWNpb24gZW52aWFkYSBjb21vIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gSWRDb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaWRQcm9tb2Npb25lcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIElkQ29uZGljaW9uOiBzdHJpbmcsIGlkUHJvbW9jaW9uZXM6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRW5jRmluZGVkID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSlcclxuICAgICAgICAgICAgICAgIGlmICghb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgfHwgIShvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldCAmJiBkZXRDYW50aWRhZCAmJiArZGV0Q2FudGlkYWQuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb3M6IEFycmF5PGFueT4gPSBKU09OLnBhcnNlKGRldC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb0ZpbmRlZCA9IHByb21vcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBpZFByb21vY2lvbmVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW9GaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25kaWNpb25GaW5kZWQgPSBwcm9tb0ZpbmRlZC5BY2Npb24uSWRDb25kaWNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5maW5kKHggPT4geCA9PSBJZENvbmRpY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9FbmNGaW5kZWQucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkID09IElkQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9FbmNGaW5kZWQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2nDg8KzbiBzaSBsYSBwcm9tb2Npw4PCs24gcXVlIGxsZWdhIGNvbW8gcGFyYW1ldHJvLCBlcyBhY3VtdWxhYmxlIG8gbm9cclxuICAgICAqIEBwYXJhbSBwcm9tb2Npb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRFc0FjdW11bGFibGVQcm9tbyhwcm9tb2Npb246IFByb21vY2lvbkNvbWJpbmFkYSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb2Npb24uQWNjaW9uLlJlZ2xhICYmIHByb21vY2lvbi5BY2Npb24uUmVnbGEgPT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIEdldEVzQWN1bXVsYWJsZVwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc2FyUHJvZHVjdG9BcGxEZXNjKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIGxldCBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgbGV0IHByb2RzQXBsRGVzY3VlbnRvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgc2t1QXBsRGVzY3VlbnRvczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5za3VBcGxEZXNjOyAvL1t7U0tVOlwiWFhYWFhYXCJ9LCB7U0tVOlwiWVlZWVlZWVwifV1cclxuICAgICAgICBsZXQgbWF4TnVtRGVzY3VlbnRvcyA9ICtjb21iaS5BY2Npb24ubWF4TnVtRGVzYztcclxuICAgICAgICBsZXQgY29udERlc2NBcGxpY2Fkb3MgPSAwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL0NhbGN1bGEgZWwgbnVtZXJvIG1heGltbyBkZSBkZXNjaW5ldG9zIHF1ZSBwdWVkZSBhcGxpY2FyIGxhIHByb21vIHF1ZSBlcyBjb21iaS5BY2Npb24ubWF4TnVtRGVzYyBtdWx0aXBsaWNhZG8gcG9yIGxhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyBxdWUgcGFsaWNhbiBsYSBwcm9tbyBlbiBlbCBwcm9jZXNvXHJcbiAgICAgICAgICAgIG1heE51bURlc2N1ZW50b3MgPSBvTGlzdEVuY2FiLnJlZHVjZSgoYWNjLCBjdXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhY2MgKyArY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB9LCAwKSAqIG1heE51bURlc2N1ZW50b3M7XHJcblxyXG4gICAgICAgICAgICAvL0RlIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gZmlsdHJvIGxvcyBwcm9kdWN0b3MgcXVlIGFwbGljYXJhbiBlbCBkZXNjdWVudG8gc2VndW4gbG9zIFNLVSBjb25maWd1cmFkb3MgZW4gY29tYmkuQWNjaW9uLnNrdUFwbERlc2NcclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28uTTNFTkMuZm9yRWFjaChvTTNQRW5jSXRlbXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNrdUFwbERlc2N1ZW50b3MuZmluZCh4ID0+IHguU0tVID09IG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2RzQXBsRGVzY3VlbnRvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL0PDg8KhbGN1bG8gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zIGRlIGxvcyBwcm9kdWN0b3MgYSBsb3MgcXVlIGxhIHByb21vIGFwbGljYXJhIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKHByb2RzQXBsRGVzY3VlbnRvLCBlc0FjdW11bGFibGUpO1xyXG5cclxuICAgICAgICAgICAgLy9BcGxpY2EgdGFudG9zIGRlc2N1ZW50b3Mgc2UgcHVlZGFuIGEgcGxhaWNhciBhIGNhZGEgdmFsb3IgZGUgbFByZWNpb1xyXG4gICAgICAgICAgICB3aGlsZSAoY29udERlc2NBcGxpY2Fkb3MgPCBtYXhOdW1EZXNjdWVudG9zICYmIGNvbnREZXNjQXBsaWNhZG9zIDwgbFByZWNpb3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvc1tjb250RGVzY0FwbGljYWRvc10uUFVOSVRORVRPIC09ICgrbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTykgKiAoKCtjb21iaS5BY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgIGNvbnREZXNjQXBsaWNhZG9zKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vUmVjYWxjdWxhIGxvcyB2YWxvcmVzIGRlbCBwcm9kdWN0byBhcGxpY2FuZG8gZWwgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kc0FwbERlc2N1ZW50bywgY29tYmksIHRydWUsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIG9ic2VxdWlvcyBlbiBlbCBjaWVycmVcclxuICAgICAqIFZhbGlkYSB0b2RhIGxhIGxpc3RhIGRlIGVuY2FiZXphZG9zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhIGVuIGVsIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICogVmFsaWRhIGxhIHByb21vY2nDg8KzbiwgcG9yIGNhZGEgY3VhbnRvcyBwcm9kdWN0b3MgaW5ncmVzYWRvcywgY3XDg8KhbnRvcyBvYnNlcXVpb3Mgc2UgcHVlZGVuIGRhci5cclxuICAgICAqIFRyYWUgdG9kb3MgbG9zIG9ic2VxdWlvcyBxdWUgc2UgaW5ncmVzYXJvbiBlbiBlbCBjYXJyaXRvIGRlIGNvbXByYXMsIGxvcyBsaXN0YVxyXG4gICAgICogY29sb2NhIGVuIHZhbG9yIDAgbG9zIG9ic2VxdWlvcyBxdWUgc2VsZWNjaW9ubyBhdXRvbWF0aWNhbWVudGUgZWwgYWxnb3JpdG1vXHJcbiAgICAgKiBSZWNhbGN1bG8gZGUgcHJlY2lvcywgaW1wdWVzdG9zIHkgZGVtYXMgdmFsb3JlcyB0b3RhbGVzLlxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgbG9zIHByb2R1Y3RvcyBpbmdyZXNhZG9zIGFsIGNhcnJpdG8gcXVlIHRpZW5lbiBvYnNlcXVpb1xyXG4gICAgICogQHBhcmFtIGNvbWJpIEluZm9ybWFjacODwrNuIGRlIHByb21vY2nDg8KzbiBkZSBvYnNlcXVpb3NcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBQcm9jZXNvIGNvbiB0b2RvcyBsb3MgcHJvZHVjdG9zIGUgaW5mb3JtYWNpw4PCs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vT2JzcUNpZXJyZShvTGlzdEVuY2FiOiBBcnJheTxhbnk+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcywgZXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29bJ1Byb2R1Y3Rvc0NvbWJpJ10gPSBbXTtcclxuICAgICAgICBsZXQgY2FudFBvck9icyA9ICtjb21iaS5BY2Npb24uQ2FudGlkYWRPYnNxOyAvL1BvciBjYWRhIGN1YW50b3MgcHJvZHVjdG9zIGNvbiBsYSBwcm9tb2Npw4PCs24gc2UgZGFyw4PCoSBlbCBvYnNlcXVpby5cclxuICAgICAgICBsZXQgY2FudEFncmVnYWRhID0gMDtcclxuICAgICAgICBsZXQgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICBsZXQgY2FudGlkYWRPYnNlcXVpb3MgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckNvbWJvID0gMDtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiA9IFtdO1xyXG4gICAgICAgIGxldCBtM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vYnNlcXVpb3NFeGMgPSB0cnVlO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vTGlzdGFPYnNlcXVpb3MgPSBjb21iaS5BY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vYnNlcXVpb3NDYW50aWRhZCA9IDBcclxuICAgICAgICAvLyB2YXIgY2FudE9ic2VxdWlvczogbnVtYmVyID0gMDsgLy9DYW50aWRhZCBkZSBvYnNlcXVpb3MgcXVlIHNlIGRhcsODwqEgcG9yIGVzdGEgY29tcHJhLlxyXG5cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWN0byBvZiBvTGlzdEVuY2FiKSB7XHJcbiAgICAgICAgICAgIHN1bWFWYWxvclByb2R1Y3RvcyArPSBwcm9kdWN0by5QVU5JVE5FVE87XHJcbiAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSsrO1xyXG4gICAgICAgICAgICBsZXQgcHJvZHVjdG9SZXZpc2FkbyA9IHByb2R1Y3Rvc1JldmlzYWRvcy5maW5kKHggPT4geC5JZCA9PSBwcm9kdWN0by5JRCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9kdWN0b1JldmlzYWRvKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b1JldmlzYWRvLkNhbnRpZGFkKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MucHVzaCh7IElkOiBwcm9kdWN0by5JRCwgQ2FudGlkYWQ6IDEgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjYW50QWdyZWdhZGEgPT09IGNhbnRQb3JPYnMpIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3NTdW1Ub3RhbChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBpb00zUHJvY2VzbywgcHJvZHVjdG9zUmV2aXNhZG9zKTtcclxuICAgICAgICAgICAgICAgIGNhbnRpZGFkT2JzZXF1aW9zKys7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb21iaS5BY2Npb24uQ29kaWdvKSBjb25zb2xlLmVycm9yKCdFbCBjw4PCs2RpZ28gZGVsIGNvbWJvIG5vIGVzdGEgY29uZmlndXJhZG8gZW4gTTNERVRDT05ESVBST01PJylcclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwICYmIGNvbWJpLkFjY2lvbi5Db2RpZ28pIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBtM1JlZ1NlcnZpY2UubG9hZE0zUEVuY0l0ZW1zRnJvbVByb21vY2lvbkNvbWJvKGlvTTNQcm9jZXNvLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaS5BY2Npb24uQ29kaWdvLCB2YWxvckNvbWJvLCAxKTtcclxuICAgICAgICAgICAgbTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBpb00zUHJvY2Vzb1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBtM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogQXBsaWNhciByZWdsYXMsIHJlc3BlY3RvIGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhLlxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvbmVzQXNvY2lhZGFzIFxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICovXHJcbiAgICBwdWJsaWMgQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcblxyXG4gICAgICAgIHZhciBpQ2FudGlkYWRQcm9tbzogbnVtYmVyID0gQWNjaW9uLkNhbnRpZGFkOyAvL0VqZW1wbG8gOiAzXHJcbiAgICAgICAgLy92YXIgaUNhbnRpZGFkQVBMUHJvbW86IG51bWJlcjsgLy9OdW1lcm8gcmVhbCBkZSBhcGxpY2FjaW9uIGRlIHByb21vY2lvbmVzLCBTaSBhcGxpY2EgcmVzdGEgZWwgcmVzaWR1by5cclxuICAgICAgICB2YXIgaUNhbnRpZGFkUmVhbDogbnVtYmVyOyAvL0NhbnRpZGFkIHJlYWwgaW5ncmVzYWRhLlxyXG4gICAgICAgIHZhciBWYWxvclByb21vOiBudW1iZXIgPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgdmFyIHZhbG9yUHJvbW9Vbml0OiBudW1iZXIgPSAoK1ZhbG9yUHJvbW8pIC8gKCtpQ2FudGlkYWRQcm9tbylcclxuICAgICAgICBpQ2FudGlkYWRSZWFsID0gbFByZWNpb3MubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2lDYW50aWRhZEFQTFByb21vID0gaUNhbnRpZGFkUmVhbCAvIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIFJlc2lkdW86IG51bWJlciA9IGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIC8vaUNhbnRpZGFkQVBMUHJvbW8gPSBpQ2FudGlkYWRSZWFsIC8gaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaUNhbnRpZGFkUmVhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobFByZWNpb3NbaV0uUFVOSVRORVRPID4gdmFsb3JQcm9tb1VuaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSB2YWxvclByb21vVW5pdDtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5BcGxpY2FkbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGNvbWJpbmFkYXMgZGVzZGUgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBzQ29tYmluYWRhID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBvQ29tYmluYWRhID0gSlNPTi5wYXJzZShzQ29tYmluYWRhKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMgPSBvQ29tYmluYWRhO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBkaW5hbWljYXMgcHJvY2VzbyBkZSBjb21iaW5hZGFzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXNGaW5kZWQ6IE0zUERpbmFtaWNhcztcclxuICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNGaW5kZWQpIHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+ID0gSlNPTi5wYXJzZShvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJQcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9Qcm9tb0NvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IGFyclByb21vW2ldLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vQ29tYmkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLnB1c2goYXJyUHJvbW9baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBcIkNPTUJJTkFEQVwiO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGFyIHByb21vY2lvbmVzLCBzZWd1biBsYSBsaXN0YSBkZSBwcmVjaW9zIGRpdmlkaWRhLlxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGRlIHByZWNpb3MsIGNvbnRyYSBlc3RlIG9iamV0byBzZSBpdGVyYXLDg8KhIHkgc2Ugb3JkZW5hcsODwqEgZGUgbWF5b3IgYSBtZW5vclxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzQnlMaXN0YVByZWMobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBUaXBvUHJvbW8gPSBjb21iaS5UaXBvMjtcclxuICAgICAgICB2YXIgaXg6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGl5OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciB4OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVsxXVxyXG4gICAgICAgIHZhciB5OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVswXSAtICgreCk7XHJcbiAgICAgICAgdmFyIHJlc2lkdW9YOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBiRW50cm86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHgudG9TdHJpbmcoKS5zcGxpdChcIi5cIikubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICByZXNpZHVvWCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdO1xyXG4gICAgICAgICAgICB4ID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLy9TZSBpdGVyYSBlbCBhcnJlZ2xvIGRlIHByaW5jaXBpbyBhIGZpbiB5IGRlIGZpbiBhIHByaW5jaXBpby4uLiBcclxuICAgICAgICAvLy9Db25mb3JtZSBzZSByZWNvcnJlIGVsIGFycmVnbG8gZGUgZmluIGEgcHJpbmljaW8sIHNlIHZhIGRhbmRvIGxhIHByb21vY2nDg8KzbiBhIGxvcyBwcm9kdWN0b3MgZGUgbWVub3IgdmFsb3IuXHJcbiAgICAgICAgLy8vU2kgbGEgcHJvbW9jacODwrNuIGVzdGEgaW5jb21wbGV0YSwgbG9zIHByb2R1Y3RvcyBkZSBsYSBtaXRhZCBxdWVkYW4gc2luIHByb21vY2nDg8KzbiBcclxuICAgICAgICB2YXIgaTogbnVtYmVyID0gMDtcclxuICAgICAgICBsUHJlY2lvcyA9IGxQcmVjaW9zLnNvcnQoKGEsIGIpID0+IGEuUFVOSVRORVRPIDwgYi5QVU5JVE5FVE8gPyAxIDogYS5QVU5JVE5FVE8gPiBiLlBVTklUTkVUTyA/IC0xIDogMClcclxuICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgaiA9ICtsUHJlY2lvcy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IGxQcmVjaW9zLmxlbmd0aCAmJiBqID49IGkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpeCA9IDA7XHJcbiAgICAgICAgICAgICAgICBpeSA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGl4IDwgeCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpeCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlIChpeSA8IHkgJiYgaiA+PSBpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNpZHVvWCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJFbnRybyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2pdLlBVTklUTkVUTyA9IDAuMDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYkVudHJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8vUGFyYSBsYXMgcHJvbW9jaW9uIGNvbW86IDJYMS41LCAuLi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHNvcG9ydGFuZG8gc29sbyBwYXJhOiAyWDEuNVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tqXS5QVU5JVE5FVE8gPSArbFByZWNpb3Nbal0uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaXkrKztcclxuICAgICAgICAgICAgICAgICAgICBqLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgICAgICAgICAgLy9KR0FNIDIwMTkxMDIzLCBmdW5jaW9uYWxpZGFkIGRlIHF1ZSBzb2xvIGVudHJhIGFjw4PCoSBjdWFuZG8gc2UgY2FtYmlvIGFsZ3VuIHByZWNpb1xyXG4gICAgICAgICAgICBpZiAoYkVudHJvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGZhbHNlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMpO1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpKTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXIgcHJlY2lvIHRvdGFsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgTGlzdGEgZGUgcHJlY2lvcyBhIHRlbmVyIGVuIGN1ZW50YVxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgICAqIEBwYXJhbSBjb21iaSBQcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkFwbFZhbGlkYTogYm9vbGVhbiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgICAgIHZhciBkVmFsb3JQcm9tb0FudDogbnVtYmVyID0gMDtcclxuICAgICAgICAvL3ZhciBkVmFsb3JQcm9tb0FudEFjdW06IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRWYWxvckFjdDogbnVtYmVyID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb051ZXZvID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKCthY2MpICsgKCtjdXIuUFVOSVRORVRPKSwgMCk7XHJcbiAgICAgICAgICAgIHZhciBwcmVjaW9Ub3RhbEFudGVyaW9yO1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbEFudGVyaW9yID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzE4IFNFIFFVSVRBIFZBTElEQUNJT04sIFBPUiBGTFVKTyBRVUUgU0kgU0UgREVWVUVMVkUgVFJBRSBMQSBQUk9NTywgUEVSTyBTSSBTRSBCT1JSQS4gaWYgKGRQcmVjaW9OdWV2byA8IHByZWNpb1RvdGFsQW50ZXJpb3IpIHsgLy8gU2UgYWdyZWdhIHZhbGlkYWNpb24gZGUgcHJlY2lvLCBwYXJhIGVzY29nZXIgZWwgbWVqb3IuIE5vIHB1ZWRlbiBhIHZlciAyIHByb21vY2lvbmVzLlxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBkUHJlY2lvTnVldm87XHJcbiAgICAgICAgICAgIC8vZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMUkVBTFwiKS5WYWxvciA9IGRQcmVjaW9OdWV2bztcclxuICAgICAgICAgICAgLy9MaW1waWFyIHByb21vY2lvbmVzXHJcbiAgICAgICAgICAgIGlmICgodGhpcy5WYWxpZGFyU2lUb2Rvc0FQTFByb21vQ29tYmluYWRhKGxQcmVjaW9zLCBlbmMpIHx8ICFiQXBsVmFsaWRhKSAmJiAhYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NEaXJlY3RhcyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NDb21iaW5hZGFzKGVuYyk7XHJcbiAgICAgICAgICAgICAgICAvLyBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yQWN0ID0gKCgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yKSAtICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRWYWxvclByb21vQW50ID0gdGhpcy5HZXRWYWxvclByb21vQW50ZXJpb3IobFByZWNpb3MsIGVuYyk7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JBY3QgPSB0aGlzLkdldFZhbG9yUHJvbW9BQ3QoZW5jLCBkVmFsb3JQcm9tb0FudCwgZFByZWNpb051ZXZvLCBwcmVjaW9Ub3RhbEFudGVyaW9yLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDczMCBzZSBhZ3JlZ2EgcGFyYSBwcm9tb2Npb25lcyBhY3VtdWxhYmxlcy4gYWN1bXVsYWJcclxuICAgICAgICAgICAgICAgIGlmICghYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gZFZhbG9yUHJvbW9BbnQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FcyBhY3VtdWxhYmxlLCB1dGlsaXphciBsYSBpbmZvcm1hY2nDg8KzbiBcclxuICAgICAgICAgICAgICAgICAgICBkVmFsb3JQcm9tb0FudCA9ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yIC0gcHJlY2lvVG90YWxBbnRlcmlvcilcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5TZXRWYWxvclByb21vY2lvbmVzKGVuYywgZFZhbG9yQWN0ICsgZFZhbG9yUHJvbW9BbnQpO1xyXG4gICAgICAgICAgICB0aGlzLkFncmVnYXJMaXN0YVByb21vKGVuYywgY29tYmksIGRWYWxvckFjdCk7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb1VuaXRGcm9tVG90YWwoZW5jLCBkUHJlY2lvTnVldm8pO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBRdWl0YXJMYXNQcm9tb3NEaXJlY3RhcyhlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbHRlcih4ID0+IHguTm9tYnJlQ29uY2VwdG8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiVkFMX1BST01PQ19cIikpLmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBRdWl0YXJMYXNQcm9tb3NDb21iaW5hZGFzKGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmlsdGVyKHggPT4geC5Ob21icmVDb25jZXB0by50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJWQUxfUFJPX0NPTUJJX1wiKSkuZm9yRWFjaChkZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGV0LlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGFyIHByZWNpbyB1bml0YXJpbywgYSBwYXJ0aXIgZGUgdW4gbnVldm8gcHJlY2lvIFRvdGFsLlxyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqIEBwYXJhbSBuZXdQcmljZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9Vbml0RnJvbVRvdGFsKGVuYzogTTNQRW5jSXRlbXMsIG5ld1ByaWNlOiBudW1iZXIpIHtcclxuICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yID0gKCtuZXdQcmljZSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIHRvZG9zIGxvcyBwcmVjaW9zIGRlIHVuIHByb2R1Y3RvIHNlIGNhbWJpYXJvbiBvIG5vLlxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGNvbiB0b2RvcyBsb3MgaXRlbXNcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyU2lUb2Rvc0FQTFByb21vQ29tYmluYWRhKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgLy9DaGVjaywgc2kgYWxndW5vIGRlIGxhIGxpc3RhIGRlIHByZWNpbyBlcyBpZ3VhbCBhbCBwcmVjaW8gYW50ZXJpb3JcclxuICAgICAgICB2YXIgcHJlY2lvQW50ZXJpb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCkuZmluZCh4ID0+IHguUFVOSVRORVRPID09IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgaWYgKHByZWNpb0FudGVyaW9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yZXMgZGUgcHJvbW9jaW9uZXMgZGVwZW5kaWVuZG8gZGVsIG51bWVybyBkZSBpdGVtcyBxdWUgbm8gc2UgbW9kaWZpY2Fyb25cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRWYWxvclByb21vQW50ZXJpb3IobFByZWNpb3M6IEFycmF5PGFueT4sIGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZFZhbG9yID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB2YXIgbnVtZXJvSXRlbXMgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LlBVTklUTkVUTyA9PSBkVmFsb3IpLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIGRVbml0UHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJWVU5JVFBST01PXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICByZXR1cm4gK251bWVyb0l0ZW1zICogK2RVbml0UHJvbW87XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3IgZGUgbGEgcHJvbW9jaW9uIHF1ZSBzZSBlc3RhIHByb2Nlc2FuZG8gYWN0dWFsbWVudGVcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gdmFsb3JQcm9tb0FudCBcclxuICAgICAqIEBwYXJhbSB2YWxvdFRvdGFsTnVldm8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRWYWxvclByb21vQUN0KGVuYzogTTNQRW5jSXRlbXMsIHZhbG9yUHJvbW9BbnQ6IG51bWJlciwgdmFsb3RUb3RhbE51ZXZvOiBudW1iZXIsIHByZWNpb1RvdGFsQW50OiBudW1iZXIsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JUb3RhbFNpbkR0bzogbnVtYmVyO1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQcm9tb0FjdDogbnVtYmVyO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgc2kgdmllbmUgYWN1bXVsYWJsZSB1dGlsaXphciBlbCBwcmVjaW8gYW50ZXJpb3IsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBkdG8uXHJcbiAgICAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxvclRvdGFsU2luRHRvID0gcHJlY2lvVG90YWxBbnQ7XHJcbiAgICAgICAgICAgICAgICB2YWxvclByb21vQWN0ID0gK3ZhbG9yVG90YWxTaW5EdG8gLSArdmFsb3RUb3RhbE51ZXZvO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpbkR0byA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB2YWxvclByb21vQWN0ID0gK3ZhbG9yVG90YWxTaW5EdG8gLSArdmFsb3JQcm9tb0FudCAtICt2YWxvdFRvdGFsTnVldm87XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdmFsb3JQcm9tb0FjdDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIEdldFZhbG9yUHJvbW9BQ3Q6IFwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldGVhciBlbCB2YWxvciBkZSBsYSBwcm9tb2Npb25cclxuICAgICAqIEBwYXJhbSBlbmMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgU2V0VmFsb3JQcm9tb2Npb25lcyhlbmM6IE0zUEVuY0l0ZW1zLCB2YWxvclByb21vOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gKCgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yKSAtICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgLy9GUyAyMDE5MDcyNSBSZWRvbmRlbyBkZWwgdmFsb3IgZGUgcHJvbW9jaW9uXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gKE1hdGgucm91bmQodmFsb3JQcm9tbyAqIDEwMCkgLyAxMDApLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYxOCBTZSBhZ3JlZ2EgZWwgdmFsb3IgdW5pdGFyaW8gZGUgbGEgcHJvbW9jacODwrNuXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWVU5JVFBST01PXCIpLlZhbG9yID0gKCsoTWF0aC5yb3VuZCh2YWxvclByb21vICogMTAwKSAvIDEwMCkgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gIC8qKlxyXG4gICAgLy8gICogU2V0ZWFyIGVsIHZhbG9yIGRlIGxhIHByb21vY2lvblxyXG4gICAgLy8gICogQHBhcmFtIGVuYyBFbmNhYmV6YWRvIGRlIGl0ZW1zXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHB1YmxpYyBTZXRWYWxvclByb21vY2lvbmVzRnJvbUxpc3RhUHJlY2lvcyhlbmM6IE0zUEVuY0l0ZW1zLCBsUHJlY2lvczogQXJyYXk8YW55Pikge1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5QVU5JVE5FVE8gPT0gZFZhbG9yKVxyXG4gICAgLy8gICAgIH0gY2F0Y2h7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvLyBwdWJsaWMgQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjQmV0YShsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAvLyAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgdmFyIFRpcG9Qcm9tbyA9IGNvbWJpLlRpcG8yO1xyXG4gICAgLy8gICAgICAgICB2YXIgaVNpemVQcmVjOiBudW1iZXIgPSBsUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAvLyAgICAgICAgIHZhciBpTWl0YWQ6IG51bWJlcjtcclxuXHJcbiAgICAvLyAgICAgICAgIHZhciByZXNpZHVvWDogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICAgICAgdmFyIHg6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzFdXHJcbiAgICAvLyAgICAgICAgIHZhciB5OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVswXSAtICgreCk7XHJcbiAgICAvLyAgICAgICAgIHZhciBpRHRvOiBudW1iZXI7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoeC50b1N0cmluZygpLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxKSB7XHJcbiAgICAvLyAgICAgICAgICAgICByZXNpZHVvWCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBpTWl0YWQgPSAoK3kpIC8gKCtpU2l6ZVByZWMpO1xyXG4gICAgLy8gICAgICAgICBpTWl0YWQgPSBNYXRoLmNlaWwoKCtpTWl0YWQpICogKCt4KSkgLSAxO1xyXG5cclxuICAgIC8vICAgICAgICAgbFByZWNpb3MgPSBsUHJlY2lvcy5zb3J0KChhLCBiKSA9PiBhLlBVTklUTkVUTyA8IGIuUFVOSVRORVRPID8gMSA6IGEuUFVOSVRORVRPID4gYi5QVU5JVE5FVE8gPyAtMSA6IDApXHJcblxyXG4gICAgLy8gICAgICAgICB2YXIgaVggPSAwO1xyXG4gICAgLy8gICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgaUR0byA9IGlNaXRhZDtcclxuICAgIC8vICAgICAgICAgICAgIHdoaWxlIChpRHRvIDwgaVNpemVQcmVjKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHJlc2lkdW9YID09IDApIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gMDtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaUR0bysrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vL1BhcmEgbGFzIHByb21vY2lvbiBjb21vOiAyWDEuNSwgLi4uXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vRXN0YSBzb3BvcnRhbmRvIHNvbG8gcGFyYTogMlgxLjVcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gK2xQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyAqICgrcmVzaWR1b1ggLyAxMCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlKGlYIDwgeCl7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaUR0b10uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlYKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpRHRvKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gaVggPSAwO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAvLyAgICAgICAgICAgICAvL1RlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MuXHJcbiAgICAvLyAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoK2FjYykgKyAoK2N1ci5QVU5JVE5FVE8pLCAwKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBhIGxpc3RhIGRlIGRldGFsbGUgZWw6ICBOT01CX1BST01PQywgVkFMX1BST01PQyB5IElEX1BST01PQ1xyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJMaXN0YVByb21vKGVuYzogTTNQRW5jSXRlbXMsIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGRWYWxvclByb21vQ29tYmk6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkZXROb21icmVzOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIGRldFZhbG9yZXM6IHN0cmluZztcclxuICAgICAgICB2YXIgZGV0SWRzOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zTmFtZXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zVmFsczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNJZHM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG5cclxuXHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzID0gZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIik7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIik7XHJcblxyXG4gICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zTmFtZXMpIHtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLk5vbWJyZUNvbmNlcHRvID0gXCJOT01CX1BST19DT01CSVwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzLk5vbWJyZUNvbmNlcHRvID0gXCJWQUxfUFJPX0NPTUJJXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5Ob21icmVDb25jZXB0byA9IFwiSURfUFJPX0NPTUJJXCJcclxuXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgPSBcIlwiXHJcblxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zTmFtZXMpXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNWYWxzKVxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zSWRzKVxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgKyBjb21iaS5Ob21icmUgKyBcIixcIjtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yID0gb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciArIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhICsgXCIsXCI7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciArIGRWYWxvclByb21vQ29tYmkudG9TdHJpbmcoKSArIFwiLFwiO1xyXG5cclxuICAgICAgICAvL0Fob3JhIHNlIGFncmVnYSB1bmEgZGluYW1pY2EgcG9yIGF0cmlidXRvIGRlIGxhIHByb21vIHBhcmEgZmFjaWxpdGFyIGxhIHJldG9tYSBkZSBlc3RhIGluZm9ybWFjacODwrNuXHJcbiAgICAgICAgbGV0IGxpc3ROb21icmUgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RJZCA9IG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RWYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiSURfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJWQUxfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGFycmF5RGluYW1pY2FzOiBBcnJheTxNM1BEZXRhbGxlSXRlbXM+LCBub21icmVEaW5hbWljYTogc3RyaW5nLCBWYWxvckRpbmFtaWNhOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgb00zUERldGFsbGVJdGVtcyA9IGFycmF5RGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IG5vbWJyZURpbmFtaWNhKTtcclxuICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gVmFsb3JEaW5hbWljYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuTm9tYnJlQ29uY2VwdG8gPSBub21icmVEaW5hbWljYTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IFZhbG9yRGluYW1pY2E7XHJcbiAgICAgICAgICAgIGFycmF5RGluYW1pY2FzLnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgcXVlIGFwbGljYW4gYSBsYSBsaXN0YSBjb21iaW5hZGEgcXVlIHRpZW5lXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvbkNvbWJpbmFkYSBPYmpldG8gZGUgcHJvbW9jaW9uIGNvbWJpYW5kYVxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIE9iamV0byBkZSBNM1Byb2Nlc29cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRFbmNhYmV6YWRvQnlDb21iaShvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbHRlcihlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5Qcm9tb0NvbWJpbmFkYXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU2V0UHJvbW9Db21iaW5hZGFFTkMoZW5jKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghKGVuYy5JZEVuY1BhZHJlID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5jLlByb21vQ29tYmluYWRhcyAmJiArZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTIwOCBzZSBjYW1iaWEgdmFsaWRhY2lvbiwgcGFyYSBxdWUgdGVuZ2EgZW4gY3VlbnRhIGN1YWxxdWllciBwcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9MaXN0RW5jYWI7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0UHJvbW9Db21iaW5hZGFFTkMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpXHJcbiAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzID0gSlNPTi5wYXJzZShvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhciBsaXN0YSBkZSBwcmVjaW9zIHkgaWQgZGUgZW5jYWJlemFkbywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGxpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByb2Nlc2FyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vL0Rlc0Fjb3BsYXIgbGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICB2YXIgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAgICAgICAgIHZhciBuQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG5QcmVjaW9Vbml0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgdmFsaWRhIHNpIGxhIHByb21vY2lvbiBlcyBhY3VtdWxhYmxlLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuQ2FudGlkYWQ7IGorKykge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3MucHVzaCh7IFwiSW5kaWNlXCI6IGosIFwiUFVOSVRORVRPXCI6IG5QcmVjaW9Vbml0LCBcIklEXCI6IGVuYy5JRCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3M7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgIC8vICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+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+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0RGF0b3NGYWN0dXJhY2lvbkZyb21SRkNcclxuXHJcbiAgICBwdWJsaWMgYWN0dWFsaXphclJGQyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nLCBvRGF0YSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM01hZXN0cm8vYWN0dWFsaXphclJGQy8nICsgSWRLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocG9zdHMgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHBvc3RzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIFhtbCBkZSBjb25maWd1cmFjaW9uIGRlIGxhIGVtcHJlc2EgYSBwYXJ0aXIgZGVsIGlkdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBnZXRfWG1sQ29uZmlnX3hfSWRVYmljYWNpb25cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxvcyBhdHJpYnV0b3MgZW4gbTNjbGFzaWZpY2EgYSBwYXJ0aXIgZGUgdW4gaWRrYXRpb3NcclxuICAgIGdldF9jbGFzaWZpY2F0aW9uX2F0dHJpYnV0ZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X2NsYXNpZmljYXRpb25fYXR0cmlidXRlcy8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkFUVFJJQlVURVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vL09idGllbmUgbGFzIGNhdGVnb3JpYXMgZW4gbTNjbGFzaWZpY2EgYSBwYXJ0aXIgZGUgdW4gaWRrYXRpb3MgeSB1biBhdHJpYnV0b1xyXG4gICAgZ2V0X2NsYXNpZmljYXRpb25fY2F0ZWdvcmllcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgYXR0cmlidXRlOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X2NsYXNpZmljYXRpb25fY2F0ZWdvcmllcy8nICsgaWRfa2F0aW9zICsgXCIvXCIgKyBhdHRyaWJ1dGUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuQ0FURUdPUklFUztcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRPcGNpb25lc0FkaWNpb25hbGVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldE9wY2lvbmVzQWRpY2lvbmFsZXMvJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgalJlc3AgPSBKU09OLnBhcnNlKHJlc3ApLlJFU1BVRVNUQS5BVFRSSUJVVEVTO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QXRyaWJ1dG9zQWRpY2lvbmFsZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldEF0cmlidXRvc0FkaWNpb25hbGVzLycgKyBpZF9rYXRpb3MgKyBcIi9cIiArIGF0dHJpYnV0ZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgalJlc3AgPSBKU09OLnBhcnNlKHJlc3ApLlJFU1BVRVNUQS5DQVRFR09SSUVTO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL09idGllbmUgbGEgaW5mb3JtYWNpb24gZGUgdGlwb3MgZGUgZW52aW8uXHJcbiAgICBNM0dldEZvcm1hc0VudmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR2V0Rm9ybWFzRW52aW8vJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIganNSZXNwO1xyXG4gICAgICAgICAgICBqc1Jlc3AgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpzUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGluaWUgdG9kYXMgbGFzIE0zVWJpY2FjaW9uZXMgYXNvY2lhZGFzIGEgdW4gaWRfa2F0aW9zXHJcbiAgICBwdWJsaWMgZ2V0X3ViaWNhY2lvbmVzX2NvbXBsZXRlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF91YmljYWNpb25lc19jb21wbGV0ZS8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGluaWUgdG9kYXMgbGFzIE0zVWJpY2FjaW9uZXMgYXNvY2lhZGFzIGEgdW4gaWRfa2F0aW9zXHJcbiAgICBwdWJsaWMgZ2V0X3ViaWNhY2lvbmVzX3NpbXBsZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfdWJpY2FjaW9uZXNfc2ltcGxlLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL09idGluaWUgdG9kYXMgbGFzIE0zVWJpY2FjaW9uZXMgYXNvY2lhZGFzIGEgdW4gaWRfa2F0aW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNHRVRfTElTVEFQUkVDSU9TX0FTeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9SZWNMaXN0YVByZWM6IGFueTtcclxuXHJcbiAgICAgICAgb1JlY0xpc3RhUHJlYyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9NM0dFVF9MSVNUQVBSRUNJT1MvJyArIGlkX2thdGlvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIG9SZWNMaXN0YVByZWNbMF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEdldEVuY2FiZXphZG9MaXN0YXNQcmVjaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zL0dldENvbmZpZ0xQLycgKyBzSURLYXRpb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZ2lzdHJhckNvbG9uaWEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgSWRLYXRpb3M6IHN0cmluZywgc0NvbG9uaWE6IHN0cmluZywgc0NvZFBvc3RhbCwgc1RlbGVmb25vOiBzdHJpbmcsIG5kb2M6IHN0cmluZywgc0xpbmVhMTogc3RyaW5nLCBzQ29kZXN0YWRvOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGFTZW5kO1xyXG4gICAgICAgIG9EYXRhU2VuZCA9IHsgXCJzQ29sb25pYVwiOiBzQ29sb25pYSwgXCJzQ29kUG9zdGFsXCI6IHNDb2RQb3N0YWwsIFwic1RlbGVmb25vXCI6IHNUZWxlZm9ubywgXCJuZG9jXCI6IG5kb2MsIFwic0xpbmVhMVwiOiBzTGluZWExLCBcInNDb2Rlc3RhZG9cIjogc0NvZGVzdGFkbyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM01hZXN0cm8vcmVnaXN0cmFyQ29sb25pYS8nICsgSWRLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHBvc3RzID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGVuZXIgcHJvbW9jaW9uZXMgXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNfR2V0UHJvbW9jaW9uZXNNYWVzdHJvQXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb1JlY0xpc3RhUHJlYzogYW55O1xyXG5cclxuICAgICAgICBvUmVjTGlzdGFQcmVjID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zX0dldFByb21vY2lvbmVzTWFlc3Ryby8nICsgaWRfa2F0aW9zKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gb1JlY0xpc3RhUHJlYztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0ZW5lciBEaW5hbWljYXMgcG9yIGFjdGl2aWRhZCBcclxuICAgIHB1YmxpYyBhc3luYyBNM0dldERpbkJ5QWN0aXZpZGFkKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRGF0YTogYW55LCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0RGluQnlBY3RpdmlkYWQvJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIganNSZXNwOmFueSA9IHJlc3A7XHJcbiAgICAgICAgICAgIC8vanNSZXNwID0gSlNPTi5wYXJzZShqc1Jlc3ApO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIHZhciBvUmVjTGlzdGFQcmVjOiBhbnk7XHJcblxyXG4gICAgICAgIC8vIG9SZWNMaXN0YVByZWMgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldERpbkJ5QWN0aXZpZGFkLycgKyBpZF9rYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAvLyByZXR1cm4gb1JlY0xpc3RhUHJlYztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGEgaW5mbyBiYXNpY2EgZGUgbGFzIHViaWNhY2lvbmVzIGNvbiBIdWIgdGlwbyBXRUIgYWN0aXZvcyBlbiBlbCBtb21lbnRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBnZXRVYmljYWNpb25lc1dlYihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldFViaWNhY2lvbmVzV2ViLycgKyBpZEthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqICBSZXRvcm5hIGxhIGluZm8gYmFzaWNhIGRlIGxhcyB1YmljYWNpb25lcyBjb24gSHViIHRpcG8gV0VCIGFjdGl2b3MgZW4gZWwgbW9tZW50byBxdWUgYWJhcnF1ZW4gdW4gY29kcG9zdGFsIGVuIGNvbmNyZXRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIGdldFViaWNhY2lvbmVzQnlDb2RQb3N0YWwoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9kYXRhID0geyBcImNvZFBvc3RhbFwiOiBzdHJpbmcgfTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXRVYmljYWNpb25lc0J5Q29kUG9zdGFsLycgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCBwYXRoIGRlIGxhIGZhY3R1cmEgZWxlY3Ryw4PCs25pY2EgYSBwYXJ0aXIgZGUgdW4gSWREaWFyaW8gYXNvY2lhZG8gYWwgcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFBhdGhGRUZyb21EaWFyaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgdGlwb0dlbmVyYWNpb246IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL2dldFBhdGhGRUZyb21EaWFyaW8vJyArIGlkS2F0aW9zICsgJy8nICsgdGlwb0dlbmVyYWNpb24sIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIHJlc3B1ZXN0YTogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3B1ZXN0YSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREaWFyaW9BZGljaW9uYWxlc3hEaWFyaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5R2VuZXJhbGVzKCdEaWFyaW8vZ2V0RGlhcmlvQWRpY2lvbmFsZXN4RGlhcmlvLycgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3RhOiBhbnkgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcHVlc3RhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgSVVfSHViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvSHViOiBhbnksIHVUQWN0aXZvOiBzdHJpbmcsIHVOQWN0aXZvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogaWRfa2F0aW9zLnRyaW0oKSwgJ29IdWInOiBvSHViLCAndVRBY3Rpdm8nOiB1VEFjdGl2bywgJ3VOQWN0aXZvJzogdU5BY3Rpdm8gfTtcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zTWFlc3Ryby9JVV9IdWInLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZWwgY3Rpdm8gZGVzZGUgc2Vydmlkb3JcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkX2thdGlvcyBcclxuICAgICAqIEBwYXJhbSBpZHByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gdWJpY2FjaW9uIFxyXG4gICAgICogQHBhcmFtIGh1YiBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgR2V0Q3Rpdm9CWVByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGlkcHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkcHJvY2Vzbyc6IGlkcHJvY2VzbywgJ3ViaWNhY2lvbic6IHViaWNhY2lvbiwgJ2h1Yic6IGh1YiB9O1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL0dldEN0aXZvQllQcm9jZXNvLycgKyBpZF9rYXRpb3MudHJpbSgpLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBWYWxpZGFyQ3Rpdm9zVlNMb2NhbChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBpbmZQcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZywgZnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zL1ZhbGlkYXJDdGl2b3NWU0xvY2FsLycgKyBpZF9rYXRpb3MgKyAnLycgKyB1YmljYWNpb24gKyAnLycgKyBodWIsIGluZlByb2Nlc28pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgZnVuY2lvblJlc3AocmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcCh7IFwiZXJyb3JcIjogZXJyb3IgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIEdlbmVyYXJBdXRvcml6YWNpb25DdWVudGFzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGRhdGEpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuXHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNMy9HZW5lcmFyQXV0b3JpemFjaW9uQ3VlbnRhcycsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBzaSBlbCBjb2RpZ28gaW5ncmVzYWRvIGNvcnJlc3BvbmRlIGFsIGRvY3VtZW50byB5IHNpIGVsIGNvZGlnbyBlc3RhIGVuIGVzdGFkbyBhY3Rpdm9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHZhbGlkYWNpb25BdXRvcml6YWNpb25NM0N1ZW50YXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgZGF0YSkge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG5cclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zL3ZhbGlkYWNpb25BdXRvcml6YWNpb25NM0N1ZW50YXMnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFzeW5jIFZlcmlmaWNhclBhZ29UYXJqZXRhQkJWQShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgakRhdGEgPSB7IFwiSWRrYXRpb3NcIjogc0lES2F0aW9zLCBcImlkS2V5XCI6IHNJZEtleSB9XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvVmVyaWZpY2FyUGFnb1RhcmpldGFCQlZBJywgakRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm87XHJcbiAgICB9Ly9FbmQgZ2V0X0luZm9Qcm9jZXNvXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGUyAyMDE5MDgxMzogUmV0b3JuYSBsb3MgY29kaWdvcyBkZSBsb3MgU0tQKHNrcFRvRmluZCkgeSBzdSByZXNwZWN0aXZvIHNpZ25pZmljYWRvIHBhcmEgdW4gcHJvZHVjdG8gZGFkb1xyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGVzY3JpcGNpb25TS1BzKGlkS2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsXHJcbiAgICAgICAgZGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vbGV0IGRhdGEgPSB7XCJTS1AxXCI6XCJTS1AxXCIsIFNLUFRvRmluZDogMiB9fTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTNDb25zdWx0YXMvZ2V0RGVzY3JpcGNpb25TS1BzL1wiICsgaWRLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKGRhdGEuU0tQMSwgSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFzeW5jIGdldFRvdGFsZXNDaWVycmVDYWphKHBvc3RTZXJ2aWNlOiBQb3N0U2VydmljZU0zLCBzSWRLYXRpb3M6IHN0cmluZywgc3ViaWNhY2lvbjogc3RyaW5nLCBzaHViOiBzdHJpbmcsIHN1c3VhcmlvOiBzdHJpbmcsIHNGZWNoYUk6IHN0cmluZywgc0ZlY2hhRjogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNlY29wY2lvbmVzOiBhbnk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IHNJZEthdGlvcywgJ3ViaWNhY2lvbic6IHN1YmljYWNpb24sICdodWInOiBzaHViLCAndXN1YXJpbyc6IHN1c3VhcmlvLCAnRmVjaGFJJzogc0ZlY2hhSSwgJ0ZlY2hhRic6IHNGZWNoYUYgfVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gYXdhaXQgcG9zdFNlcnZpY2UuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0VG90YWxlc0NpZXJyZUNhamEnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gSlNPTi5wYXJzZShzZWNvcGNpb25lcylcclxuICAgICAgICByZXR1cm4gc2Vjb3BjaW9uZXNcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRDaWVycmVzeFViaWNhY2lvbihwb3N0U2VydmljZTogUG9zdFNlcnZpY2VNMywgc0lkS2F0aW9zOiBzdHJpbmcsIHN1YmljYWNpb246IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nLCBzRmVjaGE6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBzZWNvcGNpb25lczogYW55O1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBzSWRLYXRpb3MsICd1YmljYWNpb24nOiBzdWJpY2FjaW9uLCAnaWRQcm9jZXNvJzogc0lkUHJvY2VzbywgJ0ZlY2hhJzogc0ZlY2hhIH1cclxuICAgICAgICBzZWNvcGNpb25lcyA9IGF3YWl0IHBvc3RTZXJ2aWNlLmdldFdpdGhCb2R5TTMoJ00zL2dldENpZXJyZXN4VWJpY2FjaW9uJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICBzZWNvcGNpb25lcyA9IEpTT04ucGFyc2Uoc2Vjb3BjaW9uZXMpXHJcbiAgICAgICAgcmV0dXJuIHNlY29wY2lvbmVzXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0Q2llcnJlc3hFbXByZXNhKHBvc3RTZXJ2aWNlOiBQb3N0U2VydmljZU0zLCBzSWRLYXRpb3M6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nLCBzRmVjaGE6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBzZWNvcGNpb25lczogYW55O1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBzSWRLYXRpb3MsICdpZFByb2Nlc28nOiBzSWRQcm9jZXNvLCAnRmVjaGEnOiBzRmVjaGEgfVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gYXdhaXQgcG9zdFNlcnZpY2UuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0Q2llcnJlc3hFbXByZXNhJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICBzZWNvcGNpb25lcyA9IEpTT04ucGFyc2Uoc2Vjb3BjaW9uZXMpXHJcbiAgICAgICAgcmV0dXJuIHNlY29wY2lvbmVzXHJcbiAgICB9XHJcblxyXG4gICAgLy9UcmFlIGVsIG0zcHJvY2Vzb3Mgc2VncHVuIGVsIGlkcHJlc3RhbW9cclxuICAgIHB1YmxpYyBzaW11bGFycGFnb0VubGluZWEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZE0zOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvVmFsaWRhY2lvblBhZ29JbnRlZ3JhY2lvblRlc3QvJyArIHNJREthdGlvcyArICcvJyArIHNJZE0zICsgJy8nICsgc0lkUHJvY2Vzbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZhbGlkYXJQcmRzTWlzbW9Qcm92ZWVkb3IoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG5vbWJyZUFkaWNpb25hbFByb3ZlZWRvcjogc3RyaW5nLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0Z1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNNYWVzdHJvL3ZhbGlkYXJQcmRzTWlzbW9Qcm92ZWVkb3IvXCIgKyBpZF9rYXRpb3MgKyBcIi9cIiArIG5vbWJyZUFkaWNpb25hbFByb3ZlZWRvciwgb00zUHJvY2Vzb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXNwWydfYm9keSddKS50b1N0cmluZygpKSlcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB2YWxpZGFyUHJkc01pc21vUHJvdmVlZG9yXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uUmVzcChKU09OLnBhcnNlKEpTT04ucGFyc2UoZXJyWydfYm9keSddKS5NZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2YWxpZGFyUmVzdHJpY2Npb25JbnZOZWdhdGl2byhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9GdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby92YWxpZGFyUmVzdHJpY2Npb25JbnZOZWdhdGl2by9cIiArIGlkX2thdGlvcywgb00zUHJvY2Vzb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXNwWydfYm9keSddKS50b1N0cmluZygpKSlcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB2YWxpZGFyUmVzdHJpY2Npb25JbnZOZWdhdGl2b1wiKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKGVyclsnX2JvZHknXSkuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mb1ByZEdhc3Rvc0VudmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG5cclxuICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNNYWVzdHJvL2dldEluZm9QcmRHYXN0b3NFbnZpby9cIiArIGlkX2thdGlvcywgb00zUHJvY2Vzb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04ucGFyc2UocmVzcFsnX2JvZHknXSkudG9TdHJpbmcoKSkuUkVTUFVFU1RBXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmEgdW5hIHNhbGRveGN1ZW50YSBhbGVhdG9yaW8gcG9yIGVsIHZhbG9yIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgPSB7XCJwcm9jZXNvXCIscHJvY2VzbyxcInZhbG9yXCI6dmFsb3IsXCJub21icmVEb2NcIjogbm9tYnJlRG9jfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbTNfZ2VuZXJhcl9NM1NYQ19hbGVhdG9yaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55KSB7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9tM19nZW5lcmFyX00zU1hDX2FsZWF0b3Jpby9cIiArIGlka2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXNwWydfYm9keSddKS50b1N0cmluZygpKS5SRVNQVUVTVEE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdHVhbGl6YSB1biBjb25jZXB0byBkZWwgTTNfc2FsZG9zSXRlbVViXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBNM19hY3R1YWxpemFyQ29uY2VwdG9TSVUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL00zX2FjdHVhbGl6YXJDb25jZXB0b1NJVS9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNvQWxDaWVycmVVYmljKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9wcm9jZXNvQWxDaWVycmVVYmljL1wiICsgaWRfa2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcClcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBwcm9jZXNvQWxDaWVycmVVYmljXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0X1Byb2Nlc29zQWJpZXJ0b3MoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXRfUHJvY2Vzb3NBYmllcnRvcy8nICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UoU3RyaW5nKHJlc3ApKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGdldF9Qcm9jZXNvc0FiaWVydG9zXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9JbmZvUHJvY2Vzb1xyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IE0zUEVuY0l0ZW1zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBlbmMtaXRlbXNcIjtcclxuaW1wb3J0IHsgTTNQcmRHZW5lcmFsIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHZW5lcmFsLnR5cGVcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUEl0ZW1zV0VCLCBNM1BEZXRhbGxlQ3Vwb24gfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zRGF0YSB9IGZyb20gXCIuLi9EYXRhL20zLWRhdGFcIjtcclxuaW1wb3J0IHsgREVGQVVMVF9WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9kZWZhdWx0X3ZhbHVlX2FjY2Vzc29yXCI7XHJcbmltcG9ydCB7IHhtbFRvSnNvblRGIH0gZnJvbSBcIi4uLy4uL0NvbnZlcnQveG1sVG9KU29uLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zUEltcHVlc3RvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wLWltcHVlc3Rvc1wiO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcbmltcG9ydCB7IE0zRU5DUFJPTU8gfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zRU5DUFJPTU8uY2xhc3NcIjtcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBwcm9tb2Npb25lc1NlcnZpY2UgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvcHJvbW9jaW9uZXMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQcm9tb2Npb25Qcm9jZXNhZGEsIFByb21vY2lvbmVzQXNvY2lhZGFzLCBQcm9tb2Npb25Db21iaW5hZGEgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zUHJvbW9Qcm9jZXNhZGEuY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNDb3VjaE1hZXN0cm8gfSBmcm9tIFwiLi4vRGF0YS9tMy1jb3VjaC1tYWVzdHJvXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhc1wiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTGlzdGFQcmVjaW8gfSBmcm9tIFwiLi9tMy1saXN0YS1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbG9hZC1sLXByZWNpby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGEgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9zcmMvcmVuZGVyM1wiO1xyXG5pbXBvcnQgeyBNM1ByZXNlbnRhY2lvbmVzIH0gZnJvbSBcIi4uL01hZXN0cm8vbTMtcHJlc2VudGFjaW9uZXNcIjtcclxuaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSBcIkBhbmd1bGFyL2NvbXBpbGVyL3NyYy91dGlsXCI7XHJcbmltcG9ydCB7IE0zUHJkUGFja0RldCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkUGFja0RldFwiO1xyXG5pbXBvcnQgeyBNM1ByZEFkaWNpb25hbGVzIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zT3RDbGFzaWZpY2FjaW9uZXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtb3QtY2xhc2lmaWNhY2lvbmVzXCI7XHJcbmltcG9ydCB7IE0zUHJkTGlzdGEgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZExpc3RhLnR5cGVcIjtcclxuaW1wb3J0IHsgTWF0aFRGIH0gZnJvbSBcIi4uL01pc2NlbGFuZWEvTWF0aFRGLmNsYXNzXCI7XHJcbmltcG9ydCB7IEVDQU5DRUxFRCB9IGZyb20gXCJjb25zdGFudHNcIjtcclxuaW1wb3J0ICogYXMgeG1sMmpzIGZyb20gJ3htbDJqcyc7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG52YXIgYmlnRGVjaW1hbCA9IHJlcXVpcmUoJ2pzLWJpZy1kZWNpbWFsJyk7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZWdTZXJ2aWNlIHtcclxuICAgIHB1YmxpYyBvTWF0aFRGOiBNYXRoVEYgPSBuZXcgTWF0aFRGKCk7XHJcbiAgICBwcml2YXRlIG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm87XHJcbiAgICBwdWJsaWMgb0xpc3RhT2JzZXF1aW9zOiBBcnJheTxhbnk+ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvYnNlcXVpb3NFeGM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBvYnNlcXVpb09Qcm9tbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9zQ2FudGlkYWQ6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbElkQWN0aXZhUHJvbW8gPSBbXTtcclxuICAgIHByaXZhdGUgR29Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zO1xyXG4gICAgcHJpdmF0ZSBnc0lka2F0aW9zO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBJc1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJZGthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8gPSBpb00zQ291Y2hNYWVzdHJvO1xyXG4gICAgICAgIHRoaXMuR29Qb3N0U2VydmljZU0zID0gSXNQb3N0U2VydmljZU0zO1xyXG4gICAgICAgIHRoaXMuZ3NJZGthdGlvcyA9IHNJZGthdGlvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBWYWxpZGFyIG51bWVybyBkZSBpdGVtcyBhZ3JlZ2Fkb3MuIHNpIGVzIG1heW9yIGEgMS4wMDAgcHJlbmRlIHBhcmFtZXRybyBcclxuICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTnVtZXJvSXRlbXMob2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5NM0VOQy5sZW5ndGggPiAxMDAwKSB7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5BcGxEZXNkZVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5NM0VOQyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFByb2Nlc2FtaWVudG9TZXJ2aWNlKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgYXBsUmV0b21hckluZm86IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyTnVtZXJvSXRlbXMob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JZE0zID0gb0pzb24uUkVTUFVFU1RBLklETTM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJT0NJRVJSRVxyXG5cclxuICAgICAgICAgICAgLy9BY3R1YWxpemFjaW9uIGRlIGVzdGFkb3MuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuRXN0YWRvRGVzO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvSnNvbi5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIGFwbFJldG9tYXJJbmZvOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklkTTMgPSBvSnNvbi5SRVNQVUVTVEEuSURNMztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW8gPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU87XHJcblxyXG4gICAgICAgICAgICAvL0FjdHVhbGl6YWNpb24gZGUgZXN0YWRvcy5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5Fc3RhZG9EZXM7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgUmVnaXN0cm9FdmVudG9NM09mZkxpbmUoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBBcnJheTxNM1Byb2Nlc29zPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vL1JldG9tYXIgaW5mb3JtYWNpb24gcGFyYSBlbCBwcm9jZXNvLlxyXG4gICAgcHVibGljIFJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXI6IGFueSwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhVXNlciAhPSBudWxsICYmIG9NM1Byb2Nlc29zLklkTTMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5JZE0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGFwbFJldG9tYXJJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID09IHVuZGVmaW5lZCB8fCBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZVxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIGRhdG9zIGVuIGJhc2UgZGUgZGF0b3MgcG91Y2hEQi5cclxuICAgIHB1YmxpYyBQcm9jZXNhbWllbnRvU2VydmljZVBvdWNoREIob00zRGF0YTogTTNEYXRhLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgIC8vQ2FyZ2FyIGRldGFsbGUgZGUgaXRlbXNcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4oYXN5bmMgcmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLnZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNQcm9jZXNvcy5NM0VOQywgcHJvZHVjdFVuaXRTZWxlY3RlZCwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkX2FjdHVhbCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2xldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLmdldENhbnRpZGFkKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAoK2NhbnRpZGFkX2FjdHVhbCkgKyArb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCBNM0VuYyA9IHRoaXMuZ2V0X00zRU5DX2J5X2lkcHJkX2xvdGUob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVLCBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUpO1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UgJiYgcHJvZC5Mb3RlID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSAmJiAhKHByb2QuSWRFbmNQYWRyZSA+IDApKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9EYXRhQ2Fycml0b0NvbXByYXMpO1xyXG4gICAgICAgIH0sIGFzeW5jIGVycm9yID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9EYXRhVXNlciwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgaW9NM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BZ3JlZ2FyIGEgY2Fycml0byBwcm9kdWN0by5cclxuICAgIHB1YmxpYyBhZGR0b2NhcnQob00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwsIHZhbG9yRGVzY3VlbnRvID0gMCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MDcyMiBzZSBhZ3JlZ2EgcGFyYSBjdWFuZG8gZXMgZWwgcHJpbWVyIHByb2R1Y3RvIHF1ZSBzZSBhZ3JlZ2Fyw4PCoVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0VOQy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvRGF0YVVzZXIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGlvTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy52YWxpZGFyRXhpc3RhUHJvZHVjdG8ob00zUHJvY2Vzb3MuTTNFTkMsIHByb2R1Y3RVbml0U2VsZWN0ZWQsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGlmIChjYW50aWRhZF9hY3R1YWwgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9sZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy5nZXRDYW50aWRhZChvTTNQcm9jZXNvcywgcHJvZHVjdFVuaXRTZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gKCtjYW50aWRhZF9hY3R1YWwpICsgb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVICYmIHByb2QuTG90ZSA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUgJiYgIShwcm9kLklkRW5jUGFkcmUgPiAwKSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQsIHZhbG9yRGVzY3VlbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCwgdmFsb3JEZXNjdWVudG8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9WYWxpZGEgcXVlIGV4aXN0YSBwcm9kdWN0byBlbiBsb3MgZW5jYWJlemFkb3MuIFRydWU6IFNpIGV4aXN0ZSwgRmFsc2UgZGUgb3RybyBtb2RvXHJcbiAgICAvLyBTZSBjYW1iaWEgZnVuY2lvbmFsaWRhZCBkZSByZXR1cm4uXHJcbiAgICBwdWJsaWMgdmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM0xpc3RhRW5jOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1ByZEdybDogTTNQcmRHZW5lcmFsLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKTogbnVtYmVyIHtcclxuICAgICAgICB2YXIgb0VuYzogTTNQRW5jSXRlbXMgPSBudWxsO1xyXG4gICAgICAgIHZhciBjYW50aWRhZDogbnVtYmVyID0gMDtcclxuICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9IC0xO1xyXG4gICAgICAgIGlmIChvTTNMaXN0YUVuYyAhPT0gdW5kZWZpbmVkICYmIG9NM1ByZEdybCAhPT0gdW5kZWZpbmVkICYmIG9NM0xpc3RhRW5jLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgIG9FbmMgPSBvTTNMaXN0YUVuYy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBvTTNQcmRHcmwuU0tVICYmICFlbmMuSWRFbmNQYWRyZSAmJiB0aGlzLmdldENhbnRpZGFkUG9zaXRpdmEoZW5jKSk7XHJcbiAgICAgICAgICAgIGlmIChvRW5jICE9PSB1bmRlZmluZWQgJiYgb0VuYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA3MTcgVmFsaWRhciBhaG9yYSBlbCBwcmVjaW8uXHJcbiAgICAgICAgICAgICAgICB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlc0dlbmVyYWwob00zUHJkR3JsLCArb0VuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLlZhbGlkYXJQcmVjaW9zUHJkcyhvRW5jLCBvTTNQcmRHcmwuTG9NM1ByZExpc3RhKSAmJiAhdGhpcy5WYWxpZGFyRXN0YVBhcXVldGUob0VuYywgb00zTGlzdGFFbmMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSBvRW5jLklEO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnRpZGFkID0gK29FbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbnRpZGFkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENhbnRpZGFkUG9zaXRpdmEob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjYW50aWRhZCA9IDA7XHJcbiAgICAgICAgbGV0IGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIilcclxuXHJcbiAgICAgICAgaWYgKGRldENhbnRpZGFkKSB7XHJcbiAgICAgICAgICAgIGNhbnRpZGFkID0gK2RldENhbnRpZGFkLlZhbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHF1ZSBlbCBlbmNhYmV6YWRvIGNvbiBlbCBwcm9kdWN0byBhZ3JlZ2Fkbywgc2VhIHVuIHBhcXVldGVcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gb00zTGlzdGFFbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyRXN0YVBhcXVldGUob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb00zTGlzdGFFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNMaXN0YUVuYy5maW5kKHggPT4geC5JZEVuY1BhZHJlID09IG9NM1BFbmNJdGVtcy5JRCkpIHtcclxuICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBsb3MgcHJlY2lvcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgKiBAcGFyYW0gb0VuYyBcclxuICAgICAqIEBwYXJhbSBvTTNQcmRMaXN0YSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJQcmVjaW9zUHJkcyhvRW5jOiBNM1BFbmNJdGVtcywgb00zUHJkTGlzdGE6IE0zUHJkTGlzdGEpIHtcclxuICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb0VuYzogbnVtYmVyID0gK29FbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9MaXN0OiBudW1iZXIgPSBvTTNQcmRMaXN0YS5QUkVDSU87XHJcblxyXG4gICAgICAgICAgICBpZiAoZFByZWNpb0xpc3QgPT0gZFByZWNpb0VuYykge1xyXG4gICAgICAgICAgICAgICAgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIFZhbGlkYXJQcmVjaW9zUHJkc1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyBVcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIHRpcG9VYmljYWNpb246IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvblxyXG4gICAgICAgICwgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uID0gbnVsbCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiA9IG51bGwpIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgLy9JREhVQlxyXG4gICAgICAgIGlmICh0aXBvVWJpY2FjaW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG4gICAgICAgICAgICBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBtM1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIG0zVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICBpZiAobTNVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgdmFyIGxvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgICAgICAgICBsb00zUEl0ZW1zV0VCID0gb00zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHRoaXMuZ3NJZGthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICB0aGlzLlByb2NQcm9tb0FmdGVyQWRkVG9DYXJ0KG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIsIGxvTTNQSXRlbXNXRUIsIG0zVWJpY2FjaW9uLCB0cnVlKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coeCk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhvRGF0YSk7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzQXN5bmMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh4KVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvIGVuIHByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9Pa1wiKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLm9FbmNhYmV6YWRvTTNDb21wb25lbnQuUmVjYXJnYXJDYXJyaXRvKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuTG9hZENhcnQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWN0dWFsaXphY2lvbiBkZSBNMyBwcm9jZXNvcywgY29uIGRhdGEgbGlzdGEgcGFyYSBhY3R1YWxpemFyLlxyXG4gICAgcHVibGljIHVwZGF0ZUFQb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgdGlwb1ViaWNhY2lvbjogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vSURIVUJcclxuICAgICAgICBpZiAodGlwb1ViaWNhY2lvbi50b1VwcGVyQ2FzZSgpID09IFwiV0VCXCIpIHtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICAgICAgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0bykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICBhd2FpdCBvTTNEYXRhLkRlbGV0ZShzS2V5Q2Fycml0byk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL0VsaW1pbmFyIGRvY3VtZW50byBkZSBjb3VjaC9wb3VjaCwgaW5pY2lvIHkgYWN0dWFsXHJcbiAgICBwdWJsaWMgRGVsRG9jc1N0YXJ0QW5kQ3VycmVudChvTTNEYXRhOiBNM0RhdGEsIHNJREthdGlvczogc3RyaW5nLCBvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFViaWNhY2lvbkN1cnJlbnQsIEh1YkN1cnJlbnQpIHtcclxuICAgICAgICAvL0VsaW1pbmFyIEluaWNpYWxcclxuICAgICAgICBpZiAob2xNM1Byb2Nlc29zLklERGlhcmlvQ2llcnJlICE9PSB1bmRlZmluZWQgJiYgb2xNM1Byb2Nlc29zLklERGlhcmlvQ2llcnJlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhVXNlciA9IHsgXCJVc3VhcmlvU2lzdGVtYVwiOiB7IFwiVERPQ1wiOiBvbE0zUHJvY2Vzb3MuVERvYywgXCJORE9DXCI6IG9sTTNQcm9jZXNvcy5ORG9jLCBcIlVCSUNBQ0lPTlwiOiBvbE0zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSwgXCJJREhVQlwiOiBvbE0zUHJvY2Vzb3MuSURIdWIgfSB9XHJcbiAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJEZWxldGUgc3RhcnRcIik7XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAvL0VsaW1pbmFyIGFjdHVhbFxyXG4gICAgICAgICAgICBvRGF0YVVzZXIgPSB7IFwiVXN1YXJpb1Npc3RlbWFcIjogeyBcIlRET0NcIjogb2xNM1Byb2Nlc29zLlREb2MsIFwiTkRPQ1wiOiBvbE0zUHJvY2Vzb3MuTkRvYywgXCJVQklDQUNJT05cIjogVWJpY2FjaW9uQ3VycmVudC50b1N0cmluZygpLCBcIklESFVCXCI6IEh1YkN1cnJlbnQgfSB9XHJcbiAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJEZWxldGUgY3VycmVudFwiKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyBhc3luYyBHZXRDYXJyaXRvQ29tcHJhc1BvdWNoREIob00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLy9UcmFzbGFkYXIgaW5mb3JtYWNpw4PCs24gZGUgY2Fycml0bywgZG9zIHVzdWFyaW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgTW92ZUNhcnRJbnRvVXNlcihzSURLYXRpb3M6IHN0cmluZywgb00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXJPcmlnZW46IGFueSwgb0RhdGFVc2VyRGVzdGlubzogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvT3JpZ2VuO1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0b0Rlc3Rpbm87XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvT3JpZ2VuID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG9EZXN0aW5vID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIGxldCBvTTNQcm9jZXNvID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0b09yaWdlbik7XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvLlREb2MgPSBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlRET0M7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc28uTkRvYyA9IG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuTkRPQztcclxuICAgICAgICAgICAgZGVsZXRlIG9NM1Byb2Nlc29bXCJfcmV2XCJdO1xyXG4gICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvRGVzdGlubywgb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzIHkgZGUgYmFzZVxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmVjYWxjdWxhclByZWNpb3NQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWw7XHJcbiAgICAgICAgLy8gdmFyIGRQcmVjaW9Ub3RhbEJhc2U7XHJcbiAgICAgICAgLy8gdmFyIGRWYWxvcjogbnVtYmVyID0gMDtcclxuICAgICAgICAvLyB2YXIgZFZhbG9yTmV0bzogbnVtYmVyID0gMDtcclxuXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAvLyAgICAgZFByZWNpb1RvdGFsID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yIC8vKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpICogKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKTtcclxuICAgICAgICAvLyAgICAgZFByZWNpb1RvdGFsQmFzZSA9IHRoaXMuQ2FsY3VsYXJQcmVjaW9CYXNlRnJvbVByb2Nlc28oZW5jLCBkUHJlY2lvVG90YWwpO1xyXG4gICAgICAgIC8vICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxCQVNFXCIpLlZhbG9yID0gU3RyaW5nKE1hdGgucm91bmQoZFByZWNpb1RvdGFsQmFzZSAqIDEwMCkgLyAxMDApO1xyXG4gICAgICAgIC8vICAgICBkVmFsb3IgPSAoK2RWYWxvcikgKyAoK2RQcmVjaW9Ub3RhbEJhc2UpO1xyXG4gICAgICAgIC8vICAgICBkVmFsb3JOZXRvID0gKCtkVmFsb3JOZXRvKSArICgrZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5SZWNhbGN1bG9JbXB1ZXN0b3MoZW5jLCBkUHJlY2lvVG90YWxCYXNlKTtcclxuICAgICAgICAvLyB9KTtcclxuICAgICAgICAvLyAvL29NM1Byb2Nlc29zLlZhbG9yID0gZFZhbG9yO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IGRWYWxvck5ldG87XHJcbiAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vUmVjYWxjdWxhciBwcmVjaW9zLiByZWNvcnJpZW5kbyBsb3MgZW5jYWJlemFkb3MuXHJcbiAgICBwdWJsaWMgUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgdmFsb3IgPSAwO1xyXG4gICAgICAgIHZhciBWYWxvck5ldG8gPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkxMDEwIHNlIGNhbWJpYSBlbCB2YWxvciBkZWwgcHJlY2lvIHVuaXRhcmlvIGJhc2UsIHlhIHF1ZSBhbCBtb21lbnRvIGRlIGxsYW1hciBsYSBmdW5jacODwrNuIFZhbG9yZXNDYWxjdWxhZG9zUHJvY2Vzb1xyXG4gICAgICAgICAgICAvLyBzZSByZWNhbGN1bG8gZWwgcHJlY2lvIHRvdGFsLCBkZXBlbmRpZW5kbyBkZSBlc3RlIHZhbG9yLlxyXG4gICAgICAgICAgICBsZXQgcFRvdGFsQmFzZSA9IHRoaXMuQ2FsY3VsYXRlUHJlY2lvQmFzZShlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1RCTERJTVBQUkRcIikuVmFsb3IsXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9NYXRoVEYucm91bmQoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yLCAyKSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgZENhbnRpZGFkRW5jID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgaWYgKCtkQ2FudGlkYWRFbmMgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpLlZhbG9yID0gKCtwVG90YWxCYXNlIC8gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9VTklUQkFTRVwiKS5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKGVuYywgK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bGFyIHByZWNpbyBiYXNlIGRlIHVuIHByZWNpbywgdGVuaWVuZG8gZWwgdmFsb3IgdG90YWwgbyBuZXRvLlxyXG4gICAgcHVibGljIENhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRQcmVjaW9OZXRvOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZFZhbG9ySW1wdWVzdG86IG51bWJlciA9IDE7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JJbXB1ZXN0byA9ICgrZFZhbG9ySW1wdWVzdG8pICsgKCtpbXAuUG9yY2VudGFqZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgoK2RQcmVjaW9OZXRvKSAvICgrZFZhbG9ySW1wdWVzdG8pKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1JlY2FsY3VsbyBkZSB2YWxvciBkZSBpbXB1ZXN0b3MsIGN1YW5kbyBjYW1iaWEgZWwgdmFsb3IuIFNlYSBwb3IgY2FudGlkYWQsIGVsaW1pbmFjacODwrNuLi4uXHJcbiAgICAvLyBwdWJsaWMgUmVjYWxjdWxvSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRQcmVjaW9CYXNlOiBudW1iZXIpIHtcclxuICAgIC8vICAgICB2YXIgZFRvdGFsSW1wdWVzdG86IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAvLyAgICAgICAgIGltcC5WYWxvciA9ICgrZFByZWNpb0Jhc2UpICogKCtpbXAuUG9yY2VudGFqZSk7XHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBudWV2byBjb25jZXB0b1xyXG4gICAgLy8gICAgICAgICBpbXAuQmFzZSA9IGRQcmVjaW9CYXNlO1xyXG4gICAgLy8gICAgICAgICBkVG90YWxJbXB1ZXN0byA9ICgrZFRvdGFsSW1wdWVzdG8pICsgKCtpbXAuVmFsb3IpO1xyXG4gICAgLy8gICAgICAgICAvL1N1bWEgZGUgcHJlY2lvIGJhc2UgXHJcbiAgICAvLyAgICAgICAgIGRQcmVjaW9CYXNlID0gKCtkUHJlY2lvQmFzZSkgKyAoK2ltcC5WYWxvcik7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyAgICAgZFRvdGFsSW1wdWVzdG8gPSBNYXRoLnJvdW5kKGRUb3RhbEltcHVlc3RvICogMTAwKSAvIDEwMDtcclxuICAgIC8vICAgICBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxJTVBVRVNUT1NcIikuVmFsb3IgPSBkVG90YWxJbXB1ZXN0by50b1N0cmluZygpO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWFjaW9uIG51ZXZvIE0zIHByb2Nlc29zLCBlc3RlIHZhIHZhY2lvIHNpbiBuaXNpcXVpZXJhIE0zUEVuY0l0ZW1zLiBcclxuICAgICAqIFNlIHV0aWxpemEgcHJpbmNpcGFsbWVudGUgcGFyYSBsYXMgY3JlYWNpb24gZGVzZGUgMCB1biBNMyBQcm9jZXNvLiBRdWUgcGFzYSBkZSBlc3RhZG9zICcnIGFsIHByaW1lciBlc3RhZG9cclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRwcm9jZXNvX2Rlc3Rpbm8gXHJcbiAgICAgKiBAcGFyYW0gdGRvYyBcclxuICAgICAqIEBwYXJhbSBuZG9jIFxyXG4gICAgICogQHBhcmFtIGVzdGFkb3NfZnV0dXJvcyBcclxuICAgICAqIEBwYXJhbSBpZEh1YiBcclxuICAgICAqIEBwYXJhbSBpZFViaWNhY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENyZWF0ZU0zTmV3UHJvY2Vzb0VtcHR5KGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRwcm9jZXNvX2Rlc3Rpbm86IHN0cmluZywgdGRvYzogc3RyaW5nLCBuZG9jOiBzdHJpbmcsXHJcbiAgICAgICAgZXN0YWRvc19mdXR1cm9zOiBBcnJheTxhbnk+LCBpZEh1Yjogc3RyaW5nLCBpZFViaWNhY2lvbjogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IGlkcHJvY2Vzb19kZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBlc3RhZG9zX2Z1dHVyb3NbMF0uRV9EZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBlc3RhZG9zX2Z1dHVyb3NbMF0uU0VfRGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9ICtpZEh1YjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSAraWRVYmljYWNpb247XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLklESHViID0gK2lkSHViO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5VYmljMSA9ICtpZFViaWNhY2lvbjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVERvYyA9IHRkb2M7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk5Eb2MgPSBuZG9jO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5UaXBvVGVyY2VybyA9IDE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlViaWMyID0gLTE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmUgPSAtMTtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvL0N1YW5kbyBzZSBhZ3JlZ2EgcG9yIHByaW1lcmEgdmV6IGFsIGNhcnJpdG8gZGUgY29tcHJhLlxyXG4gICAgcHVibGljIExvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb0RhdGFVc2VyOiBhbnksIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICAvL3NJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OXHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IGlvTTNQcm9jZXNvcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5UaXBvVGVyY2VybyA9IDE7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVERvYyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk5Eb2MgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQztcclxuICAgICAgICBvTTNQcm9jZXNvcy5VYmljMSA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT047XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVWJpYzIgPSAtMTtcclxuICAgICAgICAvLy9BR1JFR0FSIE5VRVZBIEZVTkNJT05BTElEQUQgREUgSFVCUy4gRkxVSk8gREUgVFJBQkFKT1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLklESHViID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSBvTTNQcm9jZXNvcy5JREh1YjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9IG9NM1Byb2Nlc29zLlViaWMxO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlID0gLTE7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUgPSAtMTtcclxuXHJcbiAgICAgICAgLy8vRklOIEFHUkVHQVIgTlVFVkEgRlVOQ0lPTkFMSURBRCBERSBIVUJTLiBGTFVKTyBERSBUUkFCQUpPXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IFwiXCI7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gXCJcIjtcclxuXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9PSBcIlwiICYmIGlvTTNQcm9jZXNvcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9IFwiUmVnaXN0cm9cIjtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gXCJBY3Rpdm9cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvTTNQSXRlbXNXRUIuU3ViRXN0YWRvX28gIT0gXCJcIiAmJiBvTTNQSXRlbXNXRUIuRXN0YWRvX28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBvTTNQSXRlbXNXRUIuU3ViRXN0YWRvX287XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IG9NM1BJdGVtc1dFQi5Fc3RhZG9fbztcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklkUHJvY2VzbyA9PSBcIlwiICYmIGlvTTNQcm9jZXNvcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gXCJNM0VDQ1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLnB1c2godGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcikpO1xyXG4gICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG51bGwsIDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZClcclxuXHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3IgPSBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWw7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAvL3RoaXMuUHJvY2VzYW1pZW50b1NlcnZpY2UoUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3MsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9DYXJnYXIgbnVldm9zIGFkaWNpb25hbGVzIGFkaWNpb25hbGVzXHJcbiAgICBwdWJsaWMgTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIHByb2R1Y3Q6IFR5cGVNM1ByZEdycCk6IE0zUEl0ZW1zV0VCIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuQ2xhdmVQcmRTUlYgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJDTEFWRVBST0RTRVJWXCIpLlZBTE9SO1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuQ2xhdmVQcmRVbmlkYWQgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJDTEFWRVVOSURBRFwiKS5WQUxPUjtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlVuaWRhZCA9IHByb2R1Y3QuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBcIlVOSURBRFwiKS5WQUxPUjtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvTTNQSXRlbXNXRUI7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYXJnYXIgcHJvY2Vzb3MsIHJldG9tYW5kbyBkZXNkZSBkYXRhXHJcbiAgICBwdWJsaWMgTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwsIHZhbG9yRGVzY3VlbnRvID0gMCk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yID0gKCtvTTNQcm9jZXNvcy5WYWxvcikgKyAoK29NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwpO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9NM1Byb2Nlc29zLlZhbG9yO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9PSBcIlwiICYmIG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IG9NM1BJdGVtc1dFQi5JZFByb2Nlc287XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLnB1c2godGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcikpO1xyXG4gICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG51bGwsIHZhbG9yRGVzY3VlbnRvLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpXHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb2VuY2FiZXphZG9JdGVtczogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9QYWRyZU0zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgdmFsb3JEZXNjdWVudG8gPSAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy9WYWxpZGFjaW9uIGRlIEludmVudGFyaW8uXHJcbiAgICAgICAgbGV0IGFkaVZlbnRhTmVnID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKHggPT4geC5BVFJJQlVUTyA9PSBcIlZFTlRBTkVHXCIpXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW1wiSW52ZW50YXJpb0Vycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvLnRvVXBwZXJDYXNlKCkgPT0gXCJNM0VDQ1wiICYmIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFIDwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCAmJiBvTTNVYmljYWNpb24uTTNIVUJTWzBdLlRpcG8gPT0gXCJXRUJcIiAmJiAhKGFkaVZlbnRhTmVnICYmIGFkaVZlbnRhTmVnLlZBTE9SKSkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXSA9ICdObyBoYXkgaW52ZW50YXJpbyBwYXJhIGFncmVnYXIgJyArIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgKyAnIEl0ZW1zJztcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFO1xyXG4gICAgICAgIH0gLy9lbHNlIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIG9NM1BFbmNJdGVtcyA9IHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybEl0ZW0ob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvUGFkcmVNM1BFbmNJdGVtcywgdmFsb3JEZXNjdWVudG8pO1xyXG5cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgZGVsZXRlIG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob1BhZHJlTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgLy9UaWVuZSB1biBlbmNhYmV6YWRvIHBhZHJlLlxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA9IG9QYWRyZU0zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgdmFyIG9sTTNQcmRQYWNrRGV0OiBBcnJheTxNM1ByZFBhY2tEZXQ+O1xyXG4gICAgICAgICAgICBvbE0zUHJkUGFja0RldCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5NM1BBQ0tcclxuICAgICAgICAgICAgaWYgKG9sTTNQcmRQYWNrRGV0ICYmIG9sTTNQcmRQYWNrRGV0Lmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCB2YWxvckRlc2N1ZW50b1BhY2sgPSB0aGlzLmNhbGN1bGFyUG9yY2VudGFqZURlc2N1ZW50b0NvbWJvKHByb2RHUlBTZWxlY3RlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbE0zUHJkUGFja0RldC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvTTNQcmRQYWNrRGV0OiBNM1ByZFBhY2tEZXQgPSBvbE0zUHJkUGFja0RldFtpXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFja00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1ByZFBhY2tEZXQub00zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQiA9IG9NM1ByZFBhY2tEZXQub00zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCID0gT2JqZWN0LmFzc2lnbih7fSwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IG9NM1ByZFBhY2tEZXQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5QYXRoSW1hZ2VuID0gb00zUHJkUGFja0RldC5nc1BhdGhJbWFnZW47XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgKiBvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5DYWxjdWxhclByZWNpb3NQQ0tHKG9NM1ByZFBhY2tEZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyBpICsgMjsgLy9Fc3RvIGZ1bmNpb25hIHNpIHRpZW5lIHNvbG8gMiBuaXZlbGVzXHJcbiAgICAgICAgICAgICAgICAgICAgLy9TaSBlc3RvIHNlIGN1bXBsZSBlc3RlIHByb2R1Y3RvIGVzIHVuIHBhY2sgeSB0aWVuZSBwcm9kdWN0b3MgYXNvY2lhZG9zLlxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZEdlbmVyYWwgPSBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLk0zQ29kcy5maW5kKHggPT4geC5JZENvZGlnbyA9PSBcIlVQQ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZEdlbmVyYWwgJiYgcHJkR2VuZXJhbC5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLkNvZGlnb0JhcnJhcyA9IHByZEdlbmVyYWwuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJubyBhw4PCsWFkaSBjb2RpZ28gZGUgYmFycmFzIGEgcHJvZHVjdG8gaGlqbzogXCIgKyBvTTNQcmRQYWNrRGV0LlNLVUhJSk8pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgb00zUHJkUGFja0RldC5NM0dSUCwgb00zUHJvY2Vzb3MuTTNFTkMsIHBhY2tNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRW5jSXRlbXMsIDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyMywgZXN0byBlcyBjdWFuZG8gc2UgbW9kaWZpY2EgbGEgY2FudGlkYWQgZGUgcHJvZGN1dG9zIGV4aXN0ZW50ZXMuXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklEID0gb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkgZW52aW8gZGUgcGFkcmUgZGVzZGUgaW5zdHJ1Y2Npb24gbWFzIGFycmliYVxyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklERW5jUGFkcmUgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlID0gb00zUEl0ZW1zV0VCLklERW5jUGFkcmU7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuVGlwb0FncnVwYWNpb24gPSBvTTNQSXRlbXNXRUIuVGlwb0FncnVwYWNpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCAmJiBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLmZvckVhY2goZGluID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQRGluYW1CeUFjdGl2aWRhZC5wdXNoKHsuLi4gZGlufSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMucHVzaChvTTNQRW5jSXRlbXMpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdID0gb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNQcm9jZXNhZG8gPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgLy99XHJcbiAgICB9XHJcblxyXG4gICAgY2FsY3VsYXJQb3JjZW50YWplRGVzY3VlbnRvQ29tYm8ocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICBsZXQgdmFsb3JEZXNjdWVudG9QYWNrID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JJdGVtc0NvbWJvU3VtYSA9IDA7XHJcbiAgICAgICAgbGV0IHZhbG9yRmluYWxDb21ibyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG5cclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTTNQQUNLLmZvckVhY2gocHJkUGFjayA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZCA9IHByZFBhY2suTTNHUlAuQ2FudGlkYWQgPyBwcmRQYWNrLk0zR1JQLkNhbnRpZGFkIDogMTtcclxuICAgICAgICAgICAgbGV0IGluZk5pdmVsZXNQcmNpbyA9IHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByZFBhY2suTTNHUlAsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5JRExJU1RBKVxyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTylcclxuICAgICAgICAgICAgdmFsb3JJdGVtc0NvbWJvU3VtYSArPSAocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPICogY2FudGlkYWQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodmFsb3JJdGVtc0NvbWJvU3VtYSA+IHZhbG9yRmluYWxDb21ibykge1xyXG4gICAgICAgICAgICB2YWxvckRlc2N1ZW50b1BhY2sgPSAxMDAgLSAodmFsb3JGaW5hbENvbWJvICogMTAwIC8gdmFsb3JJdGVtc0NvbWJvU3VtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodmFsb3JEZXNjdWVudG9QYWNrKVxyXG4gICAgICAgIHJldHVybiB2YWxvckRlc2N1ZW50b1BhY2s7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxvIGRlIHByZWNpb3MgZGUgaGlqb3MgZGVsIHBhcXVldGVcclxuICAgICAqIEBwYXJhbSBvTTNQcmRQYWNrRGV0IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcmVjaW9zUENLRyhvTTNQcmRQYWNrRGV0OiBNM1ByZFBhY2tEZXQpIHtcclxuICAgICAgICBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBsb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29kaWdvOiBzdHJpbmcsIHZhbG9yLCBkQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gbmV3IE0zUEVuY0l0ZW1zKCk7XHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uSWRQcm9kdWN0byA9IGNvZGlnbztcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLkxvdGUgPSBcIjFcIjtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMODwrNnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5PcmRlbiA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIk9yZGVuXCIpICsgMTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk5vbWJyZSA9IGBDb21ibyAtICR7cHJvZHVjdG9zSGlqb3NEZWxDb21iby5tYXAoeD0+IHguSWRQcm9kdWN0bykuam9pbignLScpfWA7XHJcblxyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzJyksIFwiRkVDSEFJTlwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJ0cnVlXCIsIFwiRVNQUk9EUFJPTU9DT01CT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJ0cnVlXCIsIFwiRVNQUk9EUFJPTU9cIikpOyAvLyBUUlVFLT4gU0kgRVMgVU4gUFJPRFVDVE8gUE9SIFBST01PQ0lPTiwgRkFMU0UtPiBERSBPVFJPIE1PRE9cclxuICAgICAgICAvL0RldGFsbGVzIGRlIGZhY3R1cmEgZWxlY3Ryb25pY2FcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIkVOQ1BST01PXCIsIFwiVElQT19QUkRcIikpO1xyXG4gICAgICAgIC8qKkZJTiBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcblxyXG4gICAgICAgIC8vKiogSU5JQ0lPIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFJFQ0lPVU5JVEJBU0VcIikpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3Rvc1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVE5FVE9cIikpOy8vQ29uIGRlc2N1ZW50byBpbmNsdWlkby0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJWVU5JVFBST01PXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVU5JVEZJREVMXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgIC8vKiogRklOIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRDYW50aWRhZC50b1N0cmluZygpLCBcIkNBTlRJREFEXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiRklERUxJWkFDSU9OXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTFBST01PXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJDVEJMRElNUFBSRFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFNJTkRUT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJTVUJUT1RBTFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTEJBU0VcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIikpO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHByb2R1Y3RvQ29tYm8pO1xyXG4gICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8uZm9yRWFjaChwcm9kdWN0byA9PiB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMODwrNnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgICAgIHByb2R1Y3RvLklkRW5jUGFkcmUgPSBwcm9kdWN0b0NvbWJvLklEO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHByb2R1Y3RvKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICByZXR1cm4gcHJvZHVjdG9Db21ibztcclxuICAgIH1cclxuXHJcbiAgICByZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc0FwbFN1bWFWYWxvciA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihvTTNFTkMgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKTtcclxuICAgICAgICAgICAgbGV0IGRldEVzUHJkQ29tYm8gPSBvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJFU1BST0RQUk9NT0NPTUJPXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGV0Q2FudGlkYWQgJiYgK2RldENhbnRpZGFkLlZhbG9yID4gMCAmJiAhKGRldEVzUHJkQ29tYm8gJiYgZGV0RXNQcmRDb21iby5WYWxvciA9PSBcInRydWVcIilcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciA9IDA7XHJcblxyXG4gICAgICAgIC8vZm9yIChjb25zdCBvTTNFTkMgb2YgdGhpcy5vTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICFlbmMuSWRFbmNQYWRyZSB8fCBlbmMuSWRFbmNQYWRyZSA8PSAwKSkge1xyXG4gICAgICAgIGZvciAoY29uc3Qgb00zRU5DIG9mIHByb2R1Y3Rvc0FwbFN1bWFWYWxvcikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gKz0gK29NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciArPSArb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiU1VCVE9UQUxcIikuVmFsb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIE0zUHJvY2VzbyBlbmNhYmV6YWRvIGl0ZW1zLCBkZXNkZSBwcm9kdWN0byBnZW5lcmFsXHJcbiAgICBwdWJsaWMgTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybEl0ZW0ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9lbmNhYmV6YWRvSXRlbXM6IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvUGFkcmVNM1BFbmNJdGVtczogTTNQRW5jSXRlbXMgPSB1bmRlZmluZWQsIHZhbG9yRGVzY3VlbnRvID0gMCk6IE0zUEVuY0l0ZW1zIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQcmRHZW5lcmFsOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgdmFyIGRQUkVDSU9Vbml0QmFzZSA9IDA7XHJcbiAgICAgICAgdmFyIGluZk5pdmVsZXNQcmNpbztcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgICAgIHZhciBkVG90YWxJbXB1ZXN0b3NUb3RhbDogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZFVuaXRhcmlvTW9uZWRlcm86IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRVbml0YXJpb1Byb21vOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIC8vVmVyaWZpY2FyIGVsIHByZWNpbyBhIHVzYXIsIHVzYW5kbyBsYSBsb2dpY2EgZGUgbml2ZWxlcyBkZSBwcmVjaW9zLlxyXG4gICAgICAgIGluZk5pdmVsZXNQcmNpbyA9IHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcbiAgICAgICAgaWYgKHZhbG9yRGVzY3VlbnRvID4gMCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gKiB2YWxvckRlc2N1ZW50byAvIDEwMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPIC0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSB0aGlzLkNhbGN1bGFyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9WYWxpZGEgc2kgZWwgcHJvZHVjdG8gZXN0w4PCoSByZXN0aW5naWRvXHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXJQcm9kdWN0b1Jlc3RyaW5naWRvKG9Qcm9tb2Npb25Qcm9jZXNhZGEpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhcyhvTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FsY3VsbyBkZWwgdG90YWwgZGUgcHVudG9zIHkgZWwgdmFsb3IgdG90YWwgZGUgbGEgcHJvbW9jacODwrNuIHBvciBsYSBjcWFudGlkYWQgZGUgcHJvZHVjdG9zIGRlIGxhIG1pc21hIHJlZmVyZW5jaWFcclxuICAgICAgICAgICAgZFVuaXRhcmlvTW9uZWRlcm8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybzsgLy9Vbml0YXJpbyBNb25lZGVyb1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy9ObyBzZSB1dGlsaXphLCBzZSBkZWphIHBhcmEgdXNvcyBhZGVsYW50ZVxyXG5cclxuICAgICAgICAgICAgZFVuaXRhcmlvUHJvbW8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uOyAvL1Byb21vY2lvbiB1bml0YXJpb1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vTm8gc2UgdXRpbGl6YSwgc2UgZGVqYSBwYXJhIHVzb3MgYWRlbGFudGVcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zRGV0Q3Vwb25lcyA9IHRoaXMuZ2V0X2xpc3RfY3Vwb25lc19mcm9tX3Byb21vKG9Qcm9tb2Npb25Qcm9jZXNhZGEsICtvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FsY3VsbyBkZSBwcmVjaW8gdG90YWwsIGRlc3B1ZXMgZGUgcHJvbW9jaW9uZXNcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAgICAgLy9DYXJnYXIgcHJvZHVjdG8gXHJcbiAgICAgICAgICAgIG9NM1ByZEdlbmVyYWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF07XHJcblxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0byA9IG9NM1ByZEdlbmVyYWwuU0tVO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTG90ZSA9IG9NM1ByZEdlbmVyYWwuTE9URTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob2VuY2FiZXphZG9JdGVtcywgXCJJRFwiKSArIDE7IC8vSkFHTSwgY2FtYmlvIGRlIElELCBjYXNvIGN1YW5kbyBzZSBhZ3JlZ2EgcHJkOjEsIHByZDoyIHkgZGUgbnVldm8gcHJkOjEuIEVuIGVzdGUgY2FzbyBlbiBsw4PCs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk9yZGVuID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob2VuY2FiZXphZG9JdGVtcywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Ob21icmUgPSBvTTNQcmRHZW5lcmFsLk5PTUJSRTE7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5ESVNQT05JQkxFID0gb00zUHJkR2VuZXJhbC5ESVNQT05JQkxFO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuUGF0aEltYWdlID0gb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW47XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Db2RpZ29CYXJyYXMgPSBvTTNQSXRlbXNXRUIuQ29kaWdvQmFycmFzO1xyXG4gICAgICAgICAgICBpZiAob00zVWJpY2FjaW9uICYmIG9NM1ViaWNhY2lvbi5NM1ViaUFkaWNpb25hbGVzKXtcclxuICAgICAgICAgICAgICAgIGxldCB1YmlJbXBGaWpvID0gb00zVWJpY2FjaW9uLk0zVWJpQWRpY2lvbmFsZXMuZmluZCh4ID0+IHguQXRyaWJ1dG8gPT0gXCJJTVBGSUpPXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHViaUltcEZpam8gJiYgdWJpSW1wRmlqby5WYWxvciAhPSBcIlwiKXtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJEID0gdWJpSW1wRmlqby5WYWxvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcFRvdGFsQmFzZSA9IHRoaXMuQ2FsY3VsYXRlUHJlY2lvQmFzZShvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCB0aGlzLm9NYXRoVEYucm91bmQoYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKSwgMikpO1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLmRDYW50aWRhZCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBkUFJFQ0lPVW5pdEJhc2UgPSBwVG90YWxCYXNlIC8gb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRQUkVDSU9Vbml0QmFzZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRUb3RhbEltcHVlc3Rvc1RvdGFsID0gdGhpcy5Mb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCBvTTNQRW5jSXRlbXMsIHBUb3RhbEJhc2UsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpO1xyXG4gICAgICAgICAgICAvKiogSU5JQ0lPIElORk9STUFDSU9OIEdFTkVSQUwgKi9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzJyksIFwiRkVDSEFJTlwiKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERQUkQsIFwiQ1RCTERQUkRcIikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQmlzT2JzZXF1aW8udG9TdHJpbmcoKSwgXCJFU09CU0VRVUlPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLlNLUDEsIFwiUFJEX0VTVElMT1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgXCJDVEJMRElNUFBSRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLm9ic2VydmFjaW9uLnRvU3RyaW5nKCksIFwiT0JTRVJWQUNJT05cIikpOyAgICAgICAgICAgICAgICAgIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4pIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4sIFwiUEFUSElNQUdFTlwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQmlzUHJvZHVjdG9Qcm9tby50b1N0cmluZygpLCBcIkVTUFJPRFBST01PXCIpKTsgLy8gVFJVRS0+IFNJIEVTIFVOIFBST0RVQ1RPIFBPUiBQUk9NT0NJT04sIEZBTFNFLT4gREUgT1RSTyBNT0RPXHJcbiAgICAgICAgICAgIC8vRGV0YWxsZXMgZGUgZmFjdHVyYSBlbGVjdHJvbmljYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHByb2RHUlBTZWxlY3RlZC5USVBPLCBcIlRJUE9fUFJEXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuVW5pZGFkLCBcIlVOSURBRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkNsYXZlUHJkU1JWLCBcIkNMQVZFUFJPRFNFUlZcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DbGF2ZVByZFVuaWRhZCwgXCJDTEFWRVVOSURBRFwiKSk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkSXRlbXNJbnRlcmZheihvTTNQRW5jSXRlbXMsIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB0aGlzLkFkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXMsIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIHRoaXMuY2FtcG9zQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCKVxyXG4gICAgICAgICAgICB0aGlzLkxvYWREZXRhbGxlTml2ZWxlc1ByZWNpbyhpbmZOaXZlbGVzUHJjaW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkSW5mb1Byb21vY2lvbmVzQURldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy8gTGlzdGEgZGUgUHJvbW9jaW9uZXMgXHJcbiAgICAgICAgICAgIC8qKkZJTiBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcblxyXG4gICAgICAgICAgICAvLyoqIElOSUNJTyBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRQUkVDSU9Vbml0QmFzZS50b1N0cmluZygpLCBcIlBSRUNJT1VOSVRCQVNFXCIpKTsgLy9QcmVjaW8gU2luIGltcHVlc3Rvc1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRUb3RhbEltcHVlc3Rvc1RvdGFsLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCh0aGlzLm9NYXRoVEYucm91bmQodGhpcy5HZXRVbml0YXJpb0J5VG90YWwob00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVUVTVE9TXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCtvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8gLSArZFRvdGFsSW1wdWVzdG9zVW5pdGFyaW8pLnRvU3RyaW5nKCksIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3RvcyAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK2RQUkVDSU9Vbml0QmFzZSArICtkVW5pdGFyaW9Qcm9tbykudG9TdHJpbmcoKSwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zIC8vLS0tLS0tIE51bmNhIENhbWJpYSAvL0ZTIDIwMTkwNzI1IENvcnJlY2Npb24gZW4gbGEgZm9tcmEgZGUgY2FsY3VsYXJsb1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTy50b1N0cmluZygpLCBcIlBVTklUXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLnRvU3RyaW5nKCksIFwiUFVOSVRORVRPXCIpKTsvL0NvbiBkZXNjdWVudG8gaW5jbHVpZG8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFVuaXRhcmlvTW9uZWRlcm8udG9TdHJpbmcoKSwgXCJVTklURklERUxcIikpOy8vVW5pdGFyaW8gZmlkZWxpemFjaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVW5pdGFyaW9Qcm9tby50b1N0cmluZygpLCBcIlZVTklUUFJPTU9cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3NJZGthdGlvcyA9PSBcIkNUTlwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGlzdGFTUiA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZCh4ID0+IHguSURMSVNUQSA9PSBcIjJcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAobGlzdGFTUikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUocHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKS5QUkVDSU8udG9TdHJpbmcoKSwgXCJQUkVDSU9TUlwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8qKiBGSU4gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuXHJcbiAgICAgICAgICAgIC8vICoqKiBJbmZvcm1hY2lvbiBkZSBhY2Npb25lcyBlbiBlbCBjbGllbnRlICoqKlxyXG4gICAgICAgICAgICBpZiAocHJvZEdSUFNlbGVjdGVkLmVuY29udHJhZG9Mb2NhbCkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIkxPQ0FMXCIsIFwiQ09OU1VMVE9FTlwiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIlNFUlZJRE9SXCIsIFwiQ09OU1VMVE9FTlwiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgdGhpcy5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ob00zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vaWYgKCFvUGFkcmVNM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciA9ICgrb00zUHJvY2Vzb3MuVmFsb3IpICsgKCtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiU1VCVE9UQUxcIikuVmFsb3IpIC8vICgrb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9ICgrb00zUHJvY2Vzb3MuVmFsb3JOZXRvKSArICgrb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICAvL1ZlcmlmaWNhciBvYnNlcXVpb3MgZGVsIHByb2R1Y3RvIHF1ZSBzZSBpbmdyZXNvIGFsIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgICAgICB0aGlzLlZlcmlmaWNhck9ic2VxdWlvcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLnR1cm5PblByb21vcyhvUHJvbW9jaW9uUHJvY2VzYWRhKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdID0gXCJQcm9kdWN0byBSZXN0cmluZ2lkb1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1BFbmNJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgdHJ1ZSBzaSBlc3RlIHByb2R1Y3RvIHNlIGVuY3VlbnRyYSByZXN0cmluZ2lkb1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGFyUHJvZHVjdG9SZXN0cmluZ2lkbyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgbGV0IHByb21vUmVzdHJpbmdpZG8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maW5kKHggPT4geC5UaXBvID09IFwiUkVTVFJJQ0NJT05cIik7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb1Jlc3RyaW5naWRvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgIC8qKlxyXG4gICAgICogRXhjbHV5ZSB0b2RvcyBsb3MgaW1wdWVzdG9zIGRlamFuZG8gc29sbyBlbCBGSUpPIHNpIGVzIGRlIGxhIHViaWNhY2lvbiBkYWRhIFxyXG4gICAgICovXHJcbiAgICAgcHVibGljIEdldE1heEF0cmlidXRvRnJvbUxpc3RhKGxpc3RhLCBhdHJpYnV0bykge1xyXG4gICAgICAgIGlmIChsaXN0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBsaXN0SUQgPSBsaXN0YS5tYXAoeCA9PiB4W2F0cmlidXRvXSk7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBsaXN0SUQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxvcmVzIENhbGN1bGFkb3MgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIGRDYW50aWRhZCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIC8qKiBJTklDSU8gVkFMT1JFUyBESU5BTUlDT1MgKi9cclxuICAgICAgICAvLyB2YXIgZFRvdGFsSW1wdWVzdG9zID0gKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWxTaW5EdG8gPSB0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVFwiKVxyXG4gICAgICAgIC8vIHZhciBkU3ViVG90YWwgPSBNYXRoLnJvdW5kKCgrZFByZWNpb1RvdGFsU2luRHRvIC0gK2RUb3RhbEltcHVlc3RvcykgKiAxMDApIC8gMTAwO1xyXG5cclxuICAgICAgICBsZXQgc3ViVG90YWwgPSAwO1xyXG4gICAgICAgIGxldCBwcmVjaW9Ub3RhbFNpbkR0byA9IDA7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wdWVzdG9zXHJcbiAgICAgICAgLy9BZ3JlZ2FyIEltcHVlc3Rvc1xyXG4gICAgICAgIHRvdGFsSW1wdWVzdG9zID0gdGhpcy5hZ3JlZ2FySW1wdWVzdG8ob00zUEVuY0l0ZW1zLCBkQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAvL0ZTIDIwMTkwNzI1IEFycmVnbG8gZW4gZWwgY2FsY3VsbyBkZSB0b3RhbGVzIGVuIGNhc28gZGUgaGFiZXIgaW1wdWVzdG9zXHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvL1N1YnRvdGFsIFN1bWFzIGRlIGxhcyBiYXNlc1xyXG4gICAgICAgICAgICBzdWJUb3RhbCA9IHRoaXMub01hdGhURi5yb3VuZCgoKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFJFQ0lPVU5JVEJBU0VcIiksIDIpKSArICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVlVOSVRQUk9NT1wiKSkpLCAyKTtcclxuICAgICAgICAgICAgdG90YWxJbXB1ZXN0b3MgPSB0aGlzLmdldFZhbG9yVG90YWxGcm9tSW1wdWVzdG9zKG9NM1BFbmNJdGVtcywgXCJWYWxvclwiKTtcclxuICAgICAgICAgICAgcHJlY2lvVG90YWxTaW5EdG8gPSBzdWJUb3RhbCArIHRvdGFsSW1wdWVzdG9zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9TZSBhc3VtZSBxdWUgbm8gaGF5IGltcHVlc3RvcyBlbnRvbmNlcyBlbCBzdWJUb3RhbCBlcyBpZ3VhbCBhbCBwcmVjaW9Ub3RhbFNpbkR0b1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbFNpbkR0byA9IHRoaXMub01hdGhURi5yb3VuZCh0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVFwiKSwgMik7XHJcbiAgICAgICAgICAgIHN1YlRvdGFsID0gcHJlY2lvVG90YWxTaW5EdG87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIGRDYW50aWRhZC50b1N0cmluZygpLCBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQodG90YWxJbXB1ZXN0b3MsIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVUVTVE9TXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VW5pdGFyaW9CeVRvdGFsKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVUVTVE9TXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVOSVRcIik7XHJcblxyXG4gICAgICAgIC8vTGEgZmlkZWxpemFjaW9uIGVzIHVuIHBvcmNhbnRhamUgcG9yIGVuZGUgbm8gZGViZSBtdWx0aXBsaWNhcnNlIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlVOSVRGSURFTFwiKS50b1N0cmluZygpLCBcIkZJREVMSVpBQ0lPTlwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVU5JVEZJREVMXCIpLlZhbG9yLCBcIkZJREVMSVpBQ0lPTlwiKTtcclxuICAgICAgICAvL3RoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUTkVUT1wiKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIik7XHJcbiAgICAgICAgLy90aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUTkVUT1wiKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFJFQUxcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgcHJlY2lvVG90YWxTaW5EdG8udG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFNJTkRUT1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBzdWJUb3RhbC50b1N0cmluZygpLCBcIlNVQlRPVEFMXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgXCJGVVRcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVlVOSVRQUk9NT1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxQUk9NT1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQUkVDSU9VTklUQkFTRVwiKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxCQVNFXCIpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zICAgICAgICBcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKChzdWJUb3RhbCArICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxJTVBVRVNUT1NcIikuVmFsb3IgLSArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKTtcclxuXHJcbiAgICAgICAgLyoqIEZJTiBWQUxPUkVTIERJTkFNSUNPUyAqL1xyXG5cclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGggPiAwICYmIGRDYW50aWRhZCA9PSAwKSB7Ly9TaSBsYSBjYW50aWRhZCBlcyAwIHNpZ25pZmljYSBxdWUgc2UgZXN0w4PCoSBib3JyYW5kbyBlbCBpdGVtIG8gZXMgdW4gb2JzZXF1aW8sIHBvciBsbyBxdWUgbm8gdGllbmUgc2VudGlkbyBxdWUgdGVuZ2EgTTNQSW1wdWVzdG9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3RvcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGEgc3VtYXRvcmlhIGRlIGxvcyB2YWxvcmVzIGRlIHVuIGF0cmlidXRvIGRhZG8gZGVsIGFycmVnbG8gZGUgaW1wdWVzdG9zXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIGF0cmlidXRvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmFsb3JUb3RhbEZyb21JbXB1ZXN0b3Mob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgYXRyaWJ1dG86IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHN1bWF0b3JpYSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltcHVlc3RvID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvc1tfaV07XHJcbiAgICAgICAgICAgIHN1bWF0b3JpYSA9IHN1bWF0b3JpYSArICgraW1wdWVzdG9bYXRyaWJ1dG9dKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub01hdGhURi5yb3VuZChzdW1hdG9yaWEsMik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZ3JlZ2FySW1wdWVzdG8ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBkZXRfY3RibGRfaW1wX3ByZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVEJMRElNUFBSRFwiKTtcclxuICAgICAgICBsZXQgZGV0X3ByZWNpb191bml0X2Jhc2UgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIik7XHJcbiAgICAgICAgbGV0IHZhbG9yVG90YWxJbXB1ZXN0b3M6IG51bWJlciA9IDA7XHJcbiAgICAgICAgaWYgKGRldF9jdGJsZF9pbXBfcHJkICYmIGRldF9wcmVjaW9fdW5pdF9iYXNlKSB7XHJcbiAgICAgICAgICAgIHZhbG9yVG90YWxJbXB1ZXN0b3MgPSB0aGlzLkxvYWRNM1BJbXB1ZXN0b3NGcm9tUHJkR3JsKGRldF9jdGJsZF9pbXBfcHJkLlZhbG9yLCBvTTNQRW5jSXRlbXMsICtiaWdEZWNpbWFsLm11bHRpcGx5KGRldF9wcmVjaW9fdW5pdF9iYXNlLlZhbG9yLCBjYW50aWRhZCksIGNhbnRpZGFkLCArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JUb3RhbEltcHVlc3RvcywyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgdmFsb3I6IHN0cmluZywgc0NvbmNlcHRvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0RldDogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgIG9EZXQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IHNDb25jZXB0byk7XHJcbiAgICAgICAgaWYgKG9EZXQpIHtcclxuICAgICAgICAgICAgLy8gRXhpc3RlIEFjdHVhbGl6YVxyXG4gICAgICAgICAgICBvRGV0LlZhbG9yID0gdmFsb3I7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy9ObyBleGlzdGUgYWdyZWdhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IudG9TdHJpbmcoKSwgc0NvbmNlcHRvKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvciB0b3RhbFxyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIE51ZXZhIENhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBEZXNjVW5pdGFyaW8gXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0VG90YWxCeVVuaXRhcmlvKGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIERlc2NVbml0YXJpbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHVuaXRhcmlvID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBEZXNjVW5pdGFyaW8pLlZhbG9yO1xyXG4gICAgICAgICAgICByZXR1cm4gK2JpZ0RlY2ltYWwubXVsdGlwbHkodW5pdGFyaW8sIGNhbnRpZGFkKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvciB1bml0YXJpb1xyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBEZXNjVG90YWwgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0VW5pdGFyaW9CeVRvdGFsKGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIERlc2NUb3RhbDogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCtjYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdG90YWwgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IERlc2NUb3RhbCkuVmFsb3I7XHJcbiAgICAgICAgICAgIHJldHVybiArdG90YWwgLyArY2FudGlkYWQ7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBkZXRhbGxlcyByZWxhY2lvbmFkb3MgY29uIGxhIGluZm9ybWFjaW9uIGRlIHN3IGV4dGVybm8uXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBndWFyZGFyw4PCoSBsb3MgbnVldm9zIGF0cmlidXRvcy5cclxuICAgICAqIEBwYXJhbSBvQWRpY2lvbmFsZXMgRGVzZGUgZG9uZGUgc2Ugc2FjYXLDg8KhIGxhIGluZm9ybWFjacODwrNuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSXRlbXNJbnRlcmZheihvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvQWRpY2lvbmFsZXM6IEFycmF5PE0zUHJkQWRpY2lvbmFsZXM+KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9BZGljaW9uYWxlc0ZpbHRlcjogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz47XHJcbiAgICAgICAgICAgIG9BZGljaW9uYWxlc0ZpbHRlciA9IG9BZGljaW9uYWxlcy5maWx0ZXIoYSA9PiBhLkFUUklCVVRPLnN0YXJ0c1dpdGgoXCJDU0lBX1wiKSk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0FkaWNpb25hbGVzRmlsdGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9BZGljaW9uYWxlc0ZpbHRlcltpXS5WQUxPUiwgb0FkaWNpb25hbGVzRmlsdGVyW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGVzIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgZ3VhcmRhcsODwqEgbG9zIG51ZXZvcyBhdHJpYnV0b3MuXHJcbiAgICAgKiBAcGFyYW0gb0FkaWNpb25hbGVzIERlc2RlIGRvbmRlIHNlIHNhY2Fyw4PCoSBsYSBpbmZvcm1hY2nDg8Kzbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvQWRpY2lvbmFsZXM6IEFycmF5PE0zUHJkQWRpY2lvbmFsZXM+KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvQWRpY2lvbmFsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob0FkaWNpb25hbGVzW2ldLlZBTE9SLCBcIkFEQ19cIiArIG9BZGljaW9uYWxlc1tpXS5BVFJJQlVUTykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNhbXBvc0FkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzW2ldLlZBTE9SLCBcIkNBTUFEQ19cIiArIG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlc1tpXS5BVFJJQlVUTykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMgTm9tYnJlLCBJRC4gYSBkZXRhbGxlIGRlbCBlbmNhYmV6YWRvIGRlIHByb2R1Y3RvIGFncmVnYWRvXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBJbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkOiBudW1iZXIsIGFwbGljYWRhcyA9IHRydWUpIHtcclxuICAgICAgICB2YXIgc05vbWJyZXM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIHNJZHM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIHNWYWxvcmVzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBkYXRhO1xyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhICYmIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICYmIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKGFwbGljYWRhcykge1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHggPT4geC5BcGxpY2FkYSkuZmlsdGVyKHggPT4geC5Qcm9tb2Npb25Db21iaW5hZGEgPT0gbnVsbCkuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc05vbWJyZXMgPSBzTm9tYnJlcyArIHByb21vLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNJZHMgPSBzSWRzICsgcHJvbW8uSURQcm9tb2Npb24gKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsb3JlcyA9IHNWYWxvcmVzICsgYmlnRGVjaW1hbC5tdWx0aXBseShwcm9tby5WYWxvciwgaUNhbnRpZGFkKSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiAheC5BcGxpY2FkYSkuZmlsdGVyKHggPT4geC5Qcm9tb2Npb25Db21iaW5hZGEgPT0gbnVsbCkuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc05vbWJyZXMgPSBzTm9tYnJlcyArIHByb21vLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNJZHMgPSBzSWRzICsgcHJvbW8uSURQcm9tb2Npb24gKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsb3JlcyA9IHNWYWxvcmVzICsgYmlnRGVjaW1hbC5tdWx0aXBseShwcm9tby5WYWxvciwgaUNhbnRpZGFkKSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGF0YSA9IHsgXCJOT01CUkVTXCI6IHNOb21icmVzLCBcIklEXCI6IHNJZHMsIFwiVkFMT1JFU1wiOiBzVmFsb3JlcyB9XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGUgZGUgcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gc05vbWJyZXMgXHJcbiAgICAgKiBAcGFyYW0gc0lkcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEluZm9Qcm9tb2Npb25lc0FEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkKVxyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5OT01CUkVTLCBcIk5PTUJfUFJPTU9DXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLklELCBcIklEX1BST01PQ1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5WQUxPUkVTLCBcIlZBTF9QUk9NT0NcIikpO1xyXG5cclxuICAgICAgICAgICAgLy9BaG9yYSBzZSBhZ3JlZ2EgdW5hIGRpbmFtaWNhIHBvciBhdHJpYnV0byBkZSBsYSBwcm9tbyBwYXJhIGZhY2lsaXRhciBsYSByZXRvbWEgZGUgZXN0YSBpbmZvcm1hY2nDg8KzblxyXG4gICAgICAgICAgICBsZXQgbGlzdE5vbWJyZSA9IGRhdGEuTk9NQlJFUy5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RJZCA9IGRhdGEuSUQucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIGxldCBsaXN0VmFsb3IgPSBkYXRhLlZBTE9SRVMucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST01PQ19cIiArIF9pKSk7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3RJZFtfaV0sIFwiSURfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdFZhbG9yW19pXSwgXCJWQUxfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkLCBmYWxzZSlcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuTk9NQlJFUywgXCJOT01CX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5JRCwgXCJJRF9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuVkFMT1JFUywgXCJWQUxfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGEgZGV0YWxsZSBpbmZvcm1hY2lvbiBkZSBuaXZlbGVzIGRlIHByZWNpb1xyXG4gICAgICogQHBhcmFtIGluZk5pdmVsZXNQcmNpbyBJbmZvcm1hY2lvbiBkZSBuaXZlbGVzIGRlIHByZWNpb1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgY2FyZ2Fyw4PCoSBsYSBpbmZvcm1hY2lvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTG9hZERldGFsbGVOaXZlbGVzUHJlY2lvKGluZk5pdmVsZXNQcmNpbywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChpbmZOaXZlbGVzUHJjaW8gJiYgaW5mTml2ZWxlc1ByY2lvLk5JVkVMICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShpbmZOaXZlbGVzUHJjaW8uTklWRUwsIFwiTklWRUxQUkVDSU9cIikpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjb24gcXVlIG5pdmVsIGRlIHByZWNpbyB2YSBhIHRyYWJhamFyXHJcbiAgICAgKiBAcGFyYW0gcHJvZEdSUFNlbGVjdGVkIEVsIHByb2R1Y3RvIGluZ3Jlc2Fkb1xyXG4gICAgICogQHBhcmFtIGlDYW50aWRhZCBMYSBjYW50aWRhZCBkZSBwcm9kdWN0b3MgcXVlIHZhIGEgaW5ncmVzYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhclByZWNpb0J5Tml2ZWxlcyhwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJlc2VudGFjaW9uZXM6IE0zUHJlc2VudGFjaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcE5pdmVsZXMgPSB7fTtcclxuICAgICAgICAgICAgaWYgKHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcyAmJlxyXG4gICAgICAgICAgICAgICAgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5maW5kKHggPT4gaUNhbnRpZGFkID49IHguVE9QRSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUHJlc2VudGFjaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwTml2ZWxlcyA9IHsgXCJQUkVDSU9cIjogb00zUHJlc2VudGFjaW9uZXMuVkFMT1IsIFwiTklWRUxcIjogb00zUHJlc2VudGFjaW9uZXMuTklWRUxQUlMgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4galJlc3BOaXZlbGVzO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFZlcmlmaWNhclByZWNpb0J5Tml2ZWxlc0dlbmVyYWwob00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcmVzZW50YWNpb25lczogTTNQcmVzZW50YWNpb25lcztcclxuICAgICAgICAgICAgdmFyIGpSZXNwTml2ZWxlcyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAob00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcyAmJiBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcyA9IG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZmluZCh4ID0+IGlDYW50aWRhZCA+PSB4LlRPUEUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1ByZXNlbnRhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb00zUHJlc2VudGFjaW9uZXMuVkFMT1I7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3BOaXZlbGVzID0geyBcIlBSRUNJT1wiOiBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiwgXCJOSVZFTFwiOiBvTTNQcmVzZW50YWNpb25lcy5OSVZFTFBSUyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBqUmVzcE5pdmVsZXM7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbG9zIGN1cG9uZXMgZ2VuZXJhZG9zIGRlIGxhIGxpc3RhIGRlIHByb21vcHJvY2VzYWRhc1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRfbGlzdF9jdXBvbmVzX2Zyb21fcHJvbW8ob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBjYW50aWRhZDogbnVtYmVyKTogQXJyYXk8TTNQRGV0YWxsZUN1cG9uPiB7XHJcbiAgICAgICAgdmFyIGxpc3RfY3Vwb25lcyA9IEFycmF5PE0zUERldGFsbGVDdXBvbj4oKTtcclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBwcm9tb19hc29jaWFkYSA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzW19pXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9fYXNvY2lhZGEuSWRDdXBvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXBvbiA9IG5ldyBNM1BEZXRhbGxlQ3Vwb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXBvbi5JZEN1cG9uID0gcHJvbW9fYXNvY2lhZGEuSWRDdXBvbjtcclxuICAgICAgICAgICAgICAgICAgICBjdXBvbi5DYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RfY3Vwb25lcy5wdXNoKGN1cG9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxpc3RfY3Vwb25lcztcclxuICAgIH1cclxuXHJcbiAgICAvL0FzaWduYXIgYSBwcm9tb2Npb25lcyBjb21iaWFuYXMgZGVzZGUgbG8gcXVlIHNlIGVuY29udHLDg8KzIGFsIGVuY2FiZXphZG8gaXRlbSwgZGVsIHByb2R1Y3RvIHNlbGVjY2lvbmFkb1xyXG4gICAgcHVibGljIEFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhICE9IG51bGwgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vQXNvID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2UgYWdyZWdhIHByb21vY2lvbiBjb21iaW5hZGEgYSBlbmNhYmV6YWRvIGRlIGl0ZW1zLlxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMucHVzaChwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vL0FncmVnYXIgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIilcclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkob00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKEpTT04uc3RyaW5naWZ5KG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMpLCBcIlBST01PQ09NQklcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXNBTTNQcm9jZXNvKG9NM1Byb2Nlc29zLCBwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc2lnbmFyIHByb21vY2lvbmVzIGNvbWJpYW5kYXMgYSBNMyBQcm9jZXNvLCBlc3RlLCB2YWxpZGEgcXVlIG5vIGV4aXN0YSB1biBwcm9tb2Npb24gYW50ZXJpb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzQU0zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAgICAgaWYgKCFvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKSkge1xyXG4gICAgICAgICAgICAvLy8vLy8vIGV4aXN0ZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vLy8vLyBObyBFeGlzdGVcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcy5wdXNoKG9Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcykge1xyXG4gICAgICAgICAgICB0aGlzLkFkZERpbmFtaWNhUHJvY2Vzb0NvbWJpbmFkYXMob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBkaW5hbWljYXMgcHJvY2VzbyBkZSBjb21iaW5hZGFzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXNGaW5kZWQ6IE0zUERpbmFtaWNhcztcclxuICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNGaW5kZWQpIHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+ID0gSlNPTi5wYXJzZShvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJQcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9Qcm9tb0NvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IGFyclByb21vW2ldLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vQ29tYmkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLnB1c2goYXJyUHJvbW9baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBcIkNPTUJJTkFEQVwiO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bG8gZGUgcHJvbW9jaW9uZXNcclxuICAgIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICB2YXIgbFRpcG9zID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIkRJUkVDVEFcIik7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJNT05FREVST1wiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIk1BTlVBTFwiKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAob00zRU5DUFJPTU8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhcnJQcm9tbyA9IG9wcm9tb2Npb25lc1NlcnZpY2UuVmVyaWZpY2FyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgbFRpcG9zKTtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlByb2Nlc2FyUHJvbW9jaW9uKGFyclByb21vLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM0VOQ1BST01PLCB0aGlzLmdzSWRrYXRpb3MpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBoYXkgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9WZXJpZmljYXIgb2JzZXF1aW9zIHkgYWdyZWdhcmxvcy5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJPYnNlcXVpb3Mob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBjYW50aWRhZDogbnVtYmVyLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vY2lvbmVzQXNvY2lhZGFzOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz47XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zQ2FudGlkYWQgPSAwO1xyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIocHJvbW8gPT4gcHJvbW8uTGlzdE9ic1NLVSAhPSBudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCAmJiBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXF1aW9PUHJvbW8gPT0gLTFcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9tby5MaXN0T2JzU0tVLmxlbmd0aCkgcHJvbW8uTGlzdE9ic1NLVSA9IFtwcm9tby5MaXN0T2JzU0tVXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYVNpVGllbmVPdHJhUHJvbW8ocHJvbW8sIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9IHByb21vLklEUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJtYXJMaXN0YU9ic2VxdWlvc1NLVShwcm9tbywgb00zUEVuY0l0ZW1zLCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0dXJuT25Qcm9tb3Mob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vY2lvbmVzQXNvY2lhZGFzOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz47XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcihwcm9tbyA9PiBwcm9tby5sSWRBY3RpdmFQcm9tbyAmJiBwcm9tby5sSWRBY3RpdmFQcm9tby5sZW5ndGggPiAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMgJiYgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxJZEFjdGl2YVByb21vID0gdGhpcy5sSWRBY3RpdmFQcm9tby5jb25jYXQocHJvbW8ubElkQWN0aXZhUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlcyh0aGlzLmxJZEFjdGl2YVByb21vKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRHVwbGljYXRlcyhhcnI6IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgdW5pcXVlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHVuaXF1ZS5pbmRleE9mKGFycltpXSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB1bmlxdWUucHVzaChhcnJbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFybWFyTGlzdGFPYnNlcXVpb3NTS1UocHJvbW86IFByb21vY2lvbmVzQXNvY2lhZGFzLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBjYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkUmVhbCA9IE1hdGguZmxvb3IoY2FudGlkYWQgLyBwcm9tby5DYW50aWRhZE9ic2VxKTtcclxuICAgICAgICBpZiAocHJvbW8uUmVnbGFPYnNlcSA9PSBcIkVYQ1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpbyhwcm9tbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gY2FudGlkYWRSZWFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICBwcm9tby5MaXN0T2JzU0tVLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LkNhbnRpZGFkID0gY2FudGlkYWRSZWFsICogK2VsZW1lbnQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9MaXN0YU9ic2VxdWlvcyA9IHByb21vLkxpc3RPYnNTS1U7XHJcbiAgICB9XHJcblxyXG4gICAgYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpbyhwcm9tbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAocHJvbW8uTGlzdE9ic1NLVS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHByb21vLkxpc3RPYnNTS1UuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaWRFbmNQYWRyZSA9IG9NM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChjb21iaS5BY2Npb24uUmVnbGFPYnNlcSA9PSBcIkVYQ1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpb0NvbWJpbmFkbyhjb21iaS5BY2Npb24uT0JTRVFVSU9TLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zQ2FudGlkYWQgPSBjYW50aWRhZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpb0NvbWJpbmFkbyhjb21iaS5BY2Npb24uT0JTRVFVSU9TLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICBjb21iaS5BY2Npb24uT0JTRVFVSU9TLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LkNhbnRpZGFkID0gY2FudGlkYWQgKiArZWxlbWVudC5DYW50aWRhZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gY29tYmkuQWNjaW9uLk9CU0VRVUlPUztcclxuICAgIH1cclxuXHJcbiAgICBhc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKG9ic2VxdWlvcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChvYnNlcXVpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvYnNlcXVpb3MuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaWRFbmNQYWRyZSA9IG9NM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vUmV0b3JuYSB0cnVlIHNpIGhheSBvdHJhIHByb21vIGFwbGljYWRhIGRvbmRlIG5pIGxhIHByb21vIGRlIG9ic2VxdWlvIG8gbGEgYXBsaWNhZGEgc29uIGZpamFzIHkgdW5hIGRlIGxhcyBkb3MgZXMgRVhDXHJcbiAgICB2YWxpZGFTaVRpZW5lT3RyYVByb21vKHByb21vT2JzZXF1aW86IFByb21vY2lvbmVzQXNvY2lhZGFzLCBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHByb21vT2JzZXF1aW8uUmVnbGEgIT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICBsZXQgb1Byb21vc05vT2JzZXF1aW9zID0gYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHggPT4geC5JRFByb21vY2lvbiAhPSBwcm9tb09ic2VxdWlvLklEUHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tbyBvZiBvUHJvbW9zTm9PYnNlcXVpb3MpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5SZWdsYSAhPSBcIkFDTVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb21vLkFwbGljYWRhICYmIChwcm9tby5SZWdsYSA9PSBcIkVYQ1wiIHx8IHByb21vT2JzZXF1aW8uUmVnbGEgPT0gXCJFWENcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vcHJvY2VzYW1pZW50byBkZSBvYnNlcXVpb3NcclxuICAgIHB1YmxpYyBhc3luYyBQcm9jZXNhck9ic2VxdWlvcyhvRGF0YVVzZXI6IGFueSxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9PUHJvbW8gPSAtMTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zICE9IG51bGwgJiYgdGhpcy5vTGlzdGFPYnNlcXVpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9MaXN0YU9ic2VxdWlvcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXS5TS1UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkwODEwIHZhbGlkYSwgY3VhbnRvcyBwcm9kdWN0b3Mgc2UgYWdyZWdhIGVuIGVsIG9ic2VxdWlvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uQ2FudGlkYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSB0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXS5DYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTExMTIgc2UgYWdyZWcgZnVuY2lvbmFsaWRhZCBkZSBvYnNlcXVpb3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLkJpc09ic2VxdWlvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUGFkcmUgPSB0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXS5pZEVuY1BhZHJlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuVGlwb0FncnVwYWNpb24gPSBcIk9CU1FcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5HdWFyZGFyUHJvbW9jaW9uKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLCBvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBFbkxpbmVhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9MaXN0YU9ic2VxdWlvcyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vR3VhcmRhciBwcm9tb2Npb24gc2VndW4gdW4gc2t1XHJcbiAgICAvLzEuIEJ1c2NhciBlbCBwcm9kdWN0byBzZWd1biBlbCBza3VcclxuICAgIC8vMi4gQWdyZWdhciBlbCBwcm9kdWN0byBhIG0zcHJvY2Vzb3NcclxuICAgIC8vMy4gQWdyZWdhciBhbCBjYXJyaXRvIGRlIGNvbXByYXMuXHJcbiAgICBwdWJsaWMgYXN5bmMgR3VhcmRhclByb21vY2lvbihwcm9tbywgb0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvLyAyMDE4MTEyMSAgdmFyIHNLZXlDYXJyaXRvO1xyXG4gICAgICAgIC8vIDIwMTgxMTIxIHZhciBvTTNQcm9jZXNvcztcclxuICAgICAgICB2YXIgcHJvY2Vzb1Byb21vO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgLy8gMjAxODExMjEgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gMjAxODExMjEgb00zUHJvY2Vzb3MgPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKTtcclxuICAgICAgICBwcm9jZXNvUHJvbW8gPSBhd2FpdCB0aGlzLkFkaWNpb25hclByb21vY2lvbkFQcm9jZXNvKHByb21vLCBvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9EYXRhVXNlcik7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIHBvdWNoIERCXHJcbiAgICAgICAgLy8gMjAxODExMjEgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIHByb2Nlc29Qcm9tbyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGxvcyBwcm9kdWN0byBzZWd1biBzdSBTS1UsIHNhY2FuZG8gbGEgaW5mb3JtYWNpb24gZGVzZGUgcG91Y2hEQi5cclxuICAgIHB1YmxpYyBhc3luYyBBZGljaW9uYXJQcm9tb2Npb25BUHJvY2Vzbyhwcm9tbywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdmFyIG9Qcm9kdWN0bzogVHlwZU0zUHJkR3JwID0gbnVsbDtcclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCB0aGlzLkdldFByb2R1Y3RvQnlTS1UocHJvbW8uU0tVLCBFbkxpbmVhLCBvTTNQcm9jZXNvcywgb0RhdGFVc2VyKTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgaWYgKG9Qcm9kdWN0byAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vWWEgbm8gc2UgZGVqYSBwcmVjaW8gY2VybyBzaW5vIHF1ZSBjb21vIGVzIG9ic2VxdWlvIHNpbXVsYSB1biBkZXNjdWVudG8gZGVsIDEwMCUgXHJcbiAgICAgICAgICAgIC8vUHJvZHVjdG8uTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICAgICAgICAgIC8vQWdyZWdhciBhIG0zcHJvY2Vzb3MgZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgICAgIC8vb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgb1Byb2R1Y3RvLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgbnVsbCwgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuYWRkdG9jYXJ0KG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvLCBudWxsLCBudWxsLCBvRGF0YVVzZXIsIHRoaXMuZ3NJZGthdGlvcywgb00zVWJpY2FjaW9uLCBudWxsLCBvTTNQcm9jZXNvcywgbnVsbCwgMTAwKTsvLypTZSBtYW5kYSB2YWxvciBkZSBkZXNjdWVubnRvIDEwMCAlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gc2VndW4gZWwgU0tVXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0UHJvZHVjdG9CeVNLVShzU0tVLCBFbkxpbmVhOiBib29sZWFuLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnksIGRpc3BvbmlibGVNM0VuYyA9IG51bGwpIHtcclxuICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgIHZhciBwcm9kdWN0b3M7XHJcbiAgICAgICAgdmFyIG9Qcm9kdWN0bzogVHlwZU0zUHJkR3JwID0gbnVsbDtcclxuICAgICAgICB2YXIgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8gPSBuZXcgU2VydmljZUxvYWRMaXN0YVByZWNpbyh0aGlzLmdzSWRrYXRpb3MpO1xyXG5cclxuICAgICAgICAvL29TZXJ2aWNlTGlzdGFQcmVjaW8uR2VuZXJhdGVEYXRhVmFsaWRhY2lvbihvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvKTtcclxuICAgICAgICBpZiAoIUVuTGluZWEgJiYgIW9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbykge1xyXG4gICAgICAgICAgICB2YXIgc0lEUHJvZHVjdG9zID0gdGhpcy5nc0lka2F0aW9zICsgXCI/UFJEXCI7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvcyA9IGF3YWl0IHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChzSURQcm9kdWN0b3MpO1xyXG4gICAgICAgICAgICBvUHJvZHVjdG8gPSBvU2VydmljZU0zTWFlc3Ryby5HZXRNM1ByZEdycEZyb21MaXN0KHByb2R1Y3Rvcy5NM0xpc3RQcm9kdWN0b3MuTTNHUlAsIHNTS1UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0byA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLk0zR2V0UHJvZHVjdG9CeVNLVUFzeW5jKHRoaXMuR29Qb3N0U2VydmljZU0zLCB0aGlzLmdzSWRrYXRpb3MsIHNTS1UsIG9EYXRhVXNlciwgb00zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvUHJvZHVjdG8uTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRSA8PSAwICYmIGRpc3BvbmlibGVNM0VuYykge1xyXG4gICAgICAgICAgICBvUHJvZHVjdG8uTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRSA9IGRpc3BvbmlibGVNM0VuYztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhvUHJvZHVjdG8sIG9EYXRhVXNlciwgdGhpcy5Hb1Bvc3RTZXJ2aWNlTTMpO1xyXG4gICAgICAgIC8vb1NlcnZpY2VMaXN0YVByZWNpby5WYWxpZGFyTGlzdGFQcmVjaW9zKG9Qcm9kdWN0bywgdGhpcy5Hb1Bvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZGthdGlvcyk7XHJcbiAgICAgICAgcmV0dXJuIG9Qcm9kdWN0bztcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bGFyIHByZWNpbyBzaW4gaW1wdWVzdG9zLiBMYSBmb3JtYSBlcyBjYWxjdWxhciB0b2RvIGVsIHZhbG9yIGRlbCBpbXB1ZXN0by4gRUo6IDEyMC4wOSAvIDEuMTYuIFNpIGVsIHZhbG9yIGRlbCBpbXB1ZXN0byBlczogMTYlXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXRlUHJlY2lvQmFzZShDVEJMRElNUFBSRDogc3RyaW5nLCBkVmFsb3JOZXRvOiBudW1iZXIpIHtcclxuICAgICAgICAvL3ZhciBkVmFsb3JJbXB1ZXN0bzogbnVtYmVyID0gMTtcclxuICAgICAgICB2YXIgZFZhbG9yQmFzZTogbnVtYmVyID0gZFZhbG9yTmV0bztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb3htbFRvSnNvblRGID0gbmV3IHhtbFRvSnNvblRGKCk7XHJcbiAgICAgICAgICAgIHZhciBqSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICBpZiAoQ1RCTERJTVBQUkQgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgakltcHVlc3RvcyA9IG94bWxUb0pzb25URi5jb252ZXJ0WG1sVG9Kc29uKENUQkxESU1QUFJEKTtcclxuICAgICAgICAgICAgICAgIGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL0pBR00gIDIwMTkwNjI2IENhbWJpbyBkZSBjYWxjdWxvIGRlIGJhc2UgZGUgbG9zIGltcHVlc3Rvcy5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wLiQuTWV0b2RvbG9naWEgPT0gXCJQT1JDRU5UQUpFXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZFZhbG9yQmFzZSA9ICgrZFZhbG9yQmFzZSkgLyAoMSArICtpbXAuJC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkVmFsb3JCYXNlID0gKCtkVmFsb3JCYXNlKSAtICgraW1wLiQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cob00zUEVuY0l0ZW1zLk0zSW1wdWVzdG9zKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDYXRjaFwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9yZXR1cm4gKCgrZFZhbG9yTmV0bykgLyAoK2RWYWxvckltcHVlc3RvKSk7XHJcbiAgICAgICAgcmV0dXJuIGRWYWxvckJhc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYXJnYXIgaW5mb3JtYWNpw4PCs24gZGUgaW1wdWVzdG9zLCBkZXNkZSBlbCBwcm9kdWN0byBnZW5lcmFsXHJcbiAgICBwdWJsaWMgTG9hZE0zUEltcHVlc3Rvc0Zyb21QcmRHcmwoQ1RCTERJTVBQUkQ6IHN0cmluZywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyxcclxuICAgICAgICBkVmFsb3JOZXRvOiBudW1iZXIsIGNhbnRpZGFkOiBudW1iZXIsIHZhbG9yVG90YWxQcm9kdWN0b1VuaXQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBveG1sVG9Kc29uVEYgPSBuZXcgeG1sVG9Kc29uVEYoKTtcclxuICAgICAgICAgICAgdmFyIG9NM1BJbXB1ZXN0b3M6IE0zUEltcHVlc3RvcztcclxuICAgICAgICAgICAgbGV0IHZhbG9yQmFzZVRvdGFsID0gdGhpcy5vTWF0aFRGLnJvdW5kKGRWYWxvck5ldG8sIDQpO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JOZXRvVG90YWwgPSB2YWxvckJhc2VUb3RhbDtcclxuICAgICAgICAgICAgbGV0IHZhbG9yVG90YWxQcm9kdWN0b1RvdGFsID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JUb3RhbFByb2R1Y3RvVW5pdCwgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICB2YXIgakltcHVlc3RvcztcclxuICAgICAgICAgICAgdmFyIGRUb3RhbEltcHVlc3RvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICBpZiAoQ1RCTERJTVBQUkQgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgakltcHVlc3RvcyA9IG94bWxUb0pzb25URi5jb252ZXJ0WG1sVG9Kc29uKENUQkxESU1QUFJEKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA2MjYgQ2FtYmlvIGVuIG9yZGVuIGRlIGxvcyBpbXB1ZXN0b3MuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JSZWFsSW1wID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1wID0gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE9baV07XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3RvcyA9IG5ldyBNM1BJbXB1ZXN0b3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvID0gaW1wLiQuQ29kSW1wO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuUG9yY2VudGFqZSA9IGltcC4kLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXAuJC5NZXRvZG9sb2dpYSA9PSBcIlBPUkNFTlRBSkVcIikgey8vUE9SQ0VOVEFKRVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxvclJlYWxJbXAgPSArYmlnRGVjaW1hbC5tdWx0aXBseShpbXAuJC5WYWxvciwgdmFsb3JOZXRvVG90YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLlZhbG9yID0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yUmVhbEltcCwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvTTNQSW1wdWVzdG9zLlZhbG9yIDwgdmFsb3JSZWFsSW1wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5jZWlsKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5mbG9vcigrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Ugey8vRklKT1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxvclJlYWxJbXAgPSAraW1wLiQuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuVmFsb3IgPSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JSZWFsSW1wLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG9NM1BJbXB1ZXN0b3MuVmFsb3IgPCB2YWxvclJlYWxJbXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmNlaWwoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmZsb29yKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxODA5MTIgTnVldm8gY29uY2VwdG8gZGUgYmFzZVxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuQmFzZSA9IHRoaXMub01hdGhURi5yb3VuZCh2YWxvck5ldG9Ub3RhbCwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSB0aGlzLm9NYXRoVEYucm91bmQoKCtkVG90YWxJbXB1ZXN0byksMikgKyB0aGlzLm9NYXRoVEYucm91bmQoKCtvTTNQSW1wdWVzdG9zLlZhbG9yKSwyKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxODA5MTIgU3VtYSBkZSBWYWxvciBOZXRvXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsb3JOZXRvVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoKCt0aGlzLm9NYXRoVEYucm91bmQodmFsb3JOZXRvVG90YWwsIDIpKSArIHRoaXMub01hdGhURi5yb3VuZCgoK29NM1BJbXB1ZXN0b3MuVmFsb3IpLDIpLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLy9Tb2xvIGFkaWNpb25lIGEgaW1wdWVzdG9zLCBjdWFuZG8gZXMgdG90YWwgaW1wdWVzdG9zXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGltcEV4aXN0ZTogTTNQSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcEV4aXN0ZSA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZmluZChpbXAgPT4gaW1wLkNvZEltcHVlc3RvID09IG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBFeGlzdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Cb3JyYSBlbiBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MgPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZpbHRlcihpbXAgPT4gaW1wLkNvZEltcHVlc3RvICE9IG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLnB1c2gob00zUEltcHVlc3Rvcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5mb3JFYWNoKGltcCA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDcyNiBzZSBhZ3JlZ2EgdmFsaWRhY2lvbiwgeWEgcXVlIGVzdGFiYSBxdWVkYW5kbyBsYSByZXN0YSwgY29uIHZhbG9yZXMgY29tbzogMC4wMDAwMDAwMDAwMSA9IDEuMTU2NDU2NDU2NGU4NDUgRUpcclxuICAgICAgICAgICAgaWYgKGRUb3RhbEltcHVlc3RvICE9IDApIHtcclxuICAgICAgICAgICAgICAgIC8vRGlmZXJlbmNpYSByZWRvbmRlYWRhIGEgZG9zIGRlY2ltYWxlc1xyXG4gICAgICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSB0aGlzLm9NYXRoVEYucm91bmQoZFRvdGFsSW1wdWVzdG8sIDIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSB0aGlzLm9NYXRoVEYucm91bmQoKCt2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtICt0aGlzLm9NYXRoVEYucm91bmQodmFsb3JCYXNlVG90YWwsMikgLSArZFRvdGFsSW1wdWVzdG8pLCAyKTtcclxuICAgICAgICAgICAgICAgIGlmIChpc05hTihkaWZlcmVuY2lhKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZmVyZW5jaWEgPSB0aGlzLm9NYXRoVEYucm91bmQoKygrdmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgLSArdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yQmFzZVRvdGFsLCAyKSAtICtkVG90YWxJbXB1ZXN0bykudG9GaXhlZCg0KSwyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckRlSW1wdWVzdG9zKG9NM1BFbmNJdGVtcywgZGlmZXJlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gXCJUT1RBTElNUFVFU1RPU1wiXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKCh2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtIHRoaXMub01hdGhURi5yb3VuZCh2YWxvckJhc2VUb3RhbCwyKSksIDIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2F0Y2hcIilcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRlMgMjAxOTA3MjVcclxuICAgICAqIENvcnJpZ2UgZWwgdmFsb3IgcXVlIHRvbW8gZWwgaW1wdWVzdG8gZGVzcHVlcyBkZSBoYWJlcnNlIHJlZG9uZGVhZG9cclxuICAgICAqIFNpIGFsIHJlY29ycmVyIHRvZG9zIGxvcyBpbXB1ZXN0b3MgbGEgZGlmZXJlbmNpYSBubyBzZSB6YW5qYSwgTkkgTU9ET1MgZWwgZXJyb3IgZXN0w4PCoSBlbiBvdHJhIHBhcnRlXHJcbiAgICAgKiBTZSBjcmVhIGVzdGEgZnVuY2nDg8KzbiBwYXJhIHJlc29sdmVyIGxvcyBlcnJvcmVzIGRlIHRpbWJyYWRvIGRlIGZhY3R1cmEgZWxlY3Ryw4PCs25pY2FcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gZGlmZXJlbmNpYSBEaWZlcmVuY2lhIHF1ZSBzZSBkZWJlIHNhbGRhciBwYXJhIGNvbnNlZ3VpciBlbCB2YWxvciB0b3RhbCBkZSBpbXB1ZXN0b3MgcmVxdWVyaWRvXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckRlSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRpZmVyZW5jaWE6IG51bWJlcikge1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbXB1ZXN0byA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3NbX2ldO1xyXG4gICAgICAgICAgICAvL1NpIGxhIGRpZmVyZW5jaWEgZXMgcG9zaXRpdmEgcXVpZXJlIGRlY2lyIHF1ZSBsYSBzdW1hIGRlIGxvcyBpbXB1ZXN0b3MgZXMgbWVub3IgYSBsYSByZWFsXHJcbiAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9TaSBlbCBpbXB1ZXN0byBzZSByZWRvbmRlbyBoYWNpYSBhYmFqbyBxdWllcmUgZGVjaXIgcXVlIHNlIHB1ZG8gcmVkb25kZWFyIGhhY2lhIGFycmliYVxyXG4gICAgICAgICAgICAgICAgLy9FbnRvbmNlcyBsbyBcInJlZG9uZGVhIGhhY2lhIGFycmliYVwiIHkgcmVzdGEgdW5hIGNlbnRlc2ltYSBhIGxhIGRpZmVyZW5jaWFcclxuICAgICAgICAgICAgICAgIGlmIChpbXB1ZXN0by5WYWxvciA8IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5WYWxvciA9IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG87XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uQmFzZSA9IHRoaXMub01hdGhURi5yb3VuZChpbXB1ZXN0by5WYWxvciAvIGltcHVlc3RvLlBvcmNlbnRhamUsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZmVyZW5jaWEgPSBkaWZlcmVuY2lhIC0gMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vU2kgVmFsb3I+VmFsb3JSZWFsIHF1aWVyZSBkZWNpciBxdWUgcmVkb25kZW8gaGFjaWEgYXJyaWJhIHkgbm8gZGViZSBtb2RpZmljYXIgZXNlIHZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9TaSBsYSBkaWZlcmVuY2lhIGVzIG5lZ2F0aXZhIHF1aWVyZSBkZWNpciBxdWUgbGEgc3VtYSBkZSBsb3MgaW1wdWVzdG9zIGVzIG1heW9yIGEgbGEgcmVhbFxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vU2kgZWwgaW1wdWVzdG8gc2UgcmVkb25kZW8gaGFjaWEgYXJyaWJhIHF1aWVyZSBkZWNpciBxdWUgc2UgcHVkbyByZWRvbmRlYXIgaGFjaWEgYWJham9cclxuICAgICAgICAgICAgICAgIC8vRW50b25jZXMgbG8gXCJyZWRvbmRlYSBoYWNpYSBhYmFqb1wiIHkgc3VtYSB1bmEgY2VudGVzaW1hIGEgbGEgZGlmZXJlbmNpYVxyXG4gICAgICAgICAgICAgICAgaWYgKGltcHVlc3RvLlZhbG9yID4gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLlZhbG9yID0gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bztcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKGltcHVlc3RvLlZhbG9yIC8gaW1wdWVzdG8uUG9yY2VudGFqZSwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IGRpZmVyZW5jaWEgKyAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9TaSBWYWxvcjxWYWxvclJlYWwgcXVpZXJlIGRlY2lyIHF1ZSByZWRvbmRlbyBoYWNpYSBhYmFqbyB5IG5vIGRlYmUgbW9kaWZpY2FyIGVzZSB2YWxvclxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1NpIHlhIHNlIHNhbGRvIGxhIGRpZmVyZW5jaWEgcm9tcGUgZWwgY2ljbG8gZGFuZG8gcG9yIGNvbmNsdWlkbyBlbCBhanVzdGVcclxuICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Mb2FkIHBvciB1bmlkYWQgZGV0YWxsZSBkZWwgbTNwcm9jZXNvIGl0ZW1zLlxyXG4gICAgcHVibGljIExvYWRNM1BEZXRhbGxlKHNWYWxvcjogc3RyaW5nLCBzQ29uY2VwdG86IHN0cmluZyk6IE0zUERldGFsbGVJdGVtcyB7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtcy5Ob21icmVDb25jZXB0byA9IHNDb25jZXB0bztcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gc1ZhbG9yO1xyXG4gICAgICAgIHJldHVybiBvTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0dlbmVyYXIgcHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgcHVibGljIGFzeW5jIEdlbmVyYXJQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMgfHwgKG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMgJiYgIW9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiUFVFTlRFX0RJQVJJT1wiKSkpIHtcclxuICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgbnVsbCk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhckNvbWJpbmFkYShvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9Db21wYXJlIE0zUHJvY2Vzb3MuIChGaXJzdDogQFBhcmFtOiBpbE0zUHJvY2Vzb3NTUUwgVlMgU2Vjb25kOiBHZXQgRnJvbSBDb3VjaERCL1BvdWNoREIpXHJcbiAgICBwdWJsaWMgYXN5bmMgQ29tcGFyZU0zUHJvY2VzbyhzSURLYXRpb3M6IHN0cmluZywgb00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgaWxNM1Byb2Nlc29zU1FMOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9SZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vR2V0IGRhdGEsIGZyb20gUG91Y2hEQi9Db3VjaERCXHJcbiAgICAgICAgICAgIHZhciBQcm9wZXJ0eUNvbXBhcmUgPSBbXCJWYWxvck5ldG9cIiwgXCJWYWxvclwiXTtcclxuICAgICAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcm9jZXNvc0NPVUNIOiBNM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICAvL0dldCBkYXRhLCBmcm9tIFBvdWNoREIvQ291Y2hEQlxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNIID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcblxyXG4gICAgICAgICAgICAvL1N0YXJ0IENvbXBhcmVcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBQcm9wZXJ0eUNvbXBhcmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbE0zUHJvY2Vzb3NTUUxbUHJvcGVydHlDb21wYXJlW2ldXSAhPSBvTTNQcm9jZXNvc0NPVUNIW1Byb3BlcnR5Q29tcGFyZVtpXV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYlJlc3ApIHtcclxuICAgICAgICAgICAgICAgIC8vQ29tcGFyZTogSUQsIElkUHJvZHVjdG8geSBDQU5USURBRFxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbE0zUHJvY2Vzb3NTUUwuTTNFTkMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5JRCAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uSUQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5JZFByb2R1Y3RvICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5JZFByb2R1Y3RvIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0guTTNFTkNbal0uTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9SZXNwID0geyBcImJSZXNwXCI6IGJSZXNwLCBcIk0zUHJvY2Vzb3NcIjogb00zUHJvY2Vzb3NDT1VDSCB9O1xyXG4gICAgICAgICAgICByZXR1cm4gb1Jlc3A7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBDb21wYXJlTTNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIG9SZXNwID0geyBcImJSZXNwXCI6IHRydWUsIFwiTTNQcm9jZXNvc1wiOiBudWxsIH07XHJcbiAgICAgICAgICAgIHJldHVybiBvUmVzcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FkaWNpb25hciBjb21lcmNpYWwgYWwgcHJvY2VzbywgbG8gYWRpY2lvbmEgYWwgYXJyZWdsbyBkZSBkaW5hbWljb3MgYXNvY2lhZG8gYWwgcHJvY2Vzby5cclxuICAgIHB1YmxpYyBBZGRDb21lcmNpYWxUb00zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgVGRvY0NvbWVyY2lhbDogc3RyaW5nLCBOZG9jQ29tZXJjaWFsOiBzdHJpbmcpIHtcclxuICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2godGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiVENPTUVSQ0lBTFwiLCBUZG9jQ29tZXJjaWFsKSk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIk5DT01FUkNJQUxcIiwgTmRvY0NvbWVyY2lhbCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ3JlYWNpb24geSByZXRvcm5vIGRlIHR1cGxhIGRlIGRpbmFtaWNvcywgYXRhZG9zIGEgcHJvY2VzbyBtMy5cclxuICAgIHB1YmxpYyBDcmVhdGVUdXBsYURpbmFtaWNhKG5vbWJyZSwgdmFsb3IpIHtcclxuICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IG5vbWJyZTtcclxuICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gdmFsb3I7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQRGluYW1pY2FzO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9BY3R1YWxpemEgbGEgY2FudGlkYWQgZGUgXHJcbiAgICBwdWJsaWMgc2V0Q2FudGlkYWRBTExZVVBEQ291Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGlDYW50aWRhZCkge1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkID09IDAgJiYgb00zUHJvY2Vzb3MuSUREaWFyaW8gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLy9BdW4gbm8gZXN0YSByZWdpc3RyYWRvIGVsIHByb2Nlc28gY29tbyB0YWwsIHNlIHB1ZWRlIGJvcnJhciBkZSByYWl6XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIFwiV0VCXCIsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkID09IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkdldENhcnJpdG9Db21wcmFzUG91Y2hEQihvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgXCJXRUJcIiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vL1NlIGNhbnRpZGFkIGRlIHVuIHByb2R1Y3RvIGVzcGVjaWZpY29cclxuICAgIHB1YmxpYyBzZXRDYW50aWRhZFlVUERDb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbixcclxuICAgICAgICBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIHRpcG9VYmljYWNpb24sIElERW5jLFxyXG4gICAgICAgIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBmb3J6YXJCb3JyYWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICBpZiAoKGlDYW50aWRhZCA9PSAwICYmIG9NM1Byb2Nlc29zLklERGlhcmlvID09PSB1bmRlZmluZWQgJiYgdGlwb1ViaWNhY2lvbiA9PSBcIldFQlwiKSB8fCBmb3J6YXJCb3JyYWQpIHtcclxuICAgICAgICAgICAgLy8vQXVuIG5vIGVzdGEgcmVnaXN0cmFkbyBlbCBwcm9jZXNvIGNvbW8gdGFsLCBzZSBwdWVkZSBib3JyYXIgZGUgcmFpelxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgcHJvZC5JRCA9PSBJREVuYykgJiYgIShwcm9kLklkRW5jUGFkcmUgPT0gSURFbmMpKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBsb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEpBR00gMjAxOTEwMjEsIG5vIGhhY2VyIGzDg8KzZ2ljYSBkZSBwcm9tb2Npb25lcyB5IHZhcmlvcywgY3XDg8KhbmRvIHNlIGJvcnJhIGVsIGl0ZW0uXHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9TZSB0b21hIGVuIGN1ZW50YSBlbCBwcmQgeSBzdXMgaGlqb3MgY29uIGVsIElkRW5jUGFkcmVcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiBlbmMuSUQgPT0gSURFbmMpIHx8IGVuYy5JZEVuY1BhZHJlID09IElERW5jKS5mb3JFYWNoKHByZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJkLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gaUNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9vTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGlDYW50aWRhZDsvL0FudGlndWEgbG9naWNhXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDYW50aWRhZFYyKG9NM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIElERW5jLCBvRGF0YVVzZXIsIHNJREthdGlvcywgbTNVYmljYWNpb24sIG9NM0VOQ1BST01PKS50aGVuKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG0zVWJpY2FjaW9uLCByZXNwLk0zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICAvL3RoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FtYmlhciBjYW50aWRhZCBkZSBtM3Byb2Nlc29cclxuICAgIC8vSkFHTSAyMDE5MTAxOCBTZSBhZ3JlZ2EgbnVldmEgZnVuY2lvbmFsaWRhZCBhIGxhIGNhbnRpZGFkOiBcclxuICAgIC8vMS5TZSBib3JyYSBlbCBwcm9kdWN0byBkZSBsYSBsaXN0YSBkZWwgcHJvY2Vzb1xyXG4gICAgLy8yLiBTZSBhZ3JlZ2EgZGUgbnVldm8gZWwgcHJvZHVjdG8gY29uIGxhIG51ZXZhIGNhbnRpZGFkLlxyXG4gICAgcHVibGljIGFzeW5jIHNldENhbnRpZGFkVjIob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUsIGlDYW50aWRhZCwgSURFbmMsIG9EYXRhVXNlcjogYW55XHJcbiAgICAgICAgLCBzSURLYXRpb3M6IHN0cmluZywgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4pIHtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIHZhciBvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gaUNhbnRpZGFkO1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MTExNCwgQWdyZWdhciBpbWFnZW5cclxuICAgICAgICB2YXIgb00zUEVuY0l0ZW1zID0gb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIGVuYy5JRCA9PSBJREVuYyk7XHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuUGF0aEltYWdlbiA9IG9NM1BFbmNJdGVtcy5QYXRoSW1hZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICEoZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIChlbmMuSUQgPT0gSURFbmMgfHwgZW5jLklkRW5jUGFkcmUgPT0gSURFbmMpKSk7XHJcblxyXG4gICAgICAgIG9Qcm9kdWN0byA9IGF3YWl0IHRoaXMuR2V0UHJvZHVjdG9CeVNLVShpZFByb2R1Y3RvLCB0cnVlLCBvTTNQcm9jZXNvcywgb0RhdGFVc2VyLCBvTTNQRW5jSXRlbXMuRElTUE9OSUJMRSk7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCID0gdGhpcy5Mb2FkQWRpY2lvbmFsZXMob00zUEl0ZW1zV0VCLCBvUHJvZHVjdG8pO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5hZGR0b2NhcnQob00zUEl0ZW1zV0VCLCBvUHJvZHVjdG8sIG51bGwsIG51bGwsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBtM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICByZXR1cm4geyBcIk0zUHJvY2Vzb1wiOiBvTTNQcm9jZXNvcywgXCJNM1BJdGVtc1dFQlwiOiBvTTNQSXRlbXNXRUIgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRfTTNFTkNfYnlfaWRwcmRfbG90ZShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlKVxyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBjYW50aWRhZCBkZSB1biBlbmNhYmV6YWRvLCBwcm9kdWN0byBlc3BlY2lmaWNvLlxyXG4gICAgcHVibGljIGdldENhbnRpZGFkKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvZHVjdG86IE0zUHJkR2VuZXJhbCkge1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBvUHJvZHVjdG8uU0tVICYmIGVuYy5Mb3RlID09IG9Qcm9kdWN0by5MT1RFKS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWRUb3RhbChvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikgPiAwKS5cclxuICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLCAwKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy9SRUdJT04gREUgUkVDRVBDSU9OXHJcbiAgICAvL1NlIGFncmVnYSBhdHJpYnV0byBkZSBDdXJyZW50IGNhbnRpZGFkIGRlIHJlY2VwY2lvblxyXG4gICAgcHVibGljIE1lcmdlUmVjZXBZRW5jKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFJlY2VwY2lvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERQUkQsIFwiQ1RCTERQUkRcIikpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM1BSZWNlcGNpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM1BSZWNlcGNpb24uZmlsdGVyKHJlY2VwID0+IHJlY2VwLklkUmVjZXBjaW9uID09IGlkUmVjZXBjaW9uKS5mb3JFYWNoKHJlYyA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSUQgPT0gcmVjLklkRW5jKS5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUocmVjLkNhbnRpZGFkLnRvU3RyaW5nKCksIFwiQ1VSQ1JFQ1wiKSk7Ly9DVVJSRU5UIENBTlRJREFEIFJFQ0VQQ0lPTlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9EZWphciBsb3MgZGUgdGFsbGVzIGRlIGxhIHZhcmlhYmxlOiBDVVJDUkVDIGVuPTAsIEVzdG8gcGFyYSBmbHVqb3MsIGRvbmRlIGFncmVnYSBpbmZvIHByb2Nlc2EgeSBhaMODwq0gbWlzbW8gYWdyZWdhIG3Dg8Khcy5cclxuICAgIHB1YmxpYyBSZW1vdmVDdXJDUmVjKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9IG51bGwpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBvRGV0YWxsZTogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgb0RldGFsbGUgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1VSQ1JFQ1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChvRGV0YWxsZSAhPT0gdW5kZWZpbmVkICYmIG9EZXRhbGxlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBvRGV0YWxsZS5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy9GSU4gUkVHSU9OIERFIFJFQ0VQQ0lPTlxyXG5cclxuICAgIC8vLy8vLy9SRUdJT04gRU5UUkVHQVxyXG4gICAgLy9TZSBhZ3JlZ2EgYXRyaWJ1dG8gZGUgQ3VycmVudCBjYW50aWRhZCBkZSBlbnZpb1xyXG4gICAgcHVibGljIE1lcmdlRW50cFlFbmMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zUEVudmlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zUEVudmlvcy5mb3JFYWNoKGVudiA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbEVuYzogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgICAgICAgICAgbEVuYyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gZW5jLklkRW52aW8gPT0gZW52LklkRW52aW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChsRW5jICE9PSB1bmRlZmluZWQgJiYgbEVuYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbEVuYy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yLCBcIkNVUkNFTlRcIikpOy8vQ1VSUkVOVCBDQU5USURBRCBSRUNFUENJT05cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9EZWphciBsb3MgZGUgdGFsbGVzIGRlIGxhIHZhcmlhYmxlOiBDVVJDUkVDIGVuPTAsIEVzdG8gcGFyYSBmbHVqb3MsIGRvbmRlIGFncmVnYSBpbmZvIHByb2Nlc2EgeSBhaMODwq0gbWlzbW8gYWdyZWdhIG3Dg8Khcy5cclxuICAgIHB1YmxpYyBSZW1vdmVDdXJDRW50KG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9IG51bGwpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBvRGV0YWxsZTogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgb0RldGFsbGUgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1VSQ0VOVFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChvRGV0YWxsZSAhPT0gdW5kZWZpbmVkICYmIG9EZXRhbGxlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBvRGV0YWxsZS5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgIH1cclxuICAgIC8vLy8vLy9GSU4gUkVHSU9OIEVOVFJFR0FcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9tb2Npb25lcyBxdWUgc2UgcHJvY2VzYW4gZGVzcHVlcyBkZSBhZ3JlZ2FyIGFsIGNhcnJpdG9cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBvRGF0YVVzZXIgXHJcbiAgICAgKiBAcGFyYW0gb00zUEl0ZW1zV0VCIFxyXG4gICAgICogQHBhcmFtIG9NM1ViaWNhY2lvbiBcclxuICAgICAqIEBwYXJhbSBFbkxpbmVhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgUHJvY1Byb21vQWZ0ZXJBZGRUb0NhcnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4pIHtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5Qcm9jZXNhck9ic2VxdWlvcyhvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBFbkxpbmVhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhciBwcm9tb2Npb25lcyBkZXNwdWVzIGRlIGZpbmFsaXphciBlbCByZWdpc3Ryb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvY1Byb21vQWZ0ZXJGaW5hbGl6YXIob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuXHJcbiAgICAgICAgdGhpcy5HZW5lcmFyUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3MsIG9EYXRhVXNlcik7XHJcbiAgICAgICAgdGhpcy5Qcm9tb0FmdGVyUHJvY2VzbyhvTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUHJvbW9BZnRlclByb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb3Byb21vY2lvbmVzU2VydmljZSA9IG5ldyBwcm9tb2Npb25lc1NlcnZpY2Uob0RhdGFVc2VyLCBudWxsKTtcclxuICAgICAgICAgICAgdmFyIGxUaXBvc1Byb21vID0gbmV3IEFycmF5PFN0cmluZz4oKTtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgbFRpcG9zUHJvbW8ucHVzaChcIkFGVEVSXCIpO1xyXG4gICAgICAgICAgICBhcnJQcm9tbyA9IG9wcm9tb2Npb25lc1NlcnZpY2UuVmVyaWZpY2FyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIG51bGwsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGxUaXBvc1Byb21vKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG9wcm9tb2Npb25lc1NlcnZpY2UuUHJvY2VzYXJQcm9tb0FmdGVyKGFyclByb21vLCBvTTNQcm9jZXNvcywgb00zRU5DUFJPTU8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuQWRkSW5mb1Byb21vY2lvbmVzQURpbmFtaWNhcyhvTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBhIGluZm9ybWFjaW9uIGRpbmFtaWNhIGRlbCBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEluZm9Qcm9tb2Npb25lc0FEaW5hbWljYXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCAwKTtcclxuICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzID0gdGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiVkFMX1BST01PQ1wiLCBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJOT01CX1BST01PQ1wiLCBkYXRhLk5PTUJSRVMpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJJRF9QUk9NT0NcIiwgZGF0YS5JRClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGllbmUgZWwgcHJvY2VzbyBhc29zaWFkbyBhIHVuIGlkcHJlc3RhbW9zXHJcbiAgICBhc3luYyBnZXRfbTNfcHJvY2Vzb19ieV9pZF9wcmVzdGFtb19hc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRfcHJlc3RhbW86IHN0cmluZykge1xyXG4gICAgICAgIHZhciByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvZ2V0TTNQcm9jZXNvQnlJZFByZXN0YW1vLycgKyBpZF9rYXRpb3MgKyAnLycgKyBpZF9wcmVzdGFtbykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEdldENvbmNlcHRvTTNTYWxkb3NJdGVtVWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYi8nICsgc0lES2F0aW9zLCBqRGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSBvIG1vZGlmaWNhIGxhIGNhbnRpZGFkIGRlIHVuIG9iamV0byBNM090Q2xhc2lmaWNhY2lvbmVzIGRlbnRybyBkZWxhIGxpc3RhIGRlIHVuIFByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9kdWN0IFxyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRQcm9kdWN0b1RvT3RyYXNDbGFzKHByb2R1Y3Q6IFR5cGVNM1ByZEdycCwgY2FudGlkYWQ6IG51bWJlciwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBmdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zID0gaW9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBvTTNPdENsYXNpZmljYWNpb25lczogTTNPdENsYXNpZmljYWNpb25lcztcclxuICAgICAgICB2YXIgcHJvZHVjdFVuaXRTZWxlY3RlZDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHByb2R1Y3RVbml0U2VsZWN0ZWQgPSBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdO1xyXG5cclxuICAgICAgICBsZXQgcHJvZHVjdG9FeGlzdGUgPSB0aGlzLnZhbGlkYXJFeGlzdGFPdHJhQ2xhc2lmKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIHByb2R1Y3QpO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b0V4aXN0ZSkge1xyXG4gICAgICAgICAgICBwcm9kdWN0b0V4aXN0ZS5DYW50aWRhZCA9IHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkICsgY2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLlZhbG9yID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkocHJvZHVjdFVuaXRTZWxlY3RlZC5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBwcm9kdWN0b0V4aXN0ZS5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLk9yZGVuID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIk9yZGVuXCIpICsgMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcyA9IG5ldyBNM090Q2xhc2lmaWNhY2lvbmVzKCk7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLkNhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLklkUHJvZHVjdG8gPSBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuTm9tYnJlID0gcHJvZHVjdFVuaXRTZWxlY3RlZC5OT01CUkUxO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5WYWxvciA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KHByb2R1Y3RVbml0U2VsZWN0ZWQuTG9NM1ByZExpc3RhLlBSRUNJTywgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5JRCA9IHRoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgXCJJRFwiKSArIDE7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLk9yZGVuID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIk9yZGVuXCIpICsgMTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMucHVzaChvTTNPdENsYXNpZmljYWNpb25lcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlvTTNQcm9jZXNvcyA9IHRoaXMucmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3MoaW9NM1Byb2Nlc29zKTtcclxuICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWxpbWluYSB1biBvYmpldG8gTTNPdENsYXNpZmljYWNpb25lcyBwb25pZW5kbyBzdSB2YWxvciB5IGNhbnRpZGFkIGVuIGNlcm9cclxuICAgICAqIEBwYXJhbSBvTTNPdENsYXNpZmljYWNpb25lcyBcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGRlbGV0ZVByb2R1Y3RvRnJvbU90cmFzQ2xhcyhvTTNPdENsYXNpZmljYWNpb25lczogTTNPdENsYXNpZmljYWNpb25lcywgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvQWN0dWFsID0gaW9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBvTTNPdENsYXNpZmljYWNpb25lcy5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG9BY3R1YWwpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuQ2FudGlkYWQgPSAwO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5WYWxvciA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlvTTNQcm9jZXNvcyA9IHRoaXMucmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3MoaW9NM1Byb2Nlc29zKTtcclxuICAgICAgICByZXR1cm4gaW9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhIGVsIHZhbG9yIGRlIE0zUHJvY2Vzb3MuVmFsT3RyYUNsYXNpIGEgcGFydGlyIGRlIGxhIHN1bWF0b3JpYSBkZSBsb3Mgb2JqZXRvcyBkZW50cm8gZGVsIGFycmVnbG8gTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHJlY2FsY3VsYXJWYWxPdHJhQ2xhc2lNM1Byb2Nlc29zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsT3RyYUNsYXNpID0gb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5yZWR1Y2UoZnVuY3Rpb24gKHN1bWEsIG9NM090Q2xhc2lmaWNhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdW1hICsgb00zT3RDbGFzaWZpY2FjaW9uZXMuVmFsb3I7XHJcbiAgICAgICAgfSwgMClcclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBwcm9kdWN0byBkZW50cm8gZGUgdW4gbGEgbGlzdGEgZGUgTTNPdENsYXNpZmljYWNpb25lc1xyXG4gICAgICogQHBhcmFtIGxpc3RNM090Q2xhc2lmaWNhY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3QgXHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXJFeGlzdGFPdHJhQ2xhc2lmKGxpc3RNM090Q2xhc2lmaWNhY2lvbmVzOiBBcnJheTxNM090Q2xhc2lmaWNhY2lvbmVzPiwgcHJvZHVjdDogVHlwZU0zUHJkR3JwKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvRXhpc3RlID0gbGlzdE0zT3RDbGFzaWZpY2FjaW9uZXMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdLlNLVSk7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RvRXhpc3RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAqIExpbXBpYSBsb3MgZGV0YWxsZXMgeSBsb3MgaW1wdWVzdG9zIGRlIHVuIHByb2R1Y3RvIGRhZG8gZW4gdW4gcHJvY2VzbyBkZSBkZXZvbHVjaW9uXHJcbiAgICogQHBhcmFtIHByb2R1Y3RvQm9ycmFkbyBcclxuICAgKiBAcGFyYW0gcHJvY2Vzb0Rldm9sdWNpb24gXHJcbiAgICovXHJcbiAgICBkZWxldGVQcmREZXZvbHVjaW9uKHByb2R1Y3RvQm9ycmFkbywgcHJvY2Vzb0Rldm9sdWNpb246IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG8gPSBwcm9jZXNvRGV2b2x1Y2lvbi5NM0VOQy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IHByb2R1Y3RvQm9ycmFkby5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG8pIHtcclxuICAgICAgICAgICAgcHJvZHVjdG8uTTNERVQuZm9yRWFjaChkZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTigrZGV0LlZhbG9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHByb2R1Y3RvLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgaW1wLkJhc2UgPSAwO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBanVzdGEgbG9zIFZhbG9yZXMgZW4gY2FzbyBkZSBlbmNvbnRyYXIgZGlmZXJlbmNpYXMgcGFyYSBwb2RlciBnZW5lcmFyIEZFXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvclZhbG9yZXNDRkRJRnJvbnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IDA7XHJcbiAgICAgICAgbGV0IHRvdGFsRGVzY3VlbnRvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbERlc2N1ZW50b3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIGxldCB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPSB0aGlzLmdldFZhbG9yVG90YWxJbXBvcnRlSW1wdWVzdG9zKG9NM1Byb2Nlc29zKTtcclxuXHJcbiAgICAgICAgZGlmZXJlbmNpYSA9IHRoaXMub01hdGhURi5yb3VuZChvTTNQcm9jZXNvcy5WYWxvck5ldG8gLSAob00zUHJvY2Vzb3MuVmFsb3IgKyB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgLSB0b3RhbERlc2N1ZW50b3MpLCAzKTtcclxuICAgICAgICBpZiAoZGlmZXJlbmNpYSAhPSAwKSB7XHJcbiAgICAgICAgICAgIGlmICh0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckltcHVlc3Rvc0NGREkoZGlmZXJlbmNpYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hanVzdGFkb3JEZXNjdWVudG9zQ0ZESShkaWZlcmVuY2lhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgdmFsb3IgdG90YWwgZGUgcHJvbW9jaW9uZXMgYXBsaWNhZGFzIGVuIGVsIHByb2Nlc28gZW4gY3Vlc3Rpw4PCs25cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZ2V0VmFsb3JUb3RhbERlc2N1ZW50b3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0b3RhbERlc2N1ZW50b3MgPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldGFsbGVQcm9tbyA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgICAgIGlmIChkZXRhbGxlUHJvbW8pIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsRGVzY3VlbnRvcyArPSArZGV0YWxsZVByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbERlc2N1ZW50b3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHZhbG9yIHRvdGFsIGRlIGltcHVlc3RvcyBjb2JyYWRvcyBlbiBlbCBwcm9jZXNvIGVuIGN1ZXN0acODwrNuXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGdldFZhbG9yVG90YWxJbXBvcnRlSW1wdWVzdG9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdG90YWxJbXBvcnRlSW1wdWVzdG9zID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIGVuYy5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgdG90YWxJbXBvcnRlSW1wdWVzdG9zICs9ICtpbXAuVmFsb3I7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdG90YWxJbXBvcnRlSW1wdWVzdG9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTXVldmUgZWwgdmFsb3IgZGUgdW4gaW1wdWVzdG8gZW4gMC4wMSB5IHN1IGNvcnJlc3BvbmRpZW50ZSBiYXNlIHBhcmEgcXVlIGN1YWRyZSBsb3MgdmFsb3JlcyBhbCB0aW1icmFyIGxhIEZFXHJcbiAgICAgKiBAcGFyYW0gZGlmZXJlbmNpYSBcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9ySW1wdWVzdG9zQ0ZESShkaWZlcmVuY2lhOiBudW1iZXIsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IGFqdXN0byA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGVuYyBvZiBvTTNQcm9jZXNvcy5NM0VOQykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpbXAgb2YgZW5jLk0zUEltcHVlc3Rvcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wLlZhbG9yID0gaW1wLlZhbG9yICsgMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IGltcC5WYWxvciAtIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpbXAuQmFzZSA9IGltcC5WYWxvciAvIGltcC5Qb3JjZW50YWplO1xyXG4gICAgICAgICAgICAgICAgYWp1c3RvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhanVzdG8pIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTXVldmUgZWwgdmFsb3IgZGUgdW4gZGVzY3VlbnRvIGVuIDAuMDEgcGFyYSBxdWUgY3VhZHJlIGxvcyB2YWxvcmVzIGFsIHRpbWJyYXIgbGEgRkVcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIFxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JEZXNjdWVudG9zQ0ZESShkaWZlcmVuY2lhOiBudW1iZXIsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IGRldGFsbGVUb3RhbFByb21vOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgZm9yIChsZXQgZW5jIG9mIG9NM1Byb2Nlc29zLk0zRU5DKSB7XHJcbiAgICAgICAgICAgIGRldGFsbGVUb3RhbFByb21vID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKTtcclxuICAgICAgICAgICAgaWYgKGRldGFsbGVUb3RhbFByb21vICYmICtkZXRhbGxlVG90YWxQcm9tby5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFsbGVUb3RhbFByb21vLlZhbG9yID0gKCtkZXRhbGxlVG90YWxQcm9tby5WYWxvciAtIDAuMDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tby5WYWxvciA9ICgrZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgKyAwLjAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFByZHNHZW5lcmFsRnJvbU0zUHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSWRLYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRQcmRzR2VuZXJhbEZyb21NM1Byb2Nlc28vJyArIHNJZEthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuZXJyb3IuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1RyeCB7XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlbCBkaWFyaW8gZGUgdHJhbnNhY2Npb25lcyBkZXNkZSBzZXJ2aWNpbyByZXN0IE0zVHJ4LiBNaWNyb3NlcnZpY2lvIE0zLlxyXG4gICAgcHVibGljIE0zX0dldERpYXJpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGFTZW5kOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNUcngvTTNfR2V0RGlhcmlvLycgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFEaWFyaW87XHJcbiAgICAgICAgICAgIG9EYXRhRGlhcmlvID0gcmVzcDtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5kYXRhLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvRGF0YURpYXJpby5SRVNQVUVTVEEuZGF0YSA9IG5ldyBBcnJheShvRGF0YURpYXJpby5SRVNQVUVTVEEuZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCBkaWFyaW8gZGUgdHJhbnNhY2Npb25lcyBkZXRhbGxhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIHNJREthdGlvcyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNfZ2V0RGlhcmlvVHJ4KFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNUcngvbTNfZ2V0RGlhcmlvVHJ4LycgKyBzSURLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9EYXRhRGlhcmlvO1xyXG4gICAgICAgICAgICBvRGF0YURpYXJpbyA9IHJlc3A7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YURpYXJpby5SRVNQVUVTVEEuRGlhcmlvLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvRGF0YURpYXJpby5SRVNQVUVTVEEuRGlhcmlvID0gbmV3IEFycmF5KG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5EaWFyaW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgdHJhbnNhY2Npb24uXHJcbiAgICBwdWJsaWMgTTNfR2V0SW5mb1RSWChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGFTZW5kOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL2xldCBkYXRhID0geyAnVG9wJzogdG9wIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM1RyeC9NM19HZXRJbmZvVFJYLycgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFUUlg7XHJcbiAgICAgICAgICAgIG9EYXRhVFJYID0gcmVzcDtcclxuXHJcbiAgICAgICAgICAgIGlmIChvRGF0YVRSWC5SRVNQVUVTVEEuVElQT1MubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9EYXRhVFJYLlJFU1BVRVNUQS5USVBPUyA9IG5ldyBBcnJheShvRGF0YVRSWC5SRVNQVUVTVEEuVElQT1MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRGF0YVRSWC5SRVNQVUVTVEEuVElQT1MuZm9yRWFjaCh0aXBvID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aXBvLlRSWC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpcG8uVFJYID0gbmV3IEFycmF5KHRpcG8uVFJYKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhvRGF0YVRSWCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcblxyXG5cclxuICAgIC8vQ2FtYmlvIGRlIGVzdGFkbyBkZSB1YmljYWNpb25cclxuICAgIHB1YmxpYyBDYW1iaW9Fc3RhZG9VYmljYWNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9NM1ViaWNhY2lvbjogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zVHJ4L0NhbWJpb0VzdGFkb1ViaWNhY2lvbi8nICsgc0lES2F0aW9zLCBvTTNVYmljYWNpb24pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLl9ib2R5KTtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLl9ib2R5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG5cclxuICAgIC8vQ2FtYmlvIGRlIGVzdGFkbyBkZSBIVUJcclxuICAgIHB1YmxpYyBDYW1iaW9Fc3RhZG9IdWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9NM1ViaWNhY2lvbjogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zVHJ4L0NhbWJpb0VzdGFkb0h1Yi8nICsgc0lES2F0aW9zLCBvTTNVYmljYWNpb24pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLl9ib2R5KTtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLl9ib2R5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG59IiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4vTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUHJlY0xpc3RQcmVjaW9zIH0gZnJvbSBcIi4uL01hZXN0cm8vbTMtcHJlYy1saXN0LXByZWNpb3MudHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VMaXN0YVByZWNpbyB7XHJcblxyXG4gICAgcHJpdmF0ZSBnb0RhdGE6IGFueTtcclxuICAgIHByaXZhdGUgZ3NJZEthdGlvczogYW55O1xyXG4gICAgcHJpdmF0ZSBsUHJlY2lvc1NlbGVjdGVkOiBzdHJpbmcgPSBcIi0xXCI7XHJcblxyXG4gICAgLy9HZW5lcmFyIEpTT04gZ2Vuw4PCqXJpY28sIHBhcmEgdmFsaWRhciBsYSBsaXN0YSBkZSBwcmVjaW9cclxuICAgIGNvbnN0cnVjdG9yKGxvZ2VkX3VzZXI6IGFueSwgc0lkUHJvY2Vzbzogc3RyaW5nKXtcclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiVVNFUlwiOiBsb2dlZF91c2VyLCBcIlByb2Nlc29cIjogc0lkUHJvY2VzbyB9XHJcbiAgICAgICAgdGhpcy5nb0RhdGEgPSBvRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgcHVibGljIGFzeW5jIEdldExpc3RhUHJlY2lvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gSWRLYXRpb3M7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgICAgIHZhciBvTGlzdFByZWNMUDogTTNQcmVjTGlzdFByZWNpb3M7XHJcbiAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gdGhpcy5HZXRMUHJlY2lvc0luU3RvcmFnZShJZEthdGlvcyk7XHJcbiAgICAgICAgICAgIGlmKCFvTGlzdFByZWNMUCl7XHJcbiAgICAgICAgICAgICAgICBvTGlzdFByZWNMUCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLk0zR0VUX0xJU1RBUFJFQ0lPU19BU3luYyhQb3N0U2VydmljZU0zLCBJZEthdGlvcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNhdmVMUHJlY2lvc0luU3RvcmFnZShvTGlzdFByZWNMUCxJZEthdGlvcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5WYWxpZGFyQVBMUmVnbGEob0xpc3RQcmVjTFApO1xyXG4gICAgICAgICAgICAvL3RoaXMuRmluZExQcmVjaW8ob0xpc3RQcmVjTFApO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sUHJlY2lvc1NlbGVjdGVkO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGFyIGxhIGxpc3RhIGRlIHByZWNpb3MgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGxsYXZlOiBSZWdQcmVjaW8gKyBpZGthdGlvc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgU2F2ZUxQcmVjaW9zSW5TdG9yYWdlKGxQcmVjaW86YW55LCBnc0lka2F0aW9zOiBzdHJpbmcpe1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiUmVnUHJlY2lvXCIgKyBnc0lka2F0aW9zLCBKU09OLnN0cmluZ2lmeShsUHJlY2lvKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGFyIGxhIGxpc3RhIGRlIHByZWNpb3MgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGxsYXZlOiBSZWdQcmVjaW8gKyBpZGthdGlvc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgU2F2ZUNvbmZpZ0xQcmVjaW9zSW5TdG9yYWdlKGxQcmVjaW86YW55LCBnc0lka2F0aW9zOiBzdHJpbmcpe1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcobFByZWNpbyk7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcIkNvbmZpZ0xQXCIgKyBnc0lka2F0aW9zLCBsUHJlY2lvKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqXHJcbiAgICAgKiBPYnRlbmVyIGxpc3RhIGRlIHByZWNpb3MgZGVzZGUgc3RvcmFnZSB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRMUHJlY2lvc0luU3RvcmFnZShnc0lka2F0aW9zOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBzUHJlY2lvcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiUmVnUHJlY2lvXCIgKyBnc0lka2F0aW9zKTtcclxuICAgICAgICB2YXIgb1ByZWNpb3M6YW55O1xyXG4gICAgICAgIGlmKHNQcmVjaW9zKXtcclxuICAgICAgICAgICAgb1ByZWNpb3MgPSBKU09OLnBhcnNlKHNQcmVjaW9zKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9QcmVjaW9zO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0Q29uZmlnTFByZWNpb3NJblN0b3JhZ2UoZ3NJZGthdGlvczogc3RyaW5nKXtcclxuICAgICAgICB2YXIgc1ByZWNpb3MgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnTFBcIiArIGdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHZhciBvUHJlY2lvczphbnk7XHJcbiAgICAgICAgaWYoc1ByZWNpb3Mpe1xyXG4gICAgICAgICAgICBvUHJlY2lvcyA9IEpTT04ucGFyc2Uoc1ByZWNpb3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1ByZWNpb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQnVzdWNhciBsYSBsaXN0YSBkZSBwcmVjaW8sIGluZ3Jlc2EgZWwgb2JqZXRvIGRlIHByZWNlbmRlbmNpYSBkZSByZWdsYXMgZGUgbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgcHVibGljIEZpbmRMUHJlY2lvKG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcykge1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChvTGlzdFByZWNMUCAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQICE9IG51bGwgJiYgb0xpc3RQcmVjTFAuSUQgIT09IHVuZGVmaW5lZCAmJiBvTGlzdFByZWNMUC5JRCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAob0xpc3RQcmVjTFAuUFJFQ0VERU5DSUEgIT09IHVuZGVmaW5lZCAmJiBvTGlzdFByZWNMUC5QUkVDRURFTkNJQSAhPSBudWxsICYmIG9MaXN0UHJlY0xQLlBSRUNFREVOQ0lBLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByZWMgb2Ygb0xpc3RQcmVjTFAuUFJFQ0VERU5DSUEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJBUExSZWdsYShwcmVjKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMuRmluZExQcmVjaW8ocHJlYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vVmFsaWRhciByZWdsYXMsIGluZ3Jlc2EgZWwgb2JqZXRvIGRlIHByZWNlbmRlbmNpYSBkZSByZWdsYXMgZGUgbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgcHVibGljIFZhbGlkYXJBUExSZWdsYShvTGlzdFByZWNMUDogTTNQcmVjTGlzdFByZWNpb3MpOiBib29sZWFue1xyXG4gICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChvTGlzdFByZWNMUCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob0xpc3RQcmVjTFAuUHJvcGllZGFkKTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAob0xpc3RQcmVjTFAuUHJvcGllZGFkLnRvVXBwZXJDYXNlKCkudHJpbSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkVNUFJFU0FcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nc0lkS2F0aW9zLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVQklDQUNJT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nb0RhdGEuVVNFUi5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9DRVNPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdGhpcy5Db21wYXJlKG9MaXN0UHJlY0xQLlZhbG9yLnRvU3RyaW5nKCksIHRoaXMuZ29EYXRhLlByb2Nlc28udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJIVUJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nb0RhdGEuVVNFUi5Vc3VhcmlvU2lzdGVtYS5JREhVQi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nb0RhdGEuVVNFUi5Vc3VhcmlvU2lzdGVtYVtvTGlzdFByZWNMUC5Qcm9waWVkYWQudG9VcHBlckNhc2UoKS50cmltKCldLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWNhdGNoIChleCl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZXJyb3I6IFwiICsgZXgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoYlJlc3Ape1xyXG4gICAgICAgICAgICB0aGlzLmxQcmVjaW9zU2VsZWN0ZWQgPSBvTGlzdFByZWNMUC5MaXN0YVByZWNpb3M7XHJcbiAgICAgICAgICAgIHRoaXMuRmluZExQcmVjaW8ob0xpc3RQcmVjTFApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBDb21wYXJlKHZhbHVlMSwgdmFsdWUyKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlMSA9PSB2YWx1ZTIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgY29uZmlndXJhY2lvbi9lbmNhYmV6YWRvIGxpc3RhIGRlIHByZWNpb3NcclxuICAgIHB1YmxpYyBhc3luYyBHZXRDb25maWdMaXN0YVByZWNpb3MoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgSWRLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3NJZEthdGlvcyA9IElkS2F0aW9zO1xyXG4gICAgICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgICAgICB2YXIgb0xpc3RQcmVjTFA6IE0zUHJlY0xpc3RQcmVjaW9zO1xyXG4gICAgICAgICAgICBvTGlzdFByZWNMUCA9IHRoaXMuR2V0Q29uZmlnTFByZWNpb3NJblN0b3JhZ2UoSWRLYXRpb3MpO1xyXG4gICAgICAgICAgICBpZighb0xpc3RQcmVjTFApe1xyXG4gICAgICAgICAgICAgICAgb0xpc3RQcmVjTFAgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5HZXRFbmNhYmV6YWRvTGlzdGFzUHJlY2lvKFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2F2ZUNvbmZpZ0xQcmVjaW9zSW5TdG9yYWdlKG9MaXN0UHJlY0xQLElkS2F0aW9zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gb0xpc3RQcmVjTFA7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNEaW5Qcm9jZXNvc3tcclxuICAgIHB1YmxpYyBpZF9wcm9jZXNvOnN0cmluZztcclxuICAgIHB1YmxpYyBpZF9zdWJfcHJvY2VzbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgaWRfZGluYW1pY2E6c3RyaW5nO1xyXG4gICAgcHVibGljIHRpcG9fZGluYW06c3RyaW5nO1xyXG4gICAgcHVibGljIHRpdHVsbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgZXN0cnVjdHVyYV9kZXN0aW5vOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgVkRlZmF1bHQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBSZXF1ZXJpZG86Ym9vbGVhbjtcclxufSIsImltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNQSXRlbXNXRUIgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1ByZFBhY2tEZXQge1xyXG4gICAgcHVibGljIExPVEU6IHN0cmluZztcclxuICAgIHB1YmxpYyBMT1RFSElKTzogc3RyaW5nO1xyXG4gICAgcHVibGljIFNLVUhJSk86IHN0cmluZztcclxuICAgIHB1YmxpYyBDYW50aWRhZDogbnVtYmVyO1xyXG4gICAgcHVibGljIFRpcG9QYWNrOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZ3NQYXRoSW1hZ2VuOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQjtcclxuICAgIHB1YmxpYyBNM0dSUCA9IG5ldyBUeXBlTTNQcmRHcnAoKTtcclxuICAgIHB1YmxpYyBPcmRlbjogbnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yQWRpY2lvbmFsOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRHcnA6IHN0cmluZztcclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNVYmlBZGljaW9uYWxlc3tcclxuICAgIHB1YmxpYyBBdHJpYnV0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG59IiwiaW1wb3J0IHsgTTNVYmlBZGljaW9uYWxlcyB9IGZyb20gXCIuL00zVWJpQWRpY2lvbmFsZXMudHlwZVwiO1xyXG5pbXBvcnQgeyBNM0h1YnMgfSBmcm9tIFwiLi9tMy1odWJzLnR5cGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1ViaWNhY2lvbntcclxuICAgIHB1YmxpYyBJRFViaWNhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvVWJpY2FjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBURG9jQWRtaW46c3RyaW5nO1xyXG4gICAgcHVibGljIE5Eb2NBZG1pbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSkNvbmZpZ3VyYWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIFNlcmllOnN0cmluZztcclxuICAgIHB1YmxpYyBFc3RhZG86bnVtYmVyO1xyXG4gICAgcHVibGljIERvY3VtZW50b0lEOnN0cmluZztcclxuICAgIHB1YmxpYyBNM1ViaUFkaWNpb25hbGVzOkFycmF5PE0zVWJpQWRpY2lvbmFsZXM+O1xyXG4gICAgcHVibGljIE0zSFVCUyA9IG5ldyBBcnJheTxNM0h1YnM+KCk7XHJcbiAgICBwdWJsaWMgRmVjaGFUcmFiYWpvOkRhdGU7XHJcbiAgICBwdWJsaWMgQVBMVWJpY0V4dGVybmFzOkJvb2xlYW47XHJcbiAgICBcclxufSIsImltcG9ydCB7IE0zQ09ORElQUk9NTyB9IGZyb20gXCIuL00zQ09ORElQUk9NTy5jbGFzc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zQ09ORElBR1JVUEFDSU9Oe1xyXG4gICAgcHVibGljIElkUHJvbW9jaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZEFncnVwYWNpb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQ29uZGljaW9uZXM6c3RyaW5nO1xyXG4gICAgcHVibGljIE9wZXJhZG9yOnN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgTTNDT05ESVBST01POkFycmF5PE0zQ09ORElQUk9NTz47XHJcbn0iLCJpbXBvcnQgeyBNM0RFVENPTkRJUFJPTU8gfSBmcm9tIFwiLi9NM0RFVENPTkRJUFJPTU8uY2xhc3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM0NPTkRJUFJPTU97XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQ29uZGljaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb25jZXB0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG4gICAgcHVibGljIEpBZGljaW9uYWxlczpzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIE0zREVUQ09ORElQUk9NTzogQXJyYXk8TTNERVRDT05ESVBST01PPjtcclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNERVRDT05ESVBST01Pe1xyXG4gICAgcHVibGljIElkUHJvbW9jaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZENvbmRpY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ29uY2VwdG86c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuICAgIHB1YmxpYyBKQWRpY2lvbmFsZXM6c3RyaW5nO1xyXG59IiwiaW1wb3J0IHsgTTNDT05ESUFHUlVQQUNJT04gfSBmcm9tIFwiLi9NM0NPTkRJQUdSVVBBQ0lPTi5jbGFzc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zRU5DUFJPTU97XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwbzI6c3RyaW5nO1xyXG4gICAgcHVibGljIFZpZ2VuY2lhOkRhdGU7XHJcbiAgICBwdWJsaWMgSW5pY2lvOkRhdGU7XHJcbiAgICBwdWJsaWMgRXN0YWRvOmJvb2xlYW47XHJcbiAgICBwdWJsaWMgSkFkaWNpb25hbGVzOnN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgRXN0YWRvTWFudWFsZXM6Ym9vbGVhbiA9ZmFsc2U7XHJcbiAgICBwdWJsaWMgRXNNYW51YWw6Ym9vbGVhbj0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIEVzdGFkb0FwbEN1cG9uOmJvb2xlYW4gPWZhbHNlO1xyXG4gICAgcHVibGljIEVzQXBsQ3Vwb246Ym9vbGVhbj0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVG9wZTpudW1iZXI7XHJcblxyXG4gICAgcHVibGljIE0zQ09ORElBR1JVUEFDSU9OOkFycmF5PE0zQ09ORElBR1JVUEFDSU9OPjtcclxufSIsImltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNVYmlBZGljaW9uYWxlcyB9IGZyb20gXCJwcm9qZWN0cy9yZWdsYW5lZ29jaW9tMzEvc3JjL3B1YmxpY19hcGlcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1ViaWNhY2lvblNlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgZ29NM1ViaWNhY2lvbjogTTNVYmljYWNpb247XHJcbiAgICBjb25zdHJ1Y3RvcihvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgdGhpcy5nb00zVWJpY2FjaW9uID0gb00zVWJpY2FjaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXREaXJlY2Npb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShcIkRJUkVDQ0lPTlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0VGVsZWZvbm8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShcIlRFTEVGT05PXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRMb25nKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkdldEFkaWNpb25hckJ5QXRyaWJ1dGUoXCJMT05HXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRMYXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShcIkxBVFwiKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBHZXRBZGljaW9uYXJCeUF0cmlidXRlKEF0cmlidXRvOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb0FkaWNpb25hbDogTTNVYmlBZGljaW9uYWxlcyA9IHRoaXMuZ29NM1ViaWNhY2lvbi5NM1ViaUFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BdHJpYnV0byA9PSBBdHJpYnV0byk7XHJcbiAgICAgICAgICAgIGlmIChvQWRpY2lvbmFsICE9PSB1bmRlZmluZWQgJiYgb0FkaWNpb25hbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb0FkaWNpb25hbC5WYWxvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gXCJOL0FcIjtcclxuICAgICAgICB9Y2F0Y2h7XHJcbiAgICAgICAgICAgIHJldHVybiBcIk4vQVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBNM1BJdGVtc1dFQiwgTTNQRGV0YWxsZUl0ZW1zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNSZWdTZXJ2aWNlIH0gZnJvbSBcIi4vbTMtcmVnLXNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNDb3VjaE1hZXN0cm8gfSBmcm9tIFwiLi4vRGF0YS9tMy1jb3VjaC1tYWVzdHJvXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4vTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhc1wiO1xyXG5pbXBvcnQgeyBNM1BlclhQcm9jZXNvIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBlci14LXByb2Nlc29cIjtcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbG9hZC1sLXByZWNpby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvdWNoUFJEU1NlcnZpY2UgfSBmcm9tIFwiLi4vT2ZmbGluZS9jb3VjaC1wcmRzLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JlZ01hc2l2byB7XHJcblxyXG4gICAgcHJpdmF0ZSBnc0lkS2F0aW9zOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHJlYWRlcjogRmlsZVJlYWRlcjtcclxuICAgIHByaXZhdGUgc2VwYXJhZG9yOiBzdHJpbmcgPSBcIixcIjtcclxuICAgIHByaXZhdGUgb00zUHJvY2VzbyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICBwcml2YXRlIHByb2dyZXNzOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIENvbmZNYXNpdmE6IGFueTtcclxuICAgIHB1YmxpYyByb3VuZGVkX3Byb2dyZXNzOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgZ2JCYXJDb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBjb25zdHJ1Y3Rvcihpc0lkS2F0aW9zOiBzdHJpbmcsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBpQ29uZk1hc2l2YTogYW55LCBpYkJhcmNvZGU6IGJvb2xlYW4sXHJcbiAgICAgICAgcHJpdmF0ZSBvQ291Y2hQUkRTU2VydmljZTogQ291Y2hQUkRTU2VydmljZSkge1xyXG4gICAgICAgIHRoaXMub00zUHJvY2VzbyA9IGlvTTNQcm9jZXNvO1xyXG4gICAgICAgIHRoaXMuZ3NJZEthdGlvcyA9IGlzSWRLYXRpb3M7XHJcbiAgICAgICAgdGhpcy5Db25mTWFzaXZhID0gaUNvbmZNYXNpdmE7XHJcbiAgICAgICAgdGhpcy5nYkJhckNvZGUgPSBpYkJhcmNvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldF9yb3VuZGVkX3Byb2dyZXNzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvdW5kZWRfcHJvZ3Jlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vQWRpY2lvbmFyIHByb2R1Y3RvcyBlbiBtYXNpdm9cclxuICAgIHB1YmxpYyBhc3luYyBBZGljaW9uYXJNYXNpdm8ob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb0RhdFVzZXI6IGFueSwgb0RhdGFQcm9jOiBhbnkpIHtcclxuICAgICAgICB0aGlzLkdldFJlYWRlcihvRGF0YVByb2MpO1xyXG4gICAgICAgIGxldCBjc3Y6IHN0cmluZztcclxuICAgICAgICBpZiAoIXRoaXMucmVhZGVyKSB7XHJcbiAgICAgICAgICAgIGNzdiA9IG9EYXRhUHJvYy5UZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3N2ID0gdGhpcy5yZWFkZXIucmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBjc3Yuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gICAgICAgIHZhciBwcm9jZXNvOiBbTTNQcm9jZXNvcywgc3RyaW5nXSA9IGF3YWl0IHRoaXMuYWRpY2lvbmFyX21hc2l2b19mcm9tX2FycmF5KG9NM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMywgb0RhdFVzZXIsIGFyckNTVik7XHJcblxyXG4gICAgICAgIHJldHVybiBwcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjb3JyZSB5IGFkaWNpb25hIGxvcyBwcm9kdWN0b3MgZW4gdW4gYXJyYXkgYSB1biBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb00zQ291Y2hNYWVzdHJvIFxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gb0RhdFVzZXIgXHJcbiAgICAgKiBAcGFyYW0gYXJyQ1NWIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRpY2lvbmFyX21hc2l2b19mcm9tX2FycmF5KG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm8sIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9EYXRVc2VyOiBhbnksIGFyckNTVjogQXJyYXk8c3RyaW5nPiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwsIGFwbEV4Yzogc3RyaW5nID0gXCIwXCIpIHtcclxuXHJcbiAgICAgICAgbGV0IHRvdGFsID0gYXJyQ1NWLmxlbmd0aDtcclxuICAgICAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgICAgIHZhciBwcm9kdWN0OiBUeXBlTTNQcmRHcnBcclxuICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShvTTNDb3VjaE1hZXN0cm8sIFBvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZEthdGlvcyk7XHJcbiAgICAgICAgdmFyIHByZHNGYWlsczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgcHJkZmFpbGFjdHVhbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG4gICAgICAgIHZhciByZXN1bHQ6IGFueTtcclxuICAgICAgICBsZXQgYXJyYXlSZXNwOiBbTTNQcm9jZXNvcywgc3RyaW5nXSA9IFt0aGlzLm9NM1Byb2Nlc28sIFwiXCJdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG90YWw7IGkrKykge1xyXG4gICAgICAgICAgICBwcmRmYWlsYWN0dWFsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZhciBsaW5lOiBzdHJpbmcgPSBhcnJDU1ZbaV07XHJcbiAgICAgICAgICAgIGlmIChsaW5lKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1Y7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuU2V0RXN0cnVjdENTVihsaW5lKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdiQmFyQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJmdWUgbG9jYWw6IFwiICsgb2VzdHJ1Y3RDU1Yuc2t1KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vQ291Y2hQUkRTU2VydmljZS5nZXQob2VzdHJ1Y3RDU1Yuc2t1KS50aGVuKGFzeW5jIHByZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwib2J0dXZvIGxvY2FsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHRoaXMuZ3NJZEthdGlvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ocHJkLkxpc3RDb2RzLCBvRGF0VXNlciwgUG9zdFNlcnZpY2VNMykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiYXNpZ25vIGxwIGxvY2FsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJkLkxpc3RDb2RzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gcHJkLkxpc3RDb2RzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBhc3luYyBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZXJyb3IgbHAgLSBpbnRlbnRvIHNlcnZlcjogXCIgKyBvZXN0cnVjdENTVi5za3UgKyBcIjogXCIgKyBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHsgXCJpZF91YmljYWNpb25cIjogb0RhdFVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBcIkNvZGlnb1wiOiBvZXN0cnVjdENTVi5za3UgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLkdldF9NM1Byb2R1Y3RvRXNwZWNCeUNvZGVBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIGRhdGEsIG9EYXRVc2VyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBjYXRjaCBscDogXCIgKyBvZXN0cnVjdENTVi5za3UgKyBcIjogXCIgKyBlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnJNc2c6IHN0cmluZyA9IGVyci51cmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZEZhaWwgPSBlcnJNc2cuc3Vic3RyaW5nKGVyck1zZy5pbmRleE9mKFwiQ29kaWdvXCIpICsgNyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJkc0ZhaWxzICs9IHByZEZhaWwgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmRmYWlsYWN0dWFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG9NM1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTTNVYmljYWNpb24gJiYgb00zVWJpY2FjaW9uLklEVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zVWJpY2FjaW9uICYmIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHZXRQcm9kdWN0b0J5U0tVQXN5bmMoUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lkS2F0aW9zLCBvZXN0cnVjdENTVi5za3UsIG9EYXRVc2VyLCBvTTNVYmljYWNpb24uSURVYmljYWNpb24sIGFwbEV4Yyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHZXRQcm9kdWN0b0J5U0tVQXN5bmMoUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lkS2F0aW9zLCBvZXN0cnVjdENTVi5za3UsIG9EYXRVc2VyLCBcIi0xXCIsIGFwbEV4Yyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJvZHVjdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXByZGZhaWxhY3R1YWwgJiYgcHJvZHVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJlY2lvU2lBUGxpY2EocHJvZHVjdCwgb2VzdHJ1Y3RDU1YpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkUHJkVG9NM1Byb2Nlc28ocHJvZHVjdCwgb2VzdHJ1Y3RDU1YsIG9NM1JlZ1NlcnZpY2UsIG9EYXRVc2VyLCBvTTNVYmljYWNpb24pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZXJyb3IgcHJvZHVjdCBubyBzZSBsbGVubzogXCIgKyBvZXN0cnVjdENTVi5za3UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBjb3VudCAqIDEwMCAvIHRvdGFsO1xyXG4gICAgICAgICAgICB0aGlzLnJvdW5kZWRfcHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKHRoaXMucHJvZ3Jlc3MgKiAxMDApIC8gMTAwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFycmF5UmVzcFswXSA9IHRoaXMub00zUHJvY2VzbztcclxuICAgICAgICBhcnJheVJlc3BbMV0gPSBwcmRzRmFpbHM7XHJcbiAgICAgICAgcmV0dXJuIGFycmF5UmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbWJpYXIgcHJlY2lvIGRlIHByb2R1Y3RvLlxyXG4gICAgcHVibGljIHNldFByZWNpb1NpQVBsaWNhKHByb2R1Y3Q6IFR5cGVNM1ByZEdycCwgb2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YpIHtcclxuICAgICAgICBpZiAob2VzdHJ1Y3RDU1YucHJlY2lvICE9PSBOYU4gJiYgb2VzdHJ1Y3RDU1YucHJlY2lvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcHJvZHVjdC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb2VzdHJ1Y3RDU1YucHJlY2lvO1xyXG4gICAgICAgICAgICBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmZvckVhY2gob00zUHJlc2VudGFjaW9uZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zUHJlc2VudGFjaW9uZXMuVkFMT1IgPSBvZXN0cnVjdENTVi5wcmVjaW87XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0FkaWNpb25hciBhIG0zcHJvY2VzbywgcHJvZHVjdG8gZXNwZWNpZmljbywgc2UgZW52aWEgY2FudGlkYWQuXHJcbiAgICBwdWJsaWMgQWRkUHJkVG9NM1Byb2Nlc28ocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBvZXN0cnVjdENTVjogZXN0cnVjdENTViwgb00zUmVnU2VydmljZTogTTNSZWdTZXJ2aWNlLCBvRGF0VXNlcjogYW55LCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uID0gbnVsbCkge1xyXG4gICAgICAgIHZhciBvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gb2VzdHJ1Y3RDU1YuY2FudGlkYWQ7XHJcbiAgICAgICAgaWYgKG9lc3RydWN0Q1NWLlBhdGhJbWFnZW4pIHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4gPSBvZXN0cnVjdENTVi5QYXRoSW1hZ2VuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvTTNQSXRlbXNXRUIgPSBvTTNSZWdTZXJ2aWNlLkxvYWRBZGljaW9uYWxlcyhvTTNQSXRlbXNXRUIsIHByb2R1Y3QpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vTTNQcm9jZXNvLk0zRU5DLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIC8vL1ByaW1lcmEgdmV6IFxyXG4gICAgICAgICAgICAvLy9OTyBTRSBFU1RBIEVOVklBTkRPIElORk9STUFDSU9OIERFIFBST01PQ0lPTkVTXHJcbiAgICAgICAgICAgIHRoaXMub00zUHJvY2VzbyA9IG9NM1JlZ1NlcnZpY2UuTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2R1Y3QsIG9NM1BJdGVtc1dFQiwgb0RhdFVzZXIsIG9NM1ViaWNhY2lvbiwgbnVsbCwgdGhpcy5vTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgLy9BZ3JlZ2FyIGRpbmFtaWNhc1xyXG4gICAgICAgICAgICB0aGlzLkFkaWNpb25hckRpbmFtaWNhKG9lc3RydWN0Q1NWKTtcclxuICAgICAgICAgICAgdGhpcy5BZGljaW9uYXJQZXJzb25hc0FQcm9jZXNvKG9lc3RydWN0Q1NWKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zUmVnU2VydmljZS5Mb2FkTTNQcm9jZXNvRnJvbURhdGEodGhpcy5vTTNQcm9jZXNvLCBwcm9kdWN0LCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgbnVsbCwgb0RhdFVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkFkaWNpb25hckRldGFsbGUob2VzdHJ1Y3RDU1YpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGNhcHR1cmFzIGRpbmFtaWNhc1xyXG4gICAgICogQHBhcmFtIG9lc3RydWN0Q1NWIEVzdHJ1Y3R1cmEgY29uIGluZm9ybWFjaW9uIGRlIGxpbmVhIGEgYWdyZWdhclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRpY2lvbmFyRGluYW1pY2Eob2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZGluYW1pY2FzID0gb2VzdHJ1Y3RDU1YuRGluYW1pY2FzXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGluYW1pY2FzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcyA9IG5ldyBBcnJheTxNM1BEaW5hbWljYXM+KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IGRpbmFtaWNhc1tpXS5BdHJpYnV0bztcclxuICAgICAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSBkaW5hbWljYXNbaV0uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBhZGljaW9uYXIgZGluYW1pY2FcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIHBlcnNvbmFzIGEgcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIG9lc3RydWN0Q1NWIEVzdHJ1Y3R1cmEgY29uIGluZm9ybWFjaW9uIGEgYWdyZWdhclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRpY2lvbmFyUGVyc29uYXNBUHJvY2VzbyhvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBwZXJzb25hcyA9IG9lc3RydWN0Q1NWLlBlcnNvbmFzO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBlcnNvbmFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb00zUGVyWFByb2Nlc28gPSBuZXcgTTNQZXJYUHJvY2VzbygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9NM1Byb2Nlc28uTTNQZXJYUHJvY2Vzbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5NM1BlclhQcm9jZXNvID0gbmV3IEFycmF5PE0zUGVyWFByb2Nlc28+KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvTTNQZXJYUHJvY2Vzby5UZG9jID0gcGVyc29uYXNbaV0uVGRvYztcclxuICAgICAgICAgICAgICAgIG9NM1BlclhQcm9jZXNvLk5kb2MgPSBwZXJzb25hc1tpXS5OZG9jO1xyXG4gICAgICAgICAgICAgICAgb00zUGVyWFByb2Nlc28uVGlwb1BlcnNvbmEgPSBwZXJzb25hc1tpXS5BdHJpYnV0bztcclxuICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5NM1BlclhQcm9jZXNvLnB1c2gob00zUGVyWFByb2Nlc28pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBhZGljaW9uYXIgcGVyc29uYXNcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGUgYWwgdWx0aW1vIGVuY2FiZXphZG8gYWdyZWdhZG8uXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gZGUgbGluZWEgYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJEZXRhbGxlKG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRldGFsbGVzID0gb2VzdHJ1Y3RDU1YuTTNEZXRcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXRhbGxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5Ob21icmVDb25jZXB0byA9IGRldGFsbGVzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IGRldGFsbGVzW2ldLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zRU5DW3RoaXMub00zUHJvY2Vzby5NM0VOQy5sZW5ndGggLSAxXS5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLm9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBvZXN0cnVjdENTVi4pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBkZXRhbGxlXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0ZW5lciB5IHNldGVhciBsYSBpbmZvcm1hY2lvbiBkZSBhcmNoaXZvIENTViB5IHNlcGFyYWRvci5cclxuICAgIHB1YmxpYyBHZXRSZWFkZXIob0RhdGFQcm9jOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnJlYWRlciA9IG9EYXRhUHJvYy5DU1Y7XHJcbiAgICAgICAgdGhpcy5zZXBhcmFkb3IgPSBvRGF0YVByb2MuU2VwYXJhZG9yO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vU2V0ZWFyIGVzdHJ1Y3V0YXIgZGUgQ1NWXHJcbiAgICBwdWJsaWMgU2V0RXN0cnVjdENTVihsaW5lOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YgPSB7IFwiY2FudGlkYWRcIjogbnVsbCwgXCJwcmVjaW9cIjogbnVsbCwgXCJza3VcIjogbnVsbCwgXCJQYXRoSW1hZ2VuXCI6IG51bGwsIFwiRGluYW1pY2FzXCI6IFtdLCBcIlBlcnNvbmFzXCI6IFtdLCBcIk0zRGV0XCI6IFtdIH07XHJcbiAgICAgICAgICAgIHZhciBvQXJyQ1NWOiBBcnJheTxzdHJpbmc+ID0gbGluZS5zcGxpdCh0aGlzLnNlcGFyYWRvcik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5Db25mTWFzaXZhICYmIHRoaXMuQ29uZk1hc2l2YS5Db2x1bW5hcykge1xyXG4gICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YgPSB0aGlzLkVzdHJ1Y3REeW5hbWljKG9BcnJDU1YpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YgPSB0aGlzLkVzdHJ1Y3REZWZhdWx0KG9BcnJDU1YpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gb2VzdHJ1Y3RDU1Y7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBjcmVhbmRvIGVzdHJ1Y3R1cmEuIFJldmlzYXIgbGluZWFzXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzdHJ1Y3R1cmEgZGluYW1pY2EgZGUgY2FyZ3VlIG1hc2l2YVxyXG4gICAgICogQHBhcmFtIG9BcnJDU1YgYXJyZWdsbyBjb24gaW5mb3JtYWNpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBFc3RydWN0RHluYW1pYyhvQXJyQ1NWOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICAgICAgdmFyIGNvbHVtbmFzOiBBcnJheTxhbnk+ID0gdGhpcy5Db25mTWFzaXZhLkNvbHVtbmFzO1xyXG4gICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTViA9IHsgXCJjYW50aWRhZFwiOiBudWxsLCBcInByZWNpb1wiOiBudWxsLCBcInNrdVwiOiBudWxsLCBcIlBhdGhJbWFnZW5cIjogbnVsbCwgXCJEaW5hbWljYXNcIjogW10sIFwiUGVyc29uYXNcIjogW10sIFwiTTNEZXRcIjogW10gfTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5hcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbmFzW2ldLkVzdHJ1Y3R1cmEpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJDYW50aWRhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLmNhbnRpZGFkID0gK29BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlByZWNpb1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLnByZWNpbyA9ICtvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJTS1VcIjpcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5za3UgPSBvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJESU5BTUlDQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaW4gPSB7IFwiQXRyaWJ1dG9cIjogY29sdW1uYXNbaV0uQXRyaWJ1dG8sIFwiVmFsb3JcIjogb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl0gfTtcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5EaW5hbWljYXMucHVzaChkaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk0zREVUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG0zRGV0ID0geyBcIkF0cmlidXRvXCI6IGNvbHVtbmFzW2ldLkF0cmlidXRvLCBcIlZhbG9yXCI6IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dIH07XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuTTNEZXQucHVzaChtM0RldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiVElQT1BFUlNPTkFcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsb3IgPSBvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdGRvYzogc3RyaW5nID0gXCI1XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5kb2M6IHN0cmluZztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbG9yLnNwbGl0KFwiLVwiKS5sZW5ndGggPj0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZG9jID0gdmFsb3Iuc3BsaXQoXCItXCIpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZG9jID0gdmFsb3Iuc3BsaXQoXCItXCIpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5kb2MgPSB2YWxvcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwZXJzb25hID0geyBcIkF0cmlidXRvXCI6IGNvbHVtbmFzW2ldLkF0cmlidXRvLCBcIlRkb2NcIjogdGRvYywgXCJOZG9jXCI6IG5kb2MgfTtcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5QZXJzb25hcy5wdXNoKHBlcnNvbmEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2VzdHJ1Y3RDU1Y7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3RydWN0dXJhIGRlZmF1bHQuXHJcbiAgICAgKiBAcGFyYW0gb0FyckNTViBBcnJlZ2xvIGNvbiBpbmZvcm1hY2lvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRXN0cnVjdERlZmF1bHQob0FyckNTVjogQXJyYXk8c3RyaW5nPikge1xyXG4gICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTViA9IHsgXCJjYW50aWRhZFwiOiBudWxsLCBcInByZWNpb1wiOiBudWxsLCBcInNrdVwiOiBudWxsLCBcIlBhdGhJbWFnZW5cIjogbnVsbCwgXCJEaW5hbWljYXNcIjogW10sIFwiUGVyc29uYXNcIjogW10sIFwiTTNEZXRcIjogW10gfTtcclxuICAgICAgICAvL3ZhciBvQXJyQ1NWOiBBcnJheTxzdHJpbmc+ID0gbGluZS5zcGxpdCh0aGlzLnNlcGFyYWRvcik7XHJcblxyXG4gICAgICAgIGlmIChvQXJyQ1NWLmxlbmd0aCA+PSAxKSB7XHJcbiAgICAgICAgICAgIG9lc3RydWN0Q1NWLnNrdSA9IG9BcnJDU1ZbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvQXJyQ1NWLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgICAgIG9lc3RydWN0Q1NWLmNhbnRpZGFkID0gK29BcnJDU1ZbMV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob0FyckNTVi5sZW5ndGggPj0gMykge1xyXG4gICAgICAgICAgICBvZXN0cnVjdENTVi5wcmVjaW8gPSArb0FyckNTVlsyXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9BcnJDU1YubGVuZ3RoID49IDQpIHtcclxuICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuUGF0aEltYWdlbiA9IG9BcnJDU1ZbM107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvZXN0cnVjdENTVjtcclxuICAgIH1cclxuXHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBlc3RydWN0Q1NWIHtcclxuICAgIHNrdTogc3RyaW5nO1xyXG4gICAgY2FudGlkYWQ6IG51bWJlcjtcclxuICAgIHByZWNpbzogbnVtYmVyO1xyXG4gICAgUGF0aEltYWdlbjogc3RyaW5nO1xyXG4gICAgRGluYW1pY2FzOiBBcnJheTxhbnk+O1xyXG4gICAgUGVyc29uYXM6IEFycmF5PGFueT47XHJcbiAgICBNM0RldDogQXJyYXk8YW55PjtcclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhc1wiO1xyXG5pbXBvcnQgeyBNM1BJdGVtc1dFQiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBhc3luYyB9IGZyb20gXCJxXCI7XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JlZ01hc2l2b0FLWlNlcnZpY2Uge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSB1biBFbmNJdGVtIHkgcHVlZGUgcXVlIHVuYSBkaW5hbWljYSBjb24gZWwgaWRwcmVzdGFtbyBhIHVuIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkX2thdGlvcyBcclxuICAgICAqIEBwYXJhbSBpZF9wcmVzdGFtbyBcclxuICAgICAqIEBwYXJhbSBtM1ByZCBcclxuICAgICAqIEBwYXJhbSB1c2VyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRkX2RpbmFtaWNhX2lkcHJlc3RhbW9fdG9fcHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRfcHJlc3RhbW86IHN0cmluZyxcclxuICAgICAgICBtM1ByZCwgdXNlciwgb3Ryb3NQYXJhbWV0cm9zOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdmFyIHJlc3A7XHJcbiAgICAgICAgdmFyIHBkaW5hbWljYSA9IG5ldyBNM1BEaW5hbWljYXNcclxuICAgICAgICBwZGluYW1pY2EuTm9tYnJlID0gXCJJZFByZXN0YW1vXCI7XHJcbiAgICAgICAgcGRpbmFtaWNhLlZhbG9yID0gaWRfcHJlc3RhbW87XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJlc3BvbnNlX3Byb2Nlc29fbTM6IE0zUHJvY2Vzb3NcclxuICAgICAgICAgICAgdmFyIG0zX3JlZ19zZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBpZF9rYXRpb3MpO1xyXG4gICAgICAgICAgICByZXNwb25zZV9wcm9jZXNvX20zID0gYXdhaXQgbTNfcmVnX3NlcnZpY2UuZ2V0X20zX3Byb2Nlc29fYnlfaWRfcHJlc3RhbW9fYXN5bmMoUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zLCBpZF9wcmVzdGFtbyk7XHJcblxyXG4gICAgICAgICAgICAvL1NlIGRlamFuIHBlZ2Fkb3MgbG9zIGVzdGFkb3MgZGUgZGVzdGlub1xyXG4gICAgICAgICAgICByZXNwb25zZV9wcm9jZXNvX20zLkVzdGFkb0RlcyA9IHJlc3BvbnNlX3Byb2Nlc29fbTMuRXN0YWRvQW50O1xyXG4gICAgICAgICAgICByZXNwb25zZV9wcm9jZXNvX20zLlN1YkVzdGFkb0RlcyA9IHJlc3BvbnNlX3Byb2Nlc29fbTMuU3ViRXN0YWRvQW50O1xyXG5cclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IHRoaXMuYWRkX3BkaW5hbWljYV90b19leGlzdGluZ19wcm9jZXNvKFBvc3RTZXJ2aWNlTTMsIHJlc3BvbnNlX3Byb2Nlc29fbTMsIGlkX2thdGlvcywgbTNQcmQsIHVzZXIsIHBkaW5hbWljYSwgb3Ryb3NQYXJhbWV0cm9zKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcblxyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgdGhpcy5hZGRfcGRpbmFtaWNhX3RvX25ld19wcm9jZXNvKFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvcywgbTNQcmQsIHVzZXIsIHBkaW5hbWljYSwgb3Ryb3NQYXJhbWV0cm9zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2EgdW4gRW5jSXRlbSB5IGRpbmFtaWNhIGNvbiBlbCBpZHByZXN0YW1vIGEgdW4gcHJvY2VzbyBudWV2b1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG0zUHJkIFxyXG4gICAgICogQHBhcmFtIHVzZXIgXHJcbiAgICAgKiBAcGFyYW0gcGRpbmFtaWNhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRkX3BkaW5hbWljYV90b19uZXdfcHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBtM1ByZDogYW55LCB1c2VyOiBhbnksIHBkaW5hbWljYTogTTNQRGluYW1pY2FzLCBvdHJvc1BhcmFtZXRyb3M6IEFycmF5PGFueT4pIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQjtcclxuICAgICAgICBvTTNQSXRlbXNXRUIgPSB0aGlzLkdldE0zUEl0ZW1zV0VCKG90cm9zUGFyYW1ldHJvcyk7XHJcbiAgICAgICAgdmFyIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIGlkX2thdGlvcyk7XHJcbiAgICAgICAgdmFyIHJlc3BvbnNlID0gb00zUmVnU2VydmljZS5Mb2FkTTNQcm9jZXNvRW1wdHlQREIobTNQcmQsIG9NM1BJdGVtc1dFQiwgdXNlciwgbnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgcmVzcG9uc2UubE0zUERpbmFtaWNhcy5wdXNoKHBkaW5hbWljYSk7XHJcblxyXG4gICAgICAgIC8vU2UgZGVqYW4gcGVnYWRvcyBsb3MgZXN0YWRvcyBkZSBkZXN0aW5vXHJcbiAgICAgICAgcmVzcG9uc2UuRXN0YWRvRGVzID0gXCJBY3Rpdm9cIjtcclxuICAgICAgICByZXNwb25zZS5TdWJFc3RhZG9EZXMgPSBcIlJlZ2lzdHJvXCI7XHJcblxyXG4gICAgICAgIHZhciBtM19wcm9jZXNvID0gYXdhaXQgb00zUmVnU2VydmljZS5wcm9jZXNhbWllbnRvX3NlcnZpY2VfYXN5bmMoaWRfa2F0aW9zLCBQb3N0U2VydmljZU0zLCByZXNwb25zZSwgdXNlcik7XHJcbiAgICAgICAgcmV0dXJuIG0zX3Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2EgdW4gRW5jSXRlbSBhIHVuIHByb2Nlc28gZXhpc3RlbnRlXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBtM19wcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGlkX2thdGlvcyBcclxuICAgICAqIEBwYXJhbSBtM1ByZCBcclxuICAgICAqIEBwYXJhbSB1c2VyIFxyXG4gICAgICogQHBhcmFtIHBkaW5hbWljYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRkX3BkaW5hbWljYV90b19leGlzdGluZ19wcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG0zX3Byb2Nlc286IE0zUHJvY2Vzb3MsIGlkX2thdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG0zUHJkOiBhbnksIHVzZXI6IGFueSwgcGRpbmFtaWNhOiBNM1BEaW5hbWljYXMsIG90cm9zUGFyYW1ldHJvczogQXJyYXk8YW55Pikge1xyXG5cclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IHRoaXMuR2V0TTNQSXRlbXNXRUIob3Ryb3NQYXJhbWV0cm9zKTtcclxuICAgICAgICB2YXIgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgaWRfa2F0aW9zKTtcclxuXHJcbiAgICAgICAgdmFyIHJlc3BvbnNlID0gb00zUmVnU2VydmljZS5Mb2FkTTNQcm9jZXNvRnJvbURhdGEobTNfcHJvY2VzbywgbTNQcmQsIG9NM1BJdGVtc1dFQiwgbnVsbCwgbnVsbCwgdXNlcik7XHJcbiAgICAgICAgcmVzcG9uc2UubE0zUERpbmFtaWNhcy5wdXNoKHBkaW5hbWljYSk7XHJcblxyXG4gICAgICAgIHZhciBtM19wcm9jZXNvID0gYXdhaXQgb00zUmVnU2VydmljZS5wcm9jZXNhbWllbnRvX3NlcnZpY2VfYXN5bmMoaWRfa2F0aW9zLCBQb3N0U2VydmljZU0zLCByZXNwb25zZSwgdXNlcik7XHJcbiAgICAgICAgcmV0dXJuIG0zX3Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgR2V0TTNQSXRlbXNXRUIob3Ryb3NQYXJhbWV0cm9zOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAxO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gPSBcIk0zVkVOVEFcIjtcclxuICAgICAgICBvdHJvc1BhcmFtZXRyb3MuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCW3guTm9tYnJlXSA9IHguVmFsb3JcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiBvTTNQSXRlbXNXRUI7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZXZlcnNvU2VydntcclxuXHJcblxyXG4gICAgXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJSZXZlcnNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsc0lES2F0aW9zOiBzdHJpbmcsIHRkb2NBY3Rpdm86c3RyaW5nLCBuZG9jQWN0aXZvOnN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM1JldmVyc28vUmV2ZXJzYXIvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIG5kb2NBY3Rpdm8gKyBcIi9cIiArIHRkb2NBY3Rpdm8sIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9LCApO1xyXG4gICAgfVxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM1BEaW5hbUJ5QWN0aXZpZGFke1xyXG4gICAgcHVibGljIElkRGluYW1pY2E6c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG59IiwiZXhwb3J0IGNsYXNzIE0zRGluQnlBY3RpdmlkYWR7XHJcbiAgICBwdWJsaWMgSURBY3RpdmlkYWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIEFjdGl2aWRhZDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSUREaW5hbWljYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwb0RpbmFtaWNhOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIFJlcXVlcmlkbzpib29sZWFuO1xyXG5cclxuICAgIC8vU29sbyBQcmVzZW50YWNpb25cclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIE0zU2FsZG9zWEN1ZW50YXtcclxuICAgIHB1YmxpYyBEb2N1bWVudG86c3RyaW5nO1xyXG4gICAgcHVibGljIFREb2NUaXR1bGFyOm51bWJlcjtcclxuICAgIHB1YmxpYyBORG9jVGl0dWxhcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTm9tQ3VlbnRhOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxDdWVudGE6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQRGluYW1CeUFjdGl2aWRhZCB9IGZyb20gXCIuL20zLXBkaW5hbS1ieS1hY3RpdmlkYWRcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZWdpc3Ryb1RyeCB7XHJcblxyXG4gICAgcHVibGljIEFjdGl2aWRhZDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSUQ6bnVtYmVyO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxuXHJcbiAgICAvL0F0cmlidXRvcyB1bmljbyBkZWwgRnJvbnRcclxuICAgIHB1YmxpYyBBY3R1YWw6c3RyaW5nID0gdW5kZWZpbmVkXHJcbn0iLCJpbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBjdXBvbmVzU2VydmljZSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRpZW5lIHRvZG9zIGxvcyBjdXBvbmVzIGdlbmVyYWRvcyBwb3IgdW4gcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNfZ2V0X2N1cG9uZXNfZ2VuZXJhZG9zX2J5X3Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBcclxuICAgICAgICAvL3ZhciBkYXRhID0geyBcImlkX20zXCI6IGlkbTMsIFwiaWRfcHJvY2Vzb1wiOiBwcm9jZXNvIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvbTNfZ2V0X2N1cG9uZXNfZ2VuZXJhZG9zX2J5X3Byb2Nlc28vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgdmFyIGN1cG9uZXMgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICB2YXIgcmVzcF9jdXBvbmVzOkFycmF5PGFueT47XHJcbiAgICAgICAgICBpZighY3Vwb25lcy5DVVBPTkVTLkNVUE9OLmxlbmd0aCl7XHJcbiAgICAgICAgICAgIHJlc3BfY3Vwb25lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgIHJlc3BfY3Vwb25lcy5wdXNoKGN1cG9uZXMuQ1VQT05FUy5DVVBPTik7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmVzcF9jdXBvbmVzID0gY3Vwb25lcy5DVVBPTkVTLkNVUE9OO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBmdW5jaW9uT0socmVzcF9jdXBvbmVzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBwdWJsaWMgZ2V0Q3Vwb25CeUlkRGV0KFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICBcclxuICAgICAgICAvL3ZhciBkYXRhID0geyBcImlkRGV0Q3Vwb25cIjogaWREZXRDdXBvbn07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvZ2V0Q3Vwb25CeUlkRGV0L1wiICsgaWRrYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVycik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvbWFwJztcclxuaW1wb3J0IHsgZmFrZUFzeW5jIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VPZmZMaW5lIHtcclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVcIiArIGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGVuIEJEIHBvdWNoLlxyXG4gICAgcHVibGljIEFkZERvY3VtZW50KGlkOiBzdHJpbmcsIGRvY3VtZW50OiBhbnkpIHtcclxuICAgICAgICBkb2N1bWVudC5faWQgPSBpZDtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJBZGREb2N1bWVudFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXQoaWQpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBZGREb2N1bWVudCBlbmNvbnJ0cm8gZG9jdW1lbnRcIik7XHJcbiAgICAgICAgICAgIGRvY3VtZW50Ll9yZXYgPSByZXN1bHQuX3JldjtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yLnN0YXR1cyk7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRvY3VtZW50W1wiX3JldlwiXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBEZXN0cm95KCkge1xyXG4gICAgLy8gICAgIHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAvLyAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiT2ZmbGluZVwiKTtcclxuICAgIC8vICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAvLyAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cm95VG90YWwoKXtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc0RlbGV0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSwgZGVsZXRlZDogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRBbGxEb2NzT2ZmTGluZVNpbkRvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlc3Ryb3koZnVuY2lvblJlcDpGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lTG9nXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvblJlcCh7XCJSZXNwXCI6XCJPS1wifSk7XHJcbiAgICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgZnVuY2lvblJlcCh7XCJSZXNwXCI6XCJFcnJvclwiLCBcIkRlc2NcIjplcnJ9KTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBEZWxldGVBbGxEb2NzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLmZpbHRlcihyb3cgPT4gIXJvdy5pZC5zdGFydHNXaXRoKFwiQ1RJVk9TXCIpKS5tYXAoZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX2lkOiByb3cuaWQsIF9yZXY6IHJvdy5kb2MuX3JldiwgX2RlbGV0ZWQ6IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbihkZWxldGVEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYnVsa0RvY3MoZGVsZXRlRG9jcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlbGV0ZShpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuaW1wb3J0IHBvdWNoZGJzaXplIGZyb20gJ3BvdWNoZGItc2l6ZSc7XHJcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvbWFwJztcclxuaW1wb3J0IHsgTTNEZXZpY2VzU2VydmljZSB9IGZyb20gJ3NmLXJlZ2xhbmVnb2Npby1ncmwnO1xyXG5cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgYmRPZmZMaW5lTG9nIHtcclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIFxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBvTTNEZXZpY2VzU2VydmljZTpNM0RldmljZXNTZXJ2aWNlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVMb2dcIiArIGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYXIgZW4gQkQgcG91Y2guXHJcbiAgICBwdWJsaWMgQWRkRG9jdW1lbnQoaWQ6IHN0cmluZywgZG9jdW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGRvY3VtZW50Ll9pZCA9IGlkO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXQoaWQpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuX3JldiA9IHJlc3VsdC5fcmV2O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQsIHsgZm9yY2U6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cm95KGZ1bmNpb25SZXA6RnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiT2ZmbGluZUxvZ1wiICsga2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXAoe1wiUmVzcFwiOlwiT0tcIn0pO1xyXG4gICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25SZXAoe1wiUmVzcFwiOlwiRXJyb3JcIiwgXCJEZXNjXCI6ZXJyfSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsb3NlSW5zdGFuY2UoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5jbG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBJbnN0YW5jZUFnYWluKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVMb2dcIiArIGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgfSBjYXRjaHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc0RlbGV0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSwgZGVsZXRlZDogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGVBbGxEb2NzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLmZpbHRlcihyb3cgPT4gIXJvdy5pZC5zdGFydHNXaXRoKFwiQ1RJVk9TXCIpKS5tYXAoZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX2lkOiByb3cuaWQsIF9yZXY6IHJvdy5kb2MuX3JldiwgX2RlbGV0ZWQ6IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbihkZWxldGVEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYnVsa0RvY3MoZGVsZXRlRG9jcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbGltaW5hIGRlbCBMb2cgbG9zIGRvY3MgY29uIGZlY2hhIGFudGVyaW9yIG8gaWd1YWwgYSB7e21heERpYXN9fSBkZSBsYSBmZWNoYSBhY3R1YWxcclxuICAgICAqIFNlIGNvbmNhdGVuYSBcIiAgMDA6MDBcIiBhIGxhIGZlY2hhIHBvciB1biBlcnJvciBlbiBsYSBmdW5jaW9uYWxpZGFkIGRlIFwibmV3IERhdGUoKVwiXHJcbiAgICAgKiBTZSB1dGlsaXphICgxMDAwICogMzYwMCAqIDI0KSBwYXJhIGNhbGN1bGFyIGVsIG51bWVybyBkZSBtaWxpc2VndW5kb3MgZW4gdW4gZMODwq1hXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBEZWxldGVPbGREb2NzKG1heERpYXM6bnVtYmVyKSB7XHJcbiAgICAgICAgLy9sZXQgbWF4RGlhcyA9IDM7XHJcblxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJEZWxldGVPbGREb2NzXCIpXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pLnRoZW4oYWxsRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoYWxsRG9jcylcclxuICAgICAgICAgICAgdGhpcy5BZGRMb2dTb2NrZXQoYWxsRG9jcyk7XHJcbiAgICAgICAgICAgIGFsbERvY3Mucm93cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhlbGVtZW50LmRvYy5GZWNoYSk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGVsZW1lbnQuZG9jLkZlY2hhLnN1YnN0cmluZygwLCAxMCkgKyBcIiAgMDA6MDBcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcobmV3IERhdGUoZWxlbWVudC5kb2MuRmVjaGEuc3Vic3RyaW5nKDAsIDEwKSArIFwiICAwMDowMFwiKSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGVsZW1lbnQuZG9jLkZlY2hhLnN1YnN0cmluZygwLCAxMCkgKyBcIiAgMDA6MDBcIikuZ2V0VGltZSgpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygoRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGVsZW1lbnQuZG9jLkZlY2hhLnN1YnN0cmluZygwLCAxMCkgKyBcIiAgMDA6MDBcIikuZ2V0VGltZSgpKSAvICgxMDAwICogMzYwMCAqIDI0KSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxEb2NzLnJvd3MuZmlsdGVyKHJvdyA9PiBNYXRoLmZsb29yKChEYXRlLm5vdygpIC0gbmV3IERhdGUocm93LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpLmdldFRpbWUoKSkgLyAoMTAwMCAqIDM2MDAgKiAyNCkpID49IG1heERpYXMpXHJcbiAgICAgICAgICAgIC5tYXAoIHJvdyA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0xsYW1hciBzb2NrZXQuIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX2lkOiByb3cuaWQsIF9yZXY6IHJvdy5kb2MuX3JldiwgX2RlbGV0ZWQ6IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbihkZWxldGVEb2NzID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgQWRkTG9nU29ja2V0KG9sTTNQcm9jZXNvczogYW55KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHBhcmFtczogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgcGFyYW1zID0gW3sgXCJub21icmVcIjogXCJNM1Byb2Nlc29cIiwgXCJ2YWxvclwiOiBKU09OLnN0cmluZ2lmeShvbE0zUHJvY2Vzb3MpIH1dO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vTTNEZXZpY2VzU2VydmljZS5EZXZpY2VfTVBvcyh0aGlzLkFkZExvZ1NvY2tldE9LLCBwYXJhbXMsIFwiTE9HTTNQcm9jZXNvc1wiLCBudWxsKVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFkZExvZ1NvY2tldE9LID0oKT0+e1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIERlbGV0ZShpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTTNDb3VjaE1hZXN0cm8gfSBmcm9tIFwiLi4vRGF0YS9tMy1jb3VjaC1tYWVzdHJvXCJcclxuaW1wb3J0IHsgdmFyaWFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tcGlsZXIvc3JjL291dHB1dC9vdXRwdXRfYXN0XCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi4vU2VydmljZXMvTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQW55QVJlY29yZCB9IGZyb20gXCJkbnNcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTTNNYWVzdHJvT2ZmbGluZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm8pIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGZvcm1hcyBkZSBwYWdvXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgSWQgZGUgbGEgRW1wcmVzYSBcclxuICAgICAqIEBwYXJhbSByZXNwT2tfZ2V0X2Zvcm1hc19wYWdvIEZ1bmNpb24gY29uIHJlc3B1ZXN0YSBPS1xyXG4gICAgICogQHBhcmFtIHJlc3BFcnJvcl9nZXRfZm9ybWFzX3BhZ28gRnVuY2lvbiBjb24gcmVzcHVlc3RhIEVSUk9SXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRGb3JtYXNQYWdvKGlkS2F0aW9zLCBpZFByb2Nlc286IHN0cmluZywgcmVzcE9rX2dldF9mb3JtYXNfcGFnbzogRnVuY3Rpb24sIHJlc3BFcnJvcl9nZXRfZm9ybWFzX3BhZ286IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KFwiRm9ybWFzUGFnb1wiKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh4KTtcclxuXHJcbiAgICAgICAgICAgIHJlc3BPa19nZXRfZm9ybWFzX3BhZ28odGhpcy5GaWx0cmFyQnlQcm9jZXNvKGlkUHJvY2VzbywgeC5Gb3JtYXNQYWdvKSk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICByZXNwRXJyb3JfZ2V0X2Zvcm1hc19wYWdvKGVycm9yKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsdHJhciBsYXMgZm9ybWFzIGRlIHBhZ28sIGRlcGVuZGllbmRvIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9jZXNvLlxyXG4gICAgICogQHBhcmFtIGlkUHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBmb3JtYXNQYWdvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRmlsdHJhckJ5UHJvY2VzbyhpZFByb2Nlc286IHN0cmluZywgZm9ybWFzUGFnbzogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGZvcm1hc1BhZ28pO1xyXG4gICAgICAgICAgICBpZiAoaWRQcm9jZXNvICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGZvcm1hc1BhZ28gPSBmb3JtYXNQYWdvLmZpbHRlcih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh4KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoeC5QUk9DRVNPUykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXguUFJPQ0VTT1MubGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5QUk9DRVNPUyA9IG5ldyBBcnJheTxhbnk+KHguUFJPQ0VTT1MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geC5QUk9DRVNPUy5maW5kKHkgPT4geS5JZFByb2Nlc28gPT0gaWRQcm9jZXNvKSAhPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZm9ybWFzUGFnbyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIEZpbHRyYXJCeVByb2Nlc29cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hc1BhZ287XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZm9ybWFzUGFnbztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RXN0cnVjdHVyYShlc3Q6c3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChlc3QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBkaW7Dg8KhbWljYXMgcG9yIGFjdGl2aWRhZFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIElkIGRlIGxhIGVtcHJlc2FcclxuICAgICAqIEBwYXJhbSBMb2FkRGluYW1pY2FzT0sgRnVuY2lvbiBkZSByZXNwdWVzdGEgT0tcclxuICAgICAqIEBwYXJhbSBMb2FkRGluYW1pY2FzRXJyb3IgRnVuY2lvbiBkZSByZXNwdWVzdGEgRVJST1JcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldERpbmFtaWNhc0J5QUN0aXZpZGFkKGlkS2F0aW9zLCBvRGF0YSwgTG9hZERpbmFtaWNhc09LOiBGdW5jdGlvbiwgTG9hZERpbmFtaWNhc0Vycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBkaW5hbVxyXG4gICAgICAgIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChcIkRJTkJZQUNUXCIpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBkaW5hbSA9IHguTTNEaW5CeUFjdGl2aWRhZDtcclxuICAgICAgICAgICAgICAgIGRpbmFtID0gZGluYW0uZmlsdGVyKHggPT4geC5BY3RpdmlkYWQgPT0gb0RhdGEuQWN0aXZpZGFkICYmIHguSURBY3RpdmlkYWQgPT0gb0RhdGEuaWRBY3RpdmlkYWQgJiYgeC5JZFByb2Nlc28gPT0gb0RhdGEuaWRQcm9jZXNvKTtcclxuICAgICAgICAgICAgICAgIExvYWREaW5hbWljYXNPSyhkaW5hbSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2h7XHJcbiAgICAgICAgICAgICAgICBkaW5hbSA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgICAgICBMb2FkRGluYW1pY2FzT0soZGluYW0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgTG9hZERpbmFtaWNhc0Vycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSB1YmljYWNpb25lc1xyXG4gICAgICogQHBhcmFtIHNJZFViaWNhY2lvbmVzIElkIGRlIGxhIHViaWNhY2lvbiBhIGJ1c2NhciBlbiBiYXNlIGRlIGRhdG9zIE5vU1FMXHJcbiAgICAgKiBAcGFyYW0gb1NlcnZpY2VNM01hZXN0cm8gU2VydmljaW8gbWFlc3RybywgZXN0YSB0aWVuZSBmdW5jaW9uYWxpZGFkIHBhcmEgYnVzY2FyIGVzcGVjaWZpY2FtZW50ZSB1biB1YmljYWNpb25cclxuICAgICAqIEBwYXJhbSBGdW5jaW9uT0sgRnVuY2lvbiBxdWUgcmV0b21hIGxhIGZ1bmNpb25hbGlkYWQgY3VhbmRvIGVzIE9LLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VWJpY2FjaW9uZXMoaWRrYXRpb3M6IHN0cmluZywgc0lkVWJpY2FjaW9uZXM6IHN0cmluZywgb1NlcnZpY2VNM01hZXN0cm86IFNlcnZpY2VNM01hZXN0cm8sIEZ1bmNpb25PSzogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL0NhcmdhciBpbmZvcm1hY2lvbiBkZSB1YmljYWNpb25cclxuICAgICAgICB2YXIgb00zVWJpY2FjaW9uO1xyXG4gICAgICAgIHZhciBzSWRVYmljYWNpb25lc0NvdWNoID0gaWRrYXRpb3MudHJpbSgpLnRvVXBwZXJDYXNlKCkgKyBcIj9VQklDXCI7O1xyXG4gICAgICAgIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChzSWRVYmljYWNpb25lc0NvdWNoKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIG9NM1ViaWNhY2lvbiA9IG9TZXJ2aWNlTTNNYWVzdHJvLkdldFViaWNhY2lvbkZyb21MaXN0KHJlc3VsdC5MaXN0VWJpY2FjaW9uZXMuTTNVQklDQUNJT04sIHNJZFViaWNhY2lvbmVzKTtcclxuICAgICAgICAgICAgRnVuY2lvbk9LKG9NM1ViaWNhY2lvbik7XHJcblxyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgIFxyXG5cclxuICAgIC8vIC8qKlxyXG4gICAgLy8gICogT2J0ZW5lciBsYSBpbmZvcm1hY2lvbiBkZSBsYXMgcHJvbW9jaW9uZXNcclxuICAgIC8vICAqIEBwYXJhbSBzSURQcm9tbyBJZCBkZSBsYSBwcm9tb2Npb24gYSBidXNjYXIgZW4gYmFzZSBkZSBkYXRvcyBOb1NRTFxyXG4gICAgLy8gICogQHBhcmFtIEZ1bmNpb25PSyBGdW5jaW9uIHF1ZSByZXRvbWEgbGEgZnVuY2lvbmFsaWRhZCBjdWFuZG8gZXMgT0suXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHB1YmxpYyBHZXRQcm9tb2Npb25lcyhpZGthdGlvczogc3RyaW5nLCBGdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAvLyAgICAgdmFyIExpc3RQcm9tbztcclxuICAgIC8vICAgICB2YXIgc0lEUHJvbW8gPSBpZGthdGlvcy50cmltKCkudG9VcHBlckNhc2UoKSArIFwiP1Byb21vY2lvbmVzXCI7XHJcbiAgICAvLyAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KHNJRFByb21vKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAvLyAgICAgICAgIGlmKHJlc3VsdC5NM0VOQ1BST01PKXtcclxuICAgIC8vICAgICAgICAgICAgIExpc3RQcm9tbyA9IHJlc3VsdC5NM0VOQ1BST01PO1xyXG4gICAgLy8gICAgICAgICB9ZWxzZSBpZihyZXN1bHQuTTNMaXN0RU5DUFJPTU8uTTNFTkNQUk9NTyl7XHJcbiAgICAvLyAgICAgICAgICAgICBMaXN0UHJvbW8gPSByZXN1bHQuTTNMaXN0RU5DUFJPTU8uTTNFTkNQUk9NTztcclxuICAgIC8vICAgICAgICAgfWVsc2V7XHJcbiAgICAvLyAgICAgICAgICAgICBMaXN0UHJvbW8gPSB1bmRlZmluZWQ7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIEZ1bmNpb25PSyhMaXN0UHJvbW8pO1xyXG4gICAgLy8gICAgIH0sIGVycm9yID0+IHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsYSBpbmZvcm1hY2lvbiBzaW5jcsODwrNuaWNhbWVudGUgZGUgdGVtcGxhdGUuIHNlZ3VuIGVsIHJlcG9ydGUgZW50cmFudGUgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBBc3luY2dldF90ZW1wbGF0ZV9yZXBvcnRlKGlka2F0aW9zOiBzdHJpbmcsIGlkcmVwKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlO1xyXG4gICAgICAgICAgICAvL3ZhciBzSUQgPSBpZGthdGlvcy50cmltKCkudG9VcHBlckNhc2UoKSArIFwiP1RlbXBsYXRlc1wiO1xyXG4gICAgICAgICAgICB2YXIgc0lEID0gXCJURU1QTEFURVNcIjtcclxuICAgICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoc0lEKTtcclxuICAgICAgICAgICAgaWYgKHRlbXBsYXRlLlJFU1BVRVNUQS5SUFRlbXBsYXRlLmxlbmd0aCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gbmV3IEFycmF5PGFueT4odGVtcGxhdGUuUkVTUFVFU1RBLlJQVGVtcGxhdGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5SRVNQVUVTVEEuUlBUZW1wbGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLy9TZSBjcmVhbiBsb3Mgbm9kb3MgcGFkcmUgUkVTUFVFU1RBIHkgUlBUZW1wbGF0ZSwgcGFyYSBzaW11bGFyIGlndWFsLCBjb21vIGxvIHJlc3BvbmRlIHNlcnZpZG9yLlxyXG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVVbm8gPSB7IFwiUkVTUFVFU1RBXCI6IHsgXCJSUFRlbXBsYXRlXCI6IHRlbXBsYXRlLmZpbmQodCA9PiB0LklkUmVwID09IGlkcmVwKSB9IH07XHJcbiAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZVVubztcclxuICAgICAgICB9IGNhdGNoe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbn0gICAiLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgU2VydmljZU9mZkxpbmUgfSBmcm9tIFwiLi9TZXJ2aWNlL2JkLW9mZmxpbmUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gXCIuLi9TZXJ2aWNlcy9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuLi9TZXJ2aWNlcy9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBiZE9mZkxpbmVMb2cgfSBmcm9tIFwiLi9TZXJ2aWNlL2JkLW9mZmxpbmUtbG9nLnNlcnZpY2VcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM1Byb2Nlc29zT2ZmbGluZSB7XHJcblxyXG4gICAgLy9wcml2YXRlIHNLZXlDdGl2b3M6IHN0cmluZyA9IFwiQ1RJVk9TXCI7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9TZXJ2aWNlT2ZmTGluZTogU2VydmljZU9mZkxpbmUsIHByaXZhdGUgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsXHJcbiAgICAgICAgcHJpdmF0ZSBvYmRPZmZMaW5lTG9nOiBiZE9mZkxpbmVMb2cpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIE0zUHJvY2Vzb3MsIHNlZ3VuIGVsIElEIE0zXHJcbiAgICAgKiBAcGFyYW0gaWQgSWQgZGVsIE1vdG9yIDNcclxuICAgICAqIEBwYXJhbSBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MgUmVzcHVlc3RhIE9LIGRlIGdldCBkZSBNMyBwcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIFJlc3BvbnNlRXJyb3JMb2FkTTNQcm9jZXNvcyBSZXNwdWVzdGEgRXJyb3IgZGUgZ2V0IGRlIE0zIHByb2Nlc29zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRQcm9jZXNvQnlJZChpZCwgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MTEwOCBjYW1iaW8gZGUgZG9uZGUgdHJhZXIgZWwgcHJvY2VzbyBsbyB0cmFlIGRlc2RlIG9mZmxpbmVcclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQoaWQpLnRoZW4ocHJvY2VzbyA9PiB7XHJcbiAgICAgICAgICAgIC8vdGhpcy5vYmRPZmZMaW5lTG9nLmdldChpZCkudGhlbihwcm9jZXNvID0+IHtcclxuICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKHByb2Nlc28pO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgLy9SZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3MoZXJyb3IpO1xyXG4gICAgICAgICAgICB0aGlzLkdldFByb2Nlc29CeUlkRnJvbUxvZyhpZCwgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zLCBSZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0UHJvY2Vzb0J5SWRGcm9tTG9nKGlkLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uLCBSZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9KQUdNIDIwMTkxMTA4IGNhbWJpbyBkZSBkb25kZSB0cmFlciBlbCBwcm9jZXNvIGxvIHRyYWUgZGVzZGUgb2ZmbGluZVxyXG4gICAgICAgIC8vdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KGlkKS50aGVuKHByb2Nlc28gPT4ge1xyXG4gICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5nZXQoaWQpLnRoZW4ocHJvY2VzbyA9PiB7XHJcbiAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhwcm9jZXNvKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIFJlc3BvbnNlRXJyb3JMb2FkTTNQcm9jZXNvcyhlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgTTMgUHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBpZCBJZCBkZWwgTTMgUHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIG9sTTNQcm9jZXNvcyBPYmpldG8gTTMgUHJvY2Vzb3MgYSBhZ3JlZ2FyXHJcbiAgICAgKiBAcGFyYW0gUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zIEZ1bmNpb24gT0sgcmVzcHVlc3RhIHF1ZSBhdHJhcGFyw4PCoS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZFByb2Nlc28oaWRrYXRpb3M6IHN0cmluZywgb2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIGlmIChvbE0zUHJvY2Vzb3MuSWRNMykge1xyXG4gICAgICAgICAgICB0aGlzLkFkZFRvRG9jT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5HZXRJZE0zT2ZmbGluZShpZGthdGlvcywgb2xNM1Byb2Nlc29zLlRNSWRQcm9jZXNvLCBvbE0zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zLklESHViLnRvU3RyaW5nKCkpLnRoZW4oaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgb2xNM1Byb2Nlc29zLklkTTMgPSBpZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuQWRkVG9Eb2NPZmZsaW5lKG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBZGRUb0RvY09mZmxpbmUob2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uLCBpbnRlbnRvID0gMCkge1xyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkFkZERvY3VtZW50KG9sTTNQcm9jZXNvcy5JZE0zLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5TYXZlSWRNMyhvbE0zUHJvY2Vzb3MuSWRNMywgb2xNM1Byb2Nlc29zLlRNSWRQcm9jZXNvLCBvbE0zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zLklESHViLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLkFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5TYXZlSWRNMyhvbE0zUHJvY2Vzb3MuSWRNMywgb2xNM1Byb2Nlc29zLlRNSWRQcm9jZXNvLCBvbE0zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zLklESHViLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAvLyAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKG9sTTNQcm9jZXNvcy5JZE0zKTtcclxuICAgICAgICAgICAgLy8gfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgICAgdGhpcy5BZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKTtcclxuXHJcbiAgICAgICAgICAgIC8vUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKG9sTTNQcm9jZXNvcy5JZE0zKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiZXJyb3JcIjogZXJyb3IsIFwib2xNM1Byb2Nlc29zXCI6IG9sTTNQcm9jZXNvcywgXCJJbnRlbnRvXCI6IGludGVudG8sIFwiZnVuY3Rpb25cIjogXCJBZGRUb0RvY09mZmxpbmVcIiB9KSk7XHJcbiAgICAgICAgICAgIGlmIChpbnRlbnRvID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5JbnN0YW5jZUFnYWluKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZFRvRG9jT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcywgMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MoeyBcIkVycm9yXCI6IFwiRXJyb3IgZW4gZ3VhcmRhciBlbiBiYXNlIGRlIGRhdG9zIHBjcGFsLlwiIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBsb2cgb2ZmbGluZSBkZSBwcm9jZXNvcy5cclxuICAgICAqIEBwYXJhbSBvbE0zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgaW50ZW50bzogbnVtYmVyID0gMCkge1xyXG4gICAgICAgIC8vQWdyZWdhciBhIExvZyBTb2NrZXRcclxuICAgICAgICAvL3RoaXMuQWRkTG9nU29ja2V0KG9sTTNQcm9jZXNvcylcclxuICAgICAgICAvL3JldHVybiB0aGlzLm9iZE9mZkxpbmVMb2cuQWRkRG9jdW1lbnQob2xNM1Byb2Nlc29zLklkTTMudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zKVxyXG4gICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5BZGREb2N1bWVudChvbE0zUHJvY2Vzb3MuSWRNMy50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHgpO1xyXG4gICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3Mob2xNM1Byb2Nlc29zLklkTTMpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICB2YXIgc0ZlY2hhTm93OiBzdHJpbmcgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZTU1ERFRISG1tc3MnKVxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVycm9yTG9nXCIgKyBzRmVjaGFOb3csIEpTT04uc3RyaW5naWZ5KHsgXCJlcnJvclwiOiBlcnJvciwgXCJvbE0zUHJvY2Vzb3NcIjogb2xNM1Byb2Nlc29zLCBcIkludGVudG9cIjogaW50ZW50bywgXCJmdW5jdGlvblwiOiBcIkFkZExvZ09mZmxpbmVcIiB9KSk7XHJcbiAgICAgICAgICAgIGlmIChpbnRlbnRvID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5JbnN0YW5jZUFnYWluKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MsIDEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKHsgXCJFcnJvclwiOiBcIkVycm9yIGVuIGd1YXJkYXIgZW4gYmFzZSBkZSBkYXRvcyBsb2NhbC5cIiB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIEFkZExvZ1NvY2tldE9LID0gKCkgPT4ge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xvc2VJbnN0YW5jZUxvZ09mZigpIHtcclxuICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuY2xvc2VJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0T2ZmTGluZUxvZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vYmRPZmZMaW5lTG9nLkdldEFsbERvY3MoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldDFEb2NPZmZMaW5lTG9nKGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub2JkT2ZmTGluZUxvZy5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV2ZXJzYXIgbTMgcHJvY2VzbywgZW4gZWwgbG9nIGxvY2FsLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmV2ZXJzYXJFbkxvZyhpZCkge1xyXG4gICAgICAgIHRoaXMuR2V0MURvY09mZkxpbmVMb2coaWQpLnRoZW4ob00zUCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvUmVzdWx0OiBNM1Byb2Nlc29zID0gb00zUDtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvUmVzdWx0LmxNM1BFbmNGUC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb1Jlc3VsdC5sTTNQRW5jRlBbaV0uVmFsQ2FtYmlvID0gMDtcclxuICAgICAgICAgICAgICAgIG9SZXN1bHQubE0zUEVuY0ZQW2ldLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgIG9SZXN1bHQubE0zUEVuY0ZQW2ldLlZhbE90cmFDbGFzaSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb1Jlc3VsdC5JZEVzdGFkbyA9IFwiUlZcIjtcclxuICAgICAgICAgICAgdGhpcy5BZGRMb2dPZmZsaW5lKG9SZXN1bHQsIG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cnVpckJETG9nKGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9iZE9mZkxpbmVMb2cuRGVzdHJveShmdW5jaW9uUmVzcCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlc3RydWlyQkRPZmYoZnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub1NlcnZpY2VPZmZMaW5lLkRlc3Ryb3koZnVuY2lvblJlc3ApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBTdW1hckN0aXZvKGlkbTM6IHN0cmluZykge1xyXG4gICAgICAgIC8vIHZhciBzUGFydDE7XHJcbiAgICAgICAgLy8gdmFyIHNQYXJ0MjtcclxuXHJcbiAgICAgICAgLy8gc1BhcnQxID0gaWRtMy5zdWJzdHJpbmcoMCwgOCk7XHJcbiAgICAgICAgLy8gc1BhcnQyID0gaWRtMy5zdWJzdHJpbmcoOCwgaWRtMy5sZW5ndGgpO1xyXG4gICAgICAgIC8vIHNQYXJ0MiA9ICtzUGFydDIgKyAxO1xyXG4gICAgICAgIC8vIGlkbTMgPSBzUGFydDEgKyBzUGFydDI7XHJcbiAgICAgICAgLy8gcmV0dXJuIGlkbTM7XHJcbiAgICAgICAgdmFyIHNQYXJ0MTtcclxuICAgICAgICB2YXIgc1BhcnQyO1xyXG4gICAgICAgIHNQYXJ0MSA9IGlkbTMuc3Vic3RyaW5nKDAsIDkpO1xyXG4gICAgICAgIHNQYXJ0MiA9IGlkbTMuc3Vic3RyaW5nKDkpO1xyXG4gICAgICAgIHNQYXJ0MiA9ICtzUGFydDIgKyAxO1xyXG4gICAgICAgIGlkbTMgPSBzUGFydDEgKyBcIlwiICsgc1BhcnQyO1xyXG4gICAgICAgIHJldHVybiBpZG0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0dWFsaXphciBlbCBNMyBQcm9jZXNvcywgdGVuaWVuZG8gZWwgSWQgZGVsIGRvY3VtZW50byBndWFyZGFkbyBlbiBsYSBCRCBOb1NRTFxyXG4gICAgICogQHBhcmFtIGlkIElkIGRlbCBkb2N1bWVudG8gQmQgTm9TUUxcclxuICAgICAqIEBwYXJhbSBvbE0zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgYSBhbG1hY2VuYXIgLyBBY3R1YWxpemFyXHJcbiAgICAgKiBAcGFyYW0gUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zIFJlc3B1ZXN0YSBkZSBPSy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZFByb2Nlc28oaWQsIG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgaW50ZW50byA9IDApIHtcclxuXHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuQWRkRG9jdW1lbnQoaWQudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAvL1Jlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhpZCk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB2YXIgc0ZlY2hhTm93OiBzdHJpbmcgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZTU1ERFRISG1tc3MnKVxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVycm9yTG9nXCIgKyBzRmVjaGFOb3csIEpTT04uc3RyaW5naWZ5KHsgXCJlcnJvclwiOiBlcnJvciwgXCJvbE0zUHJvY2Vzb3NcIjogb2xNM1Byb2Nlc29zLCBcIkludGVudG9cIjogaW50ZW50bywgXCJmdW5jdGlvblwiOiBcInVwZFByb2Nlc29cIiB9KSk7XHJcbiAgICAgICAgICAgIGlmIChpbnRlbnRvID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5JbnN0YW5jZUFnYWluKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZFByb2Nlc28oaWQsIG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zLCAxKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyh7IFwiRXJyb3JcIjogXCJFcnJvciBlbiBndWFyZGFyIGVuIGJhc2UgZGUgZGF0b3MgcGNwYWwuXCIgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdHVhbGl6YXIgZWwgTTMgUHJvY2Vzb3MsIHRlbmllbmRvIGVsIElkIGRlbCBkb2N1bWVudG8gZ3VhcmRhZG8gZW4gbGEgQkQgTm9TUUxcclxuICAgICAqIEBwYXJhbSBpZCBJZCBkZWwgZG9jdW1lbnRvIEJkIE5vU1FMXHJcbiAgICAgKiBAcGFyYW0gb2xNM1Byb2Nlc29zIE0zIFByb2Nlc29zIGEgYWxtYWNlbmFyIC8gQWN0dWFsaXphclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgdXBkUHJvY2Vzb0FzeW5jKGlkLCBvbE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5BZGREb2N1bWVudChpZC50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHRoaXMuQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3MsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRBbGxEb2NzT2ZmTGluZVNpbkRvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub1NlcnZpY2VPZmZMaW5lLkdldEFsbERvY3NPZmZMaW5lU2luRG9jcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc2FyVGlja2V0T2ZmbGluZShpZGthdGlvcywgcHJvY2Vzbywgb0RhdGFVc2VyOiBhbnksIGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBsTTNQcm9jZXNvcyA9IG5ldyBBcnJheTxNM1Byb2Nlc29zPigpO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBpZGthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlZhbGlkYXJUaWNrZXRDZXJyYWRvKHByb2Nlc28pKSB7XHJcbiAgICAgICAgICAgIGxNM1Byb2Nlc29zLnB1c2gocHJvY2Vzbyk7XHJcblxyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lKGlka2F0aW9zLCB0aGlzLm9Qb3N0U2VydmljZU0zLCBsTTNQcm9jZXNvcywgb0RhdGFVc2VyKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHgpIHtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcCh0cnVlLCBcIk9LXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcChmYWxzZSwgXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgcHJvY2Vzb3MgcXVlIHNlIHByb2Nlc2Fyb24gbWllbnRyYXMgc2UgZXN0YWJhIGZ1ZXJhIGRlIGxpbmVhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyUHJvY2Vzb3NBZ3JlZ2Fkb3NPZmZMaW5lKGlka2F0aW9zLCBvRGF0YVVzZXI6IGFueSwgZnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIkVudHJvIFZhbGlkYXJQcm9jZXNvc0FncmVnYWRvc09mZkxpbmVcIilcclxuICAgICAgICB2YXIgbE0zUHJvY2Vzb3MgPSBuZXcgQXJyYXk8TTNQcm9jZXNvcz4oKTtcclxuICAgICAgICB2YXIgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgaWRrYXRpb3MpO1xyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkdldEFsbERvY3MoKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIC8vIGhhbmRsZSByZXN1bHRcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yb3dzW2ldLmlkICYmICFyZXN1bHQucm93c1tpXS5pZC5zdGFydHNXaXRoKFwiQ1RJVk9TXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG0zUHJvY2VzbzogTTNQcm9jZXNvcyA9IHJlc3VsdC5yb3dzW2ldLmRvYztcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5WYWxpZGFyVGlja2V0Q2VycmFkbyhtM1Byb2Nlc28pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxNM1Byb2Nlc29zLnB1c2gocmVzdWx0LnJvd3NbaV0uZG9jKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkFudGVzIFJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lXCIpXHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuUmVnaXN0cm9FdmVudG9NM09mZkxpbmUoaWRrYXRpb3MsIHRoaXMub1Bvc3RTZXJ2aWNlTTMsIGxNM1Byb2Nlc29zLCBvRGF0YVVzZXIpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRpbyBSZXNwdWVzdGEgUmVnaXN0cm9FdmVudG9NM09mZkxpbmVcIilcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHgpXHJcbiAgICAgICAgICAgICAgICBpZiAoeCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJpZiAxXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuRGVsZXRlQWxsRG9jcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKHRydWUsIFwiT0tcIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJpZiAyXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLy9SZXNwdWVzdGEgY29uIGVycm9yZXNcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMub1NlcnZpY2VPZmZMaW5lLkRlbGV0ZUFsbERvY3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcChmYWxzZSwgXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFjaW9uIGRlIHF1ZSBlbCB0aWNrZXQgZXN0YSBjZXJyYWRvLlxyXG4gICAgICogQHBhcmFtIG0zUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJUaWNrZXRDZXJyYWRvKG0zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBiQ2VycmFkbzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgaWYgKG0zUHJvY2Vzby5NM0VOQyAhPSBudWxsICYmIG0zUHJvY2Vzby5sTTNQRW5jRlAgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAobTNQcm9jZXNvICYmIG0zUHJvY2Vzby5TdWJFc3RhZG9BbnQgIT0gXCJEZWNsaW5hZG9cIiAmJiBtM1Byb2Nlc28uTTNFTkMubGVuZ3RoID4gMCAmJiBtM1Byb2Nlc28ubE0zUEVuY0ZQLmxlbmd0aCA9PSAwICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldENhbnRpZGFkVG90YWxCeU0zUHJvY2VzbyhtM1Byb2Nlc28pID4gMCkge1xyXG4gICAgICAgICAgICAgICAgYkNlcnJhZG8gPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYkNlcnJhZG8gPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBiQ2VycmFkbztcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldENhbnRpZGFkVG90YWxCeU0zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAmJiBvTTNQcm9jZXNvcy5NM0VOQykge1xyXG4gICAgICAgICAgICB2YXIgZENhbnRpZGFkID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikgPiAwKS5cclxuICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLCAwKTtcclxuICAgICAgICAgICAgaWYgKGRDYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdG9kb3MgbG9zIGRvY3VtZW50b3MgT2ZmIGxpbmUgcXVlIHNlIGhhbiBndWFyZGFkbyBjb21vIG9mZmxpbmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBHZXRBbGxEb2NzT2ZmbGluZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgbE0zUHJvY2Vzb3MgPSBuZXcgQXJyYXk8TTNQcm9jZXNvcz4oKTtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IHRoaXMub1NlcnZpY2VPZmZMaW5lLkdldEFsbERvY3MoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yb3dzW2ldLmlkICE9IFwiQ1RJVk9TXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBsTTNQcm9jZXNvcy5wdXNoKHJlc3VsdC5yb3dzW2ldLmRvYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGxNM1Byb2Nlc29zO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB0b2RvcyBsb3MgZG9jdW1lbnRvcyBPZmYgbGluZSBxdWUgc2UgaGFuIGd1YXJkYWRvIGNvbW8gb2ZmbGluZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldEFsbERvY3NPZmZsaW5lRGVsZXRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vU2VydmljZU9mZkxpbmUuR2V0QWxsRG9jc0RlbGV0ZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlQ3Rpdm9zKHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5vU2VydmljZU9mZkxpbmUuRGVsZXRlKHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSlcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWxsQ3Rpdm9zKHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBsb3MgY29uc2VjdXRpdm9zIHF1ZSBlc3RhbiBsb2NhbG1lbnRlIHZzIGxvcyBxdWUgZXN0YW4gZW4gZWwgc2Vydmlkb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFjaW9uQ3Rpdm9zVlNTZXJ2ZXIoaWthdGlvczogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaWRIdWI6IHN0cmluZywgZnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5nZXRBbGxDdGl2b3ModWJpY2FjaW9uLCBpZEh1YikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgaWYgKHgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgICAgICAgICBvU2VydmljZU0zTWFlc3Ryby5WYWxpZGFyQ3Rpdm9zVlNMb2NhbCh0aGlzLm9Qb3N0U2VydmljZU0zLCBpa2F0aW9zLCBKU09OLnN0cmluZ2lmeSh4KSwgdWJpY2FjaW9uLCBpZEh1YiwgZnVuY2lvblJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZWwgY29uc2VjdXRpdm8gZW4gZWwgcXVlIHZhLCBlbCBwcm9jZXNvIG9mZmxpbmUgcXVlIHJlY2liZSBjb21vIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIHViaWNhY2lvbiBcclxuICAgICAqIEBwYXJhbSBodWIgXHJcbiAgICAgKiBAcGFyYW0gc0lkUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIEdldEN0aXZvT2ZmTGluZSh1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZykge1xyXG4gICAgICAgIHZhciBjdGl2bzogc3RyaW5nID0gXCIwXCI7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSk7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9EYXRhRmluZGVkOiBhbnkgPSBvRGF0YS5DdGl2b3MuZmluZCh4ID0+IHguSWRQcm9jZXNvID09IHNJZFByb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9EYXRhRmluZGVkLkN0aXZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3Rpdm8gPSBvRGF0YUZpbmRlZC5DdGl2by5zdWJzdHJpbmcoOSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHsgfVxyXG4gICAgICAgIHJldHVybiBjdGl2bztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgaWQgbTMgXHJcbiAgICAgKiBAcGFyYW0gc0lkTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lkUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNhdmVJZE0zKHNJZE0zOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSkudGhlbihkYXRhID0+IHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhOiBBcnJheTxhbnk+ID0gZGF0YS5DdGl2b3M7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YUZpbmRlZDogYW55ID0gb0RhdGEuZmluZCh4ID0+IHguSWRQcm9jZXNvID09IHNJZFByb2Nlc28pO1xyXG4gICAgICAgICAgICBpZiAob0RhdGFGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjdGl2b0FudCA9ICtvRGF0YUZpbmRlZC5DdGl2by5zdWJzdHJpbmcoOSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3Rpdm9BY3QgPSArc0lkTTMuc3Vic3RyaW5nKDkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0aXZvQWN0ID4gY3Rpdm9BbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvRGF0YUZpbmRlZC5DdGl2byA9IHNJZE0zO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0RhdGEucHVzaCh7IFwiSWRQcm9jZXNvXCI6IHNJZFByb2Nlc28sIFwiQ3Rpdm9cIjogc0lkTTMgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLlNhdmVDdGl2b3Mob0RhdGEsIHViaWNhY2lvbiwgaHViKTtcclxuICAgICAgICAgICAgaWYgKHNJZFByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIlRJQ0tFVFZFTlRBXCIpIHtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiQ3Rpdm9UaWNrZXRWZW50YVwiLCBzSWRNMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YSA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgIG9EYXRhLnB1c2goeyBcIklkUHJvY2Vzb1wiOiBzSWRQcm9jZXNvLCBcIkN0aXZvXCI6IHNJZE0zIH0pXHJcbiAgICAgICAgICAgIHRoaXMuU2F2ZUN0aXZvcyhvRGF0YSwgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgICAgICBpZiAoc0lkUHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiVElDS0VUVkVOVEFcIikge1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJDdGl2b1RpY2tldFZlbnRhXCIsIHNJZE0zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR3VhcmRhciBjdGl2b3MsIElkbTMuXHJcbiAgICAgKiBAcGFyYW0gb0RhdGEgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgU2F2ZUN0aXZvcyhvRGF0YTogQXJyYXk8YW55PiwgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nLCBpbnRlbnRvID0gMCkge1xyXG4gICAgICAgIHZhciBvRGF0YVNlbmQgPSB7IFwiQ3Rpdm9zXCI6IG9EYXRhIH1cclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5BZGREb2N1bWVudCh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YiksIG9EYXRhU2VuZCkudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJPS1wiKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZXJyb3JMb2dDdGl2b3NcIiArIHNGZWNoYU5vdywgSlNPTi5zdHJpbmdpZnkoeyBcImVycm9yXCI6IGVycm9yLCBcIkN0aXZvc1wiOiBvRGF0YVNlbmQsIFwiZnVuY3Rpb25cIjogXCJTYXZlQ3Rpdm9zXCIgfSkpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIGlmIChpbnRlbnRvID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2F2ZUN0aXZvcyhvRGF0YSwgdWJpY2FjaW9uLCBodWIsIDEpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlT2xkRG9jcyhtYXhEaWFzOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuRGVsZXRlT2xkRG9jcyhtYXhEaWFzKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgSWQgbTMsIGN1YW5kbyBlc3RhIGZ1ZXJhIGRlIGxpbmVhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgR2V0SWRNM09mZmxpbmUoaWRrYXRpb3M6IHN0cmluZywgaWRwcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRGF0YUlkTTM7XHJcbiAgICAgICAgdmFyIGlkTTM7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb0RhdGFJZE0zID0gYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSk7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YUZpbmRlZDogYW55ID0gb0RhdGFJZE0zLkN0aXZvcy5maW5kKHggPT4geC5JZFByb2Nlc28gPT0gaWRwcm9jZXNvKTtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gb0RhdGFGaW5kZWQuQ3Rpdm87XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5TdW1hckN0aXZvKGlkTTMpO1xyXG4gICAgICAgICAgICAgICAgaWRNMyA9IHRoaXMudmFsaWRhckF1bWVudG9DdGl2byhpZE0zLCBpZHByb2Nlc28pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWRNMyA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkYXRlLmdldE1vbnRoKCkgKyBcIlwiICsgZGF0ZS5nZXREYXkoKSArIFwiXCIgKyBkYXRlLmdldEhvdXJzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaW51dGVzKCkgKyBcIlwiICsgZGF0ZS5nZXRTZWNvbmRzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5HZXRDdGl2byhpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAvLyBpZE0zID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRhdGUuZ2V0TW9udGgoKSArIFwiXCIgKyBkYXRlLmdldERheSgpICsgXCJcIiArIGRhdGUuZ2V0SG91cnMoKSArIFwiXCIgKyBkYXRlLmdldE1pbnV0ZXMoKSArIFwiXCIgKyBkYXRlLmdldFNlY29uZHMoKSArIFwiXCIgKyBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgICAgICBpZE0zID0gdGhpcy5HZXRDdGl2byhpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpZE0zO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB2YWxpZGFyQXVtZW50b0N0aXZvKGlkTTMsIGlkcHJvY2Vzbykge1xyXG4gICAgICAgIGlmIChpZHByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIlRJQ0tFVFZFTlRBXCIpIHtcclxuICAgICAgICAgICAgbGV0IHVsdGltb0lkTTMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkN0aXZvVGlja2V0VmVudGFcIik7XHJcbiAgICAgICAgICAgIGlmICh1bHRpbW9JZE0zID09IGlkTTMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5TdW1hckN0aXZvKGlkTTMpO1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ0N0aXZvc1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiaWRNM1wiOiBpZE0zLCBcImZ1bmN0aW9uXCI6IFwidmFsaWRhckF1bWVudG9DdGl2b1wiIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaWRNMztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIEdldEN0aXZvKGlka2F0aW9zOiBzdHJpbmcsIGlkcHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgIHZhciBzQ3Rpdm87XHJcbiAgICAgICAgc0N0aXZvID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uR2V0Q3Rpdm9CWVByb2Nlc28odGhpcy5vUG9zdFNlcnZpY2VNMywgaWRrYXRpb3MsIGlkcHJvY2VzbywgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgIHJldHVybiBzQ3Rpdm87XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsbGF2ZSBkZSBwb3VjaERCXHJcbiAgICAgKiBAcGFyYW0gdWJpYyBcclxuICAgICAqIEBwYXJhbSBodWIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRLZXkodWJpYywgaHViKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiQ1RJVk9TX1wiICsgdWJpYyArIGh1YjtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM05vdGlmU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0ZW5lciBsYSBpbmZvcm1hY2lvbiBkZSBsYXMgbm90aWRpY2FjaW9uZXMgcG9yIGh1YlxyXG4gICAqIEBwYXJhbSBzSURLYXRpb3MgRW1wcmVzYVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBNM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0KHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLm9Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM05vdGlmQ29udHJvbGxlci9NM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0L1wiICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnRvUHJvbWlzZSgpO1xyXG4gICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuICAgIGNhdGNoe1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViXHJcbiAgICogQHBhcmFtIHNJREthdGlvcyBFbXByZXNhXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIE0zR2V0TTNOb3RpZmljYWNpb25lc1hIdWJPYmplY3RXaXRoVGltZU91dChzSURLYXRpb3M6IHN0cmluZywgb0RhdGFTZW5kOiBhbnksIHRpbWVPdXQ6IG51bWJlcikge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLm9Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTNUaW1lT3V0KFwiTTNOb3RpZkNvbnRyb2xsZXIvTTNHZXRNM05vdGlmaWNhY2lvbmVzWEh1Yk9iamVjdC9cIiArIHNJREthdGlvcywgb0RhdGFTZW5kLCB0aW1lT3V0KS50b1Byb21pc2UoKTtcclxuICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcbiAgICBjYXRjaHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViIGRlIHVuIGlkUmVwIGRhZG9cclxuICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAqIEBwYXJhbSBkYXRhIFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBtM19nZXRfbm90aWZpY2FjaW9uX3hfaHViX29iamVjdChzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55KSB7XHJcbiAgICAvL3ZhciBkYXRhID0ge1wiaWRfcmVwXCI6XCJcIiwgXCJpZF91YmljYWNpb25cIjpcIlwiLCBcImlkX2h1YlwiOlwiXCJ9XHJcbiAgICB0cnkge1xyXG4gICAgICB2YXIgcmVzcCA9IGF3YWl0IHRoaXMub1Bvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTm90aWZDb250cm9sbGVyL20zX2dldF9ub3RpZmljYWNpb25feF9odWJfb2JqZWN0L1wiICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3ApKTtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbiAgICBjYXRjaHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBndWFyZGFyQ2FtYmlvc0NvbmZpZ3VyYWNpb25JbXByZXNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSwgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNOb3RpZkNvbnRyb2xsZXIvZ3VhcmRhckNhbWJpb3NDb25maWd1cmFjaW9uSW1wcmVzaW9uL1wiICsgc0lES2F0aW9zLnRyaW0oKSwgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICB9LFxyXG4gICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgb0Z1bmNpb25FcnIoZXJyb3JbXCJfYm9keVwiXSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTW9kZWxNM05vdGlme1xyXG4gICAgcHVibGljIElkUmVwOnN0cmluZztcclxuICAgIHB1YmxpYyBJRFViaWNhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRIdWI6c3RyaW5nO1xyXG4gICAgcHVibGljIENvcnJlcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ29uZGljaW9uZXM6c3RyaW5nO1xyXG4gICAgcHVibGljIERhdGE6c3RyaW5nO1xyXG4gICAgcHVibGljIENvbmZJbXA6c3RyaW5nO1xyXG59IiwiZXhwb3J0IGNsYXNzIE0zUHJlc2VudGFjaW9uZXN7XHJcbiAgICBwdWJsaWMgTklWRUxQUlM6c3RyaW5nO1xyXG4gICAgcHVibGljIFZBTE9SOm51bWJlcjtcclxuICAgIHB1YmxpYyBUT1BFOm51bWJlcjtcclxufSIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgcmVzZXJ2ZVNsb3RzIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNM0NvbnN1bHRhcyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIGludmVudGFyaW8sIHRlbmllbmRvIGVuIGN1ZW50YSBsb3MgcGFjayBhc29jaWFkb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIEVtcHJlc2FcclxuICAgICAqIEBwYXJhbSBkYXRhIEpzb24gY29uIGluZm9ybWFjaW9uIGRlIFNLUDEgKE1vZGVsbykgeSBVYmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIE0zX0dFVElOVkVOVEFSSU9CWVBBQ0soc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG4gICAgICAgIHZhciByZXNwID0gYXdhaXQgdGhpcy5Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9NM19HRVRJTlZFTlRBUklPQllQQUNLL1wiICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGFySW52ZW50YXJpb05lZ2F0aXZvUHJvZHVjdG8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNMy92YWxpZGFySW52ZW50YXJpb05lZ2F0aXZvUHJvZHVjdG8vXCIgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgb0Z1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyb3IuZXJyb3IuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBCdXNjYXJDb25jZXB0b0VuTTNTSVUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKXtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9NM19HRVRDb25jZXB0b0Zyb21TSVUvXCIgKyBpZEthdGlvcyArIFwiL1wiICsgZGF0YS5zVWJpY2FjaW9uICsgXCIvXCIgKyBkYXRhLnNDb25jZXB0bywge30pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnJvci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgVEVDTEFTUkFQSURBU3tcclxuICAgIHB1YmxpYyBDb21wb25lbnRlOnN0cmluZztcclxuICAgIHB1YmxpYyBUZWNsYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRnVuY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRFbGVtZW50bzpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hQUkRTU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgaWRrYXRpb3M6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBhcGxTeW5jQ291Y2hBdXRvID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgYXBsUGFxdWV0ZXMgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmlka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGbGFnU3luY0NvdWNoKCkge1xyXG4gICAgICAgIHZhciBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIHZhciBvU1ViaWNhY2lvbjtcclxuICAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgbGV0IGNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gbnVsbCAmJiBjb25maWcuU3luY0NvdWNoQXV0byAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmbGFnID0gY29uZmlnLlN5bmNDb3VjaEF1dG87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgdGhpcy5pZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICBpZiAodGhpcy5pZGthdGlvcykgdGhpcy5HZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiUFJEXCIgKyB0aGlzLmlka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiYWRhcHRlclwiKVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5kYXRhYmFzZS5hZGFwdGVyKTtcclxuICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHRoaXMudmFsaWRhclBhcXVldGVzKClcclxuICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJQYXF1ZXRlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5hcGxQYXF1ZXRlcykge1xyXG4gICAgICAgICAgICBsZXQgdWJpY2FjaW9uID0gdGhpcy5nZXRVYmljYWNpb24oKTtcclxuICAgICAgICAgICAgaWYgKHViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNhXCIgKyB1YmljYWNpb24gKyBcIl9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3luY0NvdWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZGthdGlvcykge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGFyUGFxdWV0ZXMoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRVYmljYWNpb24oKSB7XHJcbiAgICAgICAgbGV0IHNTVWJpY2FjaW9uID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNVYmljYWNpb25cIik7XHJcbiAgICAgICAgbGV0IG9TVWJpY2FjaW9uO1xyXG5cclxuICAgICAgICBpZiAoc1NVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgb1NVYmljYWNpb24gPSBKU09OLnBhcnNlKHNTVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgaWYgKG9TVWJpY2FjaW9uLklEVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1NVYmljYWNpb24uSURVYmljYWNpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldEthdGlvc00zRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIEthdGlvcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnS2F0aW9zXCIgKyB0aGlzLmlka2F0aW9zLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICAgIGlmIChLYXRpb3MgIT09IHVuZGVmaW5lZCAmJiBLYXRpb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgakthdGlvc00zID0gSlNPTi5wYXJzZShLYXRpb3MpO1xyXG4gICAgICAgICAgICBpZiAoakthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3MgJiYgakthdGlvc00zLkthdGlvcy5LYXRpb3NNMykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFwbCA9IGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMuZmluZCh4ID0+IHguTGxhdmUudG9VcHBlckNhc2UoKSA9PSBcIkFQTFBBUVNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBsICYmIGFwbC5WYWxvciA9PSBcIjFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBsUGFxdWV0ZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KGlka2F0aW9zKSB7XHJcbiAgICAgICAgdmFyIHJlc3B1ZXN0YTtcclxuICAgICAgICByZXNwdWVzdGEgPSBhd2FpdCB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKVxyXG4gICAgICAgIHJldHVybiByZXNwdWVzdGFcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hcGxTeW5jQ291Y2hBdXRvID0gdGhpcy5nZXRGbGFnU3luY0NvdWNoKCk7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0aGlzLmFwbFN5bmNDb3VjaEF1dG8sXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmluZm8oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZVByZChpZCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGVBbGxEb2NzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLm1hcChyb3cgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX2lkOiByb3cuaWQsIF9yZXY6IHJvdy5kb2MuX3JldiwgX2RlbGV0ZWQ6IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbihkZWxldGVEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYnVsa0RvY3MoZGVsZXRlRG9jcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaENvZHNQUkRTU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBpZGthdGlvcztcclxuICAgIHByaXZhdGUgYXBsU3luY0NvdWNoQXV0byA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmxhZ1N5bmNDb3VjaCgpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGxldCBjb25maWc7XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uTTNIVUJTICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXSAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IG51bGwgJiYgY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGNvbmZpZy5TeW5jQ291Y2hBdXRvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcblxyXG4gICAgICAgIHRoaXMuaWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJhZGFwdGVyXCIpXHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmRhdGFiYXNlLmFkYXB0ZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBzeW5jQ291Y2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlka2F0aW9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hcGxTeW5jQ291Y2hBdXRvID0gdGhpcy5nZXRGbGFnU3luY0NvdWNoKCk7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0aGlzLmFwbFN5bmNDb3VjaEF1dG8sXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBDT0RTIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gQ09EUyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KCkge1xyXG4gICAgICAgIHZhciByZXNwdWVzdGE7XHJcbiAgICAgICAgcmVzcHVlc3RhID0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hQcm9tb2Npb25lc1NlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHByaXZhdGUgZWxlbWVudFJlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwicHJvbW9jaW9uZXNfXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgICAgICAvL3RoaXMuc3luYyh0aGlzLkdldFNlcnZlcihzSWRrYXRpb3MpKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKHNJZGthdGlvcyk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTMgKyBcInByb21vY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmNXaXRoREIocmVtb3RlRGF0YWJhc2U6IFBvdWNoREIpIHtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIHN5bmNBd2FpdChyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgICAgICB0aGlzLnN5bmNXaXRoREIocmVtb3RlRGF0YWJhc2UpO1xyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YWJhc2UuY29tcGFjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBjaGFuZ2VzKHJlbW90ZTogc3RyaW5nKXtcclxuICAgIC8vICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUpO1xyXG4gICAgLy8gICAgIHJlbW90ZURhdGFiYXNlLmNoYW5nZXMoe1xyXG4gICAgLy8gICAgICAgICBzaW5jZTogJ25vdycsXHJcbiAgICAvLyAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAvLyAgICAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZVxyXG4gICAgLy8gICAgICAgfSkub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChjaGFuZ2UpIHtcclxuICAgIC8vICAgICAgICAgLy8gY2hhbmdlLmlkIGNvbnRhaW5zIHRoZSBkb2MgaWQsIGNoYW5nZS5kb2MgY29udGFpbnMgdGhlIGRvY1xyXG4gICAgLy8gICAgICAgICBpZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgIC8vICAgICAgICAgICAvLyBkb2N1bWVudCB3YXMgZGVsZXRlZFxyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgIC8vIGRvY3VtZW50IHdhcyBhZGRlZC9tb2RpZmllZFxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIGhhbmRsZSBlcnJvcnNcclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGUoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKS50aGVuKGRvYyA9PntcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKGRvYyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlbGVtZW50UmVtb3ZlZCgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmNoYW5nZXMoeyBsaXZlOiB0cnVlLCBzaW5jZTogJ25vdycsIGluY2x1ZGVfZG9jczogdHJ1ZSB9KVxyXG4gICAgICAgIC5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZS5kZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVtLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL3JlbmRlckRvY3NTb21laG93KCk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJlbW92ZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZW07XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCICBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFViaWNhY2lvbmVzU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcz0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJ1YmljYWNpb25lc19cIiArIHNJZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6c3RyaW5nO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInViaWNhY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFVCSUNBQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6c3RyaW5ne1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpe1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZihzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpe1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgIFxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBVQklDQUNJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gVUJJQ0FDSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ2hhbmdlSXRlbSgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmNoYW5nZXMoeyBsaXZlOiB0cnVlLCBzaW5jZTogJ25vdycsIGluY2x1ZGVfZG9jczogdHJ1ZSB9KVxyXG4gICAgICAgIC5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgLy9pZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL3JlbmRlckRvY3NTb21laG93KCk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7aW5jbHVkZV9kb2NzOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7aW5jbHVkZV9kb2NzOiBmYWxzZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zTm90aWZpY2FjaW9uZXNBUFAge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuICAgICAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJub3RpZmljYWNpb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpLnRyaW0oKSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJub3RpZmljYWNpb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpLnRyaW0oKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIEdldERhdGFQb3VjaEJEKGlzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9hcm1hciBrZXkgZGUgZG9jdW1lbnRvIHF1ZSBzZSBxdWllcmUgY29uc3VsdGFyXHJcbiAgICBwdWJsaWMgR2V0S2V5RG9jdW1lbnRvREIoaXNJREthdGlvczogc3RyaW5nLCBpc0RvY3VtZW50bzogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGlzSURLYXRpb3MgKyBcIj9cIiArIGlzRG9jdW1lbnRvO1xyXG4gICAgfVxyXG5cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tCeVRpcG8gfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wYWNrLWJ5LXRpcG9cIjtcclxuaW1wb3J0IHsgTTNQYWNrQnlSZWdsYXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wYWNrLWJ5LXJlZ2xhc1wiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTTNQSXRlbXNXRUIgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTTNQYWNrQnlpcG8ge1xyXG5cclxuXHJcbiAgICBwcml2YXRlIG9wZXJhdG9ycyA9IHtcclxuICAgICAgICAnPCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA8ICtiIH0sXHJcbiAgICAgICAgJz4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgPiArYiB9LFxyXG4gICAgICAgICc8PSc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA8PSArYiB9LFxyXG4gICAgICAgICc+PSc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA+PSArYiB9LFxyXG4gICAgICAgICdJR1VBTCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09IGIgfSxcclxuICAgICAgICAnRElGRic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICE9IGIgfSxcclxuICAgICAgICAnRU4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB9LFxyXG4gICAgICAgICdBTkQnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiIH0sXHJcbiAgICAgICAgJ09SJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfHwgYiB9LFxyXG4gICAgICAgICcqJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRydWUgfSxcclxuICAgICAgICAnTU9EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthICUgK2IgPT0gMCB9LFxyXG4gICAgICAgIC8vIC4uLlxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHNpIGVsIHByb2R1Y3RvIHF1ZSBzZXLDg8KhIGhpam8sIGN1bXBsZSBjb24gbGFzIGNhcmFjdGVyaXN0aWNhc1xyXG4gICAgICogQHBhcmFtIG0zUHJvY1BLRyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJTaUVzVGlwbyhtM1Byb2NQS0c6IFR5cGVNM1ByZEdycCwgcHJvZHVjdG86IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChtM1Byb2NQS0cuTTNQQUNLQllUSVBPLmZpbmQoeCA9PiB4LkRFU1RJTk8gPT0gcHJvZHVjdG8uVElQTykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBsaWNhY2lvbiBkZSByZWdsYXMgZGUgcGFxdWV0ZXMsIHRlbmllbmRvIGVuIGN1ZW50YSBhbCBpbmZvcm1hY2nDg8KzbiBkZWwgcHJvZHVjdG8gaW5ncmVzYWRvLlxyXG4gICAgICogQHBhcmFtIG0zUHJvY1BLRyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0byBcclxuICAgICAqIEBwYXJhbSBvTTNQSXRlbXNXRUIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZW5lcmFWYWxpZGFjaW9uZXMobTNQcm9jUEtHOiBUeXBlTTNQcmRHcnAsIHByb2R1Y3RvOiBUeXBlTTNQcmRHcnAsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYlJlc3A6Ym9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBvTTNQQUNLQllUSVBPOiBNM1ByZFBhY2tCeVRpcG8gPSBtM1Byb2NQS0cuTTNQQUNLQllUSVBPLmZpbmQoeCA9PiB4LkRFU1RJTk8gPT0gcHJvZHVjdG8uVElQTyk7XHJcbiAgICAgICAgICAgIGlmIChvTTNQQUNLQllUSVBPKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgb00zUEFDS0JZVElQTy5NM1BBQ0tSRUdMQVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUGFja0J5UmVnbGFzOiBNM1BhY2tCeVJlZ2xhcyA9IG9NM1BBQ0tCWVRJUE8uTTNQQUNLUkVHTEFTW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2UgZXN0YSB2YWxpZGFuZG8gZWwgcGFwYSBkZWwgcGFxdWV0ZS5cclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLm9wZXJhdG9yc1tvTTNQYWNrQnlSZWdsYXMuT3BlcmFjaW9uXSh0aGlzLkdldFBhcmFtZXRyb3Mob00zUGFja0J5UmVnbGFzLlBhcmFtMSwgbTNQcm9jUEtHKSAsIHRoaXMuR2V0UGFyYW1ldHJvcyhvTTNQYWNrQnlSZWdsYXMuUGFyYW0yLCBtM1Byb2NQS0cpKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhY2lvbkFjY2lvbihvTTNQYWNrQnlSZWdsYXMuQWNjaW9uLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2h7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFjacODwrNuIGRlIGFjY2lvbiBkZSByZWdsYXMgZGUgcGFxdWV0ZS5cclxuICAgICAqIEBwYXJhbSBzQWNjaW9uIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFZhbGlkYWNpb25BY2Npb24oc0FjY2lvbjpzdHJpbmcsIG9NM1BJdGVtc1dFQjpNM1BJdGVtc1dFQil7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBpZihzQWNjaW9uICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvQWNjaW9uOmFueSA9IEpTT04ucGFyc2Uoc0FjY2lvbik7XHJcbiAgICAgICAgICAgICAgICBpZihvQWNjaW9uLkFjY2lvbil7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9BY2Npb24uQWNjaW9uKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNhbnRpZGFkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gb0FjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1jYXRjaChleCl7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpw4PCs24gZGUgcGFyYW1ldHJvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhcyByZWdsYXMuXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1ldHJvIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3RvIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEdldFBhcmFtZXRyb3MocGFyYW1ldHJvOiBzdHJpbmcsIHByb2R1Y3RvOiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICB2YXIgc1BhcmFtOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByZWdsYTogc3RyaW5nID0gcGFyYW1ldHJvLnNwbGl0KFwiX1wiKVswXTtcclxuICAgICAgICAgICAgc3dpdGNoIChyZWdsYS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiQURJXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgc1BhcmFtID0gcHJvZHVjdG8uTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoeCA9PiB4LkFUUklCVVRPID09IHBhcmFtZXRyby5zcGxpdChcIl9cIilbMV0pLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNPTlNUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgc1BhcmFtID0gcGFyYW1ldHJvLnNwbGl0KFwiX1wiKVsxXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVnbGEudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiU0tQXCIpICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJhbSA9IHByb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdW3JlZ2xhXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoe1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNQYXJhbTtcclxuICAgIH1cclxuXHJcblxyXG5cclxufSIsImltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsdHJvc0RpYXJpb09mZkxpbmUge1xyXG4gICAgcHVibGljIEZpbHRyYXJCeUZlY2hhc09mZihEYXRhLCBBZGRUb0RvYzogRnVuY3Rpb24pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcm93czogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgLy92YXIgbmV3Um93cyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgIHZhciBmZWNoYUkgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiRmVjaGFJdENPRkZcIik7XHJcbiAgICAgICAgICAgIHZhciBmZWNoYUYgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiRmVjaGFGdENPRkZcIik7XHJcbiAgICAgICAgICAgIHJvd3MgPSBEYXRhLnJvd3M7XHJcblxyXG4gICAgICAgICAgICBpZiAoZmVjaGFGICYmIGZlY2hhSSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGlGSW5pY2lvID0gdGhpcy5HZXRGZWNoYU51bWJlcihmZWNoYUkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGlGRmluYWwgPSB0aGlzLkdldEZlY2hhTnVtYmVyKGZlY2hhRik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpRkluaWNpbylcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGlGRmluYWwpXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNwOiBhbnkgPSByb3dzW2ldLmRvYztcclxuICAgICAgICAgICAgICAgICAgICBpZiAobTNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmZWNoYVByb2MgPSB0aGlzLkdldEZlY2hhTnVtYmVyKG0zcC5GZWNoYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZmVjaGFQcm9jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoK2ZlY2hhUHJvYyA+PSAraUZJbmljaW8gJiYgK2ZlY2hhUHJvYyA8PSAraUZGaW5hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXdSb3dzLnB1c2gocm93c1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRUb0RvYyhtM3ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmlsdHJhckJ5RmVjaGFzT2ZmXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgRmlsdHJhckJ5VGV4dG8oRGF0YSwgc1RleHRvOiBzdHJpbmcsIEFkZFRvRG9jOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByb3dzOiBBcnJheTxhbnk+O1xyXG5cclxuICAgICAgICAgICAgcm93cyA9IERhdGEucm93cztcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbTNwOiBhbnkgPSByb3dzW2ldLmRvYztcclxuICAgICAgICAgICAgICAgIGlmIChtM3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobTNwLklkTTMuaW5jbHVkZXMoc1RleHRvKSB8fCAobTNwLm5kb2NVQWN0aXZvICYmIG0zcC5uZG9jVUFjdGl2by5pbmNsdWRlcyhzVGV4dG8pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25ld1Jvd3MucHVzaChyb3dzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkVG9Eb2MobTNwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaWx0cmFyQnlGZWNoYXNPZmZcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgR2V0RmVjaGFOdW1iZXIoc2RhdGU6IHN0cmluZykge1xyXG4gICAgICAgIC8vdmFyIGRhdGUgPSBuZXcgRGF0ZShzZGF0ZSk7XHJcbiAgICAgICAgdmFyIGQgPSBtb21lbnQoc2RhdGUpLmZvcm1hdCgnWVlZWU1NREQnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG4vLyBASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFBlcnhpcG8ge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCkge1xyXG5cclxuICAgICAgICBzSWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwicGVyeHRpcG9fXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInBlcnh0aXBvX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBwZXJ4dGlwbyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHJldHJ5OiBmYWxzZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gcGVyeHRpcG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIHBlcnh0aXBvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuLy8gQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ291Y2hEaW5hbUJ5UHJvY2Vzb3Mge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImRpbmFteHByb2NfXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImRpbmFteHByb2NfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIGRpbmFteHByb2NfICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICBcclxufVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV0cnk6IGZhbHNlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBkaW5hbXhwcm9jXyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gZGluYW14cHJvY18gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3Moe2luY2x1ZGVfZG9jczogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YT0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcbn0iXSwibmFtZXMiOlsibW9tZW50IiwidHNsaWJfMS5fX3ZhbHVlcyIsIl8uY2xvbmVEZWVwIiwiUG9zdFNlcnZpY2VNMyIsInRzbGliXzEuX19kZWNvcmF0ZSIsInRzbGliXzEuX19wYXJhbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztJQXNCSSx1QkFDWSxNQUNBO1FBREEsU0FBSSxHQUFKLElBQUk7UUFDSixlQUFVLEdBQVYsVUFBVTtRQUVsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7S0FDdkI7Ozs7SUFFTSxvQ0FBWTs7Ozs7UUFFZixJQUFJLElBQUksQ0FBTTs7UUFDZCxJQUFJLFdBQVcsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZELElBQUksV0FBVyxFQUFFOztZQUNiLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUMsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzlCLElBQUksR0FBRyxXQUFXLENBQUM7YUFDdEI7U0FDSjthQUNJO1lBQ0QsSUFBSSxHQUFHLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNoRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzlDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQzs7Ozs7SUFJekIsa0RBQTBCOzs7OztRQUM3QixJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztRQUM3RCxJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxJQUFJLElBQUksRUFBRTtZQUN4RCxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ3hHLE9BQU8sY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7YUFDakQ7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDOzs7Ozs7SUFHVixxQ0FBYTs7OztJQUFuQixVQUFvQixRQUFnQjs7Ozs7Ozt3QkFFakIscUJBQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLDBCQUEwQixHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7d0JBQS9GLElBQUksR0FBRyxTQUF3Rjt3QkFDL0YsU0FBUyxHQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7d0JBQ2pELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQzs7Ozt3QkFHckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFHLENBQUMsQ0FBQzs7Ozs7O0tBRXhCOzs7OztJQUVELDRDQUFvQjs7OztJQUFwQixVQUFxQixJQUFJO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDaEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN0QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ2xELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7S0FDL0I7Ozs7SUFFRCxvQ0FBWTs7O0lBQVo7UUFDSSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7S0FDeEI7Ozs7SUFFRCx3Q0FBZ0I7OztJQUFoQjtRQUNJLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0tBQ2xDOzs7Ozs7O0lBR0QsK0JBQU87Ozs7O0lBQVAsVUFBUSxNQUFjLEVBQUUsU0FBaUI7UUFDckMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRztZQUM1QyxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNyQixDQUFDLENBQUM7S0FDTjs7Ozs7Ozs7SUFJRCwwQ0FBa0I7Ozs7OztJQUFsQixVQUFtQixNQUFjLEVBQUUsU0FBaUIsRUFBRSxXQUFtQjtRQUNyRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3pDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FDdkIsQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHO1lBQ0wsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDckIsQ0FBQyxDQUFDO0tBQ047Ozs7Ozs7SUFFRCx1Q0FBZTs7Ozs7O0lBQWYsVUFBZ0IsTUFBYyxFQUFFLFNBQWlCLEVBQUUsVUFBZTs7UUFDOUQsSUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUU5QixPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOztRQUtuRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQ3pDO1lBQ0ksTUFBTSxFQUFFLFVBQVU7U0FDckIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7WUFDTixPQUFPLEdBQUcsQ0FBQztTQUNkLENBQUMsQ0FBQztLQUNWOzs7Ozs7OztJQUVELDhDQUFzQjs7Ozs7OztJQUF0QixVQUF1QixNQUFjLEVBQUUsU0FBaUIsRUFBRSxVQUFlLEVBQUUsV0FBbUI7O1FBQzFGLElBQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFOUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7UUFLbkQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxFQUN6QztZQUNJLE1BQU0sRUFBRSxVQUFVO1NBQ3JCLENBQUM7YUFDRCxJQUFJLENBQ0QsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUN2QjthQUNBLEdBQUcsQ0FBQyxVQUFBLEdBQUc7WUFDSixPQUFPLEdBQUcsQ0FBQztTQUNkLENBQUMsQ0FBQztLQUNWOzs7Ozs7O0lBRUQscUNBQWE7Ozs7OztJQUFiLFVBQWMsTUFBYyxFQUFFLFNBQWlCLEVBQUUsVUFBZTs7UUFDNUQsSUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7OztRQVE5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQ3pDO1lBQ0ksWUFBWSxFQUFFLE1BQU07WUFDcEIsTUFBTSxFQUFFLFVBQVU7U0FDckIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7WUFDTixPQUFPLEdBQUcsQ0FBQztTQUNkLENBQUMsQ0FBQztLQUNWOzs7Ozs7O0lBRUQsNENBQW9COzs7Ozs7SUFBcEIsVUFBcUIsTUFBYyxFQUFFLFNBQWlCLEVBQUUsVUFBZTs7UUFDbkUsSUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7OztRQVE5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQ3pDO1lBQ0ksWUFBWSxFQUFFLGFBQWE7WUFDM0IsTUFBTSxFQUFFLFVBQVU7U0FDckIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7WUFDTixPQUFPLEdBQUcsQ0FBQztTQUNkLENBQUMsQ0FBQztLQUNWOzs7OztJQUlELG1DQUFXOzs7O0lBQVgsVUFBWSxNQUFjO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7S0FDdEQ7Ozs7Ozs7SUFFTSw0Q0FBb0I7Ozs7OztjQUFDLE1BQWMsRUFBRSxNQUFXLEVBQUUsV0FBbUI7UUFDeEUsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDOzs7Ozs7O0lBR3JGLDJDQUFtQjs7Ozs7SUFBbkIsVUFBb0IsTUFBYyxFQUFFLE1BQVc7UUFDM0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDdEU7Ozs7OztJQUVNLHFDQUFhOzs7OztjQUFDLE1BQWMsRUFBRSxNQUFXO1FBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQzs7Ozs7OztJQUdqRSwyQ0FBbUI7Ozs7O0lBQW5CLFVBQW9CLE1BQWMsRUFBRSxNQUFXO1FBQzNDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3RFOzs7Ozs7SUFFRCw0Q0FBb0I7Ozs7O0lBQXBCLFVBQXFCLE1BQWMsRUFBRSxNQUFXO1FBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3ZFOzs7Ozs7SUFFRCw0Q0FBb0I7Ozs7O0lBQXBCLFVBQXFCLE1BQWMsRUFBRSxNQUFXOztRQUM1QyxJQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztRQUc5QixPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDOztRQUkzRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLEVBQ3ZEO1lBQ0ksTUFBTSxFQUFFLE1BQU07U0FDakIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7WUFDTixPQUFPLEdBQUcsQ0FBQztTQUNkLENBQUMsQ0FBQztLQUVWOzs7Ozs7SUFFRCwyQ0FBbUI7Ozs7O0lBQW5CLFVBQW9CLE1BQWMsRUFBRSxNQUFXO1FBQzNDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3RFOzs7Ozs7SUFFRCxrREFBMEI7Ozs7O0lBQTFCLFVBQTJCLE1BQWMsRUFBRSxNQUFXO1FBQ2xELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDN0U7Ozs7O0lBRUQsZ0NBQVE7Ozs7SUFBUixVQUFTLE1BQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDOUM7Ozs7O0lBRUQsbUNBQVc7Ozs7SUFBWCxVQUFZLE1BQWM7UUFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUN0RDs7Ozs7SUFFRCxvQ0FBWTs7OztJQUFaLFVBQWEsTUFBYztRQUN2QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0tBQ3ZEOzs7OztJQUVELDZCQUFLOzs7O0lBQUwsVUFBTSxNQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ2hEOzs7Ozs7SUFFRCx3Q0FBZ0I7Ozs7O0lBQWhCLFVBQWlCLE1BQWMsRUFBRSxPQUFlO1FBQzVDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3BFOzs7OztJQUtELHFDQUFhOzs7O0lBQWIsVUFBYyxNQUFjO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7S0FDeEQ7Ozs7O0lBR0QsbUNBQVc7Ozs7SUFBWCxVQUFZLE1BQWM7UUFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUN0RDs7Ozs7O0lBR0QsMkNBQW1COzs7O0lBQW5CLFVBQW9CLE1BQWM7UUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7WUFDaEQsT0FBTyxHQUFHLENBQUM7U0FDZCxDQUFDLENBQUM7S0FDTjs7Ozs7O0lBR0QsdUNBQWU7Ozs7O0lBQWYsVUFBZ0IsTUFBYyxFQUFFLE1BQU07UUFDbEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQ3JELFVBQUEsR0FBRztZQUNDLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQztTQUN6QixDQUNKLENBQUM7S0FDTDs7Ozs7OztJQUVELCtDQUF1Qjs7Ozs7SUFBdkIsVUFBd0IsTUFBYyxFQUFFLE1BQU07UUFDMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHO1lBQ3pELE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztLQUNOOzs7Ozs7O0lBRUQsMERBQWtDOzs7Ozs7SUFBbEMsVUFBbUMsTUFBYyxFQUFFLE1BQU0sRUFBRSxTQUFTO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHO1lBQ3JELE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztLQUNOOzs7Ozs7SUFDRCx3REFBZ0M7Ozs7O0lBQWhDLFVBQWlDLE1BQWMsRUFBRSxNQUFNO1FBQ25ELE9BQU8sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7S0FDekY7Ozs7Ozs7Ozs7SUFLRCx5REFBaUM7Ozs7Ozs7SUFBakMsVUFBa0MsTUFBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUzs7UUFDeEUsSUFBSSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUV2RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FDMUQsVUFBQSxHQUFHO1lBQ0MsT0FBTyxHQUFHLENBQUM7U0FDZCxDQUNKLENBQUM7S0FDTDs7Ozs7OztJQUVELDhDQUFzQjs7Ozs7O0lBQXRCLFVBQXVCLE1BQWMsRUFBRSxNQUFNLEVBQUUsT0FBTztRQUNsRCxPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDekY7Ozs7Ozs7SUFFRCxnREFBd0I7Ozs7OztJQUF4QixVQUF5QixNQUFjLEVBQUUsTUFBTSxFQUFFLE9BQU87UUFDcEQsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQzNGOzs7Ozs7O0lBRUQsa0RBQTBCOzs7Ozs7SUFBMUIsVUFBMkIsTUFBYyxFQUFFLE1BQU0sRUFBRSxPQUFPO1FBQ3RELE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0tBQ25HOzs7Ozs7Ozs7SUFLRCx5REFBaUM7Ozs7OztJQUFqQyxVQUFrQyxNQUFjLEVBQUUsTUFBTSxFQUFFLFNBQVM7UUFDL0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FDakQsVUFBQSxHQUFHO1lBRUMsT0FBTyxHQUFHLENBQUM7U0FDZCxDQUNKLENBQUM7S0FDTDs7Ozs7O0lBRUQsOENBQXNCOzs7OztJQUF0QixVQUF1QixNQUFjLEVBQUUsTUFBTTtRQUN6QyxPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNoRjs7Ozs7O0lBSUQsc0RBQThCOzs7OztJQUE5QixVQUErQixNQUFjLEVBQUUsTUFBTTtRQUNqRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3hFOzs7Ozs7SUFFRCxnREFBd0I7Ozs7O0lBQXhCLFVBQXlCLE1BQWMsRUFBRSxNQUFNO1FBQzNDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ2xFOzs7Ozs7SUFFRCxrREFBMEI7Ozs7O0lBQTFCLFVBQTJCLE1BQWMsRUFBRSxNQUFNO1FBQzdDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ3BFOzs7Ozs7SUFFRCx1REFBK0I7Ozs7O0lBQS9CLFVBQWdDLE1BQWMsRUFBRSxNQUFNO1FBQ2xELE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0FDekY7Ozs7OztJQUVELHVEQUErQjs7Ozs7SUFBL0IsVUFBZ0MsTUFBYyxFQUFFLE1BQU07UUFDbEQsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUN4Rjs7Ozs7Ozs7SUFFRCx5Q0FBaUI7Ozs7OztJQUFqQixVQUFrQixNQUFjLEVBQUUsTUFBTSxFQUFFLFNBQVM7O1FBQy9DLElBQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDOUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7UUFDbkQsSUFBTSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUV6RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FDMUQsVUFBQSxHQUFHO1lBRUMsT0FBTyxHQUFHLENBQUM7U0FDZCxDQUNKLENBQUM7S0FDTDs7Z0JBOVdKLFVBQVUsU0FBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7Ozs7Z0JBVlEsSUFBSTtnQkFDSixVQUFVOzs7d0JBRG5COzs7Ozs7O0FDQUEsSUFBQTs7Ozs7OztJQUVJLHNDQUFnQjs7OztJQUFoQixVQUFpQixRQUFROztRQUVyQixJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDOztRQUNsRCxJQUFNLEdBQUcsR0FBRyxRQUFRLENBQUM7O1FBQ3JCLElBQUksU0FBUyxDQUFDO1FBQ2QsV0FBVyxDQUFDLEdBQUcsRUFBRSxVQUFDLEdBQUcsRUFBRSxNQUFNO1lBQ3pCLFNBQVMsR0FBRSxNQUFNLENBQUM7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxTQUFTLENBQUM7S0FDcEI7Ozs7O0lBRUQsb0NBQWM7Ozs7SUFBZCxVQUFlLFFBQVE7O1FBQ25CLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQzs7UUFDbEIsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDOztRQUNsQixJQUFJLElBQUksR0FBRyxVQUFVLENBQUM7O1FBQ3RCLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxTQUFTLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFFeEMsT0FBTyxTQUFTLENBQUM7S0FDcEI7c0JBdEJMO0lBdUJDOzs7Ozs7QUN2QkQ7SUFjSTt3QkFGc0MsSUFBSSxZQUFZLEVBQUU7UUFHcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7O1lBQ3RCLElBQUksU0FBUyxDQUFTOztZQUN0QixJQUFJLFFBQVEsQ0FBUztZQUNyQixTQUFTLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDOUMsUUFBUSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3hDLElBQUksU0FBUyxFQUFFO2dCQUNYLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUU7b0JBQ3BELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNyRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzNFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUE7aUJBQ2hDO3FCQUNJO29CQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNsRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxRQUFRLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ3hFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO2lCQUM3QjthQUNKO1NBQ0o7S0FDSjs7OztJQUdNLDhDQUFxQjs7Ozs7UUFDeEIsSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzs7UUFDdkQsSUFBSSxXQUFXLENBQUM7UUFDaEIsSUFBSSxXQUFXLEVBQUU7WUFDYixXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN0QyxJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDM0UsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUNyQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7Ozs7O0lBSVQsbURBQTBCOzs7OztRQUM3QixJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztRQUM3RCxJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxJQUFJLElBQUksRUFBRTtZQUN4RCxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ3hHLE9BQU8sY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7YUFDakQ7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDOzs7OztJQUdULGtDQUFTOzs7OztRQUNaLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Ozs7O0lBR25CLDRCQUFHOzs7O2NBQUMsRUFBVTtRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7SUFHMUIsdUNBQWM7Ozs7Y0FBQyxLQUFhO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7O0lBSTdCLDBDQUFpQjs7OztRQUNwQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7OztJQUdsQiw2QkFBSTs7OztjQUFDLE1BQWM7OztRQXdCdEIsSUFBSSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN6QyxJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxJQUFJO1NBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBQSxNQUFNO1lBRXBCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEdBQTBHLENBQUMsQ0FBQTtTQUMxSCxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFBLE1BQU07WUFDbEIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3R0FBd0csQ0FBQyxDQUFBO1NBQ3hILENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRztZQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBOztTQUV2QixDQUFDLENBQUM7Ozs7Ozs7SUFJQSwwQ0FBaUI7Ozs7O2NBQUMsVUFBa0IsRUFBRSxXQUFtQjtRQUM1RCxPQUFPLFVBQVUsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDOzs7Z0JBdkg3QyxVQUFVLFNBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzs7Ozt5QkFQRDs7Ozs7Ozs7SUNlSTt3QkFGc0MsSUFBSSxZQUFZLEVBQUU7UUFHcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1NBQzlCO0tBQ0o7Ozs7SUFFTSwwQkFBUzs7Ozs7UUFDWixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUM1RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7Ozs7OztJQUduQixvQkFBRzs7OztjQUFDLEVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7OztJQUkxQiwyQ0FBMEI7Ozs7O2NBQUMsRUFBVSxFQUFFLFFBQWE7O1FBQ3ZELFFBQVEsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNO1lBQzNCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztZQUM1QixPQUFPLEtBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3RDLEVBQUUsVUFBQSxLQUFLO1lBQ0osSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssRUFBRTtnQkFDdkIsT0FBTyxLQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN0QztpQkFBTTtnQkFDSCxPQUFPLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07b0JBQy9CLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDakIsQ0FBQyxDQUFDO2FBQ047U0FDSixDQUFDLENBQUM7Ozs7Ozs7SUFLTSxnREFBK0I7Ozs7O2NBQUMsRUFBVSxFQUFFLFFBQWE7Ozs7Ozt3QkFDbEUsUUFBUSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7Ozs7d0JBRUQscUJBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBQTs7d0JBQTNCLE1BQU0sR0FBRyxTQUFrQjt3QkFDL0IsUUFBUSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO3dCQUM1QixxQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBQTs7d0JBQWpDLFNBQWlDLENBQUM7Ozs7OEJBRTlCLE9BQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFBLEVBQXJCLHdCQUFxQjt3QkFDckIscUJBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUE7O3dCQUFqQyxTQUFpQyxDQUFDOzs0QkFFbEMsc0JBQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTs0QkFDL0IsTUFBTSxDQUFDLE9BQUssQ0FBQyxDQUFDO3lCQUNqQixDQUFDLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW9CUiwrQkFBYzs7OztjQUFDLEtBQWE7UUFDL0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O0lBSTdCLHVCQUFNOzs7O2NBQUMsS0FBYTs7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsTUFBTTtZQUNoQyxPQUFPLEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZDLENBQUMsQ0FBQzs7Ozs7SUFJQSxrQ0FBaUI7Ozs7UUFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDOzs7Ozs7SUFHbEIscUJBQUk7Ozs7Y0FBQyxNQUFjOzs7UUFDdEIsSUFBSSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7O1FBRXBFLElBQUksT0FBTyxHQUFHO1lBQ1YsS0FBSyxFQUFFLElBQUk7U0FDZCxDQUFDOztRQUVGLElBQUksUUFBUSxHQUFHO1lBQ1gsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsSUFBSTtTQUNkLENBQUM7O1FBR0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQy9CLE9BQU8sU0FBQTtTQUNWLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQUEsTUFBTTtZQUNwQixLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBQSxNQUFNO1lBQ2xCLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQUEsS0FBSztZQUNoQixLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDaEQsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBT0EscUNBQW9COzs7Ozs7OztjQUFDLFVBQWtCLEVBQUUsTUFBYyxFQUFFLE1BQWMsRUFBRSxXQUFtQixFQUFFLE9BQWU7UUFDaEgsT0FBTyxLQUFLLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxXQUFXLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7Ozs7O0lBSXpGLHdCQUFPOzs7OztRQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQztZQUMxQixLQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7U0FDNUUsQ0FBQyxDQUFDOzs7Z0JBaklWLFVBQVUsU0FBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7Ozs7O2lCQVBEOzs7Ozs7O0FDQUEsSUFBQTtJQUlJLGlCQUFZLFVBQWlCLEVBQUUsT0FBYztRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztLQUN4QjtrQkFQTDtJQVFDOzs7Ozs7QUNSRCxJQUFBOzs7MkJBQUE7SUFNQzs7Ozs7O0FDSkQsSUFBQTs7Z0NBVThCLElBQUksS0FBSyxFQUFvQjs7cUJBWjNEO0lBYUM7Ozs7OztBQ2JELElBSUE7O3NCQWdCa0MsSUFBSTs0QkFDSyxJQUFJOytCQUN6QixJQUFJLEtBQUssRUFBYzs0QkFDMUIsSUFBSSxVQUFVLEVBQUU7c0JBQ3RCLElBQUksS0FBSyxFQUFjO3lCQUNwQixJQUFJLEtBQUssRUFBa0I7O3VCQXpCM0M7SUEwQkMsQ0FBQTtBQXRCRCxJQXdCQTs7O3lCQTVCQTtJQWdDQzs7Ozs7O0FDMUJELElBQUE7SUFzQkk7OEJBWmlCLElBQUksS0FBSyxFQUFnQjtrQ0FDckIsSUFBSSxLQUFLLEVBQW9COzRCQUNuQyxJQUFJLEtBQUssRUFBbUI7Z0NBQ0EsSUFBSTs0QkFFaEMsSUFBSSxLQUFLLEVBQU87eUJBQ25CLElBQUksS0FBSyxFQUFvQjsrQkFHZCxJQUFJO0tBTTlCO3VCQS9CTDtJQWtDQyxDQUFBO0FBNUJELElBOEJBOzs7MkJBcENBO0lBd0NDOzs7Ozs7QUN4Q0QsSUFBQTs7O3VCQUFBO0lBTUM7Ozs7OztBQ05ELElBQUE7OzswQkFBQTtJQUdDLENBQUE7QUFIRCxJQUtBOztnQ0FHdUMsS0FBSzsyQkFDVixLQUFLO3NCQUVYLEVBQUU7MkJBQ0csRUFBRTs4QkFDQyxFQUFFO3lCQUNQLEVBQUU7MkJBQ0EsRUFBRTsyQkFFRixFQUFFO3dCQUNMLEVBQUU7MEJBQ0EsRUFBRTs2QkFFQyxDQUFDLENBQUM7OEJBQ0QsQ0FBQyxDQUFDOzBCQUNOLENBQUMsQ0FBQzs4QkFDRSxFQUFFOzRCQUNKLEVBQUU7aUNBQ0wsRUFBRTs7c0JBMUJqQztJQTJCQyxDQUFBO0FBdEJELElBd0JBOzs7MEJBN0JBO0lBZ0NDOzs7Ozs7QUNoQ0QsSUFBQTs7O3VCQUFBO0lBR0M7Ozs7OztBQ0RELElBQUE7OzRCQU9nQyxDQUFDO21DQUNBLElBQUksS0FBSyxFQUF1Qjs0QkFNL0IsSUFBSTs7bUJBaEJ0QztJQWtCQzs7Ozs7O0FDWkQsSUFBQTs7MEJBUWdDLENBQUM7cUJBRWQsSUFBSSxLQUFLLEVBQW1COzRCQUNyQixJQUFJLEtBQUssRUFBbUI7NEJBQzVCLElBQUksS0FBSyxFQUFnQjttQ0FDbEIsSUFBSSxLQUFLLEVBQXVCOytCQUdwQyxJQUFJLEtBQUssRUFBc0I7OEJBR3pCLEVBQUU7Ozs7O0lBRzFCLGtDQUFZOzs7O1FBQ2YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksT0FBTyxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7Ozs7O0lBSWhFLHNDQUFnQjs7OztRQUNuQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQzs7Ozs7O0lBS3BFLHNDQUFnQjs7OztjQUFDLE1BQU07UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQzs7Ozs7SUFLdEUsbUNBQWE7Ozs7UUFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7O3NCQTlDakY7SUFnREM7Ozs7OztBQzlDRCxJQUFBOzttQ0FPaUMsSUFBSSxLQUFLLEVBQXVCOztvQkFUakU7SUFVQzs7Ozs7O0FDVkQsSUFBQTs7O3FCQUFBO0lBS0MsQ0FBQTs7Ozs7O0FDREQ7QUFTQSxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFDdkIsSUFBQTs7SUFpREk7eUJBekN5QixDQUFDO3FCQUNMLENBQUM7NEJBQ00sQ0FBQztxQkFVZCxJQUFJLEtBQUssRUFBZTttQ0FDVixJQUFJLEtBQUssRUFBdUI7NkJBQ3RDLElBQUksS0FBSyxFQUFnQjs2QkFDekIsSUFBSSxLQUFLLEVBQWlCO3lCQUM5QixJQUFJLEtBQUssRUFBWTswQkFDcEIsSUFBSSxVQUFVLEVBQUU7eUJBQ2pCLElBQUksS0FBSyxFQUFhOzRCQUNuQixJQUFJLEtBQUssRUFBZ0I7OEJBQ3ZCLElBQUksS0FBSyxFQUFpQjtnQ0FXeEIsSUFBSSxLQUFLLEVBQXNCOzhCQUV6QixLQUFLOzhCQUVMLEtBQUs7UUFPakMsSUFBSSxDQUFDLEtBQUssR0FBRSxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUN2RDtxQkFqRUw7SUFtRUM7Ozs7OztBQ2pFRCxJQUFBOzttQ0FLaUMsSUFBSSxLQUFLLEVBQXVCOzt1QkFQakU7SUFTQzs7Ozs7O0FDVEQsSUFBQTs7O3dCQUFBO0lBTUM7Ozs7OztBQ05ELElBQUE7Ozs4QkFBQTtJQU9DOzs7Ozs7SUNMRDs7Ozs7Ozs7Ozs7SUFFVywyQ0FBcUI7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUN4RSxLQUFVLEVBQUUsU0FBbUIsRUFBRSxZQUFzQjtRQUN2RCxhQUFhLENBQUMsd0JBQXdCLENBQUMsNkJBQTZCLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBR25HLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQixFQUNHLFVBQUEsR0FBRzs7WUFFQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BDLENBQUMsQ0FBQzs7Ozs7Ozs7OztJQUdKLDJDQUFxQjs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQ3hFLEtBQVUsRUFBRSxTQUFtQixFQUFFLFlBQXNCO1FBQ3ZELGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFHbkcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CLEVBQ0csVUFBQSxHQUFHOztZQUVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEMsQ0FBQyxDQUFDOzs7Ozs7OztJQUdFLDhDQUF3Qjs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVU7Ozs7Z0JBSTdGLElBQUk7b0JBQ0EsSUFBSSxHQUFHLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzVHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUN2QixzQkFBTyxJQUFJLEVBQUM7aUJBQ2Y7Z0JBQ0QsV0FBSztvQkFDRCxzQkFBTyxJQUFJLEVBQUM7aUJBQ2Y7Ozs7Ozs7Ozs7Ozs7O0lBR0UsdUNBQWlCOzs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsSUFBWSxFQUNsRixLQUFVLEVBQUUsU0FBbUIsRUFBRSxZQUFzQjtRQUN2RCxhQUFhLENBQUMsMEJBQTBCLENBQUMseUJBQXlCLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFHOUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CLEVBQ0csVUFBQSxHQUFHOztZQUVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBR0osd0NBQWtCOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFDckUsS0FBVSxFQUFFLFNBQW1CLEVBQUUsWUFBc0I7UUFDdkQsYUFBYSxDQUFDLDBCQUEwQixDQUFDLDBCQUEwQixHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUdsRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7SUFHSix3Q0FBa0I7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUNyRSxLQUFVLEVBQUUsU0FBbUIsRUFBRSxZQUFzQjtRQUN2RCxhQUFhLENBQUMsMEJBQTBCLENBQUMsMEJBQTBCLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBR2xHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQixFQUNHLFVBQUEsR0FBRzs7WUFFQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BDLENBQUMsQ0FBQzs7Ozs7OztJQUdMLCtDQUF5Qjs7Ozs7SUFBL0IsVUFBZ0MsYUFBNEIsRUFBRSxTQUFpQjs7Ozs7O3dCQUV2RSxJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7d0JBQ3JDLHFCQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O3dCQUE1RixJQUFJLEdBQUcsU0FBcUYsQ0FBQTt3QkFDNUYsc0JBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQTs7OztLQUMxQjs7Ozs7OztJQUVLLG1DQUFhOzs7Ozs7SUFBbkIsVUFBb0IsYUFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVk7Ozs7Ozt3QkFFeEUsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO3dCQUNyQixxQkFBTSxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7d0JBQTVGLElBQUksR0FBRyxTQUFxRixDQUFBO3dCQUU1RixzQkFBTyxJQUFJLEVBQUM7Ozs7S0FDZjs7Ozs7Ozs7O0lBRUssK0NBQXlCOzs7Ozs7OztJQUEvQixVQUFnQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsUUFBYSxFQUFFLFFBQWdCLEVBQUUsUUFBZ0I7Ozs7Ozt3QkFFMUgsSUFBSSxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDO3dCQUN2RyxxQkFBTSxhQUFhLENBQUMsd0JBQXdCLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O3dCQUF2RyxJQUFJLEdBQUcsU0FBZ0csQ0FBQTt3QkFDdkcsc0JBQU8sSUFBSSxFQUFBOzs7O0tBQ2Q7Ozs7Ozs7OztJQUVNLHVDQUFpQjs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQ3BFLEtBQVUsRUFBRSxTQUFtQixFQUFFLFlBQXNCO1FBQ3ZELGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyx5QkFBeUIsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFFL0YsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CLEVBQ0csVUFBQSxHQUFHOztZQUVDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDN0UsQ0FBQyxDQUFDOztzQkF2SGY7SUF5SEM7Ozs7OztJQ3RIRDs7Ozs7Ozs7Ozs7SUFFVyx3Q0FBYTs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQ2hFLEtBQVUsRUFBRSxTQUFtQixFQUFFLFlBQXNCO1FBQ3ZELGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQywyQkFBMkIsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFHakcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CLEVBQ0csVUFBQSxHQUFHOztZQUVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBSVgsb0RBQXlCOzs7Ozs7O0lBQXpCLFVBQTBCLGFBQTRCLEVBQUUsU0FBaUIsRUFDckUsVUFBb0IsRUFBRSxXQUFxQjtRQUUzQyxhQUFhLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRW5GLElBQUksVUFBVSxDQUFDO1lBQ2YsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFOUIsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUM5QyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2hFO1lBRUQsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzFCLEVBQ0csVUFBQSxHQUFHOztZQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xDLENBQUMsQ0FBQztLQUNWOzs7Ozs7Ozs7SUFLTSxxREFBMEI7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFDekYsVUFBb0IsRUFBRSxXQUFxQjtRQUUzQyxhQUFhLENBQUMsYUFBYSxDQUFDLHdDQUF3QyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUVuRyxJQUFJLFVBQVUsQ0FBQztZQUNmLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDOztZQUd6QyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3ZELFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDbEY7O1lBR0QsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQUEsU0FBUztnQkFDOUMsSUFBSSxTQUFTLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7b0JBQzdFLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN0RDthQUNKLENBQUMsQ0FBQztZQUVILFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMxQixFQUNHLFVBQUEsR0FBRztZQUNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O1lBRWpCLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7SUFNSixzREFBMkI7Ozs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQUUsVUFBa0IsRUFDOUcsVUFBb0IsRUFBRSxXQUFxQjtRQUUzQyxhQUFhLENBQUMsYUFBYSxDQUFDLHlDQUF5QyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRXZILElBQUksWUFBWSxDQUFDO1lBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDOztZQUczQyxJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3hELFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDcEY7O1lBR0QsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSTtnQkFDMUMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7b0JBQ3ZFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNoRDthQUNKLENBQUMsQ0FBQztZQUVILFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM1QixFQUNHLFVBQUEsR0FBRzs7O1lBR0MsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlDLENBQUMsQ0FBQzs7Ozs7Ozs7SUFNRSxrREFBdUI7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQjs7Ozs7O3dCQUduRyxLQUFLLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUM7d0JBRXJCLHFCQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMscUNBQXFDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBcEgsVUFBVSxHQUFHLFNBQXVHLENBQUM7d0JBRXJILHNCQUFPLFVBQVUsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFJZixpREFBc0I7Ozs7Ozs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFhLEVBQUUsVUFBa0IsRUFBRSxVQUFrQixFQUNoSSxVQUFvQixFQUFFLFdBQXFCLEVBQUUsV0FBbUIsRUFBRSxXQUFtQjtRQUF4Qyw0QkFBQSxFQUFBLG1CQUFtQjtRQUFFLDRCQUFBLEVBQUEsbUJBQW1COztRQUVyRixJQUFJLEtBQUssQ0FBQztRQUNWLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQ25ELElBQUksV0FBVyxFQUFFO1lBQ2IsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFFRCxhQUFhLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUMzRixJQUFJLFdBQVcsQ0FBTTtZQUNyQixXQUFXLEdBQUcsSUFBSSxDQUFDOzs7O1lBS25CLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDNUgsSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDZCxXQUFXLEdBQUcsSUFBSSxDQUFDO2lCQUN0QjthQUNKO1lBQ0QsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzNCLEVBQ0csVUFBQSxHQUFHO1lBQ0MsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztJQVdKLHNEQUEyQjs7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQWEsRUFDN0YsVUFBb0IsRUFBRSxXQUFxQjs7UUFFM0MsSUFBSSxLQUFLLENBQUM7UUFDVixLQUFLLEdBQUcsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFFbEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyx5Q0FBeUMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUVwRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7WUFDQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNsQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7OztJQWNFLHNEQUEyQjs7Ozs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFhLEVBQ25HLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxXQUE0QjtRQUE1Qiw0QkFBQSxFQUFBLG1CQUE0Qjs7Ozs7O3dCQUdwRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQzt3QkFFbkQsSUFBSSxXQUFXLEVBQUU7NEJBQ2IsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7eUJBQzVCO3dCQUNNLHFCQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBekcsSUFBSSxHQUFHLFNBQWtHLENBQUM7d0JBQzFHLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7O0lBVUgseURBQThCOzs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLFFBQWdCOzs7Ozs7d0JBRXpHLEtBQUssR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQzt3QkFDakIscUJBQU0sYUFBYSxDQUFDLGFBQWEsQ0FBQyx1Q0FBdUMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O3dCQUFySCxJQUFJLEdBQVEsU0FBeUc7d0JBQ3pILHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7OztJQUtULGlEQUFzQjs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUNyRixVQUFvQixFQUFFLFdBQXFCO1FBRTNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsb0NBQW9DLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7WUFDL0YsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCLEVBQ0csVUFBQSxHQUFHO1lBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7SUFnQ0osZ0RBQXFCOzs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUNwRixVQUFvQixFQUFFLFdBQXFCO1FBQzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsbUNBQW1DLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7WUFDOUYsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCLEVBQ0csVUFBQSxHQUFHO1lBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlDLENBQUMsQ0FBQzs7Ozs7Ozs7OztJQUtKLHVEQUE0Qjs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUMzRixVQUFvQixFQUFFLFdBQXFCO1FBQzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsMENBQTBDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7WUFDckcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCLEVBQ0csVUFBQSxHQUFHO1lBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7SUFjSiwrQ0FBb0I7Ozs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQ25GLFVBQW9CLEVBQUUsV0FBcUI7UUFDM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQyxrQ0FBa0MsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUM3RixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7WUFDQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztJQVdKLHFEQUEwQjs7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFDekYsVUFBb0IsRUFBRSxXQUFxQjtRQUMzQyxhQUFhLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBQzNGLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3RCxFQUNHLFVBQUEsR0FBRztZQUNDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQixDQUFDLENBQUM7Ozs7Ozs7Ozs7SUFHSixtREFBd0I7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVMsRUFDckYsVUFBb0IsRUFBRSxXQUFxQjtRQUMzQyxhQUFhLENBQUMsYUFBYSxDQUFDLDhCQUE4QixHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUN2RixJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN6QixFQUNHLFVBQUEsR0FBRzs7WUFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QyxDQUFDLENBQUM7OzJCQWhVZjtJQWtVQzs7Ozs7O0FDbFVELElBQUE7O2tDQUd3QyxDQUFDO3dDQUNILElBQUksS0FBSyxFQUF3Qjs7NkJBSnZFO0lBS0MsQ0FBQTtBQUxELElBT0E7OytCQUk2QixDQUFDOzBCQUNOLElBQUksS0FBSyxFQUFPO2tDQUNZLElBQUk7NkJBQ3JCLENBQUM7dUJBQ1AsSUFBSTtxQkFNZCxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUU7OytCQXJCdkM7SUF1QkMsQ0FBQTtBQWhCRCxJQWtCQTs7OzZCQXpCQTtJQWdDQzs7Ozs7O0FDaENELElBQUE7SUFDSTtLQUVDOzs7Ozs7SUFFTSxzQkFBSzs7Ozs7Y0FBQyxDQUFNLEVBQUUsUUFBZ0I7O1FBQ2pDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsR0FBRyxZQUFZLENBQUM7Ozs7Ozs7SUFHakQsd0JBQU87Ozs7O2NBQUMsQ0FBTSxFQUFFLFFBQWdCO1FBQ25DLE9BQU8sVUFBVSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDOzs7Ozs7O0lBRzNGLHdCQUFPOzs7OztjQUFDLE1BQU0sRUFBRSxRQUFROztRQUMzQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBOztpQkFoQjNEO0lBa0JDOzs7Ozs7O0FDS0QsSUFBTUEsUUFBTSxHQUFHLE9BQU8sQ0FBQztBQUN2QixJQUFBO0lBTUksNEJBQVksU0FBYyxFQUFFLGNBQTJCO3VCQUw5QixJQUFJLE1BQU0sRUFBRTt5QkFVbEI7WUFDZixHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQSxFQUFFO1lBQ3JDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEVBQUU7WUFDckMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtZQUN2QyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxFQUFFO1lBQ3ZDLE9BQU8sRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBLEVBQUU7WUFDMUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtZQUN6QyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQSxFQUFFO1lBQ3hDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBLEVBQUU7WUFDeEMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtZQUN2QyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFBLEVBQUU7WUFDcEMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBLEVBQUU7U0FFL0M7UUFqQkcsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7S0FDekM7Ozs7Ozs7OztJQW9CTSxpREFBb0I7Ozs7Ozs7O2NBQUMsV0FBdUIsRUFBRSxhQUEyQixFQUFFLFlBQXlCLEVBQUUsV0FBOEIsRUFBRSxXQUF1Qjs7O1FBQ2hLLElBQUksS0FBSyxDQUFDOztRQUNWLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7O1FBQzlCLElBQUksWUFBWSxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7O1FBQ3BDLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsSUFBSSxXQUFXLEVBQUU7WUFDYixXQUFXLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLElBQUksS0FBSyxHQUFBLENBQUMsR0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsZUFBZTs7Z0JBQ3ZGLElBQUksU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7Z0JBQ25ELElBQUksT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7Z0JBRy9DLElBQUksS0FBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxLQUFLLGVBQWUsQ0FBQyxNQUFNLElBQUksU0FBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLElBQUksR0FBRyxDQUFDLEVBQUU7b0JBRWhILE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDO29CQUMxQixlQUFlLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFVBQUEsVUFBVTt3QkFDaEQsS0FBSyxHQUFHLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7d0JBQzdHLElBQUksS0FBSyxFQUFFOzRCQUNQLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ3RCO3FCQUNKLENBQUMsQ0FBQztvQkFFSCxLQUFLLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDcEYsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFOzs7d0JBRXBCLEtBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDeEQsS0FBSSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDckQsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDNUI7aUJBQ0o7YUFFSixDQUFDLENBQUM7WUFDSCxPQUFPLFlBQVksQ0FBQztTQUN2QjthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjs7Ozs7O0lBSUwsbURBQXNCOzs7O0lBQXRCLFVBQXVCLGVBQTJCOztRQUM5QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFFbEIsSUFBSSxlQUFlLENBQUMsUUFBUSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRTtZQUM3RCxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxlQUFlLENBQUMsVUFBVSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRTtZQUMvRCxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ2xCO1FBRUQsT0FBTyxNQUFNLENBQUM7S0FDakI7Ozs7Ozs7OztJQUdNLHFEQUF3Qjs7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLGFBQTJCLEVBQUUsWUFBeUIsRUFBRSxVQUE2QixFQUFFLFdBQXVCOztRQUNuSyxJQUFJLEtBQUssQ0FBQzs7UUFDVixJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDO1FBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7WUFDckQsSUFBSSxTQUFTLENBQWU7O1lBQzVCLElBQUksWUFBWSxDQUFDO1lBQ2pCLFNBQVMsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksVUFBVSxFQUFFO2dCQUMzRSxLQUFLLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUU1RixJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxLQUFLLElBQUksT0FBTyxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7b0JBQzNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3RCO3FCQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFOztvQkFFakYsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDcEMsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO3FCQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTs7b0JBRS9FLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtxQkFBTTs7b0JBRUgsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDdEI7YUFDSjtpQkFBTTtnQkFDSCxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7Ozs7OztJQU14RSxzREFBeUI7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLGFBQTJCLEVBQUUsWUFBeUIsRUFBRSxTQUF1Qjs7UUFDckksSUFBSSxXQUFXLENBQUM7O1FBQ2hCLElBQUksS0FBSyxDQUFDO1FBQ1YsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELEtBQUssR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sS0FBSyxDQUFDOzs7Ozs7OztJQVFWLCtDQUFrQjs7Ozs7O2NBQUMsS0FBSyxFQUFFLFNBQXVCO1FBQ3BELElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtZQUNwQixLQUFLLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7U0FDN0M7Ozs7Ozs7Ozs7SUFLRSx5REFBNEI7Ozs7Ozs7O2NBQUMsV0FBdUIsRUFBRSxhQUEyQixFQUFFLFlBQXlCLEVBQUUsU0FBdUIsRUFBRSxZQUFZOzs7UUFDdEosSUFBSSxZQUFZLENBQUM7O1FBQ2pCLElBQUksS0FBSyxDQUFDO1FBQ1YsSUFBSTtZQUVBLFFBQVEsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRzs7Z0JBRXBDLEtBQUssb0JBQW9CO29CQUNyQixZQUFZLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFBLENBQUMsQ0FBQTtvQkFDcE4sWUFBWSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUN6RCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUM1QyxNQUFNO2dCQUNWLEtBQUssT0FBTztvQkFDUixLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUM3RixNQUFNO2dCQUNWLEtBQUssUUFBUTtvQkFDVCxLQUFLLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ2pGLE1BQU07Z0JBQ1YsS0FBSyxpQkFBaUI7b0JBQ2xCLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUNuSixNQUFNO2dCQUNWLEtBQUssU0FBUztvQkFDVixLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ3hFLE1BQU07Z0JBQ1YsS0FBSyxTQUFTO29CQUNWLEtBQUssR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDN0UsTUFBTTtnQkFDVixLQUFLLFdBQVc7b0JBQ1osS0FBSyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ2hILE1BQU07Z0JBQ1YsS0FBSyxNQUFNO29CQUNQLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFBO29CQUMzRCxNQUFNO2dCQUNWLEtBQUssV0FBVztvQkFDWixLQUFLLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQTtvQkFDNUQsTUFBTTs7OztvQkFLTixNQUFNO2dCQUNWO29CQUNJLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQztvQkFDckMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzNDLE1BQU07YUFDYjtTQUNKO1FBQUMsV0FBTTtZQUNKLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7O0lBSVYsOENBQWlCOzs7Ozs7Y0FBQyxNQUFrQixFQUFFLElBQUksRUFBRSxLQUFLOztRQUNwRCxJQUFJLGFBQWEsQ0FBQzs7UUFDbEIsSUFBSSxLQUFLLENBQUM7UUFDVixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzs7O1lBSW5CLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLFlBQVksR0FBQSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDaEIsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN2QztpQkFBTTtnQkFDSCxJQUFJLElBQUksSUFBSSxXQUFXLElBQUksS0FBSyxJQUFJLE9BQU8sRUFBRTs7b0JBQ3pDLElBQUksb0JBQWtCLEdBQUcsRUFBRSxDQUFDO29CQUM1QixhQUFhLENBQUMsT0FBTyxDQUFDLFVBQUEsU0FBUzt3QkFDM0IsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7NEJBQ25DLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQUEsS0FBSztnQ0FDL0IsSUFBSSxDQUFDLG9CQUFrQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsSUFBSSxLQUFLLEdBQUEsQ0FBQztvQ0FBRSxvQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NkJBQ2pGLENBQUMsQ0FBQzt5QkFDTjs2QkFDSTs0QkFDRCxJQUFJLENBQUMsb0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxXQUFXLEdBQUEsQ0FBQztnQ0FBRSxvQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO3lCQUNqSDtxQkFDSixDQUFDLENBQUM7b0JBQ0gsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsb0JBQWtCLEVBQUUsQ0FBQztpQkFDaEY7cUJBQ0k7O29CQUNELElBQUksUUFBUSxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7O29CQUVoQyxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxHQUFBLENBQUMsQ0FBQztvQkFDdEQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7d0JBRXJCLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDekM7eUJBQU07d0JBQ0gsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUNyQztpQkFDSjthQUVKOztZQUdELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxTQUFTLEdBQUEsQ0FBQyxFQUFFO2dCQUMvQixLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQzdCO1NBQ0o7YUFDSTtZQUNELEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkM7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7OztJQUlWLDZDQUFnQjs7Ozs7Y0FBQyxTQUFrQixFQUFFLFlBQVk7O1FBQ3BELElBQUksS0FBSyxDQUFDO1FBQ1YsS0FBSyxHQUFHLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDdEQsSUFBSSxZQUFZLElBQUksSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUNoRSxLQUFLLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzNDO1FBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7Ozs7SUFVViw0REFBK0I7Ozs7Ozs7O2NBQUMsVUFBOEIsRUFBRSxLQUF5QixFQUFFLFFBQW9CLEVBQUUsYUFBc0I7O1FBQzFJLElBQUksS0FBSyxHQUFRLElBQUksQ0FBQztRQUN0QixJQUFJOztZQUNBLElBQUksT0FBTyxHQUFlLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBRy9DLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBQSxDQUFDLENBQUM7WUFFdkcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRS9ELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxHQUFBLENBQUMsRUFBRTtnQkFDL0QsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQzthQUN2RjtTQUVKO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDVCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNuQjtRQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7Ozs7O0lBU1YsMERBQTZCOzs7Ozs7OztjQUFDLFVBQThCLEVBQUUsS0FBeUIsRUFBRSxRQUFvQixFQUFFLGFBQXNCOztRQUN4SSxJQUFJLEtBQUssR0FBUSxJQUFJLENBQUM7UUFDdEIsSUFBSTs7WUFDQSxJQUFJLE9BQU8sR0FBZSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUMvQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUEsQ0FBQyxDQUFDO1lBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztnQkFDdEMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUE7Z0JBQzFELFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDcEcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7YUFDL0I7WUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksR0FBQSxDQUFDLEVBQUU7Z0JBQy9ELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7YUFDdkY7U0FFSjtRQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1QsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDbkI7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7SUFJVCxrREFBcUI7Ozs7OztjQUFDLE9BQW1CLEVBQUUsUUFBb0IsRUFBRSxlQUF1Qjs7UUFDNUYsSUFBSSxhQUFhLEdBQVcsZUFBZSxDQUFDO1FBRTVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztZQUNyQyxJQUFJLGNBQWMsR0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDOztZQUNqRCxJQUFJLFVBQVUsR0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzFDLElBQUksYUFBYSxJQUFJLGNBQWMsRUFBRTs7Z0JBQ2pDLElBQUksT0FBTyxHQUFXLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxhQUFhLEdBQUcsY0FBYyxJQUFJLENBQUMsRUFBRSxDQUN4QztxQkFBTTtvQkFDSCxPQUFPLEdBQUcsYUFBYSxHQUFHLGNBQWMsQ0FBQztvQkFDekMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ3ZELGFBQWEsR0FBRyxhQUFhLEdBQUcsT0FBTyxDQUFDO2lCQUMzQztnQkFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNwRixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3BHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2lCQUMvQjtnQkFDRCxNQUFNO2FBQ1Q7U0FDSjs7Ozs7Ozs7SUFTRSx3REFBMkI7Ozs7OztjQUFDLFFBQW9CLEVBQUUsT0FBTzs7UUFDNUQsSUFBSSxlQUFlLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQztRQUN2QyxJQUFJO1lBRUEsS0FBSyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRCxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO1NBQ0o7UUFBQyxPQUFPLEVBQUUsRUFBRTtZQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQztZQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25CO1FBRUQsT0FBTyxlQUFlLENBQUM7Ozs7Ozs7OztJQVdwQixpREFBb0I7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLFNBQXVCLEVBQUUsWUFBWTs7UUFDdEYsSUFBSSxLQUFLLENBQU07UUFDZixJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTtZQUNwSixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztTQUVyRDthQUFNO1lBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDOUM7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7O0lBU1Ysc0RBQXlCOzs7Ozs7O2NBQUMsV0FBdUIsRUFBRSxTQUF1QixFQUFFLFlBQVk7O1FBQzNGLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdEQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7SUFHakIsd0RBQTJCOzs7Ozs7SUFBM0IsVUFBNEIsWUFBd0IsRUFBRSxTQUF1QixFQUFFLFlBQVk7UUFDdkYsSUFBSTs7WUFDQSxJQUFJLEtBQUssQ0FBTTtZQUNmLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTtnQkFDbEgsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDckQ7aUJBQU07Z0JBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDOUM7U0FFSjtRQUFDLFdBQU07WUFDSixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sS0FBSyxDQUFDO0tBQ2hCOzs7Ozs7OztJQVFNLGtEQUFxQjs7Ozs7OztjQUFDLGFBQTJCLEVBQUUsU0FBdUIsRUFBRSxZQUFZO1FBQzNGLElBQUk7O1lBQ0EsSUFBSSxLQUFLLENBQU07WUFDZixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUU7Z0JBQ25ILEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO2FBQ3JEO2lCQUFNO2dCQUNILEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzlDO1NBRUo7UUFBQyxXQUFNO1lBQ0osS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDOUM7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7O0lBV1Ysd0RBQTJCOzs7Ozs7O2NBQUMsYUFBMkIsRUFBRSxTQUF1QixFQUFFLFlBQVk7UUFDakcsSUFBSTs7WUFDQSxJQUFJLEtBQUssQ0FBTTtZQUNmLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTtnQkFDbkgsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDckQ7aUJBQU07Z0JBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDOUM7U0FFSjtRQUFDLFdBQU07WUFDSixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7OztJQVVWLG1EQUFzQjs7Ozs7O2NBQUMsU0FBdUIsRUFBRSxZQUFZOztRQUMvRCxJQUFJLEtBQUssQ0FBTTtRQUNmLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQ3BMLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDSCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ2pILEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO2FBQ3JEO2lCQUFNO2dCQUNILEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzlDO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7SUFRVixrREFBcUI7Ozs7OztjQUFDLFNBQXVCLEVBQUUsWUFBWTs7O1FBQzlELElBQUksS0FBSyxDQUFNO1FBQ2YsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTtZQUN4TSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztTQUVyRDthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7O2dCQUMvSCxLQUFzQixJQUFBLEtBQUFDLFNBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQSxnQkFBQSw0QkFBRTtvQkFBaEYsSUFBTSxPQUFPLFdBQUE7b0JBQ2QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUU7d0JBQ3pGLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztxQkFDcEQ7aUJBQ0o7Ozs7Ozs7OztZQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM3QzthQUNJO1lBQ0QsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDOUM7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7Ozs7SUFJViwyREFBOEI7Ozs7Ozs7OztjQUFDLFdBQXVCLEVBQUUsYUFBMkIsRUFBRSxZQUF5QixFQUNqSCxjQUFzQyxFQUFFLGlCQUF5QixFQUFFLHFCQUFxQjs7O1FBQ3hGLElBQUksS0FBSyxDQUFDOztRQUNWLElBQUkscUJBQXFCLENBQUM7UUFDMUIsUUFBUSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUU7WUFDNUIsS0FBSyxVQUFVO2dCQUVYLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxLQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUEsQ0FBQyxDQUFDO2dCQUNuSixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3JELE1BQU07WUFDVixLQUFLLFlBQVk7Z0JBQ2IscUJBQXFCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEtBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBQSxDQUFDLENBQUM7Z0JBQzFMLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDckQsTUFBTTtZQUNWLEtBQUssU0FBUztnQkFDVixxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBQSxDQUFDLENBQUM7Z0JBRTFMLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDckQsTUFBTTtZQUNWLEtBQUssVUFBVTtnQkFDWCxxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBQSxDQUFDLENBQUM7Z0JBRWpNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDckQsTUFBTTtZQUNWLEtBQUssVUFBVTtnQkFDWCxxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFBLENBQUMsQ0FBQztnQkFFekssS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBRXpELEtBQUssYUFBYTs7Z0JBQ2QsSUFBSSxXQUFXLFVBQWdCO2dCQUMvQixxQkFBcUIsR0FBRyxTQUFTLENBQUM7Z0JBQ2xDLFdBQVcsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBQSxDQUFDLENBQUE7Z0JBQ3RHLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLFdBQVcsRUFBRTtvQkFDeEUscUJBQXFCLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3QztxQkFBTSxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxJQUFJLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDbEYscUJBQXFCLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3QztnQkFDRCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3JELE1BQU07WUFDVixLQUFLLFNBQVM7Z0JBQ1YscUJBQXFCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEtBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBQSxDQUFDLENBQUM7Z0JBQy9LLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDckQsTUFBTTtZQUNWLEtBQUssY0FBYzs7Z0JBQ2YsSUFBSSxRQUFRLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDaEMscUJBQXFCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEtBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFBLENBQUMsQ0FBQztnQkFDMUssS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNO1lBQ1YsS0FBSyxvQkFBb0I7Z0JBQ3JCLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO29CQUM5RCxJQUFJOzt3QkFDQSxJQUFJLE1BQU0sR0FBRyxhQUFhLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFFBQVEsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFBO3dCQUUvSCxxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUEsQ0FBQyxDQUFDO3dCQUM3SixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7cUJBQ3hEO29CQUFDLFdBQU07d0JBQ0osS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDdkM7aUJBQ0o7cUJBQU07b0JBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdkM7Z0JBQ0QsTUFBTTtZQUNWOztnQkFFSSxRQUFRLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQzFDLEtBQUssTUFBTTs7d0JBQ1AsSUFBSSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUN0RCxxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUEsQ0FBQyxDQUFDO3dCQUN0SixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7d0JBQ3JELE1BQU07b0JBQ1YsS0FBSyxNQUFNOzt3QkFDUCxJQUFJLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ3RELHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxLQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFBLENBQUMsQ0FBQzt3QkFDekssS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO3dCQUNyRCxNQUFNO29CQUNWO3dCQUNJLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQzt3QkFDckMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQzNDLE1BQU07aUJBQ2I7Z0JBQ0QsTUFBTTtTQUViO1FBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7OztJQU9WLDZDQUFnQjs7OztjQUFDLGNBQWM7O1FBQ2xDLElBQUksS0FBSyxDQUFDOztRQUNWLElBQUksWUFBWSxDQUFDO1FBQ2pCLElBQUksY0FBYyxFQUFFO1lBQ2hCLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQzs7WUFFdkQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ3pELElBQUksS0FBSyxFQUFFOztnQkFFUCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQzthQUNyRDtpQkFBTTtnQkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM5QztTQUVKO2FBQU07WUFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7O0lBT1YsdURBQTBCOzs7OztjQUFDLFlBQWlCOztRQUMvQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSTs7O1lBR0EsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3ZFLFFBQVEsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSTtvQkFDdkMsS0FBSyxVQUFVO3dCQUNYLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDdkcsTUFBTTtvQkFDVjt3QkFDSSxNQUFNO2lCQUNiO2FBQ0o7U0FDSjtRQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDbkI7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7OztJQUdWLDRDQUFlOzs7OztjQUFDLElBQVUsRUFBRSxJQUFVOztRQUV6QyxJQUFJLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDOztRQVc3QixJQUFJLFlBQVksR0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7O1FBQzdELElBQUksS0FBSyxHQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7UUFDL0MsSUFBSSxLQUFLLEdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlDLElBQUksWUFBWSxJQUFJLEtBQUssSUFBSSxZQUFZLElBQUksS0FBSyxFQUFFO1lBQ2hELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7YUFBTTtZQUNILE9BQU8sS0FBSyxDQUFDO1NBQ2hCOzs7Ozs7SUFJRSwyQ0FBYzs7OztjQUFDLElBQVU7O1FBQzVCLElBQUksQ0FBQyxHQUFHRCxRQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxDQUFDOzs7Ozs7O0lBS04sMENBQWE7Ozs7O2NBQUMsS0FBSyxFQUFFLFlBQVk7O1FBQ3BDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEMsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDNUQsS0FBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUN2Qzs7Ozs7OztJQUlFLG9EQUF1Qjs7Ozs7Y0FBQyxXQUF1QixFQUFFLEtBQUs7UUFDekQsS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDckIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUM1QyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDOztRQUU3QyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3RCLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzNFO2FBQU07WUFFSCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7Z0JBQ3JCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7YUFDMUM7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BCLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7YUFDeEM7U0FDSjs7Ozs7Ozs7O0lBUUUsOENBQWlCOzs7Ozs7O2NBQUMsWUFBd0IsRUFBRSxhQUEyQixFQUFFLFdBQThCLEVBQUUsVUFBaUI7UUFBakIsMkJBQUEsRUFBQSxpQkFBaUI7O1FBQzdILElBQUksbUJBQW1CLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDOztRQUNuRCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztRQUN0RSxJQUFJLFlBQVksR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBQSxDQUFDLENBQUM7O1FBQ2hILElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLFlBQVksSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkQsUUFBUSxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixLQUFLLElBQUk7b0JBQ0wsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUM7b0JBQ3RFLE1BQU07Z0JBQ1YsS0FBSyxJQUFJO29CQUNMLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUN0RSxNQUFNO2dCQUNWLEtBQUssSUFBSTtvQkFDTCxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQztvQkFDdEUsTUFBTTthQUNiO1NBQ0o7UUFDRCxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQ3RGLG1CQUFtQixDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztRQUM3QyxJQUFJLFVBQVUsSUFBSSxJQUFJLElBQUksVUFBVSxJQUFJLEtBQUssRUFBRTtZQUMzQyxjQUFjLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE9BQU8sSUFBSSxHQUFHLEdBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUN2RztRQUNELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDOzs7Ozs7Ozs7SUFRbkosK0NBQWtCOzs7Ozs7O2NBQUMsWUFBd0IsRUFBRSxXQUF1QixFQUFFLFdBQThCO1FBQ3ZHLElBQUk7O1lBQ0EsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDbkQsbUJBQW1CLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7WUFDeEQsbUJBQW1CLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQzNHO1FBQUMsV0FBTTtZQUNKLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7Ozs7Ozs7Ozs7O0lBVUUsaURBQW9COzs7Ozs7Ozs7Y0FBQyxZQUF3QixFQUFFLE9BQWUsRUFBRSxtQkFBdUMsRUFBRSxXQUE4QixFQUFFLGNBQWtCO1FBQWxCLCtCQUFBLEVBQUEsa0JBQWtCOztRQUM5SixJQUFJLHFCQUFxQixDQUF1Qjs7UUFDaEQsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssRUFBd0IsQ0FBQzs7UUFDekQsSUFBSSxjQUFjLEdBQUcsT0FBTyxDQUFDO1FBQzdCLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFOztZQUU3QyxJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7Ozs7WUFJakMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDOUcsSUFBSSxxQkFBcUIsRUFBRTtnQkFDdkIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7YUFDaEQ7U0FFSjtRQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxjQUFjLENBQUMsQ0FBQzs7Ozs7OztRQVNsRixJQUFJLG1CQUFtQixDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUU7WUFDckMsbUJBQW1CLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztTQUN2Qzs7OztRQUlELE9BQU8sbUJBQW1CLENBQUM7Ozs7Ozs7OztJQVF4QixrREFBcUI7Ozs7Ozs7Y0FBQyxnQkFBNkMsRUFBRSxtQkFBdUMsRUFBRSxRQUFnQjs7O1FBQ2pJLElBQUksd0JBQXdCLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksSUFBSSxhQUFhLEdBQUEsQ0FBQyxDQUFDOztRQUVuRixJQUFJLENBQUMsd0JBQXdCLEVBQUU7O1lBSTNCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixDQUFDLENBQUM7O1lBQ2hGLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUM7O1lBR3RGLElBQUksWUFBWSxHQUFHLFNBQVMsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxTQUFTLENBQUMsQ0FBQzthQUN6RTtpQkFDSTtnQkFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDL0U7WUFDRCxtQkFBbUIsQ0FBQyx3QkFBd0IsR0FBRyxnQkFBZ0IsQ0FBQTs7O2dCQUcvRCxLQUFvQixJQUFBLEtBQUFDLFNBQUEsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBQSxDQUFDLENBQUEsZ0JBQUEsNEJBQUU7b0JBQTFHLElBQU0sS0FBSyxXQUFBO29CQUNaLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO29CQUN0QixJQUFJLEtBQUssQ0FBQyxlQUFlLEdBQUcsQ0FBQyxFQUFFOzt3QkFNdkIsSUFBSSxtQkFBbUIsSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDLENBQUM7d0JBQzdGLG1CQUFtQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsbUJBQW1CLENBQUMsV0FBVyxJQUFJLG1CQUFtQixDQUFDO3dCQUMzRixtQkFBbUIsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLElBQUksbUJBQW1CLENBQUM7O3FCQUVwSDt5QkFDSTt3QkFDRCxtQkFBbUIsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3JGLG1CQUFtQixDQUFDLG9CQUFvQixJQUFJLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzFHO29CQUNELG1CQUFtQixDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUM7aUJBQ2pFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBc0JKO2FBQ0k7WUFDRCxtQkFBbUIsQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLEtBQUssQ0FBdUIsd0JBQXdCLENBQUMsQ0FBQztZQUN6RyxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLG1CQUFtQixDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztZQUM3QyxtQkFBbUIsQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7U0FDOUM7UUFHRCxPQUFPLG1CQUFtQixDQUFDOzs7Ozs7OztJQUcvQiwyQ0FBYzs7Ozs7O0lBQWQsVUFBZSxnQkFBNkMsRUFBRSxtQkFBdUMsRUFBRSxhQUFxQjs7UUFDeEgsSUFBSSxRQUFRLENBQXVCO1FBQ25DLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtZQUNuQixRQUFRLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxhQUFhLElBQUksQ0FBQyxDQUFDLGFBQWEsSUFBSSxhQUFhLEdBQUEsQ0FBQyxDQUFDO1lBQ3BHLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLG1CQUFtQixDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4RixtQkFBbUIsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFHLG1CQUFtQixDQUFDLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUM7U0FDcEU7S0FDSjs7Ozs7OztJQUNELDhDQUFpQjs7Ozs7O0lBQWpCLFVBQWtCLGdCQUE2QyxFQUFFLG1CQUF1QyxFQUFFLGdCQUF3Qjs7UUFDOUgsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUU7O2dCQUN0QixLQUFrQixJQUFBLEtBQUFBLFNBQUEsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxRQUFRLEdBQUEsQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO29CQUFoRSxJQUFJLEtBQUssV0FBQTtvQkFDVixLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDdEIsbUJBQW1CLENBQUMsa0JBQWtCLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQztpQkFDakU7Ozs7Ozs7OztZQUNELG1CQUFtQixDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsV0FBVyxJQUFJLGdCQUFnQixDQUFDLENBQUM7WUFDMUYsbUJBQW1CLENBQUMsb0JBQW9CLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixJQUFJLGdCQUFnQixDQUFDLENBQUM7U0FFL0c7S0FDSjs7Ozs7Ozs7SUFPTSx5Q0FBWTs7Ozs7OztjQUFDLGdCQUE2QyxFQUFFLE1BQWMsRUFBRSxtQkFBdUM7OztRQUN0SCxJQUFJLE1BQU0sR0FBVyxDQUFDLENBQUM7UUFDdkIsSUFBSTtZQUNBLFFBQVEsTUFBTTs7OztnQkFJVixLQUFLLFFBQVE7O29CQUNULElBQUksWUFBWSxHQUFHLG1CQUFtQixDQUFDLFdBQVcsQ0FBQzs7b0JBQ25ELElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDOzt3QkFDNUIsS0FBb0IsSUFBQSxLQUFBQSxTQUFBLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsR0FBQSxDQUFDLENBQUEsZ0JBQUEsNEJBQUU7NEJBQXZJLElBQU0sS0FBSyxXQUFBOzRCQUNaLElBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxDQUFDLEVBQUU7O2dDQUMzQixJQUFJLG1CQUFtQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dDQUN2RSxZQUFZLElBQUksbUJBQW1CLENBQUM7Z0NBQ3BDLG1CQUFtQixJQUFJLG1CQUFtQixDQUFDOzZCQUM5QztpQ0FDSTtnQ0FDRCxZQUFZLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQztnQ0FDNUIsbUJBQW1CLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQzs2QkFDdEM7eUJBQ0o7Ozs7Ozs7OztvQkFDRCxNQUFNLEdBQUcsbUJBQW1CLENBQUM7b0JBQzdCLE1BQU07Z0JBQ1YsS0FBSyxLQUFLO29CQUNOLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxHQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7b0JBQ3ZPLE1BQU07YUFDYjtTQUNKO1FBQUMsV0FBTTtTQUNQO1FBQ0QsT0FBTyxNQUFNLENBQUM7Ozs7Ozs7OztJQUtYLGdEQUFtQjs7Ozs7OztjQUFDLFNBQWMsRUFBRSxNQUFjLEVBQUUsbUJBQXVDLEVBQUUsV0FBOEI7UUFDOUgsSUFBSTs7WUFDQSxJQUFJLE1BQU0sQ0FBQzs7WUFDWCxJQUFJLHFCQUFxQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztZQUN2RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxTQUFTLElBQUksU0FBUyxFQUFFO2dCQUM5RCxxQkFBcUIsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELHFCQUFxQixDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDMUQsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7Z0JBQzFCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtvQkFDZCxxQkFBcUIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztpQkFDOUM7cUJBQU07b0JBQ0gscUJBQXFCLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztpQkFDdkM7Z0JBRUQscUJBQXFCLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBRTFDLFFBQVEsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7b0JBQ3JDLEtBQUssT0FBTzt3QkFDUixxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO3dCQUN4QyxxQkFBcUIsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFBO3dCQUNyRCxxQkFBcUIsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQzt3QkFDbEUsTUFBTTtvQkFDVixLQUFLLFdBQVc7d0JBQ1oscUJBQXFCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzt3QkFDeEMscUJBQXFCLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7d0JBQzNDLE1BQU07b0JBQ1YsS0FBSyxXQUFXO3dCQUNaLHFCQUFxQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7d0JBQ3hDLHFCQUFxQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUMxRCxNQUFNO29CQUNWLEtBQUssT0FBTzt3QkFDUixxQkFBcUIsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO3dCQUNoQyxxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQzt3QkFDcEQscUJBQXFCLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7d0JBQ3JELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDOzt3QkFFcEYsTUFBTTtvQkFDVixLQUFLLFVBQVU7d0JBQ1gscUJBQXFCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzt3QkFDeEMscUJBQXFCLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzt3QkFDaEMscUJBQXFCLENBQUMsYUFBYSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzs7d0JBRXBELE1BQU07b0JBQ1YsS0FBSyxPQUFPO3dCQUNSLHFCQUFxQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7d0JBQ2hDLHFCQUFxQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7d0JBQ3hDLHFCQUFxQixDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO3dCQUM3QyxNQUFNO29CQUNWLEtBQUssY0FBYzt3QkFDZixxQkFBcUIsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO3dCQUNoQyxxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO3dCQUN4QyxxQkFBcUIsQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQy9ELE1BQU07b0JBQ1YsS0FBSyxrQkFBa0IsQ0FBQztvQkFDeEIsS0FBSyxhQUFhO3dCQUNkLHFCQUFxQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7d0JBQ2hDLHFCQUFxQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7d0JBQ3hDLHFCQUFxQixDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUMvRCxNQUFNOzs7O29CQUlWO3dCQUNJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUU7NEJBQzVCLHFCQUFxQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7NEJBQ2hDLHFCQUFxQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7NEJBQ3hDLHFCQUFxQixDQUFDLGtCQUFrQixHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQzs0QkFDcEUscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLEdBQUcscUJBQXFCLENBQUMsV0FBVyxDQUFDOzRCQUNsRyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDbkYscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQzs0QkFDL0UscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs0QkFFekQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQzt5QkFDbkc7NkJBQU07NEJBQ0gscUJBQXFCLEdBQUcsSUFBSSxDQUFDO3lCQUNoQzt3QkFDRCxNQUFNO2lCQUNiO2dCQUVELElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRTtvQkFDckIscUJBQXFCLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7aUJBQ2hEO2FBQ0o7aUJBQU07Z0JBQ0gsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELE9BQU8scUJBQXFCLENBQUM7U0FDaEM7UUFBQyxPQUFPLEVBQUUsRUFBRTtZQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUM7U0FDZjs7Ozs7Ozs7SUFHRSxxREFBd0I7Ozs7OztjQUFDLFdBQThCLEVBQzFELFNBQXFCLEVBQUUscUJBQTJDO1FBQ2xFLElBQUk7O1lBQ0EsSUFBSSxLQUFLLENBQWE7O1lBQ3RCLElBQUksWUFBWSxHQUFXLENBQUMsQ0FBQyxDQUFDOztZQUM5QixJQUFJLGdCQUFnQixHQUFXLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO1lBQzlELEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFdBQVcsSUFBSSxxQkFBcUIsQ0FBQyxXQUFXLEdBQUEsQ0FBQyxDQUFDO1lBQ2xGLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBQSxDQUFDO2dCQUM3QixZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxRQUFRLElBQUksV0FBVyxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUE7YUFDNUUsQ0FBQyxDQUFDO1lBQ0gscUJBQXFCLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQTtTQUNyRDtRQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtTQUNsQjs7Ozs7Ozs7O0lBU0UscURBQXdCOzs7Ozs7O2NBQUMsV0FBOEIsRUFBRSxtQkFBdUMsRUFBRSxTQUFjO1FBQ25ILFFBQVEsbUJBQW1CLENBQUMsS0FBSztZQUM3QixLQUFLLGNBQWM7O2dCQUVmLElBQUksS0FBSyxDQUFhOztnQkFDdEIsSUFBSSxjQUFjLEdBQVcsR0FBRyxDQUFDO2dCQUNqQyxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxXQUFXLElBQUksbUJBQW1CLENBQUMsb0JBQW9CLEdBQUEsQ0FBQyxDQUFDO2dCQUN6RixLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztvQkFDN0IsY0FBYyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQztpQkFDOUUsQ0FBQyxDQUFDO2dCQUNILG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDO2dCQUN6RCxNQUFNO1lBQ1YsS0FBSyxpQkFBaUI7Ozs7O2dCQUtsQixNQUFNO1lBQ1YsS0FBSyxPQUFPOztnQkFDUixJQUFJLEtBQUssQ0FBYTtnQkFDdEIsS0FBSyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsV0FBVyxJQUFJLG1CQUFtQixDQUFDLG9CQUFvQixHQUFBLENBQUMsQ0FBQztnQkFDekYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7b0JBQzVDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7aUJBQzlGO2dCQUNELElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRTtvQkFDdkIsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFBO2lCQUNqRTtnQkFDRCxNQUFNO1lBQ1Y7Z0JBQ0ksTUFBTTtTQUNiOzs7Ozs7SUFTRSw4Q0FBaUI7Ozs7Y0FBQyxXQUF1QjtRQUM1QyxJQUFJO1lBQ0EsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sV0FBVyxDQUFDO1NBQ3RCO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQixPQUFPLFdBQVcsQ0FBQztTQUN0Qjs7Ozs7OztJQVNFLDhDQUFpQjs7Ozs7Y0FBQyxXQUF1Qjs7O1FBQzVDLElBQUksVUFBVSxDQUFxQjs7UUFDbkMsSUFBSSx3QkFBd0IsR0FBR0MsU0FBVyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RCxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7WUFDNUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsQ0FBQyxDQUFDOztZQUMvQyxJQUFJLEtBQUssR0FBdUIsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUNoRSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUE7WUFFbkQsVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDM0QsUUFBUSxLQUFLLENBQUMsS0FBSztnQkFDZixLQUFLLGNBQWM7O29CQUNmLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7O29CQUUxRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ3hFLE1BQU07Z0JBQ1YsS0FBSyxjQUFjOztvQkFDZixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUMxRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ3pFLE1BQU07Z0JBQ1YsS0FBSyxnQkFBZ0I7b0JBQ2pCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUMzRCxNQUFNO2dCQUNWLEtBQUssaUJBQWlCOztvQkFDbEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDMUUsSUFBSSxDQUFDLCtCQUErQixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUNoRixNQUFNO2dCQUNWLEtBQUssd0JBQXdCO29CQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQzs7b0JBQy9DLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQzFFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDOUUsTUFBTTtnQkFDVixLQUFLLE9BQU87O29CQUNSLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDcEIsT0FBTyxRQUFRLEVBQUU7O3dCQUNiLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7d0JBQzFFLFFBQVEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO3FCQUNuRztvQkFDRCxNQUFNO2dCQUNWLEtBQUssZ0JBQWdCOztvQkFDakIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDMUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUN2RSxNQUFNO2dCQUNWLEtBQUssY0FBYztvQkFDZixJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQzNFLE1BQU07Z0JBQ1Y7O29CQUVJLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzt3QkFDckMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQzt3QkFDMUUsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO3FCQUNsRjtvQkFDRCxNQUFNO2FBQ2I7U0FDSjtnQ0FFVSxpQkFBaUI7O1lBQ3hCLElBQUksZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7O1lBQy9GLElBQUksY0FBYyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLEdBQUEsQ0FBQyxDQUFDO1lBQy9FLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQzs7OztZQUg1RixLQUFnQyxJQUFBLDZCQUFBRCxTQUFBLHdCQUF3QixDQUFBLGtFQUFBO2dCQUFuRCxJQUFNLGlCQUFpQixxQ0FBQTt3QkFBakIsaUJBQWlCO2FBSTNCOzs7Ozs7Ozs7UUFFRCxPQUFPLFdBQVcsQ0FBQzs7Ozs7OztJQUdoQiw0Q0FBZTs7Ozs7Y0FBQyxTQUF3QixFQUFFLFlBQVk7UUFDekQsSUFBSSxZQUFZO1lBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUEsQ0FBQyxDQUFDOztZQUNqSyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksT0FBTyxHQUFBLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksT0FBTyxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBQSxDQUFDLENBQUM7Ozs7Ozs7OztJQUk5SSxtREFBc0I7Ozs7Ozs7Y0FBQyxRQUFvQixFQUFFLFVBQThCLEVBQUUsS0FBeUIsRUFBRSxhQUFzQjs7UUFDakksSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7UUFDMUIsSUFBSSxpQkFBaUIsR0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7O1FBQzlDLElBQUksaUJBQWlCLEdBQVcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEcsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDOztRQUNqQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7O1FBQ2pCLElBQUksY0FBYyxDQUFDO1FBRW5CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLGNBQWMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLElBQUksaUJBQWlCLENBQUE7WUFDaEYsUUFBUSxJQUFJLGNBQWMsQ0FBQztZQUMzQixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUM1QixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7U0FlbEU7UUFFRCxJQUFJLGlCQUFpQixHQUFHLFFBQVEsSUFBSSxpQkFBaUIsR0FBRyxRQUFRLEVBQUU7O1lBRTlELE9BQU8sQ0FBQyxLQUFLLENBQUMsNENBQTRDLEdBQUcsaUJBQWlCLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDO1lBQ3BHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksaUJBQWlCLEdBQUcsUUFBUSxDQUFDLENBQUM7U0FDdEg7UUFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxHQUFBLENBQUMsRUFBRTtZQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUE7WUFDeEMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztTQUN0Rjs7Ozs7Ozs7SUFJRSxrREFBcUI7Ozs7OztjQUFDLG9CQUFtQyxFQUFFLEtBQXlCLEVBQUUsV0FBdUI7OztRQUNoSCxJQUFJLFVBQVUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDOztRQUNyQyxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQzs7UUFDM0IsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7O1FBQzFCLElBQUksc0JBQXNCLEdBQUcsQ0FBQyxDQUFDOztRQUMvQixJQUFJLHNCQUFzQixHQUF1QixFQUFFLENBQUM7O1FBQ3BELElBQUksa0JBQWtCLEdBQUcsRUFBRSxDQUFDOztRQUM1QixJQUFJLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztRQUN2RCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7O1FBQ25CLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztnQ0FFVixPQUFPO1lBQ1osc0JBQXNCLEdBQUcsQ0FBQyxDQUFDOztZQUMzQixJQUFJLFdBQVcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxPQUFPLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQzs7WUFDOUUsSUFBSSxjQUFjLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDcEYsT0FBTyxzQkFBc0IsSUFBSSxjQUFjLEVBQUU7Z0JBQzdDLGtCQUFrQixJQUFJLFdBQVcsQ0FBQztnQkFDbEMsc0JBQXNCLEVBQUUsQ0FBQzs7Z0JBRXpCLElBQUksZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsRUFBRSxHQUFBLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxnQkFBZ0IsRUFBRTtvQkFDbEIsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQy9CO3FCQUNJO29CQUNELGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUM1RDtnQkFDRCxJQUFJLGtCQUFrQixHQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUU7b0JBQy9DLFVBQVUsSUFBSSxrQkFBa0IsQ0FBQztvQkFDakMsT0FBSyxzQ0FBc0MsQ0FBQyxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztvQkFDckcsaUJBQWlCLEVBQUUsQ0FBQztvQkFDcEIsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO29CQUN4QixVQUFVLEdBQUcsa0JBQWtCLEdBQUcsVUFBVSxDQUFDO29CQUM3QyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7aUJBQzFCO2FBQ0o7Ozs7WUF2QkwsS0FBb0IsSUFBQSx5QkFBQUEsU0FBQSxvQkFBb0IsQ0FBQSwwREFBQTtnQkFBbkMsSUFBSSxPQUFPLGlDQUFBO3dCQUFQLE9BQU87YUF3QmY7Ozs7Ozs7OztRQUNELElBQUksc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7WUFDbkMsSUFBSSxhQUFhLEdBQUcsYUFBYSxDQUFDLGlDQUFpQyxDQUFDLFdBQVcsRUFBRSxzQkFBc0IsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0ksYUFBYSxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNuRixXQUFXLENBQUMsZUFBZSxDQUFDLEdBQUcsYUFBYSxDQUFDO1NBQ2hEOzs7Ozs7OztJQUdMLG1FQUFzQzs7Ozs7O0lBQXRDLFVBQXVDLHNCQUEwQyxFQUFFLFVBQXNCLEVBQUUsa0JBQWtCOzs7UUFDekgsSUFBSSxhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7UUFDdkQsSUFBSSxRQUFRLENBQWM7Z0NBRWpCLFlBQVk7WUFDakIsSUFBSSxZQUFZLEVBQUU7O2dCQUNkLElBQUksWUFBWSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxZQUFZLENBQUMsRUFBRSxHQUFBLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxZQUFZLEVBQUU7b0JBRWQsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUM7b0JBQ2hGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO3dCQUM3QixnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO3dCQUV0RixRQUFRLEdBQUdDLFNBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQTt3QkFDcEMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3hFLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDdEMsT0FBSyw0QkFBNEIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDbEY7aUJBQ0o7YUFDSjs7MkJBWFcsZ0JBQWdCOztZQUpoQyxLQUF5QixJQUFBLHVCQUFBRCxTQUFBLGtCQUFrQixDQUFBLHNEQUFBO2dCQUF0QyxJQUFJLFlBQVksK0JBQUE7d0JBQVosWUFBWTthQWdCcEI7Ozs7Ozs7OztLQUNKOzs7Ozs7SUFFRCx5REFBNEI7Ozs7O0lBQTVCLFVBQTZCLG9CQUF3QyxFQUFFLHdCQUF3Qjs7UUFDM0YsSUFBSSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSx3QkFBd0IsQ0FBQyxFQUFFLEdBQUEsQ0FBQyxDQUFBO1FBQ3RGLElBQUksWUFBWSxFQUFFOztZQUNkLElBQUksZ0JBQWdCLENBQWlCO1lBQ3JDLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQ2xFLE9BQU9DLFNBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNwQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7OztJQU9NLDRDQUFlOzs7Ozs7Y0FBQyxRQUFvQixFQUFFLFVBQThCOztRQUN2RSxJQUFJLGNBQWMsR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7Z0JBQ3BELGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUIsQ0FBQyxDQUFDO1NBRU47UUFDRCxPQUFPLGNBQWMsQ0FBQzs7Ozs7Ozs7Ozs7O0lBV25CLG9EQUF1Qjs7Ozs7Ozs7OztjQUFDLFFBQW9CLEVBQUUsVUFBOEIsRUFBRSxLQUF5QixFQUFFLGFBQXNCLEVBQUUsV0FBdUI7OztRQUUzSixJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSTs7WUFDQSxJQUFJLGtCQUFrQixHQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7O1lBQzlELElBQUksVUFBVSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7O1lBQ3JDLElBQUksZUFBZSxHQUFHLElBQUksS0FBSyxFQUFjLENBQUM7O1lBQzlDLElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQzs7WUFDNUIsSUFBSSxpQkFBZSxHQUFHLENBQUMsQ0FBQzs7WUFDeEIsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7O1lBQzNCLElBQUksd0JBQXNCLEdBQUcsSUFBSSxLQUFLLEVBQWUsQ0FBQzs7WUFDdEQsSUFBSSxhQUFhLFVBQWU7WUFHaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGtCQUFrQixFQUFFLENBQUMsRUFBRSxFQUFFOztnQkFFMUMsSUFBSSxjQUFjLEdBQXVCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNySSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7YUFDeEU7WUFFRCxJQUFJLENBQUMsNEJBQTRCLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQy9ELElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O2dCQUU1QixXQUFXLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O29CQUM3QyxJQUFJLFlBQVksR0FBZSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUNsRCxJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO29CQUNqQyxJQUFJLE1BQU0sR0FBRyxXQUFXLEVBQUU7d0JBQ3RCLFdBQVcsR0FBRyxNQUFNLENBQUM7cUJBQ3hCO2lCQUNKOztnQkFFRCxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7b0JBQ2pCLFdBQVcsR0FBRyxDQUFDLENBQUM7aUJBQ25COztnQkFHRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7b0JBQzdDLElBQUksS0FBSyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTs7d0JBQ2xDLElBQUksR0FBRyxHQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDeEIsa0JBQWtCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBQSxDQUFDLENBQUMsU0FBUyxDQUFDO3FCQUNqRztpQkFDSjs7O2dCQUdELGlCQUFlLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUVqRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7b0JBQzdDLElBQUksS0FBSyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTs7d0JBQ2xDLElBQUksR0FBRyxHQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDeEIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTTs0QkFDL0MsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7Z0NBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFOztvQ0FDdkIsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQzs7b0NBRzdCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsS0FBSyxJQUFJLEtBQUssR0FBRyxpQkFBZSxHQUFHLEdBQUcsQ0FBQyxDQUFDO29DQUMzRCxNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztpQ0FDL0I7Z0NBQ0QsS0FBSSxDQUFDLDhCQUE4QixDQUFDLHdCQUFzQixFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQzs2QkFDcEY7aUNBQ0k7O2dDQUVELE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDOzZCQUN4Qjt5QkFDSixDQUFDLENBQUM7O3dCQUVILGVBQWUsR0FBRyxJQUFJLENBQUM7cUJBQzFCO2lCQUNKO2dCQUVELElBQUksZUFBZSxFQUFFO29CQUNqQixhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7O29CQUduRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxFQUFFLHdCQUFzQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7Ozs7O29CQUsvRixhQUFhLENBQUMsaUNBQWlDLENBQUMsV0FBVyxFQUFFLHdCQUFzQixFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNwSTthQUVKO1lBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBRTNDO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUE7WUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtTQUNsQjtRQUNELE9BQU8sZUFBZSxDQUFDOzs7Ozs7O0lBSTNCLHlEQUE0Qjs7Ozs7SUFBNUIsVUFBNkIsZUFBMkIsRUFBRSxnQkFBb0M7O1FBQzFGLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFOztZQUNoRCxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7b0NBQ2IsU0FBUzs7Z0JBQ2hCLElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLElBQUksU0FBUyxDQUFDLEVBQUUsR0FBQSxDQUFDLENBQUM7Z0JBQy9ELElBQUksT0FBTyxFQUFFOztvQkFDVCxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQ2hGLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDcEUsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO3dCQUNuQyxjQUFjLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDN0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7O3FCQUV6QjtpQkFDSjs7O2dCQVZMLEtBQXdCLElBQUEsS0FBQUQsU0FBQSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUEsZ0JBQUE7b0JBQXRDLElBQU0sU0FBUyxXQUFBOzBDQUFULFNBQVM7OztpQkFXbkI7Ozs7Ozs7OztZQUNELGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUM7U0FDeEM7S0FDSjs7Ozs7SUFFRCxtREFBc0I7Ozs7SUFBdEIsVUFBdUIsZ0JBQW9DO1FBQ3ZELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87WUFDNUIsT0FBTyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDOUIsQ0FBQyxDQUFDO0tBQ047Ozs7Ozs7SUFFRCx5REFBNEI7Ozs7OztJQUE1QixVQUE2QixVQUFzQixFQUFFLFlBQXlCLEVBQUUsUUFBWTtRQUFaLHlCQUFBLEVBQUEsWUFBWTs7UUFDeEYsSUFBSSxjQUFjLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQy9CLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNyQztRQUVELGNBQWMsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxJQUFJLFlBQVksQ0FBQyxVQUFVLEdBQUEsQ0FBQyxDQUFDO1FBQ3pGLElBQUksY0FBYyxFQUFFO1lBQ2hCLGNBQWMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7U0FDOUM7YUFDSTtZQUNELFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7U0FDaEc7S0FDSjs7Ozs7Ozs7SUFHRCwyREFBOEI7Ozs7OztJQUE5QixVQUErQixzQkFBMEMsRUFBRSxVQUFzQixFQUFFLHdCQUF3Qjs7UUFDdkgsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUN6RixJQUFJLFlBQVksRUFBRTs7WUFDZCxJQUFJLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztZQUV2RCxhQUFhLENBQUMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hELHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQy9EO0tBRUo7Ozs7Ozs7SUFHRCxpREFBb0I7Ozs7O0lBQXBCLFVBQXFCLG9CQUF3QyxFQUFFLHdCQUF3Qjs7UUFFbkYsSUFBSSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSx3QkFBd0IsQ0FBQyxFQUFFLEdBQUEsQ0FBQyxDQUFBO1FBQ3RGLElBQUksWUFBWSxFQUFFOztZQUNkLElBQUksZ0JBQWdCLENBQWlCO1lBQ3JDLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQ2xFLE9BQU9DLFNBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNwQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7OztJQU9NLDJDQUFjOzs7Ozs7Y0FBQyxVQUFzQixFQUFFLEVBQVU7O1FBQ3BELElBQUksTUFBTSxHQUFRLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBQSxDQUFDLENBQUM7UUFDbkQsSUFBSSxNQUFNLEVBQUU7WUFDUixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN2QzthQUFNO1lBQ0gsTUFBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMzQjtRQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7O0lBWWxCLGtEQUFxQjs7Ozs7OztjQUFDLFVBQThCLEVBQUUsV0FBbUIsRUFBRSxhQUFxQjs7UUFDbkcsSUFBSSxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQWUsQ0FBQztRQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJOztnQkFDQSxJQUFJLFlBQVksR0FBZ0IsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLElBQUksRUFBRSxZQUFZLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFOztvQkFDNUQsSUFBSSxHQUFHLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUM7O29CQUN6RSxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQztvQkFDL0UsSUFBSSxHQUFHLElBQUksV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7O3dCQUM5QyxJQUFJLE1BQU0sR0FBZSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7d0JBQy9DLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsb0JBQW9CLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQTt3QkFDM0UsSUFBSSxXQUFXLEVBQUU7OzRCQUNiLElBQUksZUFBZSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDOzRCQUNyRCxJQUFJLGVBQWUsRUFBRTtnQ0FDakIsSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFO29DQUN4QixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLElBQUksV0FBVyxHQUFBLENBQUMsRUFBRTt3Q0FDN0MsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztxQ0FDakM7aUNBQ0o7cUNBQ0k7b0NBQ0QsSUFBSSxlQUFlLElBQUksV0FBVyxFQUFFO3dDQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO3FDQUNqQztpQ0FDSjs2QkFDSjt5QkFDSjtxQkFDSjtpQkFDSjthQUNKO1lBQUMsV0FBTSxHQUFHO1NBQ2Q7UUFDRCxPQUFPLFVBQVUsQ0FBQzs7Ozs7OztJQVFmLGlEQUFvQjs7Ozs7Y0FBQyxTQUE2QjtRQUNyRCxJQUFJO1lBQ0EsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUU7Z0JBQzNELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1lBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7U0FDbEI7UUFHRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7O0lBR1Ysb0RBQXVCOzs7Ozs7O2NBQUMsVUFBOEIsRUFBRSxLQUF5QixFQUFFLFdBQXVCLEVBQUUsWUFBcUI7O1FBQ3BJLElBQUksUUFBUSxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7O1FBQ2hDLElBQUksaUJBQWlCLEdBQXVCLEVBQUUsQ0FBQzs7UUFDL0MsSUFBSSxnQkFBZ0IsR0FBZSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7UUFDM0QsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDOztRQUNoRCxJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUUxQixJQUFJOztZQUVBLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBQyxHQUFHLEVBQUUsR0FBRztnQkFDMUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDL0UsRUFBRSxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQzs7WUFHekIsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxZQUFZO2dCQUNsQyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLFVBQVUsR0FBQSxDQUFDLEVBQUU7b0JBQzlELGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDeEM7YUFDSixDQUFDLENBQUM7O1lBR0gsUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLENBQUMsQ0FBQzs7WUFHN0UsT0FBTyxpQkFBaUIsR0FBRyxnQkFBZ0IsSUFBSSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUNoRixRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ2xILGlCQUFpQixFQUFFLENBQUM7YUFDdkI7O1lBR0QsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQzVGO1FBQ0QsT0FBTyxLQUFLLEVBQUU7U0FFYjs7Ozs7Ozs7Ozs7Ozs7O0lBY0Usb0RBQXVCOzs7Ozs7Ozs7Ozs7O2NBQUMsVUFBc0IsRUFBRSxLQUF5QixFQUFFLFdBQXVCLEVBQUUsWUFBcUI7O1FBQzVILFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7UUFDbkMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQzs7UUFDNUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDOztRQUNyQixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQzs7UUFDM0IsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7O1FBQzFCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQzs7UUFDbkIsSUFBSSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7O1FBQzVCLElBQUksc0JBQXNCLEdBQXVCLEVBQUUsQ0FBQzs7UUFDcEQsSUFBSSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RCxZQUFZLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNqQyxZQUFZLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3RELFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUE7Z0NBSXZCLFFBQVE7WUFDZixrQkFBa0IsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQ3pDLFlBQVksRUFBRSxDQUFDOztZQUNmLElBQUksZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsRUFBRSxHQUFBLENBQUMsQ0FBQztZQUN6RSxJQUFJLGdCQUFnQixFQUFFO2dCQUNsQixnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUMvQjtpQkFDSTtnQkFDRCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM3RDtZQUVELElBQUksWUFBWSxLQUFLLFVBQVUsRUFBRTtnQkFDN0IsVUFBVSxJQUFJLGtCQUFrQixDQUFDO2dCQUNqQyxPQUFLLHNDQUFzQyxDQUFDLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNyRyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNwQixrQkFBa0IsR0FBRyxFQUFFLENBQUM7Z0JBQ3hCLFlBQVksR0FBRyxDQUFDLENBQUM7YUFDcEI7Ozs7O1lBakJMLEtBQXVCLElBQUEsZUFBQUQsU0FBQSxVQUFVLENBQUEsc0NBQUE7Z0JBQTVCLElBQU0sUUFBUSx1QkFBQTt3QkFBUixRQUFRO2FBa0JsQjs7Ozs7Ozs7O1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsNERBQTRELENBQUMsQ0FBQTtRQUNyRyxJQUFJLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7O1lBQzFELElBQUksYUFBYSxHQUFHLFlBQVksQ0FBQyxpQ0FBaUMsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVJLFlBQVksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDbEYsV0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFlBQVksQ0FBQztTQUMvQzs7Ozs7Ozs7OztJQVNFLG9EQUF1Qjs7Ozs7Ozs7Y0FBQyxRQUFvQixFQUFFLFVBQThCLEVBQUUsS0FBeUIsRUFBRSxhQUFzQjs7UUFDbEksSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7UUFFMUIsSUFBSSxjQUFjLEdBQVcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7UUFFN0MsSUFBSSxhQUFhLENBQVM7O1FBQzFCLElBQUksVUFBVSxHQUFXLE1BQU0sQ0FBQyxLQUFLLENBQUM7O1FBQ3RDLElBQUksY0FBYyxHQUFXLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUM5RCxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUVoQyxJQUFJLGFBQWEsSUFBSSxjQUFjLEVBQUU7O1lBQ2pDLElBQUksYUFBYSxHQUFHLGNBQWMsSUFBSSxDQUFDLEVBQUUsQ0FFeEM7aUJBQU07O2dCQUNILElBQUksT0FBTyxHQUFXLGFBQWEsR0FBRyxjQUFjLENBQUM7Z0JBQ3JELGFBQWEsR0FBRyxhQUFhLEdBQUcsT0FBTyxDQUFDOzthQUUzQztZQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxjQUFjLEVBQUU7b0JBQ3hDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO29CQUN2QyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztpQkFDL0I7YUFDSjtZQUNELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxRQUFRLEdBQUEsQ0FBQyxFQUFFO2dCQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUE7Z0JBQ3hDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7YUFDdEY7U0FDSjs7Ozs7OztJQU9FLHVEQUEwQjs7Ozs7Y0FBQyxXQUF1QjtRQUNyRCxJQUFJOztZQUNBLElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE1BQU0sSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQzs7WUFDcEYsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUV4QyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO1NBQzdDO1FBQUMsV0FBTTtTQUVQOzs7Ozs7O0lBT0UseURBQTRCOzs7OztjQUFDLFdBQXVCOztRQUN2RCxJQUFJLG1CQUFtQixDQUFlO1FBQ3RDLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE1BQU0sSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDO1FBQ25GLElBQUksbUJBQW1CLEVBQUU7O1lBQ3JCLElBQUksUUFBUSxHQUE4QixJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztnQkFDdEMsSUFBSSxXQUFXLEdBQXVCLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsb0JBQW9CLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixHQUFBLENBQUMsQ0FBQztnQkFDekksSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDZCxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNsRDthQUNKO1lBQ0QsbUJBQW1CLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDNUU7YUFBTTs7WUFDSCxJQUFJLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3ZDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQ25DLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUVuRSxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNqRDs7Ozs7Ozs7OztJQVVFLDJEQUE4Qjs7Ozs7Ozs7Y0FBQyxRQUFvQixFQUFFLFVBQThCLEVBQUUsS0FBeUIsRUFBRSxhQUFzQjs7UUFDekksSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7UUFDNUIsSUFBSSxFQUFFLEdBQVcsQ0FBQyxDQUFDOztRQUNuQixJQUFJLEVBQUUsR0FBVyxDQUFDLENBQUM7O1FBQ25CLElBQUksQ0FBQyxHQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTs7UUFDeEMsSUFBSSxDQUFDLEdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBQ2hELElBQUksUUFBUSxHQUFXLENBQUMsQ0FBQzs7UUFDekIsSUFBSSxNQUFNLEdBQVksS0FBSyxDQUFDO1FBRTVCLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3BDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQzs7UUFLRCxJQUFJLENBQUMsR0FBVyxDQUFDLENBQUM7UUFDbEIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFBLENBQUMsQ0FBQTtRQUN0RyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztZQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFFbEMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDUCxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUVQLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRTtvQkFFWCxFQUFFLEVBQUUsQ0FBQztvQkFDTCxDQUFDLEVBQUUsQ0FBQztpQkFDUDtnQkFDRCxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFFckIsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO3dCQUNmLE1BQU0sR0FBRyxJQUFJLENBQUM7d0JBQ2QsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7cUJBQ2hDO3lCQUFNO3dCQUNILE1BQU0sR0FBRyxJQUFJLENBQUM7O3dCQUdkLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDO3FCQUNyRTtvQkFDRCxFQUFFLEVBQUUsQ0FBQztvQkFDTCxDQUFDLEVBQUUsQ0FBQztpQkFDUDthQUVKOzs7O1lBSUQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQzthQUN2Rjs7Ozs7Ozs7U0FXSjs7Ozs7Ozs7Ozs7SUFRRSx3REFBMkI7Ozs7Ozs7OztjQUFDLFFBQW9CLEVBQUUsVUFBOEIsRUFBRSxLQUF5QixFQUFFLFVBQW1CLEVBQUUsYUFBc0I7O1FBRzNKLElBQUksY0FBYyxHQUFXLENBQUMsQ0FBQzs7UUFFL0IsSUFBSSxTQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztZQUN4QyxJQUFJLEdBQUcsR0FBZ0IsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUNyQyxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFBLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxHQUFHLElBQUssT0FBQSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFBLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1lBQ3ZELElBQUksbUJBQW1CLENBQUM7WUFDeEIsbUJBQW1CLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGFBQWEsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDOztZQUd2RixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDOzs7WUFHaEYsSUFBSSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssQ0FBQyxhQUFhLEVBQUU7Z0JBQ3hGLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGFBQWEsR0FBQSxDQUFDLEVBQUU7b0JBQzVELEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxhQUFhLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7aUJBQ3hFO2dCQUNELElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLEVBQUU7b0JBQzNELEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxZQUFZLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7aUJBQ3ZFO2dCQUNELElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGdCQUFnQixHQUFBLENBQUMsRUFBRTtvQkFDL0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGdCQUFnQixHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO2lCQUMzRTtnQkFDRCxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxlQUFlLEdBQUEsQ0FBQyxFQUFFO29CQUM5RCxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksZUFBZSxHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO2lCQUMxRTtnQkFDRCxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxjQUFjLEdBQUEsQ0FBQyxFQUFFO29CQUM3RCxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksY0FBYyxHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO2lCQUN6RTtnQkFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7O2dCQUdwQyxTQUFTLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxtQkFBbUIsR0FBQSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGFBQWEsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTthQUNoSztpQkFBTTtnQkFDSCxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDM0QsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxhQUFhLENBQUMsQ0FBQzs7Z0JBRXpHLElBQUksQ0FBQyxhQUFhLEVBQUU7b0JBQ2hCLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxZQUFZLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQy9GO3FCQUFNOztvQkFFSCxjQUFjLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksbUJBQW1CLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxDQUFBO2lCQUNuSDthQUVKO1lBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxTQUFTLEdBQUcsY0FBYyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQzs7U0FFekQ7Ozs7OztJQUlFLG9EQUF1Qjs7OztjQUFDLEdBQWdCO1FBQzNDLElBQUk7WUFDQSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxHQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO2dCQUN2RixHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQzthQUNuQixDQUFDLENBQUM7U0FDTjtRQUFDLFdBQU07U0FFUDs7Ozs7O0lBR0Usc0RBQXlCOzs7O2NBQUMsR0FBZ0I7UUFDN0MsSUFBSTtZQUNBLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsR0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztnQkFDMUYsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7YUFDbkIsQ0FBQyxDQUFDO1NBQ047UUFBQyxXQUFNO1NBRVA7Ozs7Ozs7O0lBUUUsMERBQTZCOzs7Ozs7Y0FBQyxHQUFnQixFQUFFLFFBQWdCO1FBQ25FLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDOzs7Ozs7OztJQVN0Siw0REFBK0I7Ozs7OztjQUFDLFFBQW9CLEVBQUUsR0FBZ0I7O1FBRXpFLElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFBLENBQUMsQ0FBQztRQUMvSSxJQUFJLGNBQWMsRUFBRTtZQUNoQixPQUFPLEtBQUssQ0FBQztTQUNoQjthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjs7Ozs7Ozs7SUFRRSxrREFBcUI7Ozs7OztjQUFDLFFBQW9CLEVBQUUsR0FBZ0I7UUFDL0QsSUFBSTs7WUFDQSxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksV0FBVyxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7O1lBQ3hFLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxNQUFNLEdBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQzs7WUFDdkYsSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzdFLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxVQUFVLENBQUM7U0FDckM7UUFBQyxXQUFNO1lBQ0osT0FBTyxDQUFDLENBQUM7U0FDWjs7Ozs7Ozs7Ozs7SUFTRSw2Q0FBZ0I7Ozs7Ozs7OztjQUFDLEdBQWdCLEVBQUUsYUFBcUIsRUFBRSxlQUF1QixFQUFFLGNBQXNCLEVBQUUsYUFBc0I7UUFDcEksSUFBSTs7WUFDQSxJQUFJLGdCQUFnQixDQUFTOztZQUM3QixJQUFJLGFBQWEsQ0FBUzs7WUFFMUIsSUFBSSxhQUFhLEVBQUU7Z0JBQ2YsZ0JBQWdCLEdBQUcsY0FBYyxDQUFDO2dCQUNsQyxhQUFhLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLGVBQWUsQ0FBQzthQUN4RDtpQkFBTTtnQkFDSCxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxtQkFBbUIsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUMzRixhQUFhLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLGFBQWEsR0FBRyxDQUFDLGVBQWUsQ0FBQzthQUN6RTtZQUdELE9BQU8sYUFBYSxDQUFDO1NBQ3hCO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNuQjs7Ozs7Ozs7SUFhRSxnREFBbUI7Ozs7OztjQUFDLEdBQWdCLEVBQUUsVUFBa0I7UUFDM0QsSUFBSTs7O1lBR0EsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztZQUVsSCxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksWUFBWSxHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO1NBQ3pMO1FBQUMsV0FBTTtTQUNQOzs7Ozs7Ozs7SUEwRUUsOENBQWlCOzs7Ozs7O2NBQUMsR0FBZ0IsRUFBRSxLQUF5QixFQUFFLGdCQUF3Qjs7UUFLMUYsSUFBSSxxQkFBcUIsQ0FBaUI7O1FBQzFDLElBQUksb0JBQW9CLENBQWlCOztRQUN6QyxJQUFJLG1CQUFtQixDQUFpQjtRQUd4QyxxQkFBcUIsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksZ0JBQWdCLEdBQUEsQ0FBQyxDQUFDO1FBQ2xGLG9CQUFvQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxlQUFlLEdBQUEsQ0FBQyxDQUFDO1FBQ2hGLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxjQUFjLEdBQUEsQ0FBQyxDQUFDO1FBRTlFLElBQUkscUJBQXFCLEVBQUUsQ0FFMUI7YUFBTTtZQUNILHFCQUFxQixHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7WUFDOUMsb0JBQW9CLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUM3QyxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQzVDLHFCQUFxQixDQUFDLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQTtZQUN2RCxvQkFBb0IsQ0FBQyxjQUFjLEdBQUcsZUFBZSxDQUFBO1lBQ3JELG1CQUFtQixDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7WUFFbkQscUJBQXFCLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTtZQUNoQyxvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO1lBQy9CLG1CQUFtQixDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7WUFFOUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQTtZQUNyQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1lBQ3BDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUE7U0FFdEM7UUFHRCxxQkFBcUIsQ0FBQyxLQUFLLEdBQUcscUJBQXFCLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQy9FLG1CQUFtQixDQUFDLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztRQUN6RixvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7UUFHNUYsSUFBSSxVQUFVLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztRQUMxRSxJQUFJLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7O1FBQ3BFLElBQUksU0FBUyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV4RSxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsaUJBQWlCLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGVBQWUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNoRixJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDcEY7Ozs7Ozs7O0lBR0wsc0RBQXlCOzs7Ozs7SUFBekIsVUFBMEIsY0FBc0MsRUFBRSxjQUFzQixFQUFFLGFBQXFCOztRQUMzRyxJQUFJLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLGNBQWMsR0FBQSxDQUFDLENBQUM7UUFDcEYsSUFBSSxnQkFBZ0IsRUFBRTtZQUNsQixnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDO1NBQzFDO2FBQ0k7WUFDRCxnQkFBZ0IsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLGdCQUFnQixDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7WUFDakQsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQztZQUN2QyxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDekM7S0FDSjs7Ozs7OztJQU9PLGlEQUFvQjs7Ozs7O2NBQUMsbUJBQXVDLEVBQUUsV0FBdUI7O1FBQ3pGLElBQUk7O1lBQ0EsSUFBSSxVQUFVLENBQXFCO1lBQ25DLFVBQVUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLEdBQUc7Z0JBQ3JDLElBQUksR0FBRyxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7b0JBQ25DLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDbEM7Z0JBQ0QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ3ZCLElBQUksR0FBRyxDQUFDLGVBQWUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7Ozt3QkFHdkYsT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsb0JBQW9CLElBQUksbUJBQW1CLENBQUMsb0JBQW9CLEdBQUEsQ0FBQyxDQUFDO3FCQUM5STt5QkFBTTt3QkFDSCxPQUFPLEtBQUssQ0FBQztxQkFDaEI7aUJBQ0o7cUJBQ0k7b0JBQ0QsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO2FBQ0osQ0FBQyxDQUFDO1lBQ0gsT0FBTyxVQUFVLENBQUM7U0FDckI7UUFBQyxXQUFNO1lBQ0osT0FBTyxJQUFJLENBQUM7U0FDZjs7Ozs7O0lBR0UsaURBQW9COzs7O2NBQUMsWUFBeUI7UUFDakQsSUFBSTs7WUFDQSxJQUFJLGdCQUFnQixDQUFrQjtZQUN0QyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksWUFBWSxHQUFBLENBQUMsQ0FBQTtZQUNqRixJQUFJLGdCQUFnQixFQUFFO2dCQUNsQixZQUFZLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDckU7U0FDSjtRQUFDLFdBQU07U0FFUDs7Ozs7Ozs7SUFPRyx3REFBMkI7Ozs7OztjQUFDLFVBQThCLEVBQUUsYUFBc0I7O1FBRXRGLElBQUksUUFBUSxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7UUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O1lBQ3hDLElBQUksR0FBRyxHQUFnQixVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBQ3JDLElBQUksU0FBUyxDQUFTOztZQUN0QixJQUFJLFdBQVcsQ0FBUztZQUN4QixTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7O1lBRzNFLElBQUksYUFBYSxFQUFFO2dCQUNmLFdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQTthQUNoRjtpQkFBTTtnQkFDSCxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksT0FBTyxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUE7YUFDNUU7WUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUMxRTtTQUNKO1FBQ0QsT0FBTyxRQUFRLENBQUM7Ozs7Ozs7OztJQXNDYixtREFBc0I7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLGFBQTBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNFMUUsbURBQXNCOzs7OztjQUFDLFdBQXVCOztRQUNqRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLFdBQVcsS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDOUQsa0JBQWtCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGNBQWMsR0FBQSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBQSxDQUFDO2dCQUMxSCxNQUFNLENBQUMsVUFBQyxHQUFHLEVBQUUsR0FBRyxJQUFLLE9BQUEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGNBQWMsR0FBQSxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxhQUFhLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQTtTQUM1TDs7UUFFRCxPQUFPLGtCQUFrQixDQUFDOzs7Ozs7OztJQVF2Qiw4REFBaUM7Ozs7OztjQUFDLE9BQW1CLEVBQUUsY0FBaUM7O1FBRTNGLElBQUksa0JBQWtCLEdBQVcsT0FBTyxDQUFDLFNBQVMsQ0FBQzs7UUFFbkQsSUFBSSx1QkFBdUIsR0FBVyxDQUFDLENBQUM7O1FBRXhDLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFbEcsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ25CLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTs7Z0JBQ2xELElBQUksVUFBVSxHQUFhLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7O2dCQUVqRCxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFFMUYsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztvQkFDaEMsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO29CQUN4RCx1QkFBdUIsSUFBSSxJQUFJLENBQUMsb0NBQW9DLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLENBQUM7aUJBQzNKO2FBQ0o7U0FDSjs7OztRQUtELHVCQUF1QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sdUJBQXVCLENBQUM7Ozs7Ozs7O0lBUTVCLDREQUErQjs7Ozs7O2NBQUMsMkJBQWdELEVBQUUsYUFBaUM7O1FBQ3RILElBQUksb0JBQW9CLEdBQUcsSUFBSSxLQUFLLEVBQWdCLENBQUM7UUFDckQsSUFBSSwyQkFBMkIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hDLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFOztnQkFDOUMsSUFBSSxTQUFTLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7O29CQUNsRixJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDO29CQUN6RSxJQUFJLGFBQWEsRUFBRTs7d0JBQ2YsSUFBSSxPQUFPLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0RBQ3BDLEVBQUU7OzRCQUNQLElBQUksS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs0QkFDekIsSUFBSSxVQUFVLEdBQUcsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFdBQVcsSUFBSSxLQUFLLEdBQUEsQ0FBQyxDQUFDOzRCQUMvRSxJQUFJLFVBQVUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxXQUFXLElBQUksS0FBSyxHQUFBLENBQUMsRUFBRTtnQ0FDdkUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBOzZCQUN4Qzs7d0JBTEwsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFO29DQUFqQyxFQUFFO3lCQU1WO3FCQUNKO2lCQUNKO2FBQ0o7U0FDSjtRQUNELE9BQU8sb0JBQW9CLENBQUM7Ozs7Ozs7O0lBUXpCLHdFQUEyQzs7Ozs7O2NBQUMsWUFBK0IsRUFBRSxhQUFpQzs7UUFDakgsSUFBSSwyQkFBMkIsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRW5ILE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLDJCQUEyQixFQUFFLGFBQWEsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztJQU9yRiw0REFBK0I7Ozs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsUUFBZ0IsRUFBRSxJQUFTLEVBQzVGLFNBQW1CLEVBQUUsWUFBc0I7O1FBRzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMscUNBQXFDLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBQzlGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7O1lBQ3ZDLElBQUksU0FBUyxDQUFhO1lBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZCLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDO2dCQUM3QixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakM7aUJBQU07Z0JBQ0gsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2FBQzdCO1lBRUQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3hCLEVBQ0csVUFBQSxHQUFHO1lBQ0MsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkMsQ0FBQyxDQUFDOzs7Ozs7OztJQVFKLHlEQUE0Qjs7Ozs7O2NBQUMsVUFBb0IsRUFBRSxnQkFBcUM7O1FBRTNGLElBQUksZUFBZSxHQUFHLElBQUksS0FBSyxFQUFnQixDQUFDO1FBQ2hELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7O1lBQ2pELElBQUksV0FBVyxHQUFHLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDOztZQUN2QyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUV4RCxRQUFRLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO2dCQUMvQixLQUFLLFNBQVM7O29CQUVWLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsSUFBSSxNQUFNLEVBQUU7d0JBQzVILFdBQVcsQ0FBQyxLQUFLLEdBQUcsT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO3FCQUNsRTt5QkFDSTt3QkFDRCxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztxQkFDdkQ7O29CQUNELElBQUksRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQzVDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUU7d0JBQzNDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQ3JDO29CQUNELE1BQU07YUFDYjtTQUNKO1FBQ0QsT0FBTyxlQUFlLENBQUM7Ozs7Ozs7OztJQU9wQiw4REFBaUM7Ozs7Ozs7Y0FBQyxjQUFpQyxFQUFFLFNBQWlCLEVBQUUsS0FBYTs7UUFDeEcsSUFBSSxnQkFBZ0IsR0FBd0IsSUFBSSxLQUFLLEVBQWdCLENBQUM7O1FBQ3RFLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFFckIsSUFBSSxjQUFjLEVBQUU7WUFDaEIsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7O2dCQUMvQyxJQUFJLGVBQWUsR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7O2dCQUN6QyxJQUFJLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7O2dCQUNuRCxJQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQy9DLElBQUksZUFBZSxDQUFDLE1BQU0sSUFBSSxTQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sSUFBSSxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUU7b0JBQ2hHLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxlQUFlLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFOzt3QkFDbEUsSUFBSSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBRTdELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFOzs0QkFDOUQsSUFBSSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNwRCxJQUFJLFdBQVcsQ0FBQyxZQUFZLEVBQUU7O2dDQUMxQixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQ0FDeEQsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLEVBQUU7b0NBQ3pFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQ0FDdEM7NkJBQ0o7eUJBQ0o7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsT0FBTyxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7SUFTckIsaUVBQW9DOzs7Ozs7Ozs7Y0FBQyxrQkFBMEIsRUFBRSxTQUF3QixFQUFFLGdCQUF3QixFQUFFLGNBQW1DLEVBQUUsY0FBaUM7OztRQUM5TCxJQUFJLG1CQUFtQixDQUFDOztRQUN4QixJQUFJLGVBQWUsQ0FBQzs7UUFDcEIsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7O1FBQzFCLElBQUksa0JBQWtCLEdBQVcsZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUM7O1FBQ3ZFLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQzs7WUFDdkIsS0FBbUIsSUFBQSxjQUFBQSxTQUFBLFNBQVMsQ0FBQSxvQ0FBQSwyREFBRTtnQkFBekIsSUFBTSxJQUFJLHNCQUFBO2dCQUNYLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztnQkFDekIsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDO2dCQUN4RSxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7O2dCQUNwRixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxRQUFRLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO29CQUM1QyxjQUFjLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUNwQztnQkFDRCxJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFO29CQUMxQyxtQkFBbUIsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDMUQ7d0NBQ1UsUUFBUTtvQkFDZixJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEdBQUEsQ0FBQyxFQUFFOzt3QkFDM0QsSUFBSSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxXQUFXLElBQUksUUFBUSxDQUFDLFdBQVcsR0FBQSxDQUFDLENBQUM7O3dCQUM1RSxJQUFJLEtBQUssR0FBRyxPQUFLLGVBQWUsQ0FBQyxLQUFLLEVBQUUsY0FBYyxHQUFHLE9BQUsscUNBQXFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksa0JBQWtCLENBQUMsQ0FBQzt3QkFDekksaUJBQWlCLElBQUksS0FBSyxDQUFDOztxQkFFOUI7Ozs7b0JBTkwsS0FBdUIsSUFBQSxtQkFBQUEsU0FBQSxjQUFjLENBQUEsOENBQUE7d0JBQWhDLElBQU0sUUFBUSwyQkFBQTs4Q0FBUixRQUFROzs7cUJBT2xCOzs7Ozs7Ozs7YUFDSjs7Ozs7Ozs7O1FBQ0QsT0FBTyxpQkFBaUIsQ0FBQzs7Ozs7O0lBRzdCLGtFQUFxQzs7OztJQUFyQyxVQUFzQyxLQUFLO1FBQ3ZDLElBQUk7O1lBQ0EsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEQsSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtnQkFDakYsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDekM7U0FDSjtRQUFDLFdBQU07U0FDUDtRQUNELE9BQU8sQ0FBQyxDQUFDO0tBQ1o7Ozs7OztJQUVELDRDQUFlOzs7OztJQUFmLFVBQWdCLEtBQUssRUFBRSxLQUFhO1FBQ2hDLElBQUk7O1lBQ0EsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEQsSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDcEYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN4RTtTQUNKO1FBQUMsV0FBTTtZQUNKLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxLQUFLLENBQUM7S0FDaEI7Ozs7Ozs7SUFPTSxpRUFBb0M7Ozs7OztjQUFDLE9BQW1CLEVBQUUsY0FBaUM7O1FBQzlGLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFBO1FBQzFCLElBQUksY0FBYyxFQUFFO1lBQ2hCLGtCQUFrQixHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDeEY7UUFFRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsRUFBRTs7WUFDeEIsSUFBSSxxQkFBcUIsR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUM3RCxxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFBO1lBQzdDLHFCQUFxQixDQUFDLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUU1RCxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsT0FBTyxPQUFPLENBQUM7Ozs7Ozs7Ozs7O0lBV1osc0RBQXlCOzs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFFBQWdCLEVBQUUsSUFBUyxFQUN0RixTQUFtQixFQUFFLFlBQXNCO1FBQzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsK0JBQStCLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBQ3hGLElBQUksY0FBYyxDQUFDO1lBQ25CLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7WUFDdkUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQzdCLEVBQ0csVUFBQSxHQUFHO1lBQ0MsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkMsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztJQVdKLDBEQUE2Qjs7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVMsRUFDMUYsU0FBbUIsRUFBRSxZQUFzQjs7UUFFM0MsYUFBYSxDQUFDLHdCQUF3QixDQUFDLG1DQUFtQyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBQ3ZHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QixFQUNHLFVBQUEsR0FBRztZQUNDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNyQixDQUFDLENBQUM7Ozs7Ozs7Ozs7O0lBV0osdURBQTBCOzs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFFBQWdCLEVBQUUsSUFBUyxFQUN2RixTQUFtQixFQUFFLFlBQXNCO1FBRTNDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxnQ0FBZ0MsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUNwRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkIsRUFDRyxVQUFBLEdBQUc7WUFDQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckIsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztJQVdKLGlEQUFvQjs7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVMsRUFDakYsU0FBbUIsRUFBRSxZQUFzQjs7UUFFM0MsYUFBYSxDQUFDLHdCQUF3QixDQUFDLDBCQUEwQixHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBQzlGLFNBQVMsRUFBRSxDQUFDO1NBQ2YsRUFDRyxVQUFBLEdBQUc7WUFDQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckIsQ0FBQyxDQUFDOzs7Ozs7SUFJSiw2Q0FBZ0I7Ozs7Y0FBQyxLQUF5QjtRQUM3QyxJQUFJLEtBQUssRUFBRTs7WUFDUCxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUEsQ0FBQztnQkFDckcsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0RyxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2hCLE9BQU8sQ0FBQyxDQUFDO2FBQ1o7aUJBQU07Z0JBQ0gsT0FBTyxTQUFTLENBQUM7YUFDcEI7U0FDSjthQUFNO1lBQ0gsT0FBTyxDQUFDLENBQUM7U0FDWjs7NkJBeGtGVDtJQTBrRkM7Ozs7Ozs7SUM1akZHO3dCQUhzQyxJQUFJLFlBQVksRUFBRTtnQ0FDN0IsSUFBSTtRQUczQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN0QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtTQUNsQztLQUVKOzs7O0lBRUQsK0NBQWdCOzs7SUFBaEI7O1FBQ0ksSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzs7UUFDdkQsSUFBSSxXQUFXLENBQUM7O1FBQ2hCLElBQUksSUFBSSxHQUFZLElBQUksQ0FBQzs7UUFDekIsSUFBSSxNQUFNLENBQUM7UUFFWCxJQUFJLFdBQVcsRUFBRTtZQUNiLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFO2dCQUNwRixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUV6RCxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksU0FBUyxFQUFFO29CQUNuRSxJQUFJLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztpQkFDL0I7YUFDSjtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDZjs7OztJQUVNLHVEQUF3Qjs7OztRQUUzQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwRixPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7UUFJckMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0dBQWdHLENBQUMsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW1Cakgsd0NBQVM7OztJQUFUO1FBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7U0FDbkM7YUFDSTtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDM0U7S0FDSjs7OztJQUVELDJDQUFZOzs7SUFBWjs7UUFDSSxJQUFJLFdBQVcsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDOztRQUN2RCxJQUFJLFdBQVcsQ0FBQztRQUVoQixJQUFJLFdBQVcsRUFBRTtZQUNiLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDekIsT0FBTyxXQUFXLENBQUMsV0FBVyxDQUFDO2FBQ2xDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNmOzs7O0lBRU0sd0NBQVM7Ozs7O1FBQ1osSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDNUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDOzs7OztJQUluQix5REFBMEI7Ozs7O1FBQzdCLElBQUksY0FBYyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7O1FBQzdELElBQUksY0FBYyxDQUFDO1FBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO1lBQ3hELGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVDLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtnQkFDeEcsT0FBTyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQzthQUNqRDtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7Ozs7OztJQWNILHNDQUFPOzs7O2NBQUMsUUFBUTs7Ozs7NEJBRWIscUJBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBQTs7d0JBQXpDLFNBQVMsR0FBRyxTQUE2QixDQUFBO3dCQUN6QyxzQkFBTyxTQUFTLEVBQUE7Ozs7Ozs7OztJQUtiLG1DQUFJOzs7O2NBQUMsTUFBYzs7UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztRQUNoRCxJQUFJLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3pDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQzNCLEtBQUssRUFBRSxJQUFJO1NBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBQSxNQUFNO1lBRXBCLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUdBQXVHLENBQUMsQ0FBQTtTQUN2SCxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFBLE1BQU07WUFDbEIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxR0FBcUcsQ0FBQyxDQUFBO1NBQ3JILENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRztZQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBOztTQUV2QixDQUFDLENBQUM7Ozs7OztJQUdBLGtDQUFHOzs7O2NBQUMsRUFBVTtRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7OztJQUcxQixvQ0FBSzs7OztRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzs7Ozs7SUFHbEQsNENBQWE7Ozs7UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDOzs7OztJQUduRCxzQ0FBTzs7OztRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Ozs7SUFHekIsZ0RBQWlCOzs7O1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7O0lBR2xCLHVDQUFROzs7O2NBQUMsRUFBRTs7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNO1lBQzdCLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkMsQ0FBQyxDQUFDOzs7OztJQUdBLDRDQUFhOzs7OztRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU87WUFDdEQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7Z0JBQ3ZCLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2FBQzlELENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxVQUFVO1lBQ2QsT0FBTyxLQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM3QyxDQUFDLENBQUM7OztnQkFsTFYsVUFBVSxTQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7Ozs7K0JBTEQ7Ozs7Ozs7SUNTQTtJQUtJLGdDQUFZLFFBQVE7dUJBSkYsSUFBSSxNQUFNLEVBQUU7bUNBRVMsS0FBSztRQUd4QyxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztRQUMzQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztLQUNqQzs7OztJQUdNLHVEQUFzQjs7Ozs7UUFDekIsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFOztZQUN4QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25DLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7O2dCQUM1RCxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLGdCQUFnQixHQUFBLENBQUMsQ0FBQztnQkFDekYsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLEVBQUU7b0JBQ3pCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7aUJBQ25DO2FBQ0o7U0FDSjs7Ozs7Ozs7SUFJUSx5REFBd0I7Ozs7OztjQUFDLGVBQTZCLEVBQUUsU0FBYyxFQUFFLGNBQTZCOzs7Ozs7O3dCQUU5RSxLQUFBQSxTQUFBLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQTs7Ozt3QkFBckQsaUJBQWlCO3dCQUN4QixxQkFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsRUFBQTs7d0JBQWpGLFNBQWlGLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt3QkFHNUQsS0FBQUEsU0FBQSxlQUFlLENBQUMsY0FBYyxDQUFBOzs7O3dCQUE1QyxVQUFVOzs7O3dCQUNJLEtBQUFBLFNBQUEsVUFBVSxDQUFDLE1BQU0sQ0FBQTs7Ozt3QkFBM0IsTUFBTTt3QkFDYixxQkFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQUE7O3dCQUF0RSxTQUFzRSxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NkJBRzlFLHNCQUFPLEVBQUUsRUFBQzs7Ozs7Ozs7Ozs7SUFJRCxtREFBa0I7Ozs7OztjQUFDLGVBQTZCLEVBQUUsU0FBYyxFQUFFLGNBQTZCOzs7Ozs7O3dCQUN4RyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzs4QkFDMUIsU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLENBQUMsY0FBYyxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUEsRUFBaEssd0JBQWdLOzs7Ozs7d0NBRXhKLE1BQU0sR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dDQUMzQyxXQUFXLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dDQUM1RCxZQUFZLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBQSxDQUFDLENBQUM7OENBQ25GLFlBQVksSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUEsRUFBckQsd0JBQXFEOzZDQUNqRCxDQUFDLE9BQUssbUJBQW1CLEVBQXpCLHdCQUF5Qjt3Q0FDekIsUUFBUSxXQUFXLENBQUMsQ0FBQyxDQUFDOzRDQUNsQixLQUFLLElBQUk7Z0RBQ0wsWUFBWSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDO2dEQUN0QyxNQUFNOzRDQUNWLEtBQUssSUFBSTtnREFDTCxZQUFZLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0RBQ3RDLE1BQU07NENBQ1YsS0FBSyxJQUFJO2dEQUNMLFlBQVksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQztnREFDdEMsTUFBTTs0Q0FDVixRQUFRO3lDQUNYOzs7O3dDQUlPLHFCQUFxQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQzt3Q0FDdEMscUJBQU0scUJBQXFCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBOzt3Q0FBNUQsVUFBVSxHQUFHLFNBQStDO3dDQUM1RCxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7d0NBQ3RELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRDQUNsRSxXQUFhLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs0Q0FDekYsWUFBWSxDQUFDLE1BQU0sR0FBRyxPQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxRQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7NENBQzFFLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBQSxZQUFZO2dEQUM5QyxZQUFZLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsUUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBOzZDQUMxRSxDQUFDLENBQUM7eUNBQ047Ozs7d0NBR0QsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsR0FBRyxJQUFFLENBQUMsT0FBTyxHQUFHLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTs7OzhDQUsxRixZQUFZLEtBQUssU0FBUyxDQUFBLEVBQTFCLHdCQUEwQjt3Q0FDMUIsTUFBTSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7OzRDQUVuQyxxQkFBTSxPQUFLLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQUE7O3dDQUF2RSxTQUF1RSxDQUFDOzs7Ozs7O3dCQXpDdkUsQ0FBQyxHQUFHLENBQUM7Ozs4QkFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUE7Ozs7Ozt3QkFBRSxDQUFDLEVBQUUsQ0FBQTs7O3dCQTRDMUQsaUJBQWlCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO3dCQUMvQyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDO3dCQUMzQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7d0JBQzdELGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs7OzZCQUUzRCxlQUFlLEVBQWYsd0JBQWU7d0JBQ2YscUJBQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQUE7O3dCQUEvRSxTQUErRSxDQUFDOzs0QkFFcEYsc0JBQU8sRUFBRSxFQUFDOzs7Ozs7Ozs7OztJQUdELDJEQUEwQjs7Ozs7O2NBQUMsTUFBb0IsRUFBRSxTQUFjLEVBQUUsY0FBNkI7Ozs7Ozs4QkFDbkcsU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUEsRUFBakgsd0JBQWlIO3dCQUM3RyxZQUFZLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFBLENBQUMsQ0FBQzs4QkFDdkcsWUFBWSxLQUFLLFNBQVMsQ0FBQSxFQUExQix3QkFBMEI7d0JBQzFCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDOzs0QkFFbkMscUJBQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQUE7O3dCQUF2RSxTQUF1RSxDQUFDOzs0QkFHaEYsc0JBQU8sRUFBRSxFQUFDOzs7Ozs7Ozs7OztJQUlELDBEQUF5Qjs7Ozs7O2NBQUMsTUFBb0IsRUFBRSxTQUFjLEVBQUUsY0FBNkI7Ozs7Ozt3QkFDbEcsTUFBTSxHQUFXLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO3dCQUNwRCxhQUFhLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7OEJBRWpFLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFBLEVBQTdCLHdCQUE2Qjt3QkFDekIsS0FBSyxHQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ2xJLHFCQUFNLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBQTs7d0JBQTlGLE1BQU0sR0FBRyxTQUFxRjt3QkFDbEcsSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLENBQUMsRUFBRTs0QkFDbkIsV0FBVyxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7NEJBQ25DLFdBQVcsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7NEJBQ3pELFdBQVcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQzs0QkFDL0IsV0FBVyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7NEJBQzVCLFdBQVcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQzs0QkFDN0IsTUFBTSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7eUJBQ3JDOzs7Ozs7O2lDQXRJYjtJQTJJQzs7Ozs7OztJQzNIRztLQUFpQjs7Ozs7Ozs7O0lBR1Ysa0RBQXVCOzs7Ozs7OztjQUFDRSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQzdGLFVBQW9CLEVBQUUsV0FBcUI7O1FBQzNDLElBQUksSUFBSSxDQUFDO1FBQ1QsSUFBSSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFBO1FBQ2pDQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUV2RixVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzNDLEVBQ0csVUFBQSxHQUFHOztZQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xDLENBQUMsQ0FBQzs7Ozs7Ozs7OztJQUlKLG1EQUF3Qjs7Ozs7Ozs7Y0FBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxXQUFtQixFQUNoRyxVQUFvQixFQUFFLFdBQXFCO1FBQzNDQSxnQkFBYSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBQzlGLElBQUksV0FBVyxDQUFNO1lBQ3JCLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFFbkIsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzNCLEVBQ0csVUFBQSxHQUFHOztZQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQixDQUFDLENBQUM7Ozs7Ozs7OztJQUlKLHNDQUFXOzs7Ozs7O2NBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQzlELFVBQW9CLEVBQUUsV0FBcUI7UUFDM0NBLGdCQUFhLENBQUMsS0FBSyxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBR3BFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFN0IsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JCLEVBQ0csVUFBQSxHQUFHOztZQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQixDQUFDLENBQUM7Ozs7Ozs7Ozs7SUFNSiw4Q0FBbUI7Ozs7Ozs7O2NBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsU0FBYyxFQUN0RixVQUFvQixFQUFFLFdBQXFCO1FBQzNDQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsR0FBRyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFHL0YsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzs7WUFDeEMsSUFBSSxVQUFVLENBQWE7WUFDM0IsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFOztnQkFFckQsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFNLEtBQUssQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDL0Q7aUJBQU07Z0JBQ0gsVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO2FBQy9DO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN4QixVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDMUIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0lBTVgsOENBQW1COzs7Ozs7Ozs7Ozs7O0lBQW5CLFVBQW9CQSxnQkFBNEIsRUFBRSxTQUF5QixFQUFFLFFBQWdCLEVBQUUsU0FBaUIsRUFDNUcsVUFBb0IsRUFBRSxXQUFxQixFQUFjLFdBQWtCLEVBQWMsZUFBc0IsRUFBYyxRQUFjLEVBQWMsY0FBb0I7d0RBQWxHO2dFQUFvQztpREFBNEI7NkRBQWtDOztRQUM3SyxJQUFJLFNBQVMsQ0FBQztRQUNkLFNBQVMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUNsTSxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDbkJBLGdCQUFhLENBQUMsYUFBYSxDQUFDLCtCQUErQixHQUFHLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztnQkFFOUYsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQzthQUMvQixFQUNHLFVBQUEsR0FBRzs7Z0JBRUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbEMsQ0FBQyxDQUFDO1NBQ1Y7YUFBTTtZQUNILFdBQVcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ2xEO0tBQ0o7Ozs7Ozs7Ozs7Ozs7O0lBSUQsZ0RBQXFCOzs7Ozs7Ozs7Ozs7SUFBckIsVUFBc0JBLGdCQUE0QixFQUFFLFVBQWtCLEVBQUUsa0JBQWtCLEVBQUUsT0FBZSxFQUFFLFNBQWlCLEVBQzFILFVBQW9CLEVBQUUsV0FBcUIsRUFBYyxXQUFrQixFQUFjLGNBQTRCO3dEQUExQzs2REFBMEM7O1FBQ3JILElBQUksU0FBUyxDQUFpQjs7UUFDOUIsSUFBSSxTQUFTLENBQUM7UUFDZCxTQUFTLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUV0RixTQUFTLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDdkksSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO1lBQ25CQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsR0FBRyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7Z0JBRTlGLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDL0IsRUFDRyxVQUFBLEdBQUc7O2dCQUVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbEMsQ0FBQyxDQUFDO1NBQ1Y7YUFBTTtZQUNILFdBQVcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ2xEO0tBRUo7Ozs7Ozs7Ozs7SUFPRCw4REFBbUM7Ozs7Ozs7O0lBQW5DLFVBQW9DQSxnQkFBNEIsRUFBRSxVQUFrQixFQUFFLFNBQWlCLEVBQ25HLFVBQW9CLEVBQUUsV0FBcUI7UUFFM0NBLGdCQUFhLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFFekcsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMxQixFQUNHLFVBQUEsR0FBRzs7WUFFQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEIsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7Ozs7Ozs7SUFLRCw2Q0FBa0I7Ozs7Ozs7Ozs7O0lBQWxCLFVBQW1CQSxnQkFBNEIsRUFBRSxPQUFlLEVBQUUsV0FBbUIsRUFBRSxTQUFpQixFQUFFLFFBQWdCLEVBQ3RILFVBQW9CLEVBQUUsV0FBcUIsRUFBYyxjQUE0Qjs2REFBQTs7UUFFckYsSUFBSSxLQUFLLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDbEdBLGdCQUFhLENBQUMsYUFBYSxDQUFDLG1DQUFtQyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRTlHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQixFQUNHLFVBQUEsR0FBRztZQUNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O1lBRWpCLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QyxDQUFDLENBQUM7S0FDVjs7Ozs7Ozs7Ozs7O0lBRUQsaURBQXNCOzs7Ozs7Ozs7OztJQUF0QixVQUF1QkEsZ0JBQTRCLEVBQUUsT0FBZSxFQUFFLFdBQW1CLEVBQUUsU0FBaUIsRUFBRSxRQUFnQixFQUMxSCxVQUFvQixFQUFFLFdBQXFCLEVBQWMsY0FBNEI7NkRBQUE7O1FBRXJGLElBQUksS0FBSyxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxDQUFDO1FBQ2xHQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUU5RyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7WUFDQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7WUFFdkIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxQixDQUFDLENBQUM7S0FDVjs7Ozs7Ozs7OztJQUdELGtEQUF1Qjs7Ozs7Ozs7SUFBdkIsVUFBd0JBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsUUFBUSxFQUM3RSxVQUFvQixFQUFFLFdBQXFCO1FBRC9DLGlCQXFCQzs7O1FBZkcsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDNUNBLGdCQUFhLENBQUMsS0FBSyxDQUFDLCtCQUErQixHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7Z0JBQzNFLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QixLQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUM7OztnQkFHekMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3hCLEVBQ0csVUFBQSxLQUFLOztnQkFFRCxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEIsQ0FBQyxDQUFDO1NBQ1Y7YUFBTTtZQUNILFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN4QjtLQUNKOzs7Ozs7SUFHRCxvREFBeUI7Ozs7SUFBekIsVUFBMEIsU0FBUztRQUMvQixJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUNuRTs7Ozs7Ozs7SUFJRCxvREFBeUI7Ozs7OztJQUF6QixVQUEwQixTQUFpQixFQUFFLFNBQWlCLEVBQUUsa0JBQWtCOztRQUM5RSxJQUFJLGNBQWMsR0FBVyxFQUFFLENBQUM7O1FBQ2hDLElBQUksYUFBYSxDQUFDOztRQUVsQixJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBVyxDQUFDOztRQUNyQyxJQUFJLFFBQVEsQ0FBVTs7UUFDdEIsSUFBSSxjQUFjLENBQVM7OztRQUszQixhQUFhLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztRQUU3RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMzQixPQUFPLFNBQVMsSUFBSSxFQUFFLEVBQUU7Z0JBRXBCLGNBQWMsR0FBRyxjQUFjLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxhQUFhLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLGNBQWMsQ0FBQyxRQUFRLEVBQUUsR0FBQSxDQUFDLENBQUM7Z0JBRXJILGNBQWMsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDaEQsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMxRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM1Qjs7O2FBS0o7U0FDSjthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sU0FBUyxDQUFDO0tBQ3BCOzs7Ozs7SUFHRCxnREFBcUI7Ozs7SUFBckIsVUFBc0IsU0FBUztRQUEvQixpQkFXQztRQVZHLElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDbkMsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQzFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3REO2lCQUFNO2dCQUNILFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSTtvQkFDNUIsS0FBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNwQyxDQUFDLENBQUM7YUFDTjtTQUNKO0tBQ0o7Ozs7Ozs7Ozs7Ozs7SUFHRCx3Q0FBYTs7Ozs7Ozs7Ozs7SUFBYixVQUFjQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLFdBQW1CLEVBQUUsV0FBbUIsRUFBRSxTQUF1QixFQUFFLFVBQW9CLEVBQUUsV0FBcUIsRUFBRSxXQUE0QjtRQUE1Qiw0QkFBQSxFQUFBLG1CQUE0Qjs7UUFDdk0sSUFBSSxJQUFJLENBQUM7UUFDVCxJQUFJLEdBQUcsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFFeEhBLGdCQUFhLENBQUMsd0JBQXdCLENBQUMsd0JBQXdCLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRXBHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQixFQUNHLFVBQUEsS0FBSzs7WUFFRCxXQUFXLEVBQUUsQ0FBQztTQUNqQixDQUFDLENBQUM7S0FDVjs7Ozs7Ozs7Ozs7SUFHRCw4Q0FBbUI7Ozs7Ozs7OztJQUFuQixVQUFvQkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxJQUFTLEVBQzFFLFVBQW9CLEVBQUUsV0FBcUIsRUFBRSxTQUFjO1FBQzNEQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFFMUYsSUFBSSxRQUFRLEdBQVEsSUFBSSxDQUFDOztZQUN6QixJQUFJLHVCQUF1QixHQUFHLElBQUksc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEUsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRUEsZ0JBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7Z0JBQ2pGLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN4QixDQUFDLENBQUM7U0FFTixFQUNHLFVBQUEsS0FBSzs7WUFFRCxXQUFXLEVBQUUsQ0FBQztTQUNqQixDQUFDLENBQUM7S0FDVjs7Ozs7Ozs7Ozs7SUFFRCxvREFBeUI7Ozs7Ozs7OztJQUF6QixVQUEwQkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxJQUFTLEVBQ2hGLFVBQW9CLEVBQUUsV0FBcUIsRUFBRSxTQUFjO1FBQzNEQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyxzQ0FBc0MsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFFaEcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCLEVBQ0csVUFBQSxLQUFLOztZQUVELFdBQVcsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQztLQUNWOzs7Ozs7Ozs7O0lBRUQsa0RBQXVCOzs7Ozs7OztJQUF2QixVQUF3QkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxJQUFTLEVBQzlFLFVBQW9CLEVBQUUsV0FBcUI7UUFDM0NBLGdCQUFhLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFFekYsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hCLEVBQ0csVUFBQSxLQUFLOztZQUVELFdBQVcsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQztLQUNWOzs7Ozs7Ozs7SUFHTSw4Q0FBbUI7Ozs7Ozs7O2NBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUFFLFVBQW9CLEVBQUUsV0FBcUI7UUFDL0hBLGdCQUFhLENBQUMsYUFBYSxDQUFDLG1DQUFtQyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUU5RixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNsQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7O0lBSVgsbURBQXdCOzs7Ozs7OztJQUF4QixVQUF5QkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFhLEVBQ25GLFVBQW9CLEVBQUUsV0FBcUI7UUFDM0NBLGdCQUFhLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFHL0YsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCLEVBQ0csVUFBQSxLQUFLOztZQUVELFdBQVcsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQztLQUNWOzs7Ozs7Ozs7O0lBR0QsOENBQW1COzs7Ozs7OztJQUFuQixVQUFvQkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxXQUFtQixFQUNwRixVQUFvQixFQUFFLFdBQXFCOztRQUMzQyxJQUFJLEtBQUssR0FBRyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUUxQ0EsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsdUNBQXVDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRWxHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0MsRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNsQyxDQUFDLENBQUM7S0FDVjs7Ozs7Ozs7OztJQUdELDRDQUFpQjs7Ozs7Ozs7SUFBakIsVUFBa0JBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsWUFBb0IsRUFDbkYsVUFBb0IsRUFBRSxXQUFxQjtRQUUzQ0EsZ0JBQWEsQ0FBQyxLQUFLLENBQUMsOEJBQThCLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUUvRixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEIsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7Ozs7O0lBR0Qsb0RBQXlCOzs7Ozs7Ozs7SUFBekIsVUFBMEJBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsWUFBb0IsRUFBRSxNQUFjLEVBQzNHLFVBQW9CLEVBQUUsV0FBcUI7UUFDM0NBLGdCQUFhLENBQUMsZ0JBQWdCLENBQUMsc0NBQXNDLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxZQUFZLEdBQUcsR0FBRyxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUV4SSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEIsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7Ozs7SUFJTSw2Q0FBa0I7Ozs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLElBQVMsRUFDaEYsVUFBb0IsRUFBRSxXQUFxQixFQUFFLFNBQWM7O1FBQzNELElBQUksdUJBQXVCLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVwRSxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVztZQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7UUFFbkcsT0FBTyxDQUFDLEdBQUcsQ0FBQ0EsZ0JBQWEsQ0FBQyxDQUFDO1FBQzNCQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFDekYsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO1lBQzFCLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUVBLGdCQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDO2dCQUNsRixVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDekIsQ0FBQyxDQUFDO1NBRU4sRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7SUFLTCxrREFBdUI7Ozs7Ozs7OztJQUE3QixVQUE4QkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxJQUFZLEVBQ3ZGLFNBQWMsRUFBRSxTQUF3QixFQUFFLE9BQXFCO1FBQS9DLDBCQUFBLEVBQUEsZ0JBQXdCO1FBQUUsd0JBQUEsRUFBQSxhQUFxQjs7Ozs7O3dCQUczRCx1QkFBdUIsR0FBRyxJQUFJLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUVwRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7d0JBQzNILElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXOzRCQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7d0JBRTVGLHFCQUFNQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O3dCQUF2RyxJQUFJLEdBQUcsU0FBZ0csQ0FBQzt3QkFDeEcscUJBQU0sdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRUEsZ0JBQWEsQ0FBQyxFQUFBOzt3QkFBaEYsU0FBZ0YsQ0FBQzt3QkFDakYsc0JBQU8sSUFBSSxFQUFDOzs7O0tBQ2Y7Ozs7Ozs7OztJQUlLLHlEQUE4Qjs7Ozs7OztJQUFwQyxVQUFxQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxJQUFTLEVBQUUsU0FBYzs7Ozs7O3dCQUN2Ryx1QkFBdUIsR0FBRyxJQUFJLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUdwRSxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVzs0QkFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO3dCQUV2RixxQkFBTUEsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsc0NBQXNDLEdBQUcsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBbkgsU0FBUyxHQUFHLFNBQXVHLENBQUM7d0JBQ3BILHFCQUFNLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUVBLGdCQUFhLENBQUMsRUFBQTs7d0JBQXJGLFNBQXFGLENBQUM7d0JBQ3RGLHNCQUFPLFNBQVMsRUFBQzs7OztLQUNwQjs7Ozs7Ozs7OztJQUlELGtEQUF1Qjs7Ozs7Ozs7SUFBdkIsVUFBd0JBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsU0FBaUIsRUFDdEYsVUFBb0IsRUFBRSxXQUFxQjs7UUFDM0MsSUFBSSxJQUFJLENBQUM7UUFDVCxJQUFJLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUE7UUFDakNBLGdCQUFhLENBQUMsYUFBYSxDQUFDLDRCQUE0QixHQUFHLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUV0RixVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzNDLEVBQ0csVUFBQSxHQUFHOztZQUVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMzQixDQUFDLENBQUM7S0FDVjs7Ozs7Ozs7OztJQUdELCtDQUFvQjs7Ozs7Ozs7SUFBcEIsVUFBcUJBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsT0FBZSxFQUNqRixVQUFvQixFQUFFLFdBQXFCO1FBRTNDQSxnQkFBYSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRzdGLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUM3QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUM1QixJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hCLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNwQjtpQkFDSTtnQkFDRCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDckI7U0FDSixFQUNHLFVBQUEsR0FBRzs7WUFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QyxDQUFDLENBQUM7S0FDVjs7Ozs7Ozs7O0lBR00sbURBQXdCOzs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLE9BQWUsRUFDNUYsVUFBb0IsRUFBRSxXQUFxQjtRQUUzQ0EsZ0JBQWEsQ0FBQyxLQUFLLENBQUMsMENBQTBDLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUd0RyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDN0MsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDNUIsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDcEI7aUJBQ0k7Z0JBQ0QsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3JCO1NBQ0osRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBSUosd0RBQTZCOzs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLElBQVMsRUFDM0YsVUFBb0IsRUFBRSxXQUFxQjs7UUFHM0NBLGdCQUFhLENBQUMsYUFBYSxDQUFDLDBDQUEwQyxHQUFHLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUdwRyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDckQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDNUIsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDcEI7aUJBQ0k7Z0JBQ0QsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3JCO1NBQ0osRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7Z0JBQ1gsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzlDO2lCQUFNO2dCQUNILElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtvQkFDaEMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ2xDO3FCQUNJO29CQUNELFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDcEI7YUFDSjtTQUNKLENBQUMsQ0FBQzs7Ozs7Ozs7O0lBSUosbURBQXdCOzs7Ozs7O2NBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQzNFLFVBQW9CLEVBQUUsV0FBcUI7UUFFM0NBLGdCQUFhLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBR2pGLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDakIsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCLEVBQ0csVUFBQSxHQUFHOztZQUVDLFdBQVcsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7O0lBS1gsb0RBQXlCOzs7Ozs7Ozs7SUFBekIsVUFBMEJBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsSUFBUyxFQUNoRixVQUFvQixFQUFFLFdBQXFCLEVBQUUsU0FBYzs7UUFDM0QsSUFBSSx1QkFBdUIsR0FBRyxJQUFJLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXBFLElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXO1lBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztRQUNuR0EsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsc0NBQXNDLEdBQUcsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRWhHLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztZQUMxQix1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFQSxnQkFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQztnQkFDbEYsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BCLENBQUMsQ0FBQztTQUVOLEVBQ0csVUFBQSxLQUFLO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7WUFFbkIsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEMsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7Ozs7O0lBRUQsMkRBQWdDOzs7Ozs7Ozs7O0lBQWhDLFVBQWlDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLElBQVMsRUFDdkYsVUFBb0IsRUFBRSxXQUFxQixFQUFFLFNBQWMsRUFBRSxXQUFtQjs7UUFDaEYsSUFBSSx1QkFBdUIsR0FBRyxJQUFJLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXBFLElBQUksV0FBVyxJQUFJLENBQUMsRUFBRTtZQUNsQixJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsY0FBYyxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVztnQkFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQzVJQSxnQkFBYSxDQUFDLG9CQUFvQixDQUFDLHNDQUFzQyxHQUFHLFNBQVMsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7Z0JBRXBILElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRUEsZ0JBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7b0JBQ2xGLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEIsQ0FBQyxDQUFDO2FBRU4sRUFDRyxVQUFBLEtBQUs7Z0JBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Z0JBRW5CLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTtvQkFDYixXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDcEM7cUJBQ0k7b0JBQ0QsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN0QjthQUNKLENBQUMsQ0FBQztTQUNWO2FBQU07WUFDSCxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEI7S0FDSjs7Ozs7Ozs7O0lBRUQsbURBQXdCOzs7Ozs7OztJQUF4QixVQUF5QixlQUErQixFQUFFLFNBQWlCLEVBQUUsSUFBWSxFQUFFLFVBQW9CLEVBQUUsV0FBcUI7UUFDbEksT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBOztRQUN2QyxJQUFJLFNBQVMsR0FBRyxlQUFlLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDdEIsZUFBZSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNO1lBQ2pELFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0QixFQUFFLFVBQUEsS0FBSztZQUNKLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QixDQUFDLENBQUM7S0FDTjs7Ozs7Ozs7SUFFRCwwREFBK0I7Ozs7Ozs7SUFBL0IsVUFBZ0MsY0FBbUIsRUFBRSxLQUFhLEVBQzlELFVBQW9CLEVBQUUsYUFBdUI7O1FBQzdDLElBQUksWUFBWSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxNQUFNLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUEsQ0FBQyxJQUFJLFNBQVMsR0FBQSxDQUFDLElBQUksU0FBUyxHQUFBLENBQUMsQ0FBQzs7UUFDbE4sSUFBSSxhQUFhLEdBQUdELFNBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU5QyxJQUFJLFlBQVksSUFBSSxTQUFTLEVBQUU7O1lBQzNCLElBQUksT0FBTyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBQSxDQUFDLElBQUksU0FBUyxHQUFBLENBQUMsQ0FBQTtZQUN0SCxhQUFhLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUNsQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7WUFDMUIsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1NBQzVCO2FBQ0k7WUFDRCxhQUFhLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNwRDtLQUVKOzs7Ozs7Ozs7SUFHTSwyQ0FBZ0I7Ozs7Ozs7O2NBQUNDLGdCQUE0QixFQUFFLFNBQWlCLEVBQ25FLFVBQW9CLEVBQUUsV0FBcUIsRUFBRSxTQUE0QjtRQUE1QiwwQkFBQSxFQUFBLG9CQUE0QjtRQUV6RUEsZ0JBQWEsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUUzRixVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMxQyxFQUNHLFVBQUEsR0FBRzs7WUFFQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBSUosa0RBQXVCOzs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFDdEYsVUFBb0IsRUFBRSxXQUFxQjtRQUUzQ0EsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsb0NBQW9DLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRS9GLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2xELEVBQ0csVUFBQSxHQUFHOztZQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQixDQUFDLENBQUM7Ozs7Ozs7OztJQVNFLHdEQUE2Qjs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVU7Ozs7Ozs7d0JBS3ZGLHFCQUFNQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyxvQ0FBb0MsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O3dCQUE3RyxJQUFJLEdBQUcsU0FBc0csQ0FBQzt3QkFDOUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7d0JBQ3ZCLHNCQUFPLElBQUksRUFBQzs7O3dCQUdaLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7SUFNYiw4Q0FBbUI7Ozs7O2NBQUMsT0FBNEIsRUFBRSxHQUFHO1FBQ3hELElBQUk7O1lBQ0EsSUFBSSxtQkFBbUIsQ0FBZTtZQUN0QyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRzs7Z0JBQ2xDLElBQUksS0FBSyxHQUFZLEtBQUssQ0FBQztnQkFDM0IsR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO29CQUUxQixJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFO3dCQUNqQixLQUFLLEdBQUcsSUFBSSxDQUFDO3FCQUNoQjtpQkFDSixDQUFDLENBQUM7Z0JBQ0gsT0FBTyxLQUFLLENBQUM7YUFDaEIsQ0FBQyxDQUFDO1lBQ0gsbUJBQW1CLENBQUMsY0FBYyxHQUFHLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsR0FBQSxDQUFDLENBQUM7WUFDdEcsT0FBTyxtQkFBbUIsQ0FBQztTQUM5QjtRQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQztTQUNmOzs7Ozs7O0lBS0UsK0NBQW9COzs7OztjQUFDLFFBQTRCLEVBQUUsT0FBTzs7UUFDN0QsSUFBSSxZQUFZLENBQWM7UUFDOUIsWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsV0FBVyxJQUFJLE9BQU8sR0FBQSxDQUFDLENBQUM7UUFDbEUsT0FBTyxZQUFZLENBQUM7Ozs7Ozs7Ozs7SUFJakIscURBQTBCOzs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFDekYsVUFBb0IsRUFBRSxXQUFxQjtRQUUzQ0EsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsdUNBQXVDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRWxHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0MsRUFDRyxVQUFBLEdBQUc7O1lBRUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCLENBQUMsQ0FBQzs7Ozs7Ozs7OztJQUdKLHdDQUFhOzs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxRQUFnQixFQUFFLEtBQUssRUFDdEUsVUFBb0IsRUFBRSxXQUFxQjtRQUUzQ0EsZ0JBQWEsQ0FBQyx3QkFBd0IsQ0FBQywwQkFBMEIsR0FBRyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsS0FBSzs7WUFFaEcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JCLEVBQ0csVUFBQSxHQUFHOztZQUVDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QyxDQUFDLENBQUM7Ozs7Ozs7Ozs7SUFLSixzREFBMkI7Ozs7Ozs7O2NBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUMxRixVQUFvQixFQUFFLFdBQXFCO1FBRTNDQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyx3Q0FBd0MsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFFbkcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMzQyxFQUNHLFVBQUEsR0FBRzs7WUFFQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBSVgsdURBQTRCOzs7Ozs7O0lBQTVCLFVBQTZCQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLFVBQW9CLEVBQUUsV0FBcUI7UUFDckhBLGdCQUFhLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRXJGLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUNsRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUM1QixLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUI7WUFFRCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsV0FBVyxFQUFFLENBQUM7U0FDakIsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7Ozs7SUFLRCx1REFBNEI7Ozs7Ozs7O0lBQTVCLFVBQTZCQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsVUFBb0IsRUFBRSxXQUFxQjtRQUN4SUEsZ0JBQWEsQ0FBQyxLQUFLLENBQUMseUNBQXlDLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUV2RyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDbEQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDNUIsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzVCO1lBRUQsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JCLEVBQ0csVUFBQSxHQUFHOztZQUVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUM7U0FDakIsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7O0lBRUQsaURBQXNCOzs7Ozs7O0lBQXRCLFVBQXVCQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLFVBQW9CLEVBQUUsV0FBcUI7UUFDL0dBLGdCQUFhLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRS9FLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUNsRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUM1QixLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUI7WUFFRCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsV0FBVyxFQUFFLENBQUM7U0FDakIsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7OztJQUVELGtEQUF1Qjs7Ozs7Ozs7SUFBdkIsVUFBd0JBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsU0FBaUIsRUFBRSxVQUFvQixFQUFFLFdBQXFCO1FBQ25JQSxnQkFBYSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRWxHLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUNsRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUM1QixLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUI7WUFFRCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsV0FBVyxFQUFFLENBQUM7U0FDakIsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7OztJQUlELDJDQUFnQjs7Ozs7OztJQUFoQixVQUFpQkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxVQUFvQixFQUFFLFdBQXFCO1FBQ3pHQSxnQkFBYSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUN6RSxJQUFJLE1BQU0sQ0FBQztZQUNYLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0QixFQUNHLFVBQUEsR0FBRzs7WUFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQztLQUNWOzs7Ozs7OztJQUdNLG1EQUF3Qjs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLFVBQW9CLEVBQUUsV0FBcUI7UUFDeEhBLGdCQUFhLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7WUFDakYsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCLEVBQ0csVUFBQSxHQUFHOztZQUVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUM7U0FDakIsQ0FBQyxDQUFDOzs7Ozs7Ozs7SUFJSixpREFBc0I7Ozs7Ozs7Y0FBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxVQUFvQixFQUFFLFdBQXFCO1FBQ3RIQSxnQkFBYSxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBQy9FLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQixFQUNHLFVBQUEsR0FBRzs7WUFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQzs7Ozs7OztJQUtFLG1EQUF3Qjs7Ozs7Y0FBQ0EsZ0JBQTRCLEVBQUUsU0FBaUI7Ozs7OzRCQUdqRSxxQkFBTUEsZ0JBQWEsQ0FBQyxLQUFLLENBQUMsK0JBQStCLEdBQUcsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O3dCQUFsRyxhQUFhLEdBQUcsU0FBa0YsQ0FBQzt3QkFDbkcsc0JBQU8sYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFDOzs7Ozs7Ozs7O0lBR2Ysb0RBQXlCOzs7OztjQUFDQSxnQkFBNEIsRUFBRSxTQUFpQjs7Ozs7Ozt3QkFJdkUscUJBQU1BLGdCQUFhLENBQUMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBM0UsSUFBSSxHQUFHLFNBQW9FLENBQUM7d0JBQzVFLHNCQUFPLElBQUksRUFBQzs7O3dCQUdaLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUliLDJDQUFnQjs7Ozs7Ozs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxRQUFnQixFQUFFLFFBQWdCLEVBQUUsVUFBVSxFQUFFLFNBQWlCLEVBQUUsSUFBWSxFQUFFLE9BQWUsRUFBRSxVQUFrQixFQUN0SyxVQUFvQixFQUFFLFdBQXFCOztRQUUzQyxJQUFJLFNBQVMsQ0FBQztRQUNkLFNBQVMsR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDbkpBLGdCQUFhLENBQUMsd0JBQXdCLENBQUMsNkJBQTZCLEdBQUcsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLEtBQUs7O1lBRXZHLFVBQVUsRUFBRSxDQUFDO1NBQ2hCLEVBQ0csVUFBQSxHQUFHOztZQUVDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QyxDQUFDLENBQUM7Ozs7Ozs7SUFLRSx3REFBNkI7Ozs7O2NBQUNBLGdCQUE0QixFQUFFLFNBQWlCOzs7Ozs0QkFHdEUscUJBQU1BLGdCQUFhLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBeEcsYUFBYSxHQUFHLFNBQXdGLENBQUM7d0JBQ3pHLHNCQUFPLGFBQWEsRUFBQzs7Ozs7Ozs7Ozs7OztJQUtaLDhDQUFtQjs7Ozs7Ozs7Y0FBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQUUsVUFBb0IsRUFBRSxXQUFxQjs7O2dCQUVySUEsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7OztvQkFHM0YsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNwQixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDakIsV0FBVyxFQUFFLENBQUM7aUJBQ2pCLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFnQlgsNENBQWlCOzs7Ozs7OztJQUFqQixVQUFrQkEsZ0JBQTRCLEVBQUUsUUFBZ0IsRUFBRSxVQUFvQixFQUFFLFdBQXFCO1FBQ3pHQSxnQkFBYSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBQ3pFLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDaEMsRUFDRyxVQUFBLEdBQUc7WUFDQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEIsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQVVELG9EQUF5Qjs7Ozs7Ozs7O0lBQXpCLFVBQTBCQSxnQkFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVMsRUFBRSxVQUFvQixFQUFFLFdBQXFCOztRQUU1SEEsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsc0NBQXNDLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7WUFDL0YsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMzQyxFQUNHLFVBQUEsR0FBRztZQUNDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQixDQUFDLENBQUM7S0FDVjs7Ozs7Ozs7Ozs7SUFVTSw4Q0FBbUI7Ozs7Ozs7Ozs7Y0FBQ0EsZ0JBQTRCLEVBQUUsUUFBZ0IsRUFBRSxjQUFzQixFQUFFLElBQVMsRUFDeEcsVUFBb0IsRUFBRSxXQUFxQjtRQUMzQ0EsZ0JBQWEsQ0FBQyxhQUFhLENBQUMseUJBQXlCLEdBQUcsUUFBUSxHQUFHLEdBQUcsR0FBRyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFDekcsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNqRCxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDekIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBR0osc0RBQTJCOzs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVMsRUFDeEYsVUFBb0IsRUFBRSxXQUFxQjtRQUMzQ0EsZ0JBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxxQ0FBcUMsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFDckcsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNqRCxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDekIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBSUwsaUNBQU07Ozs7Ozs7O0lBQVosVUFBYUEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxJQUFTLEVBQUUsUUFBZ0IsRUFBRSxRQUFnQjs7Ozs7O3dCQUVuRyxJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7d0JBQy9GLHFCQUFNQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBekYsSUFBSSxHQUFHLFNBQWtGLENBQUE7d0JBQ3pGLHNCQUFPLElBQUksRUFBQTs7OztLQUNkOzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFZSyw0Q0FBaUI7Ozs7Ozs7OztJQUF2QixVQUF3QkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsR0FBVzs7Ozs7O3dCQUVsSCxJQUFJLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO3dCQUNuRSxxQkFBTUEsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBdEcsSUFBSSxHQUFHLFNBQStGLENBQUE7d0JBQ3RHLHNCQUFPLElBQUksRUFBQTs7OztLQUNkOzs7Ozs7Ozs7O0lBR1ksK0NBQW9COzs7Ozs7Ozs7Y0FBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFDN0UsVUFBa0IsRUFBRSxTQUFpQixFQUFFLEdBQVcsRUFBRSxXQUFxQjs7O2dCQUN6RUEsZ0JBQWEsQ0FBQyx3QkFBd0IsQ0FBQywwQkFBMEIsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUVuSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3JCLEVBQ0csVUFBQSxLQUFLOztvQkFFRCxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztpQkFDbkMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBR0wscURBQTBCOzs7OztJQUFoQyxVQUFpQ0EsZ0JBQTRCLEVBQUUsSUFBSTs7Ozs7NEJBR3hELHFCQUFNQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLCtCQUErQixFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBdEcsSUFBSSxHQUFHLFNBQStGLENBQUE7d0JBQ3RHLHNCQUFPLElBQUksRUFBQTs7OztLQUNkOzs7Ozs7Ozs7Ozs7SUFPSywwREFBK0I7Ozs7OztJQUFyQyxVQUFzQ0EsZ0JBQTRCLEVBQUUsSUFBSTs7Ozs7NEJBRzdELHFCQUFNQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLG9DQUFvQyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBM0csSUFBSSxHQUFHLFNBQW9HLENBQUE7d0JBQzNHLHNCQUFPLElBQUksRUFBQTs7OztLQUNkOzs7Ozs7O0lBR0ssbURBQXdCOzs7Ozs7SUFBOUIsVUFBK0JBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsTUFBYzs7Ozs7O3dCQUN0RixLQUFLLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQTt3QkFFL0MscUJBQU1BLGdCQUFhLENBQUMsYUFBYSxDQUFDLDZCQUE2QixFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBMUYsSUFBSSxHQUFHLFNBQW1GLENBQUE7d0JBQzFGLHNCQUFPLElBQUksRUFBQzs7OztLQUNmOzs7Ozs7Ozs7O0lBVU0sNkNBQWtCOzs7Ozs7Ozs7Y0FBQyxRQUFnQixFQUFFQSxnQkFBNEIsRUFDcEUsSUFBUyxFQUFFLFNBQW1CLEVBQUUsWUFBc0I7O1FBSXREQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyxpQ0FBaUMsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUMxRixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDckQsRUFDRyxVQUFBLEdBQUc7WUFDQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7OztJQUlMLCtDQUFvQjs7Ozs7Ozs7OztJQUExQixVQUEyQixXQUEwQixFQUFFLFNBQWlCLEVBQUUsVUFBa0IsRUFBRSxJQUFZLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsT0FBZTs7Ozs7O3dCQUV0SixJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFBO3dCQUN2SCxxQkFBTSxXQUFXLENBQUMsYUFBYSxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBMUYsV0FBVyxHQUFHLFNBQTRFLENBQUE7d0JBQzFGLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFBO3dCQUNyQyxzQkFBTyxXQUFXLEVBQUE7Ozs7S0FDckI7Ozs7Ozs7OztJQUVLLCtDQUFvQjs7Ozs7Ozs7SUFBMUIsVUFBMkIsV0FBMEIsRUFBRSxTQUFpQixFQUFFLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxNQUFjOzs7Ozs7d0JBRXhILElBQUksR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQTt3QkFDekYscUJBQU0sV0FBVyxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7d0JBQTFGLFdBQVcsR0FBRyxTQUE0RSxDQUFBO3dCQUMxRixXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTt3QkFDckMsc0JBQU8sV0FBVyxFQUFBOzs7O0tBQ3JCOzs7Ozs7OztJQUVLLDZDQUFrQjs7Ozs7OztJQUF4QixVQUF5QixXQUEwQixFQUFFLFNBQWlCLEVBQUUsVUFBa0IsRUFBRSxNQUFjOzs7Ozs7d0JBRWxHLElBQUksR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUE7d0JBQ2hFLHFCQUFNLFdBQVcsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O3dCQUF4RixXQUFXLEdBQUcsU0FBMEUsQ0FBQTt3QkFDeEYsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7d0JBQ3JDLHNCQUFPLFdBQVcsRUFBQTs7OztLQUNyQjs7Ozs7Ozs7OztJQUdNLDZDQUFrQjs7Ozs7Ozs7O2NBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBYSxFQUFFLFVBQWtCLEVBQ3hHLFVBQW9CLEVBQUUsV0FBcUI7UUFDM0NBLGdCQUFhLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBQ2hILFVBQVUsRUFBRSxDQUFDO1NBQ2hCLEVBQ0csVUFBQSxHQUFHOztZQUVDLFdBQVcsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQzs7Ozs7Ozs7OztJQUdKLG9EQUF5Qjs7Ozs7Ozs7Y0FBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSx3QkFBZ0MsRUFBRSxXQUF1QixFQUFFLFlBQXNCO1FBQy9KQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLHNDQUFzQyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsd0JBQXdCLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUNuSixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQTtTQUNqRSxFQUNHLFVBQUEsR0FBRzs7WUFFQyxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7WUFDaEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDOUQsQ0FBQyxDQUFDOzs7Ozs7Ozs7SUFHSix3REFBNkI7Ozs7Ozs7Y0FBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxXQUF1QixFQUFFLFlBQXNCO1FBQ2pJQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLDBDQUEwQyxHQUFHLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBQ3RILFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFBO1NBQ2pFLEVBQ0csVUFBQSxHQUFHOztZQUVDLE9BQU8sQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtZQUNwRCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2xCLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM5RCxDQUFDLENBQUM7Ozs7Ozs7O0lBR0UsZ0RBQXFCOzs7Ozs7Y0FBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxXQUF1Qjs7Ozs7NEJBRTVGLHFCQUFNQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLGtDQUFrQyxHQUFHLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7d0JBQTVILElBQUksR0FBRyxTQUFxSDt3QkFDaEksc0JBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFBOzs7Ozs7Ozs7Ozs7SUFTeEQscURBQTBCOzs7Ozs7O2NBQUNBLGdCQUE0QixFQUFFLFFBQWdCLEVBQUUsSUFBUzs7Ozs7Ozt3QkFHOUUscUJBQU1BLGdCQUFhLENBQUMsd0JBQXdCLENBQUMsZ0NBQWdDLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBbEgsSUFBSSxHQUFHLFNBQTJHO3dCQUN0SCxzQkFBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUM7Ozt3QkFHbEUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFDLENBQUMsQ0FBQzt3QkFDakIsc0JBQU8sSUFBSSxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7SUFZYixtREFBd0I7Ozs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVMsRUFDckYsU0FBbUIsRUFBRSxZQUFzQjtRQUMzQ0EsZ0JBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw4QkFBOEIsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUNsRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkIsRUFDRyxVQUFBLEdBQUc7WUFDQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckIsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBR0osOENBQW1COzs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFBRSxTQUFtQixFQUFFLFlBQXNCO1FBQy9IQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLHlCQUF5QixHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBQy9GLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUNsQixFQUNHLFVBQUEsR0FBRzs7WUFFQyxPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUE7WUFDMUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNsQixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckIsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBR0osK0NBQW9COzs7Ozs7OztjQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFDbkYsVUFBb0IsRUFBRSxXQUFxQjtRQUUzQ0EsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsaUNBQWlDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRTVGLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2xELEVBQ0csVUFBQSxHQUFHOztZQUVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtZQUMzQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2xCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQixDQUFDLENBQUM7OztJQXRtQ1hDO1FBQ2tEQyxXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQXNCQSxXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQTBCQSxXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQWtCQSxXQUFBLFFBQVEsRUFBRSxDQUFBOzt5Q0FEekgsYUFBYSxFQUFhLEtBQUssa0JBQ2xELFFBQVEsRUFBZSxRQUFROzsrREFlOUM7SUFJREQ7UUFDa0RDLFdBQUEsUUFBUSxFQUFFLENBQUEsRUFBc0JBLFdBQUEsUUFBUSxFQUFFLENBQUE7O3lDQUR2RCxhQUFhLGtDQUNsQyxRQUFRLEVBQWUsUUFBUTs7aUVBb0I5QztJQXVCREQ7UUFDa0RDLFdBQUEsUUFBUSxFQUFFLENBQUE7O3lDQUQxQixhQUFhLGtDQUMvQixRQUFRLEVBQWUsUUFBUTs7OERBWTlDO0lBRUREO1FBQ2tEQyxXQUFBLFFBQVEsRUFBRSxDQUFBOzt5Q0FEdEIsYUFBYSxrQ0FDbkMsUUFBUSxFQUFlLFFBQVE7O2tFQVk5QzsyQkF4TEw7Ozs7Ozs7O0FDK0JBLElBQU1MLFFBQU0sR0FBRyxPQUFPLENBQUM7O0FBQ3ZCLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTNDLElBQUE7SUFXSSxzQkFBWSxnQkFBZ0MsRUFBRSxlQUE4QixFQUFFLFNBQWlCO3VCQVZ0RSxJQUFJLE1BQU0sRUFBRTsrQkFFQSxJQUFJOzRCQUNWLEtBQUs7OEJBQ0osQ0FBQyxDQUFDO2lDQUNDLENBQUM7OEJBQ1osRUFBRTtRQUt0QixJQUFJLENBQUMsZUFBZSxHQUFHLGdCQUFnQixDQUFDO1FBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0tBQy9COzs7Ozs7SUFLTSx5Q0FBa0I7Ozs7O2NBQUMsWUFBd0I7UUFDOUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUU7WUFDbEMsWUFBWSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDbkMsWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBZSxDQUFDO1NBQ2pEOzs7Ozs7Ozs7Ozs7SUFHRSwyQ0FBb0I7Ozs7Ozs7Ozs7Y0FBQyxTQUFpQixFQUFFLGFBQTRCLEVBQUUsV0FBdUIsRUFDaEcsU0FBYyxFQUFFLFNBQW1CLEVBQUUsWUFBc0IsRUFBRSxjQUE4QjtRQUE5QiwrQkFBQSxFQUFBLHFCQUE4QjtRQUMzRixJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFaEUsYUFBYSxDQUFDLHdCQUF3QixDQUFDLHNCQUFzQixHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBQzlLLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDcEMsV0FBVyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUN4QyxXQUFXLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO1lBQ2hELFdBQVcsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUE7O1lBRzNELFdBQVcsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUNwRCxXQUFXLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7WUFFOUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDM0MsRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7SUFHRSxrREFBMkI7Ozs7Ozs7O2NBQUMsU0FBaUIsRUFBRSxhQUE0QixFQUFFLFdBQXVCLEVBQzdHLFNBQWMsRUFBRSxjQUE4QjtRQUE5QiwrQkFBQSxFQUFBLHFCQUE4Qjs7Ozs7Ozt3QkFFMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7d0JBRXJELHFCQUFNLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7d0JBQTVMLElBQUksR0FBRyxTQUFxTDt3QkFDNUwsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ3BDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7d0JBQ3hDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7O3dCQUdoRCxXQUFXLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7d0JBQ3BELFdBQVcsQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQzt3QkFFOUMsc0JBQU8sV0FBVyxFQUFDOzs7d0JBR25CLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7OztJQUtQLDhDQUF1Qjs7Ozs7OztjQUFDLFNBQWlCLEVBQUUsYUFBNEIsRUFBRSxXQUE4QixFQUFFLFNBQWM7Ozs7Ozs7d0JBRTVILHFCQUFNLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7d0JBQTVMLFNBQTRMLENBQUM7d0JBRTdMLHNCQUFPLElBQUksRUFBQzs7O3dCQUdaLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7O0lBT2IseUNBQWtCOzs7Ozs7Y0FBQyxTQUFjLEVBQUUsV0FBdUIsRUFBRSxjQUF1QjtRQUN0RixJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDakYsSUFBSSxjQUFjLEVBQUU7Z0JBQ2hCLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2dCQUM5RCxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLFNBQVMsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7b0JBQ2xGLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO2lCQUN0RTthQUNKO2lCQUNJO2dCQUNELFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFBO2dCQUNoRSxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQzthQUNsRTtTQUNKOzs7Ozs7Ozs7Ozs7Ozs7O0lBSUUsa0RBQTJCOzs7Ozs7Ozs7Ozs7OztjQUFDLE9BQWUsRUFBRSxZQUF5QixFQUN6RSxlQUE2QixFQUFFLFNBQW1CLEVBQUUsWUFBc0IsRUFBRSxTQUFjLEVBQUUsU0FBaUIsRUFDN0csWUFBeUIsRUFBRSxXQUE4QixFQUFFLFlBQXdCLEVBQUUsd0JBQW9DOztRQUFwQyx5Q0FBQSxFQUFBLCtCQUFvQzs7UUFFekgsSUFBSSxXQUFXLENBQWE7O1FBQzVCLElBQUksV0FBVyxDQUFTOztRQUN4QixJQUFJLG1CQUFtQixDQUFlO1FBQ3RDLG1CQUFtQixHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRXhELFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7OztRQUd4TCxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFNLE1BQU07Ozs7O3dCQUNqRCxXQUFXLEdBQUcsTUFBTSxDQUFDO3dCQUNqQixlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUM7OEJBQ25HLGVBQWUsSUFBSSxDQUFDLENBQUEsRUFBcEIsd0JBQW9COzt3QkFFcEIsWUFBWSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQzs7d0JBSXRFLFdBQVcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksbUJBQW1CLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFBLENBQUMsQ0FBQzt3QkFDdkssSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUNwQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixDQUFDLENBQUM7d0JBQ3JKLHFCQUFNLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUE7O3dCQUFsRSxTQUFrRSxDQUFDO3dCQUNuRSxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDOzs7d0JBRXJDLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsd0JBQXdCLENBQUMsQ0FBQzt3QkFDckoscUJBQU0sT0FBTyxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsRUFBQTs7d0JBQWxFLFNBQWtFLENBQUM7d0JBQ25FLFNBQVMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7Ozs7Ozs7YUFJNUMsRUFBRSxVQUFNLEtBQUs7Ozs7OEJBQ04sS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUEsRUFBckIsd0JBQXFCOzt3QkFDckIsV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO3dCQUN0SixxQkFBTSxPQUFPLENBQUMsMEJBQTBCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFBOzt3QkFBbEUsU0FBa0UsQ0FBQzt3QkFDbkUsU0FBUyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQzs7O3dCQUVyQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7d0JBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ25CLFlBQVksRUFBRSxDQUFDOzs7OzthQUV0QixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7SUFLQSxnQ0FBUzs7Ozs7Ozs7Ozs7Ozs7Y0FBQyxZQUF5QixFQUN0QyxlQUE2QixFQUFFLFNBQW1CLEVBQUUsWUFBc0IsRUFBRSxTQUFjLEVBQUUsU0FBaUIsRUFDN0csWUFBeUIsRUFBRSxXQUE4QixFQUFFLFlBQXdCLEVBQUUsd0JBQW9DLEVBQUUsY0FBa0I7UUFBeEQseUNBQUEsRUFBQSwrQkFBb0M7UUFBRSwrQkFBQSxFQUFBLGtCQUFrQjs7UUFFN0ksSUFBSSxXQUFXLEdBQWUsWUFBWSxDQUFDOztRQUUzQyxJQUFJLG1CQUFtQixDQUFlO1FBQ3RDLG1CQUFtQixHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRXhELElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQy9CLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztZQUN0SixJQUFJLFNBQVM7Z0JBQ1QsU0FBUyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQzs7Z0JBRXJDLE9BQU8sV0FBVyxDQUFDO1NBRTFCO2FBQU07O1lBQ0gsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDdkcsSUFBSSxlQUFlLElBQUksQ0FBQyxFQUFFOztnQkFFdEIsWUFBWSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsZUFBZSxJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUM7Z0JBRXJFLFdBQVcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksbUJBQW1CLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFBLENBQUMsQ0FBQztnQkFDdkssSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNwQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUNySyxJQUFJLFNBQVM7b0JBQ1QsU0FBUyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQzs7b0JBRXJDLE9BQU8sV0FBVyxDQUFDO2FBQzFCO2lCQUFNO2dCQUNILFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsd0JBQXdCLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQ3JLLElBQUksU0FBUztvQkFDVCxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDOztvQkFFckMsT0FBTyxXQUFXLENBQUM7YUFDMUI7U0FDSjs7Ozs7Ozs7SUFPRSw0Q0FBcUI7Ozs7OztjQUFDLFdBQStCLEVBQUUsU0FBdUIsRUFBRSxZQUF5Qjs7O1FBQzVHLElBQUksSUFBSSxHQUFnQixJQUFJLENBQUM7O1FBQzdCLElBQUksUUFBUSxHQUFXLENBQUMsQ0FBQztRQUN6QixZQUFZLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBRWhGLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxLQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEdBQUEsQ0FBQyxDQUFDO1lBQ3BILElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFOztnQkFFcEMsSUFBSSxDQUFDLCtCQUErQixDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3RyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDdEcsWUFBWSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNyQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7O2lCQUU5RSxBQUVBO2FBQ0o7U0FDSjtRQUNELE9BQU8sUUFBUSxDQUFDOzs7Ozs7SUFHcEIsMENBQW1COzs7O0lBQW5CLFVBQW9CLFlBQXlCOztRQUN6QyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7O1FBQ2pCLElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFBO1FBRTlFLElBQUksV0FBVyxFQUFFO1lBQ2IsUUFBUSxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztTQUNqQztRQUVELElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtZQUNkLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7YUFDSTtZQUNELE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0tBRUo7Ozs7Ozs7SUFPTSx5Q0FBa0I7Ozs7OztjQUFDLFlBQXlCLEVBQUUsV0FBK0I7O1FBQ2hGLElBQUksS0FBSyxHQUFZLEtBQUssQ0FBQztRQUMzQixJQUFJO1lBQ0EsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsRUFBRSxHQUFBLENBQUMsRUFBRTtnQkFDeEQsS0FBSyxHQUFHLElBQUksQ0FBQzthQUNoQjtTQUNKO1FBQUMsV0FBTTtTQUVQO1FBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7O0lBUVYseUNBQWtCOzs7Ozs7Y0FBQyxJQUFpQixFQUFFLFdBQXVCOztRQUNoRSxJQUFJLEtBQUssR0FBWSxLQUFLLENBQUM7UUFDM0IsSUFBSTs7WUFDQSxJQUFJLFVBQVUsR0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxPQUFPLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQzs7WUFDbEYsSUFBSSxXQUFXLEdBQVcsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUU3QyxJQUFJLFdBQVcsSUFBSSxVQUFVLEVBQUU7Z0JBQzNCLEtBQUssR0FBRyxJQUFJLENBQUM7YUFDaEI7U0FHSjtRQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO1lBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7U0FDbEI7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7Ozs7Ozs7SUFLViwrQ0FBd0I7Ozs7Ozs7Ozs7OztjQUFDLFdBQXVCLEVBQUUsT0FBZSxFQUNwRSxTQUFjLEVBQUUsU0FBaUIsRUFBRSxhQUFxQixFQUFFLFNBQW1CLEVBQUUsWUFBc0IsRUFDbkcsV0FBK0IsRUFBRSxZQUFnQzs7UUFBakUsNEJBQUEsRUFBQSxrQkFBK0I7UUFBRSw2QkFBQSxFQUFBLG1CQUFnQzs7UUFFbkUsSUFBSSxXQUFXLENBQVM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDOzs7UUFHcEMsSUFBSSxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxFQUFFO1lBQ3RDLFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEwsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNO2dCQUMzQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUM3RCxLQUFJLENBQUMsMkJBQTJCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDekgsRUFBRSxVQUFBLEtBQUs7Z0JBQ0osSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssRUFBRTs7b0JBQ3ZCLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQzdELEtBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztpQkFDekg7cUJBQU07b0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO29CQUNuQyxZQUFZLEVBQUUsQ0FBQztpQkFDbEI7YUFDSixDQUFDLENBQUM7U0FDTjs7Ozs7Ozs7Ozs7O0lBR0Usa0RBQTJCOzs7Ozs7Ozs7O2NBQUMsV0FBdUIsRUFBRSxPQUFlLEVBQ3ZFLFNBQWMsRUFBRSxXQUF3QixFQUFFLFNBQW1CLEVBQUUsWUFBc0IsRUFBRSxZQUF5QjtRQUNoSCxJQUFJLFdBQVcsRUFBRTs7WUFDYixJQUFJLGFBQWEsQ0FBYztZQUMvQixJQUFJLFlBQVksRUFBRTtnQkFDZCxhQUFhLEdBQUcsWUFBWSxDQUFDO2FBQ2hDO2lCQUFNO2dCQUNILGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNsQyxhQUFhLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQzthQUMvQjs7WUFFRCxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQzs7O2dCQUd6RixPQUFPLENBQUMsK0JBQStCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7b0JBQ3BFLFNBQVMsRUFBRSxDQUFDO2lCQUNmLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQSxDQUFDO29CQUNOLFNBQVMsRUFBRSxDQUFDO2lCQUNmLENBQUMsQ0FBQzthQUNOLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO2dCQUNsRSxTQUFTLEVBQUUsQ0FBQzs7O2FBR2YsQ0FBQyxDQUFDO1NBQ047YUFDSTtZQUNELFNBQVMsRUFBRSxDQUFDO1NBQ2Y7Ozs7Ozs7Ozs7OztJQUtFLG1DQUFZOzs7Ozs7Ozs7O2NBQUMsV0FBdUIsRUFBRSxPQUFlLEVBQ3hELFNBQWMsRUFBRSxTQUFpQixFQUFFLGFBQXFCLEVBQUUsU0FBbUIsRUFBRSxZQUFzQjs7UUFFckcsSUFBSSxXQUFXLENBQVM7OztRQUd4QixJQUFJLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLEVBQUU7WUFDdEMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV4TCxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU07Z0JBQzNDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzdELFNBQVMsRUFBRSxDQUFDO2FBQ2YsRUFBRSxVQUFBLEtBQUs7Z0JBQ0osSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssRUFBRTs7b0JBQ3ZCLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQzdELFNBQVMsRUFBRSxDQUFDO2lCQUNmO3FCQUFNO29CQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDbkMsWUFBWSxFQUFFLENBQUM7aUJBQ2xCO2FBQ0osQ0FBQyxDQUFDO1NBQ047Ozs7Ozs7O0lBSVEsc0NBQWU7Ozs7OztjQUFDLE9BQWUsRUFBRSxTQUFjLEVBQUUsU0FBaUI7Ozs7Ozt3QkFFM0UsV0FBVyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDeEwscUJBQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBQTs7d0JBQWpDLFNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7O0lBSy9CLDZDQUFzQjs7Ozs7Ozs7Y0FBQyxPQUFlLEVBQUUsU0FBaUIsRUFBRSxZQUF3QixFQUFFLGdCQUFnQixFQUFFLFVBQVU7O1FBRXBILElBQUksWUFBWSxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksWUFBWSxDQUFDLGNBQWMsSUFBSSxJQUFJLEVBQUU7O1lBQ2xGLElBQUksU0FBUyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUE7WUFDdkssSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7Z0JBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDL0IsQ0FBQyxDQUFBOztZQUdGLFNBQVMsR0FBRyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFBO1lBQ3pKLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDO2dCQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDakMsQ0FBQyxDQUFBO1NBQ0w7Ozs7Ozs7O0lBTVEsK0NBQXdCOzs7Ozs7Y0FBQyxPQUFlLEVBQUUsU0FBYyxFQUFFLFNBQWlCOzs7Ozs7O3dCQUtwRixXQUFXLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUUzSyxxQkFBTSxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFBOzt3QkFBdEQsVUFBVSxHQUFHLFNBQXlDLENBQUM7d0JBQ3ZELHNCQUFPLFVBQVUsRUFBQzs7Ozs7Ozs7Ozs7OztJQUlULHVDQUFnQjs7Ozs7Ozs7Y0FBQyxTQUFpQixFQUFFLE9BQWUsRUFBRSxlQUFvQixFQUFFLGdCQUFxQixFQUFFLFNBQW1COzs7Ozs7O3dCQUsxSCxpQkFBaUIsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3ROLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUMxTSxxQkFBTSxPQUFPLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEVBQUE7O3dCQUE1RCxVQUFVLEdBQUcsU0FBK0M7d0JBRWhFLFVBQVUsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQzt3QkFDdkQsVUFBVSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO3dCQUN2RCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDMUIscUJBQU0sT0FBTyxDQUFDLDBCQUEwQixDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxFQUFBOzt3QkFBeEUsU0FBd0UsQ0FBQzt3QkFDekUsU0FBUyxFQUFFLENBQUM7Ozs7d0JBRVosU0FBUyxFQUFFLENBQUM7Ozs7Ozs7Ozs7OztJQVFiLHNEQUErQjs7Ozs7Y0FBQyxXQUF1Qjs7Ozs7Ozs7Ozs7Ozs7O1FBaUIxRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7Ozs7OztJQUtqQyx3Q0FBaUI7Ozs7Y0FBQyxXQUF1Qjs7UUFHNUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHOztZQUd6QixJQUFJLFVBQVUsR0FBRyxLQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGFBQWEsR0FBQSxDQUFDLENBQUMsS0FBSyxFQUN0RyxLQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFN0YsSUFBSSxZQUFZLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDbEYsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLEVBQUU7Z0JBQ3BCLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxnQkFBZ0IsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7YUFDbks7aUJBQU07Z0JBQ0gsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGdCQUFnQixHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO2FBQzdFO1lBQ0QsS0FBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RHLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQzs7Ozs7OztJQUluQyxvREFBNkI7Ozs7O2NBQUMsWUFBeUIsRUFBRSxXQUFtQjs7UUFDL0UsSUFBSSxjQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQy9CLElBQUk7WUFDQSxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7Z0JBQ2pDLGNBQWMsR0FBRyxDQUFDLENBQUMsY0FBYyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzFELENBQUMsQ0FBQztTQUNOO1FBQUMsV0FBTTtTQUVQO1FBQ0QsUUFBUSxDQUFDLENBQUMsV0FBVyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUU7Ozs7Ozs7Ozs7Ozs7O0lBOEJ6Qyw4Q0FBdUI7Ozs7Ozs7Ozs7OztjQUFDLFlBQXdCLEVBQUUsaUJBQXlCLEVBQUUsSUFBWSxFQUFFLElBQVksRUFDMUcsZUFBMkIsRUFBRSxLQUFhLEVBQUUsV0FBbUI7UUFFL0QsWUFBWSxDQUFDLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQztRQUM3QyxZQUFZLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUM1QixZQUFZLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUMvQixZQUFZLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEQsWUFBWSxDQUFDLFlBQVksR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQzFELFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ3ZDLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDO1FBQzlDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDNUIsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUNsQyxZQUFZLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUN6QixZQUFZLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUN6QixZQUFZLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUM3QixZQUFZLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7SUFJcEMsNENBQXFCOzs7Ozs7Ozs7O2NBQUMsZUFBNkIsRUFBRSxZQUF5QixFQUFFLFNBQWMsRUFBRSxZQUF5QixFQUFFLFdBQThCLEVBQUUsWUFBd0IsRUFBRSx3QkFBb0M7UUFBcEMseUNBQUEsRUFBQSwrQkFBb0M7O1FBRTVOLElBQUksV0FBVyxDQUFDO1FBQ2hCLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtZQUN0QixXQUFXLEdBQUcsWUFBWSxDQUFDO1NBQzlCO2FBQU07WUFDSCxXQUFXLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztTQUNsQztRQUVELFdBQVcsQ0FBQyxLQUFLLEdBQUdBLFFBQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVELFdBQVcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLFdBQVcsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDakQsV0FBVyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztRQUNqRCxXQUFXLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO1FBQ3ZELFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFdkIsV0FBVyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztRQUNuRCxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ2pELFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFFbEQsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7OztRQU90QyxJQUFJLFdBQVcsQ0FBQyxZQUFZLElBQUksRUFBRSxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDeEQsV0FBVyxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7WUFDdEMsV0FBVyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7U0FDcEM7UUFFRCxJQUFJLFlBQVksQ0FBQyxXQUFXLElBQUksRUFBRSxJQUFJLFlBQVksQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFFO1lBQy9ELFdBQVcsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQztZQUNwRCxXQUFXLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7U0FDakQ7UUFHRCxJQUFJLFlBQVksQ0FBQyxTQUFTLElBQUksRUFBRSxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDdEQsV0FBVyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7U0FDckM7YUFDSTtZQUNELElBQUksWUFBWSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUU7Z0JBQzlCLFdBQVcsQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQzthQUNwRDtTQUNKOztRQUdELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsd0JBQXdCLENBQUMsQ0FBQTs7O1FBS3RLLE9BQU8sV0FBVyxDQUFDOzs7Ozs7OztJQU1oQixzQ0FBZTs7Ozs7Y0FBQyxZQUF5QixFQUFFLE9BQXFCO1FBQ25FLElBQUk7WUFDQSxZQUFZLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsUUFBUSxJQUFJLGVBQWUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3pHLFlBQVksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxRQUFRLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDMUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFFBQVEsSUFBSSxRQUFRLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUNoRztRQUFDLFdBQU07U0FFUDtRQUNELE9BQU8sWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7O0lBSWpCLDRDQUFxQjs7Ozs7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLGVBQTZCLEVBQy9FLFlBQXlCLEVBQUUsWUFBeUIsRUFBRSxXQUE4QixFQUFFLFNBQWMsRUFBRSx3QkFBb0MsRUFBRSxjQUFrQjtRQUF4RCx5Q0FBQSxFQUFBLCtCQUFvQztRQUFFLCtCQUFBLEVBQUEsa0JBQWtCOzs7UUFHOUosV0FBVyxDQUFDLEtBQUssR0FBR0EsUUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUQsSUFBSSxXQUFXLENBQUMsV0FBVyxJQUFJLEVBQUUsSUFBSSxZQUFZLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRTtZQUMvRCxXQUFXLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUM7U0FDcEQ7O1FBR0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFBO1FBRW5MLE9BQU8sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7SUFHaEIsZ0RBQXlCOzs7Ozs7Ozs7Ozs7O2NBQUMsV0FBdUIsRUFBRSxlQUE2QixFQUNuRixnQkFBb0MsRUFBRSxZQUF5QixFQUMvRCxZQUF5QixFQUFFLFdBQThCLEVBQUUsU0FBYyxFQUFFLGlCQUE4QixFQUFFLGNBQWtCLEVBQUUsd0JBQW9DO1FBQXhELCtCQUFBLEVBQUEsa0JBQWtCO1FBQUUseUNBQUEsRUFBQSwrQkFBb0M7O1FBR25LLElBQUksV0FBVyxHQUFHLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUE7UUFDeEYsSUFBSSxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRTtZQUNoQyxPQUFPLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sSUFBSSxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsU0FBUyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLFdBQVcsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMU0sV0FBVyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsaUNBQWlDLEdBQUcsWUFBWSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7WUFDdkcsWUFBWSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztTQUN6RTs7UUFFRCxJQUFJLFlBQVksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLFdBQVcsQ0FBQyxLQUFLLEdBQUdBLFFBQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVELFlBQVksR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUUxTCxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUM3QixPQUFPLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN0QztRQUNELElBQUksaUJBQWlCLEVBQUU7O1lBRW5CLFlBQVksQ0FBQyxVQUFVLEdBQUcsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1NBQ2xEO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRTs7WUFDL0IsSUFBSSxjQUFjLENBQXNCO1lBQ3hDLGNBQWMsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtZQUN6RCxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7Z0JBSTdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztvQkFDNUMsSUFBSSxhQUFhLEdBQWlCLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBQ3BELElBQUksZUFBZSxDQUFjO29CQUVqQyxJQUFJLGFBQWEsQ0FBQyxZQUFZLEVBQUU7d0JBQzVCLGVBQWUsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDO3FCQUNoRDt5QkFDSTt3QkFDRCxlQUFlLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7d0JBQ2xELGVBQWUsQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztxQkFDdEQ7b0JBQ0QsZUFBZSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDO29CQUN4RCxlQUFlLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQzs7b0JBRS9FLGVBQWUsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztvQkFFL0YsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQzlELElBQUk7O3dCQUNBLElBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxJQUFJLEtBQUssR0FBQSxDQUFDLENBQUM7d0JBQzdGLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUU7NEJBQ2hDLGVBQWUsQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQzt5QkFDbkQ7cUJBQ0o7b0JBQ0QsT0FBTSxDQUFDLEVBQUU7d0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7cUJBQ3RGO29CQUNELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUM7aUJBQ3pMO2FBQ0o7O1lBR0QsSUFBSSxZQUFZLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUNsQyxZQUFZLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUM7YUFDaEQ7O1lBRUQsSUFBSSxZQUFZLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUMvQixZQUFZLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUM7Z0JBQ2xELFlBQVksQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQzthQUM3RDtZQUNELElBQUksd0JBQXdCLElBQUksd0JBQXdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDakUsd0JBQXdCLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztvQkFDaEMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLElBQUksY0FBTSxHQUFHLEVBQUUsQ0FBQztpQkFDcEQsQ0FBQyxDQUFDO2FBQ047WUFFRCxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUV4QzthQUNJO1lBQ0QsV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUM5RDtRQUNELFlBQVksQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQzs7Ozs7OztJQUlsRCx1REFBZ0M7Ozs7SUFBaEMsVUFBaUMsZUFBNkI7UUFBOUQsaUJBa0JDOztRQWpCRyxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQzs7UUFDM0IsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7O1FBQzVCLElBQUksZUFBZSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUU1RSxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBQSxPQUFPOztZQUNwRCxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7O1lBQ25FLElBQUksZUFBZSxHQUFHLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzdFLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ25FLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2xFLG1CQUFtQixLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUM7U0FDM0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxtQkFBbUIsR0FBRyxlQUFlLEVBQUU7WUFDdkMsa0JBQWtCLEdBQUcsR0FBRyxJQUFJLGVBQWUsR0FBRyxHQUFHLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztTQUM1RTtRQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUNqQyxPQUFPLGtCQUFrQixDQUFDO0tBQzdCOzs7Ozs7SUFPTSwwQ0FBbUI7Ozs7O2NBQUMsYUFBMkI7UUFDbEQsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Ozs7Ozs7Ozs7SUFHM0Qsd0RBQWlDOzs7Ozs7OztjQUFDLFdBQXVCLEVBQUUsc0JBQTBDLEVBQUUsTUFBYyxFQUFFLEtBQUssRUFBRSxTQUFpQjs7O1FBQ2xKLElBQUksYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFFdEMsYUFBYSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDbEMsYUFBYSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDekIsYUFBYSxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RSxhQUFhLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BGLGFBQWEsQ0FBQyxNQUFNLEdBQUcsYUFBVyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUcsT0FBQSxDQUFDLENBQUMsVUFBVSxHQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFHLENBQUM7UUFHM0YsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQ0EsUUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNHLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUMxRSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDOztRQUVyRSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDOzs7UUFJdEUsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUNyRSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ25FLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUN6RSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzlELGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbEUsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNqRSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7O1FBR25FLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDaEYsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNqRSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUMzRixhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUNsRyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFFOUYsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLFVBQUEsUUFBUTtZQUNuQyxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pFLFFBQVEsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNwQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEMsT0FBTyxhQUFhLENBQUM7Ozs7OztJQUd6QiwwQ0FBbUI7Ozs7SUFBbkIsVUFBb0IsV0FBdUI7OztRQUN2QyxJQUFJLHFCQUFxQixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsTUFBTTs7WUFDdkQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUM7O1lBQ3pFLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxrQkFBa0IsR0FBQSxDQUFDLENBQUM7WUFDbkYsT0FBTyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsSUFBSSxhQUFhLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFBO1NBQ3BHLENBQUMsQ0FBQztRQUVILFdBQVcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDOzs7WUFHdEIsS0FBcUIsSUFBQSwwQkFBQUMsU0FBQSxxQkFBcUIsQ0FBQSw0REFBQSwrRkFBRTtnQkFBdkMsSUFBTSxNQUFNLGtDQUFBO2dCQUNiLFdBQVcsQ0FBQyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzFGLFdBQVcsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDdEY7Ozs7Ozs7OztLQUNKOzs7Ozs7Ozs7Ozs7O0lBR00sb0RBQTZCOzs7Ozs7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLGVBQTZCLEVBQ3ZGLGdCQUFvQyxFQUFFLFlBQXlCLEVBQy9ELFlBQXlCLEVBQUUsV0FBOEIsRUFBRSxTQUFjLEVBQUUsaUJBQTBDLEVBQUUsY0FBa0I7UUFBOUQsa0NBQUEsRUFBQSw2QkFBMEM7UUFBRSwrQkFBQSxFQUFBLGtCQUFrQjs7UUFFekksSUFBSSxZQUFZLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQzs7UUFDckMsSUFBSSxhQUFhLENBQWU7O1FBQ2hDLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQzs7UUFDeEIsSUFBSSxlQUFlLENBQUM7O1FBQ3BCLElBQUksbUJBQW1CLENBQXFCOztRQUM1QyxJQUFJLG9CQUFvQixHQUFXLENBQUMsQ0FBQzs7UUFDckMsSUFBSSxpQkFBaUIsR0FBVyxDQUFDLENBQUM7O1FBQ2xDLElBQUksY0FBYyxHQUFXLENBQUMsQ0FBQzs7UUFFL0IsZUFBZSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pGLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtZQUNwQixtQkFBbUIsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDL0MsbUJBQW1CLENBQUMsb0JBQW9CLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLGNBQWMsR0FBRyxHQUFHLENBQUM7WUFDeEgsbUJBQW1CLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQztZQUNuSSxtQkFBbUIsQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLENBQUM7U0FDckQ7YUFDSTtZQUNELG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ3BJOztRQUdELElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUN2RCxJQUFJLENBQUMsNEJBQTRCLENBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFlBQVksQ0FBQyxDQUFDOztZQUdsRixpQkFBaUIsR0FBRyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQztZQUMzRCxtQkFBbUIsQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTlILGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQztZQUMxRCxtQkFBbUIsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xJLFlBQVksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLG1CQUFtQixFQUFFLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDOztZQUczRyxZQUFZLENBQUMsWUFBWSxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDOztZQUcxRyxhQUFhLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVsRCxZQUFZLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDNUMsWUFBWSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ3ZDLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVFLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xGLFlBQVksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxZQUFZLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFDbkQsWUFBWSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO1lBQ2pELFlBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQztZQUN0RCxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsZ0JBQWdCLEVBQUM7O2dCQUM5QyxJQUFJLFVBQVUsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsSUFBSSxTQUFTLEdBQUEsQ0FBQyxDQUFDO2dCQUNsRixJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBQztvQkFDckMsYUFBYSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO2lCQUNoRDthQUNKOztZQUNELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFLLElBQUksWUFBWSxDQUFDLFNBQVMsSUFBSSxDQUFDLEVBQUU7Z0JBQzdCLGVBQWUsR0FBRyxVQUFVLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQzthQUN6RDtpQkFBTTtnQkFDSCxlQUFlLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZCO1lBRUQsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDOztZQUVySyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDRCxRQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDMUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDakYsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDaEcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDL0UsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDdkYsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDakcsSUFBSSxZQUFZLENBQUMsVUFBVSxFQUFFO2dCQUN6QixZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQzthQUN2RjtZQUNELFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7O1lBRXRHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQy9FLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzVFLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3pGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtZQUM1RSxJQUFJLENBQUMsMkJBQTJCLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFBO1lBQzVELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7OztZQUkzRixZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDM0YsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDaEcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7O1lBRWxMLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7WUFDbEgsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDdEcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEYsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssRUFBRTs7Z0JBQzFCLElBQUksT0FBTyxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxPQUFPLElBQUksR0FBRyxHQUFBLENBQUMsQ0FBQztnQkFDNUYsSUFBSSxPQUFPLEVBQUU7b0JBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsT0FBTyxJQUFJLEdBQUcsR0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7aUJBQzdKO2FBQ0o7OztZQUlELElBQUksZUFBZSxDQUFDLGVBQWUsRUFBRTtnQkFDakMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQzthQUN2RTtpQkFBTTtnQkFDSCxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO2FBQzFFO1lBR0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7O1lBR3BFLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNwSCxXQUFXLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGFBQWEsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7OztZQUloSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUE7U0FDekM7YUFDSTtZQUNELFlBQVksQ0FBQyxjQUFjLENBQUMsR0FBRyxzQkFBc0IsQ0FBQztTQUN6RDtRQUVELE9BQU8sWUFBWSxDQUFDOzs7Ozs7O0lBT2pCLGlEQUEwQjs7Ozs7Y0FBQyxtQkFBdUM7UUFDckUsSUFBSSxtQkFBbUIsQ0FBQyx3QkFBd0IsRUFBRTs7WUFDOUMsSUFBSSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsSUFBSSxJQUFJLGFBQWEsR0FBQSxDQUFDLENBQUM7WUFDdkcsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDbEIsT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7O0lBUVQsOENBQXVCOzs7Ozs7Y0FBQyxLQUFLLEVBQUUsUUFBUTtRQUMzQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztZQUNsQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFBLENBQUMsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN2QzthQUFNO1lBQ0gsT0FBTyxDQUFDLENBQUM7U0FDWjs7Ozs7Ozs7SUFTRSwrQ0FBd0I7Ozs7OztjQUFDLFlBQXlCLEVBQUUsU0FBaUI7Ozs7UUFNeEUsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDOztRQUNqQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQzs7UUFDMUIsSUFBSSxjQUFjLENBQUE7O1FBRWxCLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQzs7UUFHL0QsSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O1lBRXRDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDck0sY0FBYyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDeEUsaUJBQWlCLEdBQUcsUUFBUSxHQUFHLGNBQWMsQ0FBQztTQUNqRDthQUNJOztZQUVELGlCQUFpQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JHLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQztTQUNoQztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDOztRQUcxSixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksV0FBVyxHQUFBLENBQUMsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7OztRQUcxSCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRUEsUUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3BKLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDN0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksZ0JBQWdCLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxZQUFZLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQzs7UUFJNVAsSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRTs7WUFDeEQsWUFBWSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7U0FDbEM7Ozs7Ozs7O0lBUUUsaURBQTBCOzs7Ozs7Y0FBQyxZQUF5QixFQUFFLFFBQWdCOztRQUN6RSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFOztZQUMxRCxJQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLFNBQVMsR0FBRyxTQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNqRDtRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7O0lBR25DLHNDQUFlOzs7OztjQUFDLFlBQXlCLEVBQUUsUUFBZ0I7O1FBQy9ELElBQUksaUJBQWlCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGFBQWEsR0FBQSxDQUFDLENBQUM7O1FBQzVGLElBQUksb0JBQW9CLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGdCQUFnQixHQUFBLENBQUMsQ0FBQzs7UUFDbEcsSUFBSSxtQkFBbUIsR0FBVyxDQUFDLENBQUM7UUFDcEMsSUFBSSxpQkFBaUIsSUFBSSxvQkFBb0IsRUFBRTtZQUMzQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hQO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7SUFHN0Msb0NBQWE7Ozs7OztjQUFDLFlBQXlCLEVBQUUsS0FBYSxFQUFFLFNBQWlCOztRQUM3RSxJQUFJLElBQUksQ0FBa0I7UUFDMUIsSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxTQUFTLEdBQUEsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksSUFBSSxFQUFFOztZQUVOLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3RCO2FBQU07O1lBRUgsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztTQUM3RTs7Ozs7Ozs7O0lBU0cseUNBQWtCOzs7Ozs7O2NBQUMsUUFBZ0IsRUFBRSxZQUF5QixFQUFFLFlBQW9CO1FBQ3hGLElBQUk7O1lBQ0EsSUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3hGLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNuRDtRQUFDLFdBQU07WUFDSixPQUFPLENBQUMsQ0FBQztTQUNaOzs7Ozs7Ozs7SUFTRyx5Q0FBa0I7Ozs7Ozs7Y0FBQyxRQUFnQixFQUFFLFlBQXlCLEVBQUUsU0FBaUI7UUFDckYsSUFBSTtZQUNBLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFO2dCQUNoQixPQUFPLENBQUMsQ0FBQzthQUNaOztZQUNELElBQUksS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxTQUFTLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNsRixPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsUUFBUSxDQUFDO1NBQzdCO1FBQUMsV0FBTTtZQUNKLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7Ozs7Ozs7O0lBUUUsdUNBQWdCOzs7Ozs7Y0FBQyxZQUF5QixFQUFFLFlBQXFDO1FBQ3BGLElBQUk7O1lBQ0EsSUFBSSxrQkFBa0IsQ0FBMEI7WUFDaEQsa0JBQWtCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFBLENBQUMsQ0FBQztZQUM5RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRCxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQzdHO1NBRUo7UUFBQyxXQUFNO1NBRVA7Ozs7Ozs7O0lBVUUsNENBQXFCOzs7Ozs7Y0FBQyxZQUF5QixFQUFFLFlBQXFDO1FBQ3pGLElBQUk7WUFDQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzthQUMxRztTQUNKO1FBQUMsV0FBTTtTQUVQOzs7Ozs7O0lBSUUsa0RBQTJCOzs7OztjQUFDLFlBQXlCLEVBQUUsWUFBeUI7UUFDbkYsSUFBSTtZQUNBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM1RCxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ2pKO1NBQ0o7UUFBQyxXQUFNO1NBRVA7Ozs7Ozs7OztJQVdFLHVEQUFnQzs7Ozs7OztjQUFDLG1CQUF1QyxFQUFFLFNBQWlCLEVBQUUsU0FBZ0I7UUFBaEIsMEJBQUEsRUFBQSxnQkFBZ0I7O1FBQ2hILElBQUksUUFBUSxHQUFXLEVBQUUsQ0FBQzs7UUFDMUIsSUFBSSxJQUFJLEdBQVcsRUFBRSxDQUFDOztRQUN0QixJQUFJLFFBQVEsR0FBVyxFQUFFLENBQUM7O1FBQzFCLElBQUksSUFBSSxDQUFDO1FBQ1QsSUFBSSxtQkFBbUIsSUFBSSxtQkFBbUIsQ0FBQyx3QkFBd0IsSUFBSSxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hJLElBQUksU0FBUyxFQUFFO2dCQUNYLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxRQUFRLEdBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLEdBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLEtBQUs7b0JBQ3hILFFBQVEsR0FBRyxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7b0JBQ3pDLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7b0JBQ3RDLFFBQVEsR0FBRyxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztpQkFDM0UsQ0FBQyxDQUFDO2FBQ047aUJBQ0k7Z0JBQ0QsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsa0JBQWtCLElBQUksSUFBSSxHQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO29CQUN6SCxRQUFRLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO29CQUN6QyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO29CQUN0QyxRQUFRLEdBQUcsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQzNFLENBQUMsQ0FBQzthQUNOO1lBQ0QsSUFBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQTtZQUMvRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxJQUFJLENBQUM7Ozs7Ozs7OztJQVdULGlEQUEwQjs7Ozs7OztjQUFDLG1CQUF1QyxFQUFFLFlBQXlCLEVBQUUsU0FBaUI7O1FBQ25ILElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUNoRixJQUFJLElBQUksRUFBRTtZQUNOLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQzFFLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ25FLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDOztZQUd6RSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztZQUMzRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztZQUNsRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTFELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFO2dCQUN2QyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbEYsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVFLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ25GO1NBQ0o7UUFFRCxJQUFJLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNuRixJQUFJLElBQUksRUFBRTtZQUNOLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDaEYsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUN6RSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1NBQ2xGOzs7Ozs7OztJQVNFLCtDQUF3Qjs7Ozs7O2NBQUMsZUFBZSxFQUFFLFlBQXlCO1FBQ3RFLElBQUksZUFBZSxJQUFJLGVBQWUsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3hELFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ3RGOzs7Ozs7OztJQVFFLCtDQUF3Qjs7Ozs7O2NBQUMsZUFBNkIsRUFBRSxTQUFpQjtRQUM1RSxJQUFJOztZQUNBLElBQUksaUJBQWlCLENBQW1COztZQUN4QyxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0I7Z0JBQy9ELGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBRTVFLGlCQUFpQixHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLFNBQVMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFBLENBQUMsQ0FBQztnQkFDbkgsSUFBSSxpQkFBaUIsRUFBRTtvQkFDbkIsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQztvQkFDaEYsWUFBWSxHQUFHLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQzdGO2FBQ0o7WUFDRCxPQUFPLFlBQVksQ0FBQztTQUN2QjtRQUFDLFdBQU07WUFDSixPQUFPLElBQUksQ0FBQztTQUNmOzs7Ozs7O0lBR0Usc0RBQStCOzs7OztjQUFDLGFBQTJCLEVBQUUsU0FBaUI7UUFDakYsSUFBSTs7WUFDQSxJQUFJLGlCQUFpQixDQUFtQjs7WUFDeEMsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLElBQUksYUFBYSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxhQUFhLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBRXZHLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsU0FBUyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUEsQ0FBQyxDQUFDO2dCQUMvRixJQUFJLGlCQUFpQixFQUFFO29CQUNuQixhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7b0JBQzVELFlBQVksR0FBRyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUM3RjthQUNKO1lBQ0QsT0FBTyxZQUFZLENBQUM7U0FDdkI7UUFBQyxXQUFNO1lBQ0osT0FBTyxJQUFJLENBQUM7U0FDZjs7Ozs7Ozs7SUFPRSxrREFBMkI7Ozs7OztjQUFDLG1CQUF1QyxFQUFFLFFBQWdCOztRQUN4RixJQUFJLFlBQVksR0FBRyxLQUFLLEVBQW1CLENBQUM7UUFFNUMsSUFBSSxtQkFBbUIsQ0FBQyx3QkFBd0IsRUFBRTtZQUM5QyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFOztnQkFDN0UsSUFBSSxjQUFjLEdBQUcsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRXRFLElBQUksY0FBYyxDQUFDLE9BQU8sRUFBRTs7b0JBQ3hCLElBQUksS0FBSyxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7b0JBQ2xDLEtBQUssQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQztvQkFDdkMsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7b0JBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzVCO2FBQ0o7U0FDSjtRQUVELE9BQU8sWUFBWSxDQUFDOzs7Ozs7OztJQUlqQixtREFBNEI7Ozs7OztjQUFDLFdBQXVCLEVBQUUsbUJBQXVDLEVBQUUsWUFBeUI7O1FBQzNILElBQUksbUJBQW1CLElBQUksSUFBSSxJQUFJLG1CQUFtQixDQUFDLHdCQUF3QixJQUFJLElBQUksRUFBRTtZQUNyRixtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsVUFBQSxRQUFRO2dCQUN6RCxJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLEVBQUU7O29CQUVyQyxZQUFZLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQzs7b0JBRS9ELElBQUksZ0JBQWdCLENBQWtCO29CQUN0QyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksWUFBWSxHQUFBLENBQUMsQ0FBQTtvQkFDakYsSUFBSSxnQkFBZ0IsRUFBRTt3QkFDbEIsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO3FCQUN6RTt5QkFDSTt3QkFDRCxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7cUJBQzVHO29CQUNELEtBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7aUJBQ3pGO2FBQ0osQ0FBQyxDQUFDO1NBQ047Ozs7Ozs7O0lBTUUsNkRBQXNDOzs7Ozs7Y0FBQyxXQUF1QixFQUFFLG1CQUF1QztRQUMxRyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFO1lBQy9CLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssRUFBc0IsQ0FBQztTQUNsRTtRQUNELElBQUksV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxvQkFBb0IsSUFBSSxtQkFBbUIsQ0FBQyxvQkFBb0IsR0FBQSxDQUFDLEVBQUUsQ0FFL0c7YUFBTTtZQUVILFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUMxRDtRQUNELElBQUksV0FBVyxDQUFDLGdCQUFnQixFQUFFO1lBQzlCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNsRDs7Ozs7OztJQVFFLG1EQUE0Qjs7Ozs7Y0FBQyxXQUF1Qjs7UUFDdkQsSUFBSSxtQkFBbUIsQ0FBZTtRQUN0QyxtQkFBbUIsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxNQUFNLElBQUksV0FBVyxHQUFBLENBQUMsQ0FBQztRQUNuRixJQUFJLG1CQUFtQixFQUFFOztZQUNyQixJQUFJLFFBQVEsR0FBOEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7Z0JBQ3RDLElBQUksV0FBVyxHQUF1QixXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLG9CQUFvQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsR0FBQSxDQUFDLENBQUM7Z0JBQ3pJLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ2QsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbEQ7YUFDSjtZQUNELG1CQUFtQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzVFO2FBQU07O1lBQ0gsSUFBSSxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUN2QyxhQUFhLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztZQUNuQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFbkUsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDakQ7Ozs7Ozs7Ozs7O0lBS0UsMENBQW1COzs7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLGVBQTZCLEVBQzdFLFlBQXlCLEVBQUUsV0FBOEIsRUFBRSxTQUFjLEVBQUUsWUFBeUI7O1FBQ3BHLElBQUksbUJBQW1CLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDOztRQUNuRCxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEIsSUFBSTtZQUNBLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTs7Z0JBQ3JCLElBQUksUUFBUSxDQUFhOztnQkFDekIsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFFMUUsUUFBUSxHQUFHLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDckgsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUVySCxPQUFPLG1CQUFtQixDQUFDO2FBQzlCO2lCQUFNO2dCQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQzthQUN4RDtTQUVKO1FBQUMsV0FBTTtZQUNKLG1CQUFtQixHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUMvQyxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQ3hGLG1CQUFtQixDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztZQUM3QyxtQkFBbUIsQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7WUFDcEQsT0FBTyxtQkFBbUIsQ0FBQztTQUM5Qjs7Ozs7Ozs7SUFJRSx5Q0FBa0I7Ozs7OztjQUFDLG1CQUF1QyxFQUFFLFFBQWdCLEVBQUUsWUFBeUI7O1FBQzFHLElBQUk7O1lBQ0EsSUFBSSx1QkFBdUIsQ0FBOEI7WUFDekQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztZQUMzQixJQUFJLG1CQUFtQixDQUFDLHdCQUF3QixJQUFJLElBQUksRUFBRTtnQkFDdEQsdUJBQXVCLEdBQUcsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsS0FBSyxDQUFDLFVBQVUsSUFBSSxJQUFJLEdBQUEsQ0FBQyxDQUFDO2dCQUVqSCxJQUFJLHVCQUF1QixJQUFJLElBQUksSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN2RSx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO3dCQUNqQyxLQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxDQUFBO3dCQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNOzRCQUFFLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBRXBFLElBQUksS0FBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFOzRCQUNsRixLQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7eUJBQzNDO3dCQUNELEtBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3FCQUM5RCxDQUFDLENBQUM7aUJBQ047YUFDSjtTQUNKO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25COzs7Ozs7SUFHRSxtQ0FBWTs7OztjQUFDLG1CQUF1Qzs7UUFDdkQsSUFBSTs7WUFDQSxJQUFJLHVCQUF1QixDQUE4QjtZQUN6RCxJQUFJLG1CQUFtQixDQUFDLHdCQUF3QixJQUFJLElBQUksRUFBRTtnQkFDdEQsdUJBQXVCLEdBQUcsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUEsQ0FBQyxDQUFDO2dCQUVoSixJQUFJLHVCQUF1QixJQUFJLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQy9ELHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxVQUFBLEtBQUs7d0JBQ2pDLEtBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO3FCQUMxRSxDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDOUM7YUFDSjtTQUNKO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25COzs7Ozs7SUFHTCx1Q0FBZ0I7Ozs7SUFBaEIsVUFBaUIsR0FBZTs7UUFDNUIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2QjtTQUNKO0tBQ0o7Ozs7Ozs7SUFFRCw2Q0FBc0I7Ozs7OztJQUF0QixVQUF1QixLQUEyQixFQUFFLFlBQXlCLEVBQUUsUUFBZ0I7O1FBQzNGLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5RCxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxFQUFFO1lBQzNCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQztTQUN6QzthQUNJO1lBQ0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNwRCxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87Z0JBQzVCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsWUFBWSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQzthQUN2RCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztTQUM3QjtRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztLQUMzQzs7Ozs7O0lBRUQsZ0RBQXlCOzs7OztJQUF6QixVQUEwQixLQUEyQixFQUFFLFlBQXlCO1FBQzVFLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUEsT0FBTztnQkFDNUIsT0FBTyxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDO2FBQ3hDLENBQUMsQ0FBQztTQUNOO0tBQ0o7Ozs7Ozs7SUFFRCxrREFBMkI7Ozs7OztJQUEzQixVQUE0QixLQUFLLEVBQUUsWUFBeUIsRUFBRSxRQUFnQjtRQUMxRSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUssRUFBRTtZQUNsQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQztTQUNyQzthQUNJO1lBQ0QsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzlFLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87Z0JBQ2xDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQzthQUNuRCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztTQUM3QjtRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7S0FDakQ7Ozs7OztJQUVELHlEQUFrQzs7Ozs7SUFBbEMsVUFBbUMsU0FBUyxFQUFFLFlBQXlCO1FBQ25FLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87Z0JBQ3JCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQzthQUN4QyxDQUFDLENBQUM7U0FDTjtLQUNKOzs7Ozs7O0lBR0QsNkNBQXNCOzs7OztJQUF0QixVQUF1QixhQUFtQyxFQUFFLHVCQUFvRDs7UUFDNUcsSUFBSSxhQUFhLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRTs7WUFDOUIsSUFBSSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsV0FBVyxJQUFJLGFBQWEsQ0FBQyxXQUFXLEdBQUEsQ0FBQyxDQUFDOztnQkFDekcsS0FBb0IsSUFBQSx1QkFBQUMsU0FBQSxrQkFBa0IsQ0FBQSxzREFBQSxzRkFBRTtvQkFBbkMsSUFBTSxLQUFLLCtCQUFBO29CQUNaLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUU7d0JBQ3RCLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssSUFBSSxhQUFhLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFOzRCQUMxRSxPQUFPLElBQUksQ0FBQzt5QkFDZjtxQkFDSjtpQkFDSjs7Ozs7Ozs7O1NBQ0o7UUFFRCxPQUFPLEtBQUssQ0FBQztLQUNoQjs7Ozs7Ozs7O0lBSVksd0NBQWlCOzs7Ozs7OztjQUFDLFNBQWMsRUFDekMsWUFBeUIsRUFBRSxZQUF5QixFQUFFLE9BQWdCLEVBQUUsV0FBdUI7Ozs7Ozs7d0JBRTNGLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO3dCQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDOzhCQUNyQixJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUEsRUFBL0Qsd0JBQStEO3dCQUN0RCxDQUFDLEdBQUcsQ0FBQzs7OzhCQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQTs2QkFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQTNCLHdCQUEyQjs7d0JBRTNCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7NEJBQ2xDLFlBQVksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7eUJBQzdEOzt3QkFFRCxZQUFZLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzt3QkFDaEMsWUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQzt3QkFDN0QsWUFBWSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7d0JBQ3JDLHFCQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBQTs7d0JBQWpILFNBQWlILENBQUM7Ozt3QkFWekUsQ0FBQyxFQUFFLENBQUE7Ozs7O3dCQWV4RCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUUsQ0FBQyxDQUFDOzs7d0JBRXBCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7SUFRbkIsdUNBQWdCOzs7Ozs7Ozs7Y0FBQyxLQUFLLEVBQUUsU0FBYyxFQUMvQyxZQUF5QixFQUFFLFlBQXlCLEVBQUUsT0FBZ0IsRUFBRSxXQUF1Qjs7Ozs7NEJBU2hGLHFCQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFBOzs7Ozt3QkFBeEgsWUFBWSxHQUFHLFNBQXlHLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBTWhILGlEQUEwQjs7Ozs7Ozs7O2NBQUMsS0FBSyxFQUFFLFdBQXVCLEVBQUUsWUFBeUIsRUFBRSxZQUF5QixFQUFFLE9BQWdCLEVBQUUsU0FBYzs7Ozs7O3dCQUN0SixTQUFTLEdBQWlCLElBQUksQ0FBQzt3QkFDdkIscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBQTs7d0JBQW5GLFNBQVMsR0FBRyxTQUF1RSxDQUFDO3dCQUNwRixPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUN6QixJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7Ozs7OzRCQU1uQixXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO3lCQUM3STt3QkFDRCxzQkFBTyxXQUFXLEVBQUM7Ozs7Ozs7Ozs7Ozs7SUFJVix1Q0FBZ0I7Ozs7Ozs7O2NBQUMsSUFBSSxFQUFFLE9BQWdCLEVBQUUsV0FBdUIsRUFBRSxTQUFjLEVBQUUsZUFBc0I7UUFBdEIsZ0NBQUEsRUFBQSxzQkFBc0I7Ozs7Ozt3QkFDN0csaUJBQWlCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO3dCQUUzQyxTQUFTLEdBQWlCLElBQUksQ0FBQzt3QkFDL0IsdUJBQXVCLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7OEJBR3RFLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUEsRUFBakQsd0JBQWlEO3dCQUM3QyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7d0JBQ2hDLHFCQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFBOzt3QkFBeEQsU0FBUyxHQUFHLFNBQTRDLENBQUM7d0JBQ3pELFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzs7NEJBRTdFLHFCQUFNLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBQTs7d0JBQWpKLFNBQVMsR0FBRyxTQUFxSSxDQUFDOzs7d0JBRXRKLElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLGVBQWUsRUFBRTs0QkFDaEUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDO3lCQUM1RDt3QkFFRCxxQkFBTSx1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBQTs7d0JBQTVGLFNBQTRGLENBQUM7O3dCQUU3RixzQkFBTyxTQUFTLEVBQUM7Ozs7Ozs7Ozs7SUFJZCwwQ0FBbUI7Ozs7O2NBQUMsV0FBbUIsRUFBRSxVQUFrQjs7UUFFOUQsSUFBSSxVQUFVLEdBQVcsVUFBVSxDQUFDO1FBQ3BDLElBQUk7O1lBQ0EsSUFBSSxZQUFZLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQzs7WUFDckMsSUFBSSxVQUFVLENBQUM7WUFDZixJQUFJLFdBQVcsSUFBSSxFQUFFLEVBQUU7Z0JBQ25CLFVBQVUsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3hELFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7O29CQUVyQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLFlBQVksRUFBRTt3QkFDbkMsVUFBVSxHQUFHLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDbkQ7eUJBQ0k7d0JBQ0QsVUFBVSxHQUFHLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUMvQztpQkFDSixDQUFDLENBQUM7YUFDTjs7U0FFSjtRQUFDLFdBQU07WUFDSixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1NBQ3ZCOztRQUdELE9BQU8sVUFBVSxDQUFDOzs7Ozs7Ozs7O0lBSWYsaURBQTBCOzs7Ozs7OztjQUFDLFdBQW1CLEVBQUUsWUFBeUIsRUFDNUUsVUFBa0IsRUFBRSxRQUFnQixFQUFFLHNCQUE4QjtRQUNwRSxJQUFJOztZQUNBLElBQUksWUFBWSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7O1lBQ3JDLElBQUksYUFBYSxDQUFlOztZQUNoQyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1lBQ3ZELElBQUksY0FBYyxHQUFHLGNBQWMsQ0FBQzs7WUFDcEMsSUFBSSx1QkFBdUIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLENBQUM7O1lBQ3JGLElBQUksVUFBVSxDQUFDOztZQUNmLElBQUksY0FBYyxHQUFXLENBQUMsQ0FBQztZQUMvQixJQUFJLFdBQVcsSUFBSSxFQUFFLEVBQUU7Z0JBQ25CLFVBQVUsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7O2dCQUd4RCxLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTs7b0JBQ2hFLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQzs7b0JBQ3JCLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDbkMsYUFBYSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQkFDekMsYUFBYSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDdkMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxZQUFZLEVBQUU7O3dCQUNuQyxZQUFZLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO3dCQUNqRSxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDMUQsSUFBSSxhQUFhLENBQUMsS0FBSyxHQUFHLFlBQVksRUFBRTs0QkFDcEMsYUFBYSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt5QkFDM0Y7NkJBQ0k7NEJBQ0QsYUFBYSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt5QkFDNUY7cUJBQ0o7eUJBQ0k7O3dCQUNELFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO3dCQUM1QixhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQzs7Ozs7OztxQkFPN0Q7O29CQUlELGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMzRCxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxjQUFjLEdBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFFLENBQUMsQ0FBQyxDQUFDOztvQkFFeEcsY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztvQkFHaEksSUFBSSxTQUFTLENBQWU7b0JBQzVCLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxXQUFXLElBQUksYUFBYSxDQUFDLFdBQVcsR0FBQSxDQUFDLENBQUM7b0JBQ2hHLElBQUksU0FBUyxFQUFFOzt3QkFFWCxZQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFdBQVcsSUFBSSxhQUFhLENBQUMsV0FBVyxHQUFBLENBQUMsQ0FBQztxQkFDckg7b0JBQ0QsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ2pEOzs7YUFJSjs7WUFHRCxJQUFJLGNBQWMsSUFBSSxDQUFDLEVBQUU7O2dCQUVyQixjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDOztnQkFDdkQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDN0gsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQ25CLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3hJO2dCQUNELElBQUksVUFBVSxJQUFJLENBQUMsRUFBRTtvQkFDakIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztpQkFDdkQ7O2dCQUdELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2xHO2lCQUFNO2dCQUNILE9BQU8sQ0FBQyxDQUFDO2FBQ1o7U0FFSjtRQUFDLFdBQU07WUFDSixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3BCLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFXTCwyQ0FBb0I7Ozs7Ozs7OztJQUFwQixVQUFxQixZQUF5QixFQUFFLFVBQWtCO1FBQzlELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTs7WUFDMUQsSUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQzs7WUFFL0MsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFOzs7Z0JBR2hCLElBQUksUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFO29CQUN6QyxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7b0JBQ3hDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM1RSxVQUFVLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQztpQkFDbEM7O2FBRUo7O2lCQUVJOzs7Z0JBR0QsSUFBSSxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUU7b0JBQ3pDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztvQkFDeEMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzVFLFVBQVUsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDO2lCQUNsQzs7YUFFSjs7WUFHRCxJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUU7Z0JBQ2pCLE1BQU07YUFDVDtTQUNKO0tBQ0o7Ozs7OztJQUdNLHFDQUFjOzs7OztjQUFDLE1BQWMsRUFBRSxTQUFpQjs7UUFDbkQsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzdDLGdCQUFnQixDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDNUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNoQyxPQUFPLGdCQUFnQixDQUFDOzs7Ozs7O0lBS2YsNENBQXFCOzs7OztjQUFDLFdBQXVCLEVBQUUsU0FBYzs7OztnQkFDdEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEtBQUssV0FBVyxDQUFDLGFBQWEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE1BQU0sSUFBSSxlQUFlLEdBQUEsQ0FBQyxDQUFDLEVBQUU7b0JBQzVILG1CQUFtQixHQUFHLElBQUksa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNsRSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ2pFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDdkM7Ozs7Ozs7Ozs7OztJQUtRLHVDQUFnQjs7Ozs7OztjQUFDLFNBQWlCLEVBQUUsT0FBZSxFQUFFLFNBQWMsRUFBRSxlQUEyQjs7Ozs7Ozt3QkFJakcsZUFBZSxHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dCQUd6QyxLQUFLLEdBQVksSUFBSSxDQUFDO3dCQUUxQixXQUFXLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUVySyxxQkFBTSxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFBOzs7d0JBQTVELGdCQUFnQixHQUFHLFNBQXlDLENBQUM7O3dCQUc3RCxLQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQzdDLElBQUksZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUM3RSxLQUFLLEdBQUcsS0FBSyxDQUFDO2dDQUNkLE1BQU07NkJBQ1Q7eUJBQ0o7d0JBRUQsSUFBSSxLQUFLLEVBQUU7OzRCQUVQLEtBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0NBQ25ELElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0NBQzNELGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO29DQUMzRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssRUFBRTtvQ0FDbkssS0FBSyxHQUFHLEtBQUssQ0FBQztvQ0FDZCxNQUFNO2lDQUNUOzZCQUNKO3lCQUNKO3dCQUVELEtBQUssR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLENBQUM7d0JBQzNELHNCQUFPLEtBQUssRUFBQzs7O3dCQUViLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQzt3QkFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFFLENBQUMsQ0FBQzt3QkFDaEIsS0FBSyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7d0JBQzlDLHNCQUFPLEtBQUssRUFBQzs7Ozs7Ozs7Ozs7O0lBT2QsOENBQXVCOzs7Ozs7Y0FBQyxXQUF1QixFQUFFLGFBQXFCLEVBQUUsYUFBcUI7UUFDaEcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQzs7Ozs7OztJQUluRiwwQ0FBbUI7Ozs7O2NBQUMsTUFBTSxFQUFFLEtBQUs7O1FBQ3BDLElBQUksYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsYUFBYSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDOUIsYUFBYSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFNUIsT0FBTyxhQUFhLENBQUM7Ozs7Ozs7Ozs7OztJQUtsQiw4Q0FBdUI7Ozs7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLE9BQWUsRUFDbkUsU0FBYyxFQUFFLFNBQWlCLEVBQUUsU0FBbUIsRUFBRSxZQUFzQixFQUFFLFNBQVM7O1FBRXpGLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUV0RCxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFlLENBQUM7WUFDN0MsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQzdHO2FBQU07WUFDSCxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUU7Z0JBRWhCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDO29CQUN0RCxLQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHO3dCQUNqRSxXQUFXLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDL0IsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO3FCQUMxQixDQUFDLENBQUM7aUJBQ04sQ0FBQyxDQUFDO2FBQ047aUJBQU07Z0JBQ0gsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO29CQUN6QixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO2lCQUM3RSxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO2FBQzdHO1NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFJRSwyQ0FBb0I7Ozs7Ozs7Ozs7Ozs7Ozs7O2NBQUMsV0FBdUIsRUFBRSxPQUFlLEVBQ2hFLFNBQWMsRUFBRSxTQUFpQixFQUFFLFNBQW1CLEVBQ3RELFlBQXNCLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFDekUsV0FBd0IsRUFBRSxXQUE4QixFQUFFLFlBQTZCOztRQUE3Qiw2QkFBQSxFQUFBLG9CQUE2QjtRQUV2RixJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxhQUFhLElBQUksS0FBSyxLQUFLLFlBQVksRUFBRTtZQUVsRyxXQUFXLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsR0FBQSxDQUFDLENBQUM7O1lBRTFJLElBQUksYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDdEMsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztTQUNsSTthQUFNOztZQUVILElBQUksU0FBUyxJQUFJLENBQUMsRUFBRTs7Z0JBRWhCLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEtBQUssS0FBSyxHQUFHLENBQUMsVUFBVSxJQUFJLEtBQUssR0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztvQkFDekksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztpQkFDN0UsQ0FBQyxDQUFDOztnQkFJSCxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQ2xJO2lCQUFNO2dCQUNILElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJO29CQUN6SCxLQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ3BKLENBQUMsQ0FBQzthQUNOO1NBS0o7Ozs7Ozs7Ozs7Ozs7OztJQVFRLG9DQUFhOzs7Ozs7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFjLEVBQ2hHLFNBQWlCLEVBQUUsV0FBd0IsRUFBRSxXQUE4Qjs7Ozs7O3dCQUN6RSxTQUFTLEdBQWlCLElBQUksQ0FBQzt3QkFDL0IsWUFBWSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7d0JBQ3JDLFlBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO3dCQUUvQixZQUFZLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEtBQUssR0FBQSxDQUFDLENBQUM7d0JBQ3RILElBQUksWUFBWSxFQUFFOzRCQUNkLFlBQVksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQzt5QkFDcEQ7d0JBR0QsV0FBVyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEVBQUUsR0FBRyxDQUFDLFVBQVUsSUFBSSxVQUFVLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFBLENBQUMsQ0FBQzt3QkFFN0kscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQUE7O3dCQUExRyxTQUFTLEdBQUcsU0FBOEYsQ0FBQzt3QkFDM0csWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO3dCQUM3RCxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO3dCQUMvSCxzQkFBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxFQUFDOzs7Ozs7Ozs7OztJQUdyRSw4Q0FBdUI7Ozs7OztJQUF2QixVQUF3QixXQUF1QixFQUFFLFVBQVUsRUFBRSxJQUFJO1FBQzdELE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksR0FBQSxDQUFDLENBQUE7S0FDekY7Ozs7OztJQUdNLGtDQUFXOzs7OztjQUFDLFdBQXVCLEVBQUUsU0FBdUI7UUFDL0QsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxVQUFVLElBQUksU0FBUyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDOzs7Ozs7SUFHM0osdUNBQWdCOzs7O2NBQUMsV0FBdUI7UUFDM0MsSUFBSSxXQUFXLEtBQUssU0FBUyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQzlELFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUEsQ0FBQztnQkFDakcsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQTtTQUN4RzthQUFNO1lBQ0gsT0FBTyxDQUFDLENBQUM7U0FDWjs7Ozs7OztJQUtFLHFDQUFjOzs7OztjQUFDLFdBQXVCLEVBQUUsV0FBbUI7OztRQUU5RCxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUssQ0FBQyxXQUFXLElBQUksV0FBVyxHQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO2dCQUNsRixXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUMxSCxDQUFDLENBQUM7U0FDTjs7Ozs7O0lBSUUsb0NBQWE7Ozs7Y0FBQyxXQUF1QjtRQUN4QyxJQUFJLFdBQVcsS0FBSyxTQUFTLElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxXQUFXLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsS0FBSyxJQUFJLElBQUk7WUFDaEgsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHOztnQkFDekIsSUFBSSxRQUFRLENBQWtCO2dCQUM5QixRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFNBQVMsR0FBQSxDQUFDLENBQUM7Z0JBQ2xFLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO29CQUM1QyxRQUFRLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztpQkFDeEI7YUFDSixDQUFDLENBQUE7Ozs7OztJQVFILG9DQUFhOzs7O2NBQUMsV0FBdUI7OztRQUV4QyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNsQyxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7O2dCQUM3QixJQUFJLElBQUksQ0FBcUI7Z0JBQzdCLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sR0FBQSxDQUFDLENBQUM7Z0JBRW5FLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO29CQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRzt3QkFDWixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO3FCQUNqSCxDQUFDLENBQUM7aUJBRU47YUFFSixDQUFDLENBQUM7U0FDTjs7Ozs7O0lBSUUsb0NBQWE7Ozs7Y0FBQyxXQUF1QjtRQUN4QyxJQUFJLFdBQVcsS0FBSyxTQUFTLElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxXQUFXLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsS0FBSyxJQUFJLElBQUk7WUFDaEgsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHOztnQkFDekIsSUFBSSxRQUFRLENBQWtCO2dCQUM5QixRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFNBQVMsR0FBQSxDQUFDLENBQUM7Z0JBQ2xFLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO29CQUM1QyxRQUFRLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztpQkFDeEI7YUFDSixDQUFDLENBQUE7Ozs7Ozs7Ozs7O0lBY0csOENBQXVCOzs7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLFNBQWMsRUFDeEUsWUFBeUIsRUFBRSxZQUF5QixFQUFFLE9BQWdCOzs7OzRCQUV0RSxxQkFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxFQUFBOzt3QkFBekYsU0FBeUYsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7SUFPdkYsOENBQXVCOzs7Ozs7OztjQUFDLFdBQXVCLEVBQUUsWUFBeUIsRUFBRSxXQUE4QixFQUFFLFNBQWM7UUFFN0gsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7Ozs7Ozs7OztJQUd2RSx3Q0FBaUI7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLFlBQXlCLEVBQUUsV0FBOEIsRUFBRSxTQUFjO1FBQ3ZILElBQUk7O1lBQ0EsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQzs7WUFDbEUsSUFBSSxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQzs7WUFDdEMsSUFBSSxRQUFRLENBQWE7O1lBQ3pCLElBQUksbUJBQW1CLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ25ELFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUIsUUFBUSxHQUFHLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMvRyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRWpHLElBQUksbUJBQW1CLElBQUksSUFBSSxFQUFFO2dCQUM3QixXQUFXLENBQUMsU0FBUyxHQUFHLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2FBQ3ZFO1NBQ0o7UUFBQyxXQUFNO1NBRVA7Ozs7Ozs7O0lBUUUsbURBQTRCOzs7Ozs7Y0FBQyxXQUF1QixFQUFFLG1CQUF1Qzs7UUFDaEcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTs7WUFDZCxJQUFJLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3ZDLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7WUFDM0csV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFOUMsYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3JFLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRTlDLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUM5RCxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNqRDs7Ozs7Ozs7O0lBTUMsMERBQW1DOzs7Ozs7SUFBekMsVUFBMEMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLFdBQW1COzs7Ozs0QkFDL0YscUJBQU0sYUFBYSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBNUcsSUFBSSxHQUFHLFNBQXFHO3dCQUNoSCxzQkFBTyxJQUFJLEVBQUM7Ozs7S0FDZjs7Ozs7OztJQUVZLGdEQUF5Qjs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVU7Ozs7Ozs7d0JBSW5GLHFCQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMsK0JBQStCLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBeEcsSUFBSSxHQUFHLFNBQWlHLENBQUM7d0JBQ3pHLHNCQUFPLElBQUksRUFBQzs7O3dCQUdaLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7Ozs7SUFXYiw2Q0FBc0I7Ozs7Ozs7O2NBQUMsT0FBcUIsRUFBRSxRQUFnQixFQUFFLFlBQXdCLEVBQUUsU0FBbUI7O1FBQ2hILElBQUksV0FBVyxHQUFlLFlBQVksQ0FBQzs7UUFDM0MsSUFBSSxvQkFBb0IsQ0FBc0I7O1FBQzlDLElBQUksbUJBQW1CLENBQWU7UUFDdEMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7UUFFaEQsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RixJQUFJLGNBQWMsRUFBRTtZQUNoQixjQUFjLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQzdELGNBQWMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlHLGNBQWMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckc7YUFBTTtZQUNILG9CQUFvQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUNqRCxvQkFBb0IsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3pDLG9CQUFvQixDQUFDLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUM7WUFDMUQsb0JBQW9CLENBQUMsTUFBTSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztZQUMxRCxvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDckcsb0JBQW9CLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xHLG9CQUFvQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV4RyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDOUQ7UUFDRCxZQUFZLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25FLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztJQVEzQixrREFBMkI7Ozs7OztJQUEzQixVQUE0QixvQkFBeUMsRUFBRSxZQUF3Qjs7UUFDM0YsSUFBSSxjQUFjLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxVQUFVLElBQUksb0JBQW9CLENBQUMsVUFBVSxHQUFBLENBQUMsQ0FBQztRQUNqSCxJQUFJLGNBQWMsRUFBRTtZQUNoQixjQUFjLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUM1QixjQUFjLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUM1QjtRQUNELFlBQVksR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkUsT0FBTyxZQUFZLENBQUM7S0FDdkI7Ozs7Ozs7Ozs7SUFNRCx1REFBZ0M7Ozs7O0lBQWhDLFVBQWlDLFdBQXVCO1FBQ3BELFdBQVcsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxvQkFBb0I7WUFDbEcsT0FBTyxJQUFJLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDO1NBQzVDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDTCxPQUFPLFdBQVcsQ0FBQztLQUN0Qjs7Ozs7Ozs7Ozs7O0lBT0QsOENBQXVCOzs7Ozs7SUFBdkIsVUFBd0IsdUJBQW1ELEVBQUUsT0FBcUI7O1FBQzlGLElBQUksY0FBYyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUEsQ0FBQyxDQUFDO1FBQ3RHLE9BQU8sY0FBYyxDQUFDO0tBQ3pCOzs7Ozs7Ozs7Ozs7SUFPRCwwQ0FBbUI7Ozs7OztJQUFuQixVQUFvQixlQUFlLEVBQUUsaUJBQTZCOztRQUM5RCxJQUFJLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFVBQVUsSUFBSSxlQUFlLENBQUMsVUFBVSxHQUFBLENBQUMsQ0FBQztRQUM3RixJQUFJLFFBQVEsRUFBRTtZQUNWLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztnQkFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDcEIsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7aUJBQ25CO2FBQ0osQ0FBQyxDQUFDO1lBRUgsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO2dCQUM3QixHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDZCxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzthQUNoQixDQUFDLENBQUM7U0FDTjtLQUNKOzs7Ozs7Ozs7O0lBTUQsZ0RBQXlCOzs7OztJQUF6QixVQUEwQixXQUF1Qjs7UUFDN0MsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDOztRQUNuQixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUM7O1FBQ2hFLElBQUkscUJBQXFCLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTVFLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEdBQUcscUJBQXFCLEdBQUcsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUgsSUFBSSxVQUFVLElBQUksQ0FBQyxFQUFFO1lBQ2pCLElBQUkscUJBQXFCLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQixJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQ3hEO2lCQUNJO2dCQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDekQ7U0FDSjtRQUVELE9BQU8sV0FBVyxDQUFDO0tBQ3RCOzs7Ozs7Ozs7O0lBTUQsOENBQXVCOzs7OztJQUF2QixVQUF3QixXQUF1Qjs7UUFDM0MsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRzs7WUFDekIsSUFBSSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUM7WUFDekUsSUFBSSxZQUFZLEVBQUU7Z0JBQ2QsZUFBZSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQzthQUMxQztTQUNKLENBQUMsQ0FBQztRQUVILE9BQU8sZUFBZSxDQUFDO0tBQzFCOzs7Ozs7Ozs7O0lBTUQsb0RBQTZCOzs7OztJQUE3QixVQUE4QixXQUF1Qjs7UUFDakQsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7UUFDOUIsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO1lBQ3pCLEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztnQkFDeEIscUJBQXFCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO2FBQ3ZDLENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQztRQUVILE9BQU8scUJBQXFCLENBQUM7S0FDaEM7Ozs7Ozs7Ozs7OztJQU9ELDZDQUFzQjs7Ozs7O0lBQXRCLFVBQXVCLFVBQWtCLEVBQUUsV0FBdUI7OztRQUM5RCxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7O1lBQ25CLEtBQWdCLElBQUEsS0FBQUEsU0FBQSxXQUFXLENBQUMsS0FBSyxDQUFBLGdCQUFBLDRCQUFFO2dCQUE5QixJQUFJLEdBQUcsV0FBQTs7b0JBQ1IsS0FBZ0IsSUFBQSxLQUFBQSxTQUFBLEdBQUcsQ0FBQyxZQUFZLENBQUEsZ0JBQUEsNEJBQUU7d0JBQTdCLElBQUksR0FBRyxXQUFBO3dCQUNSLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTs0QkFDaEIsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzt5QkFDaEM7NkJBQ0k7NEJBQ0QsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzt5QkFDaEM7d0JBQ0QsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7d0JBQ3RDLE1BQU0sR0FBRyxJQUFJLENBQUM7d0JBQ2QsTUFBTTtxQkFDVDs7Ozs7Ozs7O2dCQUNELElBQUksTUFBTSxFQUFFO29CQUNSLE1BQU07aUJBQ1Q7YUFDSjs7Ozs7Ozs7O0tBQ0o7Ozs7Ozs7Ozs7OztJQU9ELDhDQUF1Qjs7Ozs7O0lBQXZCLFVBQXdCLFVBQWtCLEVBQUUsV0FBdUI7OztRQUMvRCxJQUFJLGlCQUFpQixDQUFrQjs7WUFDdkMsS0FBZ0IsSUFBQSxLQUFBQSxTQUFBLFdBQVcsQ0FBQyxLQUFLLENBQUEsZ0JBQUEsNEJBQUU7Z0JBQTlCLElBQUksR0FBRyxXQUFBO2dCQUNSLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxZQUFZLEdBQUEsQ0FBQyxDQUFDO2dCQUMxRSxJQUFJLGlCQUFpQixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTtvQkFDbkQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFO3dCQUNoQixpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7cUJBQzFFO3lCQUNJO3dCQUNELGlCQUFpQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztxQkFDMUU7b0JBQ0QsTUFBTTtpQkFDVDthQUNKOzs7Ozs7Ozs7S0FDSjs7Ozs7Ozs7O0lBRU0sa0RBQTJCOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQzFGLFVBQW9CLEVBQUUsV0FBcUI7UUFDM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQyxpQ0FBaUMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUM1RixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7WUFDQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDOUMsQ0FBQyxDQUFDOzt1QkFqdkVmO0lBb3ZFQzs7Ozs7O0FDanZFRCxJQUFBOzs7Ozs7Ozs7OztJQUdXLDRCQUFZOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxTQUFjLEVBQy9FLFVBQW9CLEVBQUUsV0FBcUI7UUFDM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFFcEYsSUFBSSxXQUFXLENBQUM7WUFDaEIsV0FBVyxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ2pELFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdEU7WUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztJQVVKLCtCQUFlOzs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsSUFBUyxFQUM3RSxVQUFvQixFQUFFLFdBQXFCO1FBQzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLEdBQUcsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRWxGLElBQUksV0FBVyxDQUFDO1lBQ2hCLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUNuRCxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCLEVBQ0csVUFBQSxHQUFHOztZQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xDLENBQUMsQ0FBQzs7Ozs7Ozs7OztJQUlKLDZCQUFhOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxTQUFjLEVBQ2hGLFVBQW9CLEVBQUUsV0FBcUI7O1FBRzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRXJGLElBQUksUUFBUSxDQUFDO1lBQ2IsUUFBUSxHQUFHLElBQUksQ0FBQztZQUVoQixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQy9DLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbEU7WUFFRCxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJO2dCQUNqQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ2xDO2FBQ0osQ0FBQyxDQUFDO1lBR0gsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3hCLEVBQ0csVUFBQSxHQUFHOztZQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xDLENBQUMsQ0FBQzs7Ozs7Ozs7OztJQU1KLHFDQUFxQjs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsWUFBaUIsRUFDM0YsVUFBb0IsRUFBRSxXQUFxQjtRQUUzQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsOEJBQThCLEdBQUcsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRTNHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQixFQUNHLFVBQUEsR0FBRztZQUNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDOztZQUV2QixXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFCLENBQUMsQ0FBQzs7Ozs7Ozs7OztJQUtKLCtCQUFlOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxZQUFpQixFQUNyRixVQUFvQixFQUFFLFdBQXFCO1FBRTNDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFFckcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCLEVBQ0csVUFBQSxHQUFHO1lBQ0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O1lBRXZCLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUIsQ0FBQyxDQUFDOzs7Z0JBMUdmO0lBNkdDOzs7Ozs7SUN4R0Q7O0lBT0ksNEJBQVksVUFBZSxFQUFFLFVBQWtCO2dDQUhaLElBQUk7O1FBSW5DLElBQUksS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUE7UUFDekQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7S0FDdkI7Ozs7OztJQUdZLDRDQUFlOzs7OztjQUFDLGFBQTRCLEVBQUUsUUFBZ0I7Ozs7Ozs7d0JBRW5FLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO3dCQUN2QixpQkFBaUIsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7d0JBRS9DLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7NkJBQy9DLENBQUMsV0FBVyxFQUFaLHdCQUFZO3dCQUNHLHFCQUFNLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsRUFBQTs7d0JBQXZGLFdBQVcsR0FBRyxTQUF5RSxDQUFDO3dCQUN4RixJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFDLFFBQVEsQ0FBQyxDQUFBOzs7d0JBR3BELElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7O3dCQUVsQyxzQkFBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUM7Ozt3QkFFN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFFLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztJQU9qQixrREFBcUI7Ozs7OztjQUFDLE9BQVcsRUFBRSxVQUFrQjtRQUN4RCxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDOzs7Ozs7OztJQU1yRSx3REFBMkI7Ozs7OztjQUFDLE9BQVcsRUFBRSxVQUFrQjtRQUM5RCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQzs7Ozs7Ozs7SUFNdEQsaURBQW9COzs7Ozs7Y0FBQyxVQUFrQjs7UUFDMUMsSUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUM7O1FBQzlELElBQUksUUFBUSxDQUFLO1FBQ2pCLElBQUcsUUFBUSxFQUFDO1lBQ1IsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEMsT0FBTyxRQUFRLENBQUM7U0FDbkI7UUFDRCxPQUFPLElBQUksQ0FBQzs7Ozs7O0lBR1QsdURBQTBCOzs7O2NBQUMsVUFBa0I7O1FBQ2hELElBQUksUUFBUSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDOztRQUMvRCxJQUFJLFFBQVEsQ0FBSztRQUNqQixJQUFHLFFBQVEsRUFBQztZQUNSLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sUUFBUSxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxJQUFJLENBQUM7Ozs7OztJQUlULHdDQUFXOzs7O2NBQUMsV0FBOEI7O1FBRTdDLElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEtBQUssU0FBUyxJQUFJLFdBQVcsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFO1lBRTVHLElBQUksV0FBVyxDQUFDLFdBQVcsS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLFdBQVcsSUFBSSxJQUFJLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFOztvQkFDMUgsS0FBbUIsSUFBQSxLQUFBQSxTQUFBLFdBQVcsQ0FBQyxXQUFXLENBQUEsZ0JBQUEsNEJBQUU7d0JBQXZDLElBQU0sSUFBSSxXQUFBO3dCQUNYLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7O3FCQUU5Qjs7Ozs7Ozs7O2FBQ0o7U0FDSjs7Ozs7O0lBS0UsNENBQWU7Ozs7Y0FBQyxXQUE4Qjs7UUFDakQsSUFBSSxLQUFLLEdBQVksS0FBSyxDQUFDO1FBQzNCLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUMzQixJQUFHO2dCQUNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNyQyxRQUFRLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFO29CQUM5QyxLQUFLLFNBQVM7d0JBQ1YsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7d0JBQzlFLE1BQU07b0JBQ1YsS0FBSyxXQUFXO3dCQUNaLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO3dCQUN6RyxNQUFNO29CQUNWLEtBQUssU0FBUzt3QkFDVixLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7d0JBQ25GLE1BQU07b0JBQ1YsS0FBSyxLQUFLO3dCQUNOLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO3dCQUNyRyxNQUFNO29CQUNWO3dCQUNJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO3dCQUMzSSxNQUFNO2lCQUNiO2FBQ0o7WUFBQSxPQUFPLEVBQUUsRUFBQztnQkFDUCxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQTthQUNoQztTQUNKO1FBQ0QsSUFBRyxLQUFLLEVBQUM7WUFDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUNqRCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7SUFHVixvQ0FBTzs7Ozs7Y0FBQyxNQUFNLEVBQUUsTUFBTTtRQUN6QixJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUU7WUFDbEIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7O0lBSUosa0RBQXFCOzs7OztjQUFDLGFBQTRCLEVBQUUsUUFBZ0I7Ozs7Ozs7d0JBRXpFLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO3dCQUN2QixpQkFBaUIsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7d0JBRS9DLFdBQVcsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLENBQUM7NkJBQ3JELENBQUMsV0FBVyxFQUFaLHdCQUFZO3dCQUNHLHFCQUFNLGlCQUFpQixDQUFDLHlCQUF5QixDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsRUFBQTs7d0JBQXhGLFdBQVcsR0FBRyxTQUEwRSxDQUFDO3dCQUN6RixJQUFJLENBQUMsMkJBQTJCLENBQUMsV0FBVyxFQUFDLFFBQVEsQ0FBQyxDQUFBOzs0QkFHMUQsc0JBQU8sV0FBVyxFQUFDOzs7d0JBRW5CLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBRSxDQUFDLENBQUM7Ozs7Ozs7NkJBako1QjtJQXFKQzs7Ozs7O0FDckpELElBQUE7Ozt3QkFBQTtJQVNDOzs7Ozs7QUNURCxJQUdBOztxQkFRbUIsSUFBSSxZQUFZLEVBQUU7O3VCQVhyQztJQWdCQzs7Ozs7O0FDaEJELElBQUE7OzsyQkFBQTtJQUdDOzs7Ozs7QUNBRCxJQUFBOztzQkFXb0IsSUFBSSxLQUFLLEVBQVU7O3NCQWR2QztJQWtCQzs7Ozs7O0FDaEJELElBQUE7Ozs0QkFGQTtJQVNDOzs7Ozs7QUNQRCxJQUFBOzs7dUJBRkE7SUFXQzs7Ozs7O0FDWEQsSUFBQTs7OzBCQUFBO0lBTUM7Ozs7OztBQ0pELElBQUE7OzhCQVVtQyxLQUFLO3dCQUNYLEtBQUs7OEJBRUMsS0FBSzswQkFDVCxLQUFLOztxQkFoQnBDO0lBb0JDOzs7Ozs7QUNqQkQsSUFBQTtJQUdJLDRCQUFZLFlBQXlCO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO0tBQ3JDOzs7O0lBRU0seUNBQVk7Ozs7UUFDZixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzs7Ozs7SUFHN0Msd0NBQVc7Ozs7UUFDZCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Ozs7SUFHNUMsb0NBQU87Ozs7UUFDVixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7Ozs7SUFHeEMsbUNBQU07Ozs7UUFDVCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O0lBSXRDLG1EQUFzQjs7OztjQUFDLFFBQWdCO1FBQzNDLElBQUk7O1lBQ0EsSUFBSSxVQUFVLEdBQXFCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFFBQVEsSUFBSSxRQUFRLEdBQUEsQ0FBQyxDQUFDO1lBQzdHLElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO2dCQUNoRCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUM7YUFDM0I7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUFBLFdBQUs7WUFDRixPQUFPLEtBQUssQ0FBQztTQUNoQjs7NkJBcENUO0lBd0NDOzs7Ozs7SUMzQkQ7SUFVSSxxQkFBWSxVQUFrQixFQUFFLFdBQXVCLEVBQUUsV0FBZ0IsRUFBRSxTQUFrQixFQUNqRjtRQUFBLHNCQUFpQixHQUFqQixpQkFBaUI7eUJBUEQsR0FBRzswQkFDVixJQUFJLFVBQVUsRUFBRTt5QkFJVCxLQUFLO1FBRzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0tBQzlCOzs7O0lBRU0sMENBQW9COzs7O1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDOzs7Ozs7Ozs7SUFJcEIscUNBQWU7Ozs7Ozs7Y0FBQyxlQUErQixFQUFFLGFBQTRCLEVBQUUsUUFBYSxFQUFFLFNBQWM7Ozs7Ozt3QkFDckgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFFMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7NEJBQ2QsR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7eUJBQ3hCOzZCQUNJOzRCQUNELEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQzt5QkFDdkM7d0JBQ0csTUFBTSxHQUFrQixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUVSLHFCQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBQTs7d0JBQXhILE9BQU8sR0FBeUIsU0FBd0Y7d0JBRTVILHNCQUFPLE9BQU8sRUFBQzs7Ozs7Ozs7Ozs7Ozs7O0lBVU4saURBQTJCOzs7Ozs7Ozs7O2NBQUMsZUFBK0IsRUFBRSxhQUE0QixFQUFFLFFBQWEsRUFBRSxNQUFxQixFQUFFLFlBQWdDLEVBQUUsTUFBb0I7UUFBdEQsNkJBQUEsRUFBQSxtQkFBZ0M7UUFBRSx1QkFBQSxFQUFBLFlBQW9COzs7Ozs7O3dCQUU1TCxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzt3QkFDdEIsS0FBSyxHQUFHLENBQUMsQ0FBQzt3QkFFVixpQkFBaUIsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7d0JBQzNDLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDbEYsU0FBUyxHQUFXLEVBQUUsQ0FBQzt3QkFDdkIsYUFBYSxHQUFHLEtBQUssQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7d0JBRWQsU0FBUyxHQUF5QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ25ELENBQUMsR0FBRyxDQUFDOzs7OEJBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQTt3QkFDckIsYUFBYSxHQUFHLEtBQUssQ0FBQzt3QkFDbEIsSUFBSSxHQUFXLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs2QkFDekIsSUFBSSxFQUFKLHdCQUFJO3dCQUVKLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUNuQyxJQUFJLENBQUMsU0FBUyxFQUFkLHdCQUFjO3dCQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDM0MscUJBQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQU0sR0FBRzs7Ozs7NENBQzVELE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7NENBQzlCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7NENBRWYsdUJBQXVCLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7NENBQzFFLHFCQUFNLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7b0RBQzFGLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvREFDakMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0RBQzVCLE9BQU8sR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO2lEQUMxQixDQUFDLEVBQUE7OzRDQUpGLFNBSUUsQ0FBQzs7OztpQ0FFTixFQUFFLFVBQU0sS0FBSzs7Ozs7NENBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsR0FBRyxXQUFXLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQzs0Q0FDMUUsSUFBSSxHQUFHLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7Ozs7NENBRTlFLHFCQUFNLGlCQUFpQixDQUFDLDhCQUE4QixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsRUFBQTs7NENBQWhILE9BQU8sR0FBRyxTQUFzRyxDQUFDOzs7OzRDQUVqSCxPQUFPLENBQUMsS0FBSyxDQUFDLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEtBQUcsQ0FBQyxDQUFDOzRDQUM3RCxNQUFNLEdBQVcsS0FBRyxDQUFDLEdBQUcsQ0FBQzs0Q0FDekIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs0Q0FDN0QsU0FBUyxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUM7NENBQzNCLGFBQWEsR0FBRyxJQUFJLENBQUM7Ozs7O2lDQUU1QixDQUFDLEVBQUE7O3dCQXZCRixTQXVCRSxDQUFDOzs7d0JBR1AsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDOzhCQUNwRCxZQUFZLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQSxFQUF4Qyx3QkFBd0M7d0JBQzlCLHFCQUFNLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEVBQUE7O3dCQUF0SixPQUFPLEdBQUcsU0FBNEksQ0FBQzs7NEJBRzdJLHFCQUFNLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsRUFBQTs7d0JBQWxJLE9BQU8sR0FBRyxTQUF3SCxDQUFDOzs7d0JBSTNJLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3ZCLElBQUksQ0FBQyxhQUFhLElBQUksT0FBTyxFQUFFOzRCQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDOzRCQUM3QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO3lCQUN2Rjs2QkFBTTs0QkFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDbEU7Ozt3QkFFTCxLQUFLLEVBQUUsQ0FBQzt3QkFDUixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO3dCQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQTs7O3dCQXREdEMsQ0FBQyxFQUFFLENBQUE7Ozt3QkF3RDlCLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO3dCQUMvQixTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO3dCQUN6QixzQkFBTyxTQUFTLEVBQUM7Ozs7Ozs7Ozs7SUFJZCx1Q0FBaUI7Ozs7O2NBQUMsT0FBcUIsRUFBRSxXQUF1QjtRQUNuRSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQzFELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxVQUFBLGlCQUFpQjtnQkFDN0UsaUJBQWlCLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7YUFDaEQsQ0FBQyxDQUFDO1NBQ047Ozs7Ozs7Ozs7SUFJRSx1Q0FBaUI7Ozs7Ozs7O2NBQUMsT0FBcUIsRUFBRSxXQUF1QixFQUFFLGFBQTJCLEVBQUUsUUFBYSxFQUFFLFlBQWdDO1FBQWhDLDZCQUFBLEVBQUEsbUJBQWdDOztRQUNqSixJQUFJLFlBQVksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLFlBQVksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUM5QyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDeEIsWUFBWSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1NBQ3BEO1FBQ0QsWUFBWSxHQUFHLGFBQWEsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXBFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUduQyxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7WUFFNUgsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUUvQzthQUFNO1lBQ0gsYUFBYSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzdHO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDOzs7Ozs7O0lBT2hDLHVDQUFpQjs7Ozs7Y0FBQyxXQUF1QjtRQUM1QyxJQUFJOztZQUNBLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUE7WUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O2dCQUN2QyxJQUFJLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxHQUFHLElBQUksS0FBSyxFQUFnQixDQUFDO2lCQUM3RDtnQkFDRCxhQUFhLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQzdDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ3JEO1NBQ0o7UUFBQyxPQUFPLEVBQUUsRUFBRTtZQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtZQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1NBQ2xCOzs7Ozs7O0lBT0UsK0NBQXlCOzs7OztjQUFDLFdBQXVCO1FBQ3BELElBQUk7O1lBQ0EsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7Z0JBQ3RDLElBQUksY0FBYyxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxLQUFLLEVBQWlCLENBQUM7aUJBQzlEO2dCQUNELGNBQWMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDdkMsY0FBYyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUN2QyxjQUFjLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUN0RDtTQUNKO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUE7WUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtTQUNsQjs7Ozs7OztJQU9FLHNDQUFnQjs7Ozs7Y0FBQyxXQUF1QjtRQUMzQyxJQUFJOztZQUNBLElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUE7WUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O2dCQUN0QyxJQUFJLGdCQUFnQixHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBRTdDLGdCQUFnQixDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUN2RCxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7YUFFeEY7U0FDSjtRQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO1lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7U0FDbEI7Ozs7OztJQUtFLCtCQUFTOzs7O2NBQUMsU0FBYztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDOzs7Ozs7SUFNbEMsbUNBQWE7Ozs7Y0FBQyxJQUFZO1FBQzdCLElBQUk7O1lBQ0EsSUFBSSxXQUFXLEdBQWUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7O1lBQ2xKLElBQUksT0FBTyxHQUFrQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV4RCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0JBQzdDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzlDO2lCQUFNO2dCQUNILFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzlDO1lBRUQsT0FBTyxXQUFXLENBQUM7U0FDdEI7UUFBQyxPQUFPLEVBQUUsRUFBRTtZQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsMENBQTBDLENBQUMsQ0FBQztZQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7Ozs7Ozs7SUFPRSxvQ0FBYzs7Ozs7Y0FBQyxPQUFzQjs7UUFDeEMsSUFBSSxRQUFRLEdBQWUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7O1FBQ3BELElBQUksV0FBVyxHQUFlLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBRWxKLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLFFBQVEsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7Z0JBQzFCLEtBQUssVUFBVTtvQkFDWCxXQUFXLENBQUMsUUFBUSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdEQsTUFBTTtnQkFDVixLQUFLLFFBQVE7b0JBQ1QsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3BELE1BQU07Z0JBQ1YsS0FBSyxLQUFLO29CQUNOLFdBQVcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDaEQsTUFBTTtnQkFDVixLQUFLLFVBQVU7O29CQUNYLElBQUksR0FBRyxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDdkYsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2hDLE1BQU07Z0JBQ1YsS0FBSyxPQUFPOztvQkFDUixJQUFJLEtBQUssR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQ3pGLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM5QixNQUFNO2dCQUNWLEtBQUssYUFBYTs7b0JBQ2QsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7b0JBQzFDLElBQUksSUFBSSxHQUFXLEdBQUcsQ0FBQzs7b0JBQ3ZCLElBQUksSUFBSSxDQUFTO29CQUVqQixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTt3QkFDOUIsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzNCLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUM5Qjt5QkFBTTt3QkFDSCxJQUFJLEdBQUcsS0FBSyxDQUFDO3FCQUNoQjs7b0JBRUQsSUFBSSxPQUFPLEdBQUcsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztvQkFDL0UsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ25DLE1BQU07Z0JBQ1Y7b0JBQ0ksTUFBTTthQUNiO1NBQ0o7UUFDRCxPQUFPLFdBQVcsQ0FBQzs7Ozs7OztJQU9oQixvQ0FBYzs7Ozs7Y0FBQyxPQUFzQjs7UUFDeEMsSUFBSSxXQUFXLEdBQWUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7O1FBR2xKLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDckIsV0FBVyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3JCLFdBQVcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3JCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3JCLFdBQVcsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxXQUFXLENBQUM7O3NCQTFVM0I7SUE4VUM7Ozs7OztJQ3BVRDs7Ozs7Ozs7Ozs7OztJQVdpQixrRUFBa0M7Ozs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsV0FBbUIsRUFDaEgsS0FBSyxFQUFFLElBQUksRUFBRSxlQUEyQjs7Ozs7O3dCQUVwQyxTQUFTLEdBQUcsSUFBSSxZQUFZLENBQUE7d0JBQ2hDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO3dCQUNoQyxTQUFTLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQzs7Ozt3QkFHdEIsY0FBYyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7d0JBQ3ZDLHFCQUFNLGNBQWMsQ0FBQyxtQ0FBbUMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFBOzt3QkFBckgsbUJBQW1CLEdBQUcsU0FBK0YsQ0FBQzs7d0JBR3RILG1CQUFtQixDQUFDLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7d0JBQzlELG1CQUFtQixDQUFDLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxZQUFZLENBQUM7d0JBRTdELHFCQUFNLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxFQUFBOzt3QkFBM0ksSUFBSSxHQUFHLFNBQW9JLENBQUM7Ozs7d0JBSXJJLHFCQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxFQUFBOzt3QkFBakgsSUFBSSxHQUFHLFNBQTBHLENBQUM7OzRCQUV0SCxzQkFBTyxJQUFJLEVBQUM7Ozs7Ozs7Ozs7Ozs7OztJQVdILDREQUE0Qjs7Ozs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFDckYsS0FBVSxFQUFFLElBQVMsRUFBRSxTQUF1QixFQUFFLGVBQTJCOzs7Ozs7d0JBRzNFLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUNoRCxhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDeEQsUUFBUSxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUNoRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzs7d0JBR3ZDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO3dCQUM5QixRQUFRLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQzt3QkFFbEIscUJBQU0sYUFBYSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFBOzt3QkFBdEcsVUFBVSxHQUFHLFNBQXlGO3dCQUMxRyxzQkFBTyxVQUFVLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7SUFZVCxpRUFBaUM7Ozs7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxVQUFzQixFQUFFLFNBQWlCLEVBQ2xILEtBQVUsRUFBRSxJQUFTLEVBQUUsU0FBdUIsRUFBRSxlQUEyQjs7Ozs7Ozt3QkFHM0UsWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQ2hELGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO3dCQUV4RCxRQUFRLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQ3RHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUV0QixxQkFBTSxhQUFhLENBQUMsMkJBQTJCLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUE7O3dCQUF0RyxVQUFVLEdBQUcsU0FBeUY7d0JBQzFHLHNCQUFPLFVBQVUsRUFBQzs7Ozs7Ozs7O0lBR3RCLDhDQUFjOzs7O0lBQWQsVUFBZSxlQUEyQjs7UUFDdEMsSUFBSSxZQUFZLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNyQyxZQUFZLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUMzQixZQUFZLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUNuQyxlQUFlLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztZQUNyQixZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUE7U0FDbkMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxZQUFZLENBQUM7S0FDdkI7Z0NBckdMO0lBdUdDOzs7Ozs7QUNyR0QsSUFBQTs7Ozs7Ozs7Ozs7OztJQUlXLHVDQUFlOzs7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBQyxTQUFpQixFQUFFLFVBQWlCLEVBQUUsVUFBaUIsRUFDdkcsS0FBVSxFQUFFLFNBQW1CLEVBQUUsWUFBc0I7UUFDdkQsYUFBYSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFHakksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CLEVBQ0csVUFBQSxHQUFHOztZQUVDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNyQixDQUFHLENBQUM7O3dCQWhCakI7SUFtQkM7Ozs7OztBQ25CRCxJQUFBOzs7OEJBQUE7SUFJQzs7Ozs7O0FDSkQsSUFBQTs7OzJCQUFBO0lBV0M7Ozs7OztBQ1hELElBQUE7OzswQkFBQTtJQU1DOzs7Ozs7QUNIRCxJQUFBOzttQ0FJaUMsSUFBSSxLQUFLLEVBQXVCO3NCQUd0QyxTQUFTOzt3QkFWcEM7SUFXQzs7Ozs7O0FDVEQsSUFBQTs7Ozs7Ozs7Ozs7O0lBVVcsNERBQW1DOzs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFFBQWdCLEVBQUUsSUFBUyxFQUNoRyxTQUFtQixFQUFFLFlBQXNCOztRQUczQyxhQUFhLENBQUMsYUFBYSxDQUFDLHlDQUF5QyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUNwRyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDOztZQUMxQyxJQUFJLFlBQVksQ0FBWTtZQUM1QixJQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFDO2dCQUMvQixZQUFZLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQztnQkFDaEMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzFDO2lCQUFJO2dCQUNILFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQzthQUN0QztZQUVELFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN6QixFQUNDLFVBQUEsR0FBRztZQUNELFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pDLENBQUMsQ0FBQzs7Ozs7Ozs7OztJQUdBLHdDQUFlOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsUUFBZ0IsRUFBRSxJQUFTLEVBQzlFLFNBQW1CLEVBQUUsWUFBc0I7O1FBRzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7WUFDaEYsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pCLEVBQ0MsVUFBQSxHQUFHO1lBQ0QsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ25CLENBQUMsQ0FBQzs7eUJBMUNiO0lBNENDOzs7Ozs7QUM1Q0Q7SUFlSTt3QkFIc0MsSUFBSSxZQUFZLEVBQUU7UUFJcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7O1lBQ3RCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1NBQzlCO0tBQ0o7Ozs7SUFJTSxtREFBMEI7Ozs7O1FBQzdCLElBQUksY0FBYyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7O1FBQzdELElBQUksY0FBYyxDQUFDO1FBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO1lBQ3hELGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVDLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtnQkFDeEcsT0FBTyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQzthQUNqRDtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7Ozs7OztJQUdULDRCQUFHOzs7O2NBQUMsRUFBVTtRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7O0lBSTFCLG9DQUFXOzs7OztjQUFDLEVBQVUsRUFBRSxRQUFhOztRQUN4QyxRQUFRLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUVsQixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDNUIsT0FBTyxLQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN0QyxFQUFFLFVBQUEsS0FBSztZQUNKLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFCLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7Z0JBQ3ZCLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QixPQUFPLEtBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3RDO2lCQUFNO2dCQUNILE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtvQkFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNqQixDQUFDLENBQUM7YUFDTjtTQUNKLENBQUMsQ0FBQzs7Ozs7SUFhQSxxQ0FBWTs7OztRQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Ozs7O0lBR3JCLDBDQUFpQjs7OztRQUNwQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzs7Ozs7SUFHakUsbUNBQVU7Ozs7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Ozs7O0lBR2xELGlEQUF3Qjs7OztRQUMzQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Ozs7OztJQUduRCxnQ0FBTzs7OztjQUFDLFVBQW1COztRQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFBLFFBQVE7WUFDakMsVUFBVSxDQUFDOztnQkFDUCxJQUFJLE1BQU0sR0FBRyxLQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDL0MsS0FBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEdBQUcsTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzlFLFVBQVUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDO2FBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDWixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRztZQUNsQixVQUFVLENBQUMsRUFBQyxNQUFNLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEIsQ0FBQyxDQUFDOzs7OztJQUVBLHNDQUFhOzs7OztRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU87WUFDdEQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUc7Z0JBQzdFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2FBQzlELENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxVQUFVO1lBQ2QsT0FBTyxLQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM3QyxDQUFDLENBQUM7Ozs7OztJQUdBLCtCQUFNOzs7O2NBQUMsS0FBYTs7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsTUFBTTtZQUNoQyxPQUFPLEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZDLENBQUMsQ0FBQzs7O2dCQTVHVixVQUFVLFNBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzs7Ozt5QkFSRDs7Ozs7OztBQ0FBO0lBZ0JJLHNCQUFtQixpQkFBa0M7UUFBbEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFpQjt3QkFIZixJQUFJLFlBQVksRUFBRTs4QkFxSWpDO1NBRXRCO1FBbklHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFOztZQUN0QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksR0FBRyxNQUFNLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUM5QjtLQUNKOzs7O0lBR00saURBQTBCOzs7OztRQUM3QixJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztRQUM3RCxJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxJQUFJLElBQUksRUFBRTtZQUN4RCxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ3hHLE9BQU8sY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7YUFDakQ7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDOzs7Ozs7SUFHVCwwQkFBRzs7OztjQUFDLEVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7OztJQUkxQixrQ0FBVzs7Ozs7Y0FBQyxFQUFVLEVBQUUsUUFBYTs7UUFDeEMsUUFBUSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFFbEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU07WUFDM0IsUUFBUSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzVCLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdEMsRUFBRSxVQUFBLEtBQUs7WUFDSixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFO2dCQUN2QixPQUFPLEtBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQ3ZEO2lCQUFNO2dCQUNILE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtvQkFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNqQixDQUFDLENBQUM7YUFDTjtTQUNKLENBQUMsQ0FBQzs7Ozs7O0lBR0EsOEJBQU87Ozs7Y0FBQyxVQUFtQjs7UUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQSxRQUFRO1lBQ2pDLFVBQVUsQ0FBQzs7Z0JBQ1AsSUFBSSxNQUFNLEdBQUcsS0FBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7Z0JBQy9DLEtBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxHQUFHLE1BQU0sRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RSxVQUFVLENBQUMsRUFBQyxNQUFNLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQzthQUM3QixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ1osQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUc7WUFDbEIsVUFBVSxDQUFDLEVBQUMsTUFBTSxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztZQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCLENBQUMsQ0FBQzs7Ozs7SUFHQSxvQ0FBYTs7OztRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDOzs7OztJQUduQixvQ0FBYTs7OztRQUNoQixJQUFJOztZQUNBLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxHQUFHLE1BQU0sRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ2pGO1FBQUMsV0FBSztTQUVOOzs7OztJQUlFLHdDQUFpQjs7OztRQUNwQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzs7Ozs7SUFHakUsaUNBQVU7Ozs7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Ozs7O0lBR2xELG9DQUFhOzs7OztRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU87WUFDdEQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUc7Z0JBQzdFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2FBQzlELENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxVQUFVO1lBQ2QsT0FBTyxLQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM3QyxDQUFDLENBQUM7Ozs7Ozs7OztJQVFBLG9DQUFhOzs7Ozs7O2NBQUMsT0FBYzs7O1FBRy9CLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxPQUFPO1lBQ3RELE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDdEIsS0FBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87Z0JBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFBO2dCQUM3RCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQTtnQkFDdkUsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM5RixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO2FBQ3hILENBQUMsQ0FBQztZQUNILE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLE9BQU8sR0FBQSxDQUFDO2lCQUMzSixHQUFHLENBQUUsVUFBQSxHQUFHOztnQkFFTCxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUM5RCxDQUFDLENBQUM7U0FDTixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsVUFBVTtZQUVkLE9BQU8sS0FBSSxD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
16786
+ //# 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+IGxQcmUuSURMSVNUQSA9PSBzcGxpdFByZWNpb1swXSk7XHJcbiAgICAgICAgbGV0IHByZWNpb01vbmVkZXJvID0gMDtcclxuICAgICAgICBpZiAob0xpc3RhRmluZGVkICYmIHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChzcGxpdFByZWNpb1sxXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxCXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxDO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxEO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgaWYgKGdzSWRLYXRpb3MgIT0gbnVsbCAmJiBnc0lkS2F0aW9zID09IFwiQ1ROXCIpIHtcclxuICAgICAgICAgICAgcHJlY2lvTW9uZWRlcm8gPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKS5QUkVDSU87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTywgcHJlY2lvTW9uZWRlcm8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gcXVlIHNlIGhhY2VuIHZhbGlkYXMgZGVzcHVlcyBkZSByZWdpc3RyYXIgdG9kb3MgbG9zIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSBKUHJvbW9jaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQWZ0ZXIoSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9NM1Byb2Nlc29zLlZhbG9yTmV0bztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb00zUHJvY2Vzb3MuVmFsb3JOZXRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiBlbiBnZW5lcmFsXHJcbiAgICAgKiBAcGFyYW0gSlByb21vY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIG5QcmVjaW8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lczogQXJyYXk8YW55PiwgblByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgcHJlY2lvTW9uZWRlcm8gPSAwKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzOiBQcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB2YXIgb0xpc3RhUHJvbW9zQXNvYyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxuICAgICAgICBsZXQgcHJlY2lvQXNpZ25hZG8gPSBuUHJlY2lvO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBKUHJvbW9jaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIC8vSlByb21vY2lvbmVzLmZvckVhY2gocHJvbW9jaW9uID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21vY2lvbiA9IEpQcm9tb2Npb25lc1tfaV07XHJcbiAgICAgICAgICAgIC8vIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLkFjY2lvbi5UaXBvMiAhPSBudWxsICYmIHByb21vY2lvbi5BY2Npb24uVGlwbzIgPT0gXCJNT05FREVST1wiICYmIHByZWNpb01vbmVkZXJvID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByZWNpb01vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0J5VGlwbyhwcm9tb2Npb24sIHByZWNpb0FzaWduYWRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MucHVzaChvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlZhbGlkYXJNZWpvclByb21vY2lvbihvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBwcmVjaW9Nb25lZGVybyk7XHJcblxyXG4gICAgICAgIC8vIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5wdXNoKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPCAwKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL0ZTIDIwMTkwNzI1IFJlZG9kbmVvIGRlIGxvcyB2YWxvcmVzIHRvdGFsZXNcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpb24gZGUgbWVqb3Igb3BjaW9uLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIHByb21vY2lvbmVzIHByb2Nlc2FkYXMuXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RhUHJvbW9zQXNvYyBMaXN0YSBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBQcm9tb2Npb24gcHJvY2VzYWRhLCBxdWUgcmV0b3JuYXLDg8KhIGEgZmx1am8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTWVqb3JQcm9tb2Npb24ob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG1vbmVkZXJvOiBudW1iZXIpOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIGxldCBwcm9tb0Fzb2NpYWRhUmVzdHJpbmdpZG8gPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlRpcG8gPT0gXCJSRVNUUklDQ0lPTlwiKTtcclxuICAgICAgICAvL1NpIGVsIHByb2R1Y3RvIGVzdGEgcmVzdHJpbmdpZG8gbGUgZGEgbWF5b3IgcHJpb3JpZGFkIGEgZXN0YSBwcm9tb2Npw4PCs25cclxuICAgICAgICBpZiAoIXByb21vQXNvY2lhZGFSZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAvLzEuIFN1bWEgZGUgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcbiAgICAgICAgICAgIC8vdmFyIGRQcm9tb0FDTTogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgLy9kUHJvbW9BQ00gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTVwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgbGV0IGRQcm9tb0VYQyA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiRVhDXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vQUNNRElOID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJBQ01ESU5cIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIC8vUHJvbW9jaW9uZXMgTm8gQWN1bXVsYWJsZXNcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJvbW9BQ01ESU4gPCBkUHJvbW9FWEMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vRVhDKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9BQ01ESU4ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcblxyXG4gICAgICAgICAgICAvL1JlY29ycmVyIHRvZGFzIGxhcyBwcm9tb2Npb25lcyBBY3VtdWxhYmxlc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiICYmICF4LmZsYWdzLmZvcm1hUGFnbykpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG1vbmVkZXJvICE9IDAgJiYgcHJvbW8uVGlwbyA9PSBcIk1PTkVERVJPXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCttb25lZGVybykgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCttb25lZGVybykgLSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gcHJvbW8uVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHByb21vLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IHByb21vLlZhbG9yTW9uZWRlcm87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vLy8vLy9GVU5DSU9OQUxJREFEIFBST0RSSUEgRlVOQ0lPTkFSIE3Dg8KBUyBBREVMQU5URSwgU0kgU0UgUVVJRVJFIEFHUlVQQVIgTEFTIFBST01PQ0lPTkVTIEFDTSBZIEVYQ1xyXG4gICAgICAgICAgICAvLyBpZihkUHJvbW9BQ00gPT0gMCAmJiBkUHJvbW9FWEMgPT0gMCl7XHJcbiAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlIGVuY29udHJhcm9uIHByb21vY2lvbmVzJyk7XHJcbiAgICAgICAgICAgIC8vIH1lbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgaWYoZFByb21vQUNNID4gZFByb21vRVhDKXtcclxuICAgICAgICAgICAgLy8gICAgICAgICAvL0dhbmEgcHJvbW9jaW9uZXMgYWN1bXVsYXRpdmFzLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKS5mb3JFYWNoKHggPT4geC5BcGxpY2FkYSA9IHRydWUpOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvTGlzdGFQcm9tb3NBc29jOy8vLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIilcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIGRQcm9tb0FDTSkgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgZFByb21vQUNNKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpLnJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuVmFsb3JNb25lZGVybyksIDApO1xyXG4gICAgICAgICAgICAvLyAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9HYW5hIHByb21vY2lvbmVzIGV4Y2x1eWVudGVzLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKS5BcGxpY2FkYSA9IHRydWU7IC8vIE1hcmNhY2lvbiBkZSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBkUHJvbW9FWEMpICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIGRQcm9tb0VYQykgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKS5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4ocHJvbW9Bc29jaWFkYVJlc3RyaW5naWRvKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICB9XHJcblxyXG4gICAgYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIHZhbG9yUHJvbW9FWEM6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwcm9tb0V4YzogUHJvbW9jaW9uZXNBc29jaWFkYXM7XHJcbiAgICAgICAgaWYgKHZhbG9yUHJvbW9FWEMgPiAwKSB7XHJcbiAgICAgICAgICAgIHByb21vRXhjID0gb0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSB2YWxvclByb21vRVhDIHx8IHguVmFsb3JNb25lZGVybyA9PSB2YWxvclByb21vRVhDKTtcclxuICAgICAgICAgICAgcHJvbW9FeGMuQXBsaWNhZGEgPSB0cnVlOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHByb21vRXhjLlZhbG9yKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgcHJvbW9FeGMuVmFsb3IpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tb0V4Yy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFwbGljYVByb21vQUNNRElOKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCB2YWxvclByb21vQUNNRElOOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodmFsb3JQcm9tb0FDTURJTiA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcHJvbW8gb2Ygb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhID09IFwiQUNNRElOXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tby5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHZhbG9yUHJvbW9BQ01ESU4pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyB2YWxvclByb21vQUNNRElOKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBtYXhpbW8gdmFsb3Igc2VndW4gbGEgcmVnbGEgYSBjb21wYXJhclxyXG4gICAgICogQHBhcmFtIG9MaXN0YVByb21vc0Fzb2MgXHJcbiAgICAgKiBAcGFyYW0gc1JlZ2xhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgc1JlZ2xhOiBzdHJpbmcsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHZhciByZXN1bHQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc3dpdGNoIChzUmVnbGEpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNhc2UgXCJBQ01cIjpcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXN1bHQgPSBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gc1JlZ2xhICYmICF4LmZsYWdzLmZvcm1hUGFnbykucmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5WYWxvciksIDApO1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFDTURJTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVjaW9BY3R1YWwgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclRvdGFsRGVzY3VlbnRvID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTURJTlwiICYmICgheC5mbGFncy5mb3JtYVBhZ28gfHwgeC5UaXBvID09IFwiTU9ORURFUk9cIikpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVldm9WYWxvckRlc2N1ZW50byA9IChwcmVjaW9BY3R1YWwgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvQWN0dWFsIC09IG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxvclRvdGFsRGVzY3VlbnRvICs9IG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9BY3R1YWwgLT0gcHJvbW8uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxvclRvdGFsRGVzY3VlbnRvICs9IHByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbG9yVG90YWxEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiRVhDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IHNSZWdsYSAmJiAoIXguZmxhZ3MuZm9ybWFQYWdvIHx8IHguVGlwbyA9PSBcIk1PTkVERVJPXCIpKS5tYXAoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8uVmFsb3IgPiBvLlZhbG9yTW9uZWRlcm8gPyBvLlZhbG9yIDogby5WYWxvck1vbmVkZXJvOyB9KSlcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1Byb2Nlc2FyIHByb21vY2lvbiBzZWd1biBlbCB0aXBvIFxyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9CeVRpcG8ocHJvbW9jaW9uOiBhbnksIFByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPik6IFByb21vY2lvbmVzQXNvY2lhZGFzIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgQWNjaW9uO1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbmV3IFByb21vY2lvbmVzQXNvY2lhZGFzKCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLlByb21vY2lvbiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbiA9IHByb21vY2lvbi5Qcm9tb2Npb24uSUQ7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTm9tYnJlID0gcHJvbW9jaW9uLlByb21vY2lvbi5Ob21icmU7XHJcbiAgICAgICAgICAgICAgICBBY2Npb24gPSBwcm9tb2Npb24uQWNjaW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2lvbi5SZWdsYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYSA9IEFjY2lvbi5SZWdsYTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlJlZ2xhID0gXCJFWENcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMjtcclxuXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fJVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvclBvcmNlbnRhamUgPSArQWNjaW9uLlZhbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9ICgrUHJlY2lvKSAqICgoK0FjY2lvbi5WYWxvcikgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX1ZBTE9SXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX0VYQUNUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gKCtQcmVjaW8pIC0gKCtBY2Npb24uVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBBY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGFPYnNlcSA9IEFjY2lvbi5SZWdsYU9ic2VxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJDYW50aWRhZE9ic2VxdWlvcyhvTTNFTkNQUk9NTywgQWNjaW9uLk9CU0VRVUlPUywgb1Byb21vY2lvbmVzQXNvY2lhZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy92YWxpZGFyIGNhbnRpZGFkIHZzIGNhbnRpZGFkIGRlIG9ic3F1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNT05FREVST1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9GUyAyMDE5MDgyNyBZYSBubyBzZSBndWFyZGEgZWwgdmFsb3IgdG90YWwgZGVsIG1vbmVkZXJvIHNpIG5vIHVuaWNhbWVudGUgZWwgcG9yY2VudGFqZS4uLiBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybyA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgKiAoKCtBY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNVUE9OXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLklkQ3Vwb24gPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJBQ1RJVkFfUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMubElkQWN0aXZhUHJvbW8gPSBBY2Npb24uVmFsb3Iuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJFU1RSSUNDSU9OX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUkVTVFJJQ0NJT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAvL3RoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQob1Byb21vY2lvbmVzQXNvY2lhZGFzLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBBY2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWNjaW9uLlRpcG8gPT0gXCJDT01CSU5BREFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEgPSBuZXcgUHJvbW9jaW9uQ29tYmluYWRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5UaXBvMiA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuTm9tYnJlID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uID0gQWNjaW9uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckNhbXBvc0FkaWNpb25hbGVzKG9NM0VOQ1BST01PLCBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLCBwcm9tb2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLkZvcm1hUGFnbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5mbGFncy5mb3JtYVBhZ28gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmFsaWRhckNhbnRpZGFkT2JzZXF1aW9zKG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPixcclxuICAgICAgICBvYnNlcXVpb3M6IEFycmF5PGFueT4sIG9Qcm9tb2Npb25lc0Fzb2NpYWRhczogUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgIHZhciBWYWxvckNhbnRQUkQ6IG51bWJlciA9IC0xO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JDYW50UFJEUmVhbDogbnVtYmVyID0gdGhpcy5nb0RhdGFBZGljaW9uYWwuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIHByb21vLk0zQ09ORElBR1JVUEFDSU9OLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBWYWxvckNhbnRQUkQgPSAreC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIikuVmFsb3JcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5DYW50aWRhZE9ic2VxID0gVmFsb3JDYW50UFJEXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBjYW1wb3MgYWRpY2lvbmFsZXMgZW4gcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNFTkNQUk9NTyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uQ29tYmluYWRhIFxyXG4gICAgICogQHBhcmFtIHByb21vY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJDYW1wb3NBZGljaW9uYWxlcyhvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSwgcHJvbW9jaW9uOiBhbnkpIHtcclxuICAgICAgICBzd2l0Y2ggKG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIpIHtcclxuICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgLy9BZ3JlZ2FyIENhbnRpZGFkLlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNWYWxvckNhbnRpZGFkOiBzdHJpbmcgPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvckNhbnRpZGFkID0geC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLkNhbnRpZGFkT2JzcSA9IHNWYWxvckNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FcIjpcclxuICAgICAgICAgICAgICAgIC8vIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIC8vIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgakFkaWM6YW55ID0gSlNPTi5wYXJzZShwcm9tby5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uQ2xhc2lmaWNhY2lvbiA9IGpBZGljLlJPT1QuQWNjaW9uLkNhcmFjdGVyaXN0aWNhO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJDT01CT1wiOlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgcHJvbW8gPSBvTTNFTkNQUk9NTy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uTnVtQ29uZGljaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5OdW1Db25kaWNpb25lcyA9IHByb21vLk0zQ09ORElBR1JVUEFDSU9OWzBdLk0zQ09ORElQUk9NTy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLklEQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uSWRDb25kaWNpb24gPSBwcm9tb2Npb24uSURDb25kaWNpb25cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEZpbiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gSW5pY2lvIFByb2Nlc2FtaWVudG8gQ29tYmluYWRhIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vUHJvY2VzYXIgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5Qcm9tb0NvbWJpbmFkYXNWMihvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb2Nlc2FyQ29tYmluYWRhXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vVjIgQ09NQklOQURBXHJcbiAgICAvKipcclxuICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbmVzIGNvbWJpbmFkYXMsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzIGRlIE0zUHJvY2Vzb3NcclxuICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gT2JqZXRvIE0zIFByb2Nlc29zLCBlbCBjdWFsIHNlIHJlY29ycmVyw4PCoSBsYSBpbmZvcm1hY2lvbiBkZSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9Db21iaW5hZGFzVjIoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgIGxldCBlbmNDb25MYUNhbnRpZGFkT3JpZ2luYWwgPSBfLmNsb25lRGVlcChpb00zUHJvY2Vzby5NM0VOQyk7XHJcblxyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5HZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5BZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgdmFyIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzW2ldO1xyXG4gICAgICAgICAgICB2YXIgZXNBY3VtdWxhYmxlID0gdGhpcy5HZXRFc0FjdW11bGFibGVQcm9tbyhjb21iaSlcclxuICAgICAgICAgICAgLy8vT2J0ZW5lciB0b2RvcyBsb3MgRW5jYWJlemFkb3MgcXVlIGFwbGljYW4gYSBsYSBwcm9tb2Npb24gYSBsYSBxdWUgc2UgZXN0YSBpdGVyYW5kb1xyXG4gICAgICAgICAgICBvTGlzdEVuY2FiID0gdGhpcy5HZXRFbmNhYmV6YWRvQnlDb21iaShjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbWJpLlRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTU9EX0NBTlRJREFEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzOiAzIGdhc2Vvc2FzIHBvciAkNTAwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUmVnbGFNb2RDYW50aWRhZChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfQ0lFUlJFXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlByb2Nlc2FyUHJvbW9PYnNxQ2llcnJlKGxQcmVjaW9zLCBjb21iaSwgaW9NM1Byb2Nlc28sIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfU1VNVE9UQUxcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyT2JzZXFTdW1Ub3RhbChvTGlzdEVuY2FiLCBjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlhDQVJBQ1RFUklTVElDQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FQQVJDSUFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlbmFyTGlzdGFFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYiwgY29tYmksIGxQcmVjaW9zLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNPTUJPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwbENvbWJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXBsQ29tYm8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBsQ29tYm8gPSB0aGlzLlByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlLCBpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRUT19WQUxPUlRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBST0RfQVBMREVTQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9kdWN0b0FwbERlc2Mob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzIHBhcmEgMngxLCAzeDEsIDR4MiwgLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9MaXN0RW5jYWIgJiYgb0xpc3RFbmNhYi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZSByZWVzdGFibGVjZSBsYSBjYW50aWRhZCBvcmlnaW5hbCBwYXJhIHF1ZSBubyBzZSBxdWVkZSBlbiB1biBidXZsZSBpbmZpbml0b1xyXG4gICAgICAgIGZvciAoY29uc3Qgb00zUEVuY09yaWdpbmFsZXMgb2YgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsKSB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZE9yaWdpbmFsID0gb00zUEVuY09yaWdpbmFsZXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQWN0dWFsID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY09yaWdpbmFsZXMuSUQpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gY2FudGlkYWRPcmlnaW5hbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3JkZW5hckxpc3RhRW5jKG9saXN0YUVuYzogTTNQRW5jSXRlbXNbXSwgZXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgaWYgKGVzQWN1bXVsYWJsZSkgb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVE5FVE8nKS5WYWxvcikpO1xyXG4gICAgICAgIGVsc2Ugb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVQnKS5WYWxvcikgLSAoK2EuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcbiAgICAgICAgdmFyIGNhbnRpZGFkRGVzY1Byb21vOiBudW1iZXIgPSArQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBwcmVjaW9Ub3RhbENvbXByYTogbnVtYmVyID0gbFByZWNpb3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICsgTnVtYmVyKGIuUFVOSVRORVRPKTsgfSwgMCk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmVjaW9Ub3RhbENvbXByYSk7XHJcbiAgICAgICAgbGV0IGRlc2NBY3VtID0gMDtcclxuICAgICAgICBsZXQgZGVzY1Byb2RBY3R1YWw7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZGVzY1Byb2RBY3R1YWwgPSAobFByZWNpb3NbaV0uUFVOSVRORVRPIC8gcHJlY2lvVG90YWxDb21wcmEpICogY2FudGlkYWREZXNjUHJvbW8gLy80MFxyXG4gICAgICAgICAgICBkZXNjQWN1bSArPSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgLy8gaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAvLyAgICAgaWYgKGxQcmVjaW9zW2ldLlBVTklUTkVUTyA8IGNhbnRpZGFkRGVzY1Byb21vKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gLT0gbFByZWNpb3NbaV0uUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICBlbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyAtPSBjYW50aWRhZERlc2NQcm9tbztcclxuICAgICAgICAgICAgLy8gICAgICAgICBjYW50aWRhZERlc2NQcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gZGVzY0FjdW0gfHwgY2FudGlkYWREZXNjUHJvbW8gPCBkZXNjQWN1bSkge1xyXG4gICAgICAgICAgICAvL2ZpbmQgZGVsIHVsdGltbyBcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkVuY29udHJlIGRpZmVyZW5jaWEgZW4gcHJvbW9zIGNvbWJpbmFkYXM6IFwiICsgY2FudGlkYWREZXNjUHJvbW8gKyBcIiB2cyBcIiArIGRlc2NBY3VtKTtcclxuICAgICAgICAgICAgbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPID0gbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPIC0gKGNhbnRpZGFkRGVzY1Byb21vIC0gZGVzY0FjdW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWRcIilcclxuICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhck9ic2VxU3VtVG90YWwocHJvZHVjdG9zQXBsaWNhUHJvbW86IE0zUEVuY0l0ZW1zW10sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHZhbG9yUHJvbW8gPSArY29tYmkuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZE9ic2VxdWlvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCB2YWxvckNvbWJvID0gMDtcclxuICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGVuY0l0ZW0gb2YgcHJvZHVjdG9zQXBsaWNhUHJvbW8pIHtcclxuICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA9IDE7XHJcbiAgICAgICAgICAgIGxldCBwVW5pdEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHdoaWxlIChjYW50aWRhZFByb2R1Y3RvQWN0dWFsIDw9IGNhbnRpZGFkQWN0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgKz0gcFVuaXRBY3R1YWw7XHJcbiAgICAgICAgICAgICAgICBjYW50aWRhZFByb2R1Y3RvQWN0dWFsKys7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb2R1Y3RvUmV2aXNhZG8gPSBwcm9kdWN0b3NSZXZpc2Fkb3MuZmluZCh4ID0+IHguSWQgPT0gZW5jSXRlbS5JRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZHVjdG9SZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RvUmV2aXNhZG8uQ2FudGlkYWQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcy5wdXNoKHsgSWQ6IGVuY0l0ZW0uSUQsIENhbnRpZGFkOiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHN1bWFWYWxvclByb2R1Y3RvcyArIGRpZmVyZW5jaWEgPj0gdmFsb3JQcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zU3VtVG90YWwocHJvZHVjdG9zSGlqb3NEZWxDb21ibywgb00zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWRPYnNlcXVpb3MrKztcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gc3VtYVZhbG9yUHJvZHVjdG9zIC0gdmFsb3JQcm9tbztcclxuICAgICAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgdmFsb3JDb21ibywgMSk7XHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBwcm9kdWN0b0NvbWJvLCBjYW50aWRhZE9ic2VxdWlvcyk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wib00zUmVnU2VydmljZVwiXSA9IG9NM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUHJvY2VzbzogTTNQcm9jZXNvcywgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCBwcm9kSGlqbzogTTNQRW5jSXRlbXM7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHByb2RSZXZpc2FkbyBvZiBwcm9kdWN0b3NSZXZpc2Fkb3MpIHtcclxuICAgICAgICAgICAgaWYgKHByb2RSZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gcHJvZFJldmlzYWRvLklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9ICgrb00zUERldGFsbGVJdGVtcy5WYWxvciAtIHByb2RSZXZpc2Fkby5DYW50aWRhZCkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2RIaWpvID0gXy5jbG9uZURlZXAob00zUEVuY0l0ZW1zKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2Vzbyhwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zSGlqb3NEZWxDb21iby5wdXNoKHByb2RIaWpvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIHByb2RIaWpvLCBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9kdXRvUHJvbW9Db21ib1N1bVRvdGFsKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExpc3RhUHJlY2lvcyhsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgdmFyIGxQcmVjaW9zRmlsdGVyID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHkgPT4geS5JRCA9PSBvTGlzdEVuY2FiW2ldLklEKS5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NGaWx0ZXIucHVzaCh4KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3NGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9tb2Npb24gZGUgY29tYm8sIHggcHJvZHVjdG9zLCB5IHByb2R1Y3RvcywgLi4uIG4gcHJvZHVjdG9zIFxyXG4gICAgICogcG9yICQxMDAwXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqIEBwYXJhbSBiRXNBY3VtdWxhYmxlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9jaW9uQ29tYmluYWRhQ29tYm8obFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbiwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgbGV0IGZsYWdBcGxpY29Qcm9tbyA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBuTnVtZXJvQ29uZGljaW9uZXM6IG51bWJlciA9ICtjb21iaS5BY2Npb24uTnVtQ29uZGljaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBWYWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIExpc3RDb25kaWNpb25lcyA9IG5ldyBBcnJheTxBcnJheTxhbnk+PigpO1xyXG4gICAgICAgICAgICB2YXIgbWluaW1vSXRlbXM6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwb3JjZW50YWplUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFNpblByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2U7XHJcblxyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbk51bWVyb0NvbmRpY2lvbmVzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGNvbmRpY2lvbiAxLlxyXG4gICAgICAgICAgICAgICAgdmFyIExpc3RQcm9tb0NvbWJpOiBBcnJheTxNM1BFbmNJdGVtcz4gPSB0aGlzLkJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiLCBpLnRvU3RyaW5nKCksIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgTGlzdENvbmRpY2lvbmVzLnB1c2godGhpcy5HZXRMaXN0YVByZWNpb3MobFByZWNpb3MsIExpc3RQcm9tb0NvbWJpKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhMaXN0Q29uZGljaW9uZXMsIG9MaXN0RW5jYWIpO1xyXG4gICAgICAgICAgICBpZiAoTGlzdENvbmRpY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGVsIHZhbG9yIG1lbm9yIGRlIGxhcyBpdGVtcyBhZ3JlZ2FkYXNcclxuICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gTGlzdENvbmRpY2lvbmVzWzBdLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaisrKSB7Ly9Db21pZW56YSBkZXNkZSAxIHBvcnF1ZSBlbCAwIHlhIHNlIHZhbGlkbyBlbiBsYSBhbnRlcmlvciBsaW5lYVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtc1ByZWNpb3M6IEFycmF5PGFueT4gPSBMaXN0Q29uZGljaW9uZXNbal07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld01pbiA9IGl0ZW1zUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01pbiA8IG1pbmltb0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gbmV3TWluO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vTG9zIGNvbWJvcyBkZWJlbiBwcm9jZXNhcnNlIGRlIGEgdW5vIHBhcmEgc3UgY29ycmVjdG8gZnVuY2lvbmFtaWVudG9cclxuICAgICAgICAgICAgICAgIGlmIChtaW5pbW9JdGVtcyA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9SZWNvcnJlIHRvZG9zIGxvcyBwcmVjaW9zIGRlIGxvcyBwcm9kdWN0b3MgZGUgbGEgcHJvbW8gcGFyYSBzYWJlciBjdWFsIGVzIGVsIHZhbG9yIHJvYWwgZGUgbGEgcHJvbW9cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpblByb21vICs9ICtsUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5JbmRpY2UgPT0gZW5jLkluZGljZSkuUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL0NhbGN1bGEgZWwgdmFsb3IgZGVsIHBvcmNlbnRhamUgZGUgbGEgcHJvbW8gYSBwYXJ0aXIgZGVsIGNhbG9yIGRlbCBjb21ibyB5IGRlIGxhIHN1bWEgZGUgbG9zIHByZWNpb3Mgb3JpZ2luYWxlcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgICAgICAgICAgICBwb3JjZW50YWplUHJvbW8gPSAxMDAgLSAoK1ZhbG9yUHJvbW8gKiAxMDAgLyB2YWxvclRvdGFsU2luUHJvbW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZvckVhY2gocHJlY2lvID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVjaW8uSW5kaWNlID09IGVuYy5JbmRpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWNpby5Qcm9tb0FwbGljYWRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWxvciA9IHByZWNpby5QVU5JVE5FVE87XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01vZGlmaWNhIGVsIHByZWNpbyBkZSBsb3MgcHJvZHVjdG9zIGEgc3UgbnVldm8gdmFsb3IgY29uIGxhIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gdmFsb3IgLSAodmFsb3IgKiBwb3JjZW50YWplUHJvbW8gLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUHJvbW9BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGlvTTNQcm9jZXNvLCBwcmVjaW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9FbiBsYXMgcHJvbW9zIHBvciBjb21ibyBubyBhcGxpY2FuIGVsIHByZWNpbyBkZSBsb3Mgb3Ryb3MgcHJvZHVjdG9zIHF1ZSBubyBoYWNlbiBwYXJ0ZSBkZWwgY29tYm8gOilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTyA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnQXBsaWNvUHJvbW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ0FwbGljb1Byb21vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgcHJvZHVjdG9Qcm9tb0NvbWJpRXhpc3RlbnRlID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBjb21iaS5BY2Npb24uQ29kaWdvKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhpb00zUHJvY2VzbywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgY29tYmkuQWNjaW9uLlZhbG9yLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5saW1waWFyRW5jSXRlbVByZENvbmRpKG9MaXN0RW5jYWIpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb21vY2lvbkNvbWJpbmFkYUNvbWJvXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZ0FwbGljb1Byb21vO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmaWx0cmFyTGlzdGFDb25kaWNpb25lc0NvbWJvKGxpc3RDb25kaWNpb25lczogQXJyYXk8YW55Piwgb00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RDb25kaWNpb25lcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgbGV0IG51ZXZhQ29uZGljaW9uID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29uZGljaW9uIG9mIGxpc3RDb25kaWNpb25lc1tfaV0pIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbmNJdGVtID0gb00zUEVuY0l0ZW1zTGlzdC5maW5kKHggPT4geC5JRCA9PSBjb25kaWNpb24uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY0l0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdID0gZW5jSXRlbVtcIlByZENvbmRpXCJdID8gZW5jSXRlbVtcIlByZENvbmRpXCJdIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGV0Q2FudGlkYWQgPiBlbmNJdGVtW1wiUHJkQ29uZGlcIl0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVldmFDb25kaWNpb24gPSBbY29uZGljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaXN0Q29uZGljaW9uZXNbX2ldID0gbnVldmFDb25kaWNpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxpbXBpYXJFbmNJdGVtUHJkQ29uZGkob00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgb00zUEVuY0l0ZW1zTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgZWxlbWVudFtcIlByZENvbmRpXCJdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2VzbzogTTNQcm9jZXNvcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQgPSAxKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvUXVpdGFyO1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvZHVjdG9RdWl0YXIgPSBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0uZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b1F1aXRhcikge1xyXG4gICAgICAgICAgICBwcm9kdWN0b1F1aXRhci5DYW50aWRhZCArPSAoLTEgKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0ucHVzaCh7IElEOiBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0bywgQ2FudGlkYWQ6ICgtMSAqIGNhbnRpZGFkKSB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0FncmVnYSBlbCBwcm9kdWN0byBkZSBsYSBsaXN0YSBkZSBlbnRyYWRhIGEgdW4gYXJyZWdsbyBkZSBwcm9kdWN0b3MgcXVlIHBvc3Rlcmlvcm1lbnRlIHNlcmEgbG9zIHByb2R1Y3RvcyBoaWpvcyBkZWwgcHJvZHVjdG8gQ29tYm9cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSB0aGlzLmdldFByb2R1dG9Qcm9tb0NvbWJvKG9NM1Byb2Nlc28uTTNFTkMsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk7XHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgIC8vTGEgY2FudGlkYWQgZGlzbWludXllIHBlcm8gZXN0ZSBtb3ZpbWllbnRvIHNlIHJldmVyc2EgYWwgdGVybWluYXIgZGUgdmFsaWRhciBlc3RhIHByb21vXHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgMSk7XHJcbiAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLmFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2Vzbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vRGlzbWludXllIGVuIHVubyBsYSBjYW50aWRhZCBkZWwgcHJvZHVjdG8geSByZXRvcm5hIHVuIGNsb24gZGUgZXN0ZVxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm8ocHJvZHVjdG9zRW5NM1Byb2Nlc286IEFycmF5PE0zUEVuY0l0ZW1zPiwgb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NEZWxDb21ibyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGVuIGhhc2htYXAgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGhtbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gSUQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGR0b0htUHJlY2lvcyhobWxQcmVjaW9zOiBBcnJheTxhbnk+LCBJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGZpbmRlZDogYW55ID0gaG1sUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBJRCk7XHJcbiAgICAgICAgaWYgKGZpbmRlZCkge1xyXG4gICAgICAgICAgICBmaW5kZWQuSW5kaWNlID0gK2ZpbmRlZC5JbmRpY2UgKyArMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaW5kZWQgPSB7IFwiSURcIjogSUQsIFwiSW5kaWNlXCI6IDAgfTtcclxuICAgICAgICAgICAgaG1sUHJlY2lvcy5wdXNoKGZpbmRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaW5kZWQuSW5kaWNlO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVzY2FyIGVuY2FiZXphZG9zIHF1ZSB0ZW5nYSBsYSBwcm9tb2Npb24geSBjb25kaWNpb24gZW52aWFkYSBjb21vIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gSWRDb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaWRQcm9tb2Npb25lcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIElkQ29uZGljaW9uOiBzdHJpbmcsIGlkUHJvbW9jaW9uZXM6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRW5jRmluZGVkID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSlcclxuICAgICAgICAgICAgICAgIGlmICghb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgfHwgIShvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldCAmJiBkZXRDYW50aWRhZCAmJiArZGV0Q2FudGlkYWQuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb3M6IEFycmF5PGFueT4gPSBKU09OLnBhcnNlKGRldC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb0ZpbmRlZCA9IHByb21vcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBpZFByb21vY2lvbmVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW9GaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25kaWNpb25GaW5kZWQgPSBwcm9tb0ZpbmRlZC5BY2Npb24uSWRDb25kaWNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5maW5kKHggPT4geCA9PSBJZENvbmRpY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9FbmNGaW5kZWQucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkID09IElkQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9FbmNGaW5kZWQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2nDg8KzbiBzaSBsYSBwcm9tb2Npw4PCs24gcXVlIGxsZWdhIGNvbW8gcGFyYW1ldHJvLCBlcyBhY3VtdWxhYmxlIG8gbm9cclxuICAgICAqIEBwYXJhbSBwcm9tb2Npb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRFc0FjdW11bGFibGVQcm9tbyhwcm9tb2Npb246IFByb21vY2lvbkNvbWJpbmFkYSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb2Npb24uQWNjaW9uLlJlZ2xhICYmIHByb21vY2lvbi5BY2Npb24uUmVnbGEgPT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIEdldEVzQWN1bXVsYWJsZVwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc2FyUHJvZHVjdG9BcGxEZXNjKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIGxldCBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgbGV0IHByb2RzQXBsRGVzY3VlbnRvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgc2t1QXBsRGVzY3VlbnRvczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5za3VBcGxEZXNjOyAvL1t7U0tVOlwiWFhYWFhYXCJ9LCB7U0tVOlwiWVlZWVlZWVwifV1cclxuICAgICAgICBsZXQgbWF4TnVtRGVzY3VlbnRvcyA9ICtjb21iaS5BY2Npb24ubWF4TnVtRGVzYztcclxuICAgICAgICBsZXQgY29udERlc2NBcGxpY2Fkb3MgPSAwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL0NhbGN1bGEgZWwgbnVtZXJvIG1heGltbyBkZSBkZXNjaW5ldG9zIHF1ZSBwdWVkZSBhcGxpY2FyIGxhIHByb21vIHF1ZSBlcyBjb21iaS5BY2Npb24ubWF4TnVtRGVzYyBtdWx0aXBsaWNhZG8gcG9yIGxhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyBxdWUgcGFsaWNhbiBsYSBwcm9tbyBlbiBlbCBwcm9jZXNvXHJcbiAgICAgICAgICAgIG1heE51bURlc2N1ZW50b3MgPSBvTGlzdEVuY2FiLnJlZHVjZSgoYWNjLCBjdXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhY2MgKyArY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB9LCAwKSAqIG1heE51bURlc2N1ZW50b3M7XHJcblxyXG4gICAgICAgICAgICAvL0RlIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gZmlsdHJvIGxvcyBwcm9kdWN0b3MgcXVlIGFwbGljYXJhbiBlbCBkZXNjdWVudG8gc2VndW4gbG9zIFNLVSBjb25maWd1cmFkb3MgZW4gY29tYmkuQWNjaW9uLnNrdUFwbERlc2NcclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28uTTNFTkMuZm9yRWFjaChvTTNQRW5jSXRlbXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNrdUFwbERlc2N1ZW50b3MuZmluZCh4ID0+IHguU0tVID09IG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2RzQXBsRGVzY3VlbnRvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL0PDg8KhbGN1bG8gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zIGRlIGxvcyBwcm9kdWN0b3MgYSBsb3MgcXVlIGxhIHByb21vIGFwbGljYXJhIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKHByb2RzQXBsRGVzY3VlbnRvLCBlc0FjdW11bGFibGUpO1xyXG5cclxuICAgICAgICAgICAgLy9BcGxpY2EgdGFudG9zIGRlc2N1ZW50b3Mgc2UgcHVlZGFuIGEgcGxhaWNhciBhIGNhZGEgdmFsb3IgZGUgbFByZWNpb1xyXG4gICAgICAgICAgICB3aGlsZSAoY29udERlc2NBcGxpY2Fkb3MgPCBtYXhOdW1EZXNjdWVudG9zICYmIGNvbnREZXNjQXBsaWNhZG9zIDwgbFByZWNpb3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvc1tjb250RGVzY0FwbGljYWRvc10uUFVOSVRORVRPIC09ICgrbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTykgKiAoKCtjb21iaS5BY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgIGNvbnREZXNjQXBsaWNhZG9zKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vUmVjYWxjdWxhIGxvcyB2YWxvcmVzIGRlbCBwcm9kdWN0byBhcGxpY2FuZG8gZWwgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kc0FwbERlc2N1ZW50bywgY29tYmksIHRydWUsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIG9ic2VxdWlvcyBlbiBlbCBjaWVycmVcclxuICAgICAqIFZhbGlkYSB0b2RhIGxhIGxpc3RhIGRlIGVuY2FiZXphZG9zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhIGVuIGVsIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICogVmFsaWRhIGxhIHByb21vY2nDg8KzbiwgcG9yIGNhZGEgY3VhbnRvcyBwcm9kdWN0b3MgaW5ncmVzYWRvcywgY3XDg8KhbnRvcyBvYnNlcXVpb3Mgc2UgcHVlZGVuIGRhci5cclxuICAgICAqIFRyYWUgdG9kb3MgbG9zIG9ic2VxdWlvcyBxdWUgc2UgaW5ncmVzYXJvbiBlbiBlbCBjYXJyaXRvIGRlIGNvbXByYXMsIGxvcyBsaXN0YVxyXG4gICAgICogY29sb2NhIGVuIHZhbG9yIDAgbG9zIG9ic2VxdWlvcyBxdWUgc2VsZWNjaW9ubyBhdXRvbWF0aWNhbWVudGUgZWwgYWxnb3JpdG1vXHJcbiAgICAgKiBSZWNhbGN1bG8gZGUgcHJlY2lvcywgaW1wdWVzdG9zIHkgZGVtYXMgdmFsb3JlcyB0b3RhbGVzLlxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgbG9zIHByb2R1Y3RvcyBpbmdyZXNhZG9zIGFsIGNhcnJpdG8gcXVlIHRpZW5lbiBvYnNlcXVpb1xyXG4gICAgICogQHBhcmFtIGNvbWJpIEluZm9ybWFjacODwrNuIGRlIHByb21vY2nDg8KzbiBkZSBvYnNlcXVpb3NcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBQcm9jZXNvIGNvbiB0b2RvcyBsb3MgcHJvZHVjdG9zIGUgaW5mb3JtYWNpw4PCs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vT2JzcUNpZXJyZShvTGlzdEVuY2FiOiBBcnJheTxhbnk+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcywgZXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29bJ1Byb2R1Y3Rvc0NvbWJpJ10gPSBbXTtcclxuICAgICAgICBsZXQgY2FudFBvck9icyA9ICtjb21iaS5BY2Npb24uQ2FudGlkYWRPYnNxOyAvL1BvciBjYWRhIGN1YW50b3MgcHJvZHVjdG9zIGNvbiBsYSBwcm9tb2Npw4PCs24gc2UgZGFyw4PCoSBlbCBvYnNlcXVpby5cclxuICAgICAgICBsZXQgY2FudEFncmVnYWRhID0gMDtcclxuICAgICAgICBsZXQgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICBsZXQgY2FudGlkYWRPYnNlcXVpb3MgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckNvbWJvID0gMDtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiA9IFtdO1xyXG4gICAgICAgIGxldCBtM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vYnNlcXVpb3NFeGMgPSB0cnVlO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vTGlzdGFPYnNlcXVpb3MgPSBjb21iaS5BY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vYnNlcXVpb3NDYW50aWRhZCA9IDBcclxuICAgICAgICAvLyB2YXIgY2FudE9ic2VxdWlvczogbnVtYmVyID0gMDsgLy9DYW50aWRhZCBkZSBvYnNlcXVpb3MgcXVlIHNlIGRhcsODwqEgcG9yIGVzdGEgY29tcHJhLlxyXG5cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWN0byBvZiBvTGlzdEVuY2FiKSB7XHJcbiAgICAgICAgICAgIHN1bWFWYWxvclByb2R1Y3RvcyArPSBwcm9kdWN0by5QVU5JVE5FVE87XHJcbiAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSsrO1xyXG4gICAgICAgICAgICBsZXQgcHJvZHVjdG9SZXZpc2FkbyA9IHByb2R1Y3Rvc1JldmlzYWRvcy5maW5kKHggPT4geC5JZCA9PSBwcm9kdWN0by5JRCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9kdWN0b1JldmlzYWRvKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b1JldmlzYWRvLkNhbnRpZGFkKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MucHVzaCh7IElkOiBwcm9kdWN0by5JRCwgQ2FudGlkYWQ6IDEgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjYW50QWdyZWdhZGEgPT09IGNhbnRQb3JPYnMpIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3NTdW1Ub3RhbChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBpb00zUHJvY2VzbywgcHJvZHVjdG9zUmV2aXNhZG9zKTtcclxuICAgICAgICAgICAgICAgIGNhbnRpZGFkT2JzZXF1aW9zKys7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb21iaS5BY2Npb24uQ29kaWdvKSBjb25zb2xlLmVycm9yKCdFbCBjw4PCs2RpZ28gZGVsIGNvbWJvIG5vIGVzdGEgY29uZmlndXJhZG8gZW4gTTNERVRDT05ESVBST01PJylcclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwICYmIGNvbWJpLkFjY2lvbi5Db2RpZ28pIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBtM1JlZ1NlcnZpY2UubG9hZE0zUEVuY0l0ZW1zRnJvbVByb21vY2lvbkNvbWJvKGlvTTNQcm9jZXNvLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaS5BY2Npb24uQ29kaWdvLCB2YWxvckNvbWJvLCAxKTtcclxuICAgICAgICAgICAgbTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBpb00zUHJvY2Vzb1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBtM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogQXBsaWNhciByZWdsYXMsIHJlc3BlY3RvIGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhLlxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvbmVzQXNvY2lhZGFzIFxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICovXHJcbiAgICBwdWJsaWMgQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcblxyXG4gICAgICAgIHZhciBpQ2FudGlkYWRQcm9tbzogbnVtYmVyID0gQWNjaW9uLkNhbnRpZGFkOyAvL0VqZW1wbG8gOiAzXHJcbiAgICAgICAgLy92YXIgaUNhbnRpZGFkQVBMUHJvbW86IG51bWJlcjsgLy9OdW1lcm8gcmVhbCBkZSBhcGxpY2FjaW9uIGRlIHByb21vY2lvbmVzLCBTaSBhcGxpY2EgcmVzdGEgZWwgcmVzaWR1by5cclxuICAgICAgICB2YXIgaUNhbnRpZGFkUmVhbDogbnVtYmVyOyAvL0NhbnRpZGFkIHJlYWwgaW5ncmVzYWRhLlxyXG4gICAgICAgIHZhciBWYWxvclByb21vOiBudW1iZXIgPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgdmFyIHZhbG9yUHJvbW9Vbml0OiBudW1iZXIgPSAoK1ZhbG9yUHJvbW8pIC8gKCtpQ2FudGlkYWRQcm9tbylcclxuICAgICAgICBpQ2FudGlkYWRSZWFsID0gbFByZWNpb3MubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2lDYW50aWRhZEFQTFByb21vID0gaUNhbnRpZGFkUmVhbCAvIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIFJlc2lkdW86IG51bWJlciA9IGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIC8vaUNhbnRpZGFkQVBMUHJvbW8gPSBpQ2FudGlkYWRSZWFsIC8gaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaUNhbnRpZGFkUmVhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobFByZWNpb3NbaV0uUFVOSVRORVRPID4gdmFsb3JQcm9tb1VuaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSB2YWxvclByb21vVW5pdDtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5BcGxpY2FkbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGNvbWJpbmFkYXMgZGVzZGUgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBzQ29tYmluYWRhID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBvQ29tYmluYWRhID0gSlNPTi5wYXJzZShzQ29tYmluYWRhKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMgPSBvQ29tYmluYWRhO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBkaW5hbWljYXMgcHJvY2VzbyBkZSBjb21iaW5hZGFzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXNGaW5kZWQ6IE0zUERpbmFtaWNhcztcclxuICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNGaW5kZWQpIHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+ID0gSlNPTi5wYXJzZShvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJQcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9Qcm9tb0NvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IGFyclByb21vW2ldLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vQ29tYmkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLnB1c2goYXJyUHJvbW9baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBcIkNPTUJJTkFEQVwiO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGFyIHByb21vY2lvbmVzLCBzZWd1biBsYSBsaXN0YSBkZSBwcmVjaW9zIGRpdmlkaWRhLlxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGRlIHByZWNpb3MsIGNvbnRyYSBlc3RlIG9iamV0byBzZSBpdGVyYXLDg8KhIHkgc2Ugb3JkZW5hcsODwqEgZGUgbWF5b3IgYSBtZW5vclxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzQnlMaXN0YVByZWMobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBUaXBvUHJvbW8gPSBjb21iaS5UaXBvMjtcclxuICAgICAgICB2YXIgaXg6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGl5OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciB4OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVsxXVxyXG4gICAgICAgIHZhciB5OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVswXSAtICgreCk7XHJcbiAgICAgICAgdmFyIHJlc2lkdW9YOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBiRW50cm86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHgudG9TdHJpbmcoKS5zcGxpdChcIi5cIikubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICByZXNpZHVvWCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdO1xyXG4gICAgICAgICAgICB4ID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLy9TZSBpdGVyYSBlbCBhcnJlZ2xvIGRlIHByaW5jaXBpbyBhIGZpbiB5IGRlIGZpbiBhIHByaW5jaXBpby4uLiBcclxuICAgICAgICAvLy9Db25mb3JtZSBzZSByZWNvcnJlIGVsIGFycmVnbG8gZGUgZmluIGEgcHJpbmljaW8sIHNlIHZhIGRhbmRvIGxhIHByb21vY2nDg8KzbiBhIGxvcyBwcm9kdWN0b3MgZGUgbWVub3IgdmFsb3IuXHJcbiAgICAgICAgLy8vU2kgbGEgcHJvbW9jacODwrNuIGVzdGEgaW5jb21wbGV0YSwgbG9zIHByb2R1Y3RvcyBkZSBsYSBtaXRhZCBxdWVkYW4gc2luIHByb21vY2nDg8KzbiBcclxuICAgICAgICB2YXIgaTogbnVtYmVyID0gMDtcclxuICAgICAgICBsUHJlY2lvcyA9IGxQcmVjaW9zLnNvcnQoKGEsIGIpID0+IGEuUFVOSVRORVRPIDwgYi5QVU5JVE5FVE8gPyAxIDogYS5QVU5JVE5FVE8gPiBiLlBVTklUTkVUTyA/IC0xIDogMClcclxuICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgaiA9ICtsUHJlY2lvcy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IGxQcmVjaW9zLmxlbmd0aCAmJiBqID49IGkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpeCA9IDA7XHJcbiAgICAgICAgICAgICAgICBpeSA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGl4IDwgeCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpeCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlIChpeSA8IHkgJiYgaiA+PSBpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNpZHVvWCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJFbnRybyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2pdLlBVTklUTkVUTyA9IDAuMDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYkVudHJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8vUGFyYSBsYXMgcHJvbW9jaW9uIGNvbW86IDJYMS41LCAuLi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHNvcG9ydGFuZG8gc29sbyBwYXJhOiAyWDEuNVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tqXS5QVU5JVE5FVE8gPSArbFByZWNpb3Nbal0uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaXkrKztcclxuICAgICAgICAgICAgICAgICAgICBqLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgICAgICAgICAgLy9KR0FNIDIwMTkxMDIzLCBmdW5jaW9uYWxpZGFkIGRlIHF1ZSBzb2xvIGVudHJhIGFjw4PCoSBjdWFuZG8gc2UgY2FtYmlvIGFsZ3VuIHByZWNpb1xyXG4gICAgICAgICAgICBpZiAoYkVudHJvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGZhbHNlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMpO1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpKTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXIgcHJlY2lvIHRvdGFsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgTGlzdGEgZGUgcHJlY2lvcyBhIHRlbmVyIGVuIGN1ZW50YVxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgICAqIEBwYXJhbSBjb21iaSBQcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkFwbFZhbGlkYTogYm9vbGVhbiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgICAgIHZhciBkVmFsb3JQcm9tb0FudDogbnVtYmVyID0gMDtcclxuICAgICAgICAvL3ZhciBkVmFsb3JQcm9tb0FudEFjdW06IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRWYWxvckFjdDogbnVtYmVyID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb051ZXZvID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKCthY2MpICsgKCtjdXIuUFVOSVRORVRPKSwgMCk7XHJcbiAgICAgICAgICAgIHZhciBwcmVjaW9Ub3RhbEFudGVyaW9yO1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbEFudGVyaW9yID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzE4IFNFIFFVSVRBIFZBTElEQUNJT04sIFBPUiBGTFVKTyBRVUUgU0kgU0UgREVWVUVMVkUgVFJBRSBMQSBQUk9NTywgUEVSTyBTSSBTRSBCT1JSQS4gaWYgKGRQcmVjaW9OdWV2byA8IHByZWNpb1RvdGFsQW50ZXJpb3IpIHsgLy8gU2UgYWdyZWdhIHZhbGlkYWNpb24gZGUgcHJlY2lvLCBwYXJhIGVzY29nZXIgZWwgbWVqb3IuIE5vIHB1ZWRlbiBhIHZlciAyIHByb21vY2lvbmVzLlxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBkUHJlY2lvTnVldm87XHJcbiAgICAgICAgICAgIC8vZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMUkVBTFwiKS5WYWxvciA9IGRQcmVjaW9OdWV2bztcclxuICAgICAgICAgICAgLy9MaW1waWFyIHByb21vY2lvbmVzXHJcbiAgICAgICAgICAgIGlmICgodGhpcy5WYWxpZGFyU2lUb2Rvc0FQTFByb21vQ29tYmluYWRhKGxQcmVjaW9zLCBlbmMpIHx8ICFiQXBsVmFsaWRhKSAmJiAhYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NEaXJlY3RhcyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NDb21iaW5hZGFzKGVuYyk7XHJcbiAgICAgICAgICAgICAgICAvLyBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yQWN0ID0gKCgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yKSAtICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRWYWxvclByb21vQW50ID0gdGhpcy5HZXRWYWxvclByb21vQW50ZXJpb3IobFByZWNpb3MsIGVuYyk7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JBY3QgPSB0aGlzLkdldFZhbG9yUHJvbW9BQ3QoZW5jLCBkVmFsb3JQcm9tb0FudCwgZFByZWNpb051ZXZvLCBwcmVjaW9Ub3RhbEFudGVyaW9yLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDczMCBzZSBhZ3JlZ2EgcGFyYSBwcm9tb2Npb25lcyBhY3VtdWxhYmxlcy4gYWN1bXVsYWJcclxuICAgICAgICAgICAgICAgIGlmICghYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gZFZhbG9yUHJvbW9BbnQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FcyBhY3VtdWxhYmxlLCB1dGlsaXphciBsYSBpbmZvcm1hY2nDg8KzbiBcclxuICAgICAgICAgICAgICAgICAgICBkVmFsb3JQcm9tb0FudCA9ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yIC0gcHJlY2lvVG90YWxBbnRlcmlvcilcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5TZXRWYWxvclByb21vY2lvbmVzKGVuYywgZFZhbG9yQWN0ICsgZFZhbG9yUHJvbW9BbnQpO1xyXG4gICAgICAgICAgICB0aGlzLkFncmVnYXJMaXN0YVByb21vKGVuYywgY29tYmksIGRWYWxvckFjdCk7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb1VuaXRGcm9tVG90YWwoZW5jLCBkUHJlY2lvTnVldm8pO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBRdWl0YXJMYXNQcm9tb3NEaXJlY3RhcyhlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbHRlcih4ID0+IHguTm9tYnJlQ29uY2VwdG8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiVkFMX1BST01PQ19cIikpLmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBRdWl0YXJMYXNQcm9tb3NDb21iaW5hZGFzKGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmlsdGVyKHggPT4geC5Ob21icmVDb25jZXB0by50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJWQUxfUFJPX0NPTUJJX1wiKSkuZm9yRWFjaChkZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGV0LlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGFyIHByZWNpbyB1bml0YXJpbywgYSBwYXJ0aXIgZGUgdW4gbnVldm8gcHJlY2lvIFRvdGFsLlxyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqIEBwYXJhbSBuZXdQcmljZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9Vbml0RnJvbVRvdGFsKGVuYzogTTNQRW5jSXRlbXMsIG5ld1ByaWNlOiBudW1iZXIpIHtcclxuICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yID0gKCtuZXdQcmljZSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIHRvZG9zIGxvcyBwcmVjaW9zIGRlIHVuIHByb2R1Y3RvIHNlIGNhbWJpYXJvbiBvIG5vLlxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGNvbiB0b2RvcyBsb3MgaXRlbXNcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyU2lUb2Rvc0FQTFByb21vQ29tYmluYWRhKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgLy9DaGVjaywgc2kgYWxndW5vIGRlIGxhIGxpc3RhIGRlIHByZWNpbyBlcyBpZ3VhbCBhbCBwcmVjaW8gYW50ZXJpb3JcclxuICAgICAgICB2YXIgcHJlY2lvQW50ZXJpb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCkuZmluZCh4ID0+IHguUFVOSVRORVRPID09IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgaWYgKHByZWNpb0FudGVyaW9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yZXMgZGUgcHJvbW9jaW9uZXMgZGVwZW5kaWVuZG8gZGVsIG51bWVybyBkZSBpdGVtcyBxdWUgbm8gc2UgbW9kaWZpY2Fyb25cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRWYWxvclByb21vQW50ZXJpb3IobFByZWNpb3M6IEFycmF5PGFueT4sIGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZFZhbG9yID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB2YXIgbnVtZXJvSXRlbXMgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LlBVTklUTkVUTyA9PSBkVmFsb3IpLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIGRVbml0UHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJWVU5JVFBST01PXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICByZXR1cm4gK251bWVyb0l0ZW1zICogK2RVbml0UHJvbW87XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3IgZGUgbGEgcHJvbW9jaW9uIHF1ZSBzZSBlc3RhIHByb2Nlc2FuZG8gYWN0dWFsbWVudGVcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gdmFsb3JQcm9tb0FudCBcclxuICAgICAqIEBwYXJhbSB2YWxvdFRvdGFsTnVldm8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRWYWxvclByb21vQUN0KGVuYzogTTNQRW5jSXRlbXMsIHZhbG9yUHJvbW9BbnQ6IG51bWJlciwgdmFsb3RUb3RhbE51ZXZvOiBudW1iZXIsIHByZWNpb1RvdGFsQW50OiBudW1iZXIsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JUb3RhbFNpbkR0bzogbnVtYmVyO1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQcm9tb0FjdDogbnVtYmVyO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgc2kgdmllbmUgYWN1bXVsYWJsZSB1dGlsaXphciBlbCBwcmVjaW8gYW50ZXJpb3IsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBkdG8uXHJcbiAgICAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxvclRvdGFsU2luRHRvID0gcHJlY2lvVG90YWxBbnQ7XHJcbiAgICAgICAgICAgICAgICB2YWxvclByb21vQWN0ID0gK3ZhbG9yVG90YWxTaW5EdG8gLSArdmFsb3RUb3RhbE51ZXZvO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpbkR0byA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB2YWxvclByb21vQWN0ID0gK3ZhbG9yVG90YWxTaW5EdG8gLSArdmFsb3JQcm9tb0FudCAtICt2YWxvdFRvdGFsTnVldm87XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdmFsb3JQcm9tb0FjdDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIEdldFZhbG9yUHJvbW9BQ3Q6IFwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldGVhciBlbCB2YWxvciBkZSBsYSBwcm9tb2Npb25cclxuICAgICAqIEBwYXJhbSBlbmMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgU2V0VmFsb3JQcm9tb2Npb25lcyhlbmM6IE0zUEVuY0l0ZW1zLCB2YWxvclByb21vOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gKCgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yKSAtICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgLy9GUyAyMDE5MDcyNSBSZWRvbmRlbyBkZWwgdmFsb3IgZGUgcHJvbW9jaW9uXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gKE1hdGgucm91bmQodmFsb3JQcm9tbyAqIDEwMCkgLyAxMDApLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYxOCBTZSBhZ3JlZ2EgZWwgdmFsb3IgdW5pdGFyaW8gZGUgbGEgcHJvbW9jacODwrNuXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWVU5JVFBST01PXCIpLlZhbG9yID0gKCsoTWF0aC5yb3VuZCh2YWxvclByb21vICogMTAwKSAvIDEwMCkgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gIC8qKlxyXG4gICAgLy8gICogU2V0ZWFyIGVsIHZhbG9yIGRlIGxhIHByb21vY2lvblxyXG4gICAgLy8gICogQHBhcmFtIGVuYyBFbmNhYmV6YWRvIGRlIGl0ZW1zXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHB1YmxpYyBTZXRWYWxvclByb21vY2lvbmVzRnJvbUxpc3RhUHJlY2lvcyhlbmM6IE0zUEVuY0l0ZW1zLCBsUHJlY2lvczogQXJyYXk8YW55Pikge1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5QVU5JVE5FVE8gPT0gZFZhbG9yKVxyXG4gICAgLy8gICAgIH0gY2F0Y2h7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvLyBwdWJsaWMgQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjQmV0YShsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAvLyAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgdmFyIFRpcG9Qcm9tbyA9IGNvbWJpLlRpcG8yO1xyXG4gICAgLy8gICAgICAgICB2YXIgaVNpemVQcmVjOiBudW1iZXIgPSBsUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAvLyAgICAgICAgIHZhciBpTWl0YWQ6IG51bWJlcjtcclxuXHJcbiAgICAvLyAgICAgICAgIHZhciByZXNpZHVvWDogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICAgICAgdmFyIHg6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzFdXHJcbiAgICAvLyAgICAgICAgIHZhciB5OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVswXSAtICgreCk7XHJcbiAgICAvLyAgICAgICAgIHZhciBpRHRvOiBudW1iZXI7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoeC50b1N0cmluZygpLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxKSB7XHJcbiAgICAvLyAgICAgICAgICAgICByZXNpZHVvWCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBpTWl0YWQgPSAoK3kpIC8gKCtpU2l6ZVByZWMpO1xyXG4gICAgLy8gICAgICAgICBpTWl0YWQgPSBNYXRoLmNlaWwoKCtpTWl0YWQpICogKCt4KSkgLSAxO1xyXG5cclxuICAgIC8vICAgICAgICAgbFByZWNpb3MgPSBsUHJlY2lvcy5zb3J0KChhLCBiKSA9PiBhLlBVTklUTkVUTyA8IGIuUFVOSVRORVRPID8gMSA6IGEuUFVOSVRORVRPID4gYi5QVU5JVE5FVE8gPyAtMSA6IDApXHJcblxyXG4gICAgLy8gICAgICAgICB2YXIgaVggPSAwO1xyXG4gICAgLy8gICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgaUR0byA9IGlNaXRhZDtcclxuICAgIC8vICAgICAgICAgICAgIHdoaWxlIChpRHRvIDwgaVNpemVQcmVjKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHJlc2lkdW9YID09IDApIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gMDtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaUR0bysrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vL1BhcmEgbGFzIHByb21vY2lvbiBjb21vOiAyWDEuNSwgLi4uXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vRXN0YSBzb3BvcnRhbmRvIHNvbG8gcGFyYTogMlgxLjVcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gK2xQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyAqICgrcmVzaWR1b1ggLyAxMCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlKGlYIDwgeCl7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaUR0b10uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlYKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpRHRvKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gaVggPSAwO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAvLyAgICAgICAgICAgICAvL1RlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MuXHJcbiAgICAvLyAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoK2FjYykgKyAoK2N1ci5QVU5JVE5FVE8pLCAwKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBhIGxpc3RhIGRlIGRldGFsbGUgZWw6ICBOT01CX1BST01PQywgVkFMX1BST01PQyB5IElEX1BST01PQ1xyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJMaXN0YVByb21vKGVuYzogTTNQRW5jSXRlbXMsIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGRWYWxvclByb21vQ29tYmk6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkZXROb21icmVzOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIGRldFZhbG9yZXM6IHN0cmluZztcclxuICAgICAgICB2YXIgZGV0SWRzOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zTmFtZXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zVmFsczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNJZHM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG5cclxuXHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzID0gZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIik7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIik7XHJcblxyXG4gICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zTmFtZXMpIHtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLk5vbWJyZUNvbmNlcHRvID0gXCJOT01CX1BST19DT01CSVwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzLk5vbWJyZUNvbmNlcHRvID0gXCJWQUxfUFJPX0NPTUJJXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5Ob21icmVDb25jZXB0byA9IFwiSURfUFJPX0NPTUJJXCJcclxuXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgPSBcIlwiXHJcblxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zTmFtZXMpXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNWYWxzKVxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zSWRzKVxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgKyBjb21iaS5Ob21icmUgKyBcIixcIjtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yID0gb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciArIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhICsgXCIsXCI7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciArIGRWYWxvclByb21vQ29tYmkudG9TdHJpbmcoKSArIFwiLFwiO1xyXG5cclxuICAgICAgICAvL0Fob3JhIHNlIGFncmVnYSB1bmEgZGluYW1pY2EgcG9yIGF0cmlidXRvIGRlIGxhIHByb21vIHBhcmEgZmFjaWxpdGFyIGxhIHJldG9tYSBkZSBlc3RhIGluZm9ybWFjacODwrNuXHJcbiAgICAgICAgbGV0IGxpc3ROb21icmUgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RJZCA9IG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RWYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiSURfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJWQUxfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGFycmF5RGluYW1pY2FzOiBBcnJheTxNM1BEZXRhbGxlSXRlbXM+LCBub21icmVEaW5hbWljYTogc3RyaW5nLCBWYWxvckRpbmFtaWNhOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgb00zUERldGFsbGVJdGVtcyA9IGFycmF5RGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IG5vbWJyZURpbmFtaWNhKTtcclxuICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gVmFsb3JEaW5hbWljYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuTm9tYnJlQ29uY2VwdG8gPSBub21icmVEaW5hbWljYTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IFZhbG9yRGluYW1pY2E7XHJcbiAgICAgICAgICAgIGFycmF5RGluYW1pY2FzLnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgcXVlIGFwbGljYW4gYSBsYSBsaXN0YSBjb21iaW5hZGEgcXVlIHRpZW5lXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvbkNvbWJpbmFkYSBPYmpldG8gZGUgcHJvbW9jaW9uIGNvbWJpYW5kYVxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIE9iamV0byBkZSBNM1Byb2Nlc29cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRFbmNhYmV6YWRvQnlDb21iaShvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbHRlcihlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5Qcm9tb0NvbWJpbmFkYXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU2V0UHJvbW9Db21iaW5hZGFFTkMoZW5jKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghKGVuYy5JZEVuY1BhZHJlID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5jLlByb21vQ29tYmluYWRhcyAmJiArZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTIwOCBzZSBjYW1iaWEgdmFsaWRhY2lvbiwgcGFyYSBxdWUgdGVuZ2EgZW4gY3VlbnRhIGN1YWxxdWllciBwcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9MaXN0RW5jYWI7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0UHJvbW9Db21iaW5hZGFFTkMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpXHJcbiAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzID0gSlNPTi5wYXJzZShvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhciBsaXN0YSBkZSBwcmVjaW9zIHkgaWQgZGUgZW5jYWJlemFkbywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGxpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByb2Nlc2FyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vL0Rlc0Fjb3BsYXIgbGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICB2YXIgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAgICAgICAgIHZhciBuQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG5QcmVjaW9Vbml0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgdmFsaWRhIHNpIGxhIHByb21vY2lvbiBlcyBhY3VtdWxhYmxlLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuQ2FudGlkYWQ7IGorKykge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3MucHVzaCh7IFwiSW5kaWNlXCI6IGosIFwiUFVOSVRORVRPXCI6IG5QcmVjaW9Vbml0LCBcIklEXCI6IGVuYy5JRCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3M7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgIC8vICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+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+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0RGF0b3NGYWN0dXJhY2lvbkZyb21SRkNcclxuXHJcbiAgICBwdWJsaWMgYWN0dWFsaXphclJGQyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nLCBvRGF0YSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM01hZXN0cm8vYWN0dWFsaXphclJGQy8nICsgSWRLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocG9zdHMgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHBvc3RzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIFhtbCBkZSBjb25maWd1cmFjaW9uIGRlIGxhIGVtcHJlc2EgYSBwYXJ0aXIgZGVsIGlkdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBnZXRfWG1sQ29uZmlnX3hfSWRVYmljYWNpb25cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxvcyBhdHJpYnV0b3MgZW4gbTNjbGFzaWZpY2EgYSBwYXJ0aXIgZGUgdW4gaWRrYXRpb3NcclxuICAgIGdldF9jbGFzaWZpY2F0aW9uX2F0dHJpYnV0ZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X2NsYXNpZmljYXRpb25fYXR0cmlidXRlcy8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkFUVFJJQlVURVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vL09idGllbmUgbGFzIGNhdGVnb3JpYXMgZW4gbTNjbGFzaWZpY2EgYSBwYXJ0aXIgZGUgdW4gaWRrYXRpb3MgeSB1biBhdHJpYnV0b1xyXG4gICAgZ2V0X2NsYXNpZmljYXRpb25fY2F0ZWdvcmllcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgYXR0cmlidXRlOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X2NsYXNpZmljYXRpb25fY2F0ZWdvcmllcy8nICsgaWRfa2F0aW9zICsgXCIvXCIgKyBhdHRyaWJ1dGUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuQ0FURUdPUklFUztcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRPcGNpb25lc0FkaWNpb25hbGVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldE9wY2lvbmVzQWRpY2lvbmFsZXMvJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgalJlc3AgPSBKU09OLnBhcnNlKHJlc3ApLlJFU1BVRVNUQS5BVFRSSUJVVEVTO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QXRyaWJ1dG9zQWRpY2lvbmFsZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldEF0cmlidXRvc0FkaWNpb25hbGVzLycgKyBpZF9rYXRpb3MgKyBcIi9cIiArIGF0dHJpYnV0ZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgalJlc3AgPSBKU09OLnBhcnNlKHJlc3ApLlJFU1BVRVNUQS5DQVRFR09SSUVTO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL09idGllbmUgbGEgaW5mb3JtYWNpb24gZGUgdGlwb3MgZGUgZW52aW8uXHJcbiAgICBNM0dldEZvcm1hc0VudmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR2V0Rm9ybWFzRW52aW8vJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIganNSZXNwO1xyXG4gICAgICAgICAgICBqc1Jlc3AgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpzUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGluaWUgdG9kYXMgbGFzIE0zVWJpY2FjaW9uZXMgYXNvY2lhZGFzIGEgdW4gaWRfa2F0aW9zXHJcbiAgICBwdWJsaWMgZ2V0X3ViaWNhY2lvbmVzX2NvbXBsZXRlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF91YmljYWNpb25lc19jb21wbGV0ZS8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGluaWUgdG9kYXMgbGFzIE0zVWJpY2FjaW9uZXMgYXNvY2lhZGFzIGEgdW4gaWRfa2F0aW9zXHJcbiAgICBwdWJsaWMgZ2V0X3ViaWNhY2lvbmVzX3NpbXBsZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfdWJpY2FjaW9uZXNfc2ltcGxlLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL09idGluaWUgdG9kYXMgbGFzIE0zVWJpY2FjaW9uZXMgYXNvY2lhZGFzIGEgdW4gaWRfa2F0aW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNHRVRfTElTVEFQUkVDSU9TX0FTeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9SZWNMaXN0YVByZWM6IGFueTtcclxuXHJcbiAgICAgICAgb1JlY0xpc3RhUHJlYyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9NM0dFVF9MSVNUQVBSRUNJT1MvJyArIGlkX2thdGlvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIG9SZWNMaXN0YVByZWNbMF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEdldEVuY2FiZXphZG9MaXN0YXNQcmVjaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zL0dldENvbmZpZ0xQLycgKyBzSURLYXRpb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZ2lzdHJhckNvbG9uaWEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgSWRLYXRpb3M6IHN0cmluZywgc0NvbG9uaWE6IHN0cmluZywgc0NvZFBvc3RhbCwgc1RlbGVmb25vOiBzdHJpbmcsIG5kb2M6IHN0cmluZywgc0xpbmVhMTogc3RyaW5nLCBzQ29kZXN0YWRvOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGFTZW5kO1xyXG4gICAgICAgIG9EYXRhU2VuZCA9IHsgXCJzQ29sb25pYVwiOiBzQ29sb25pYSwgXCJzQ29kUG9zdGFsXCI6IHNDb2RQb3N0YWwsIFwic1RlbGVmb25vXCI6IHNUZWxlZm9ubywgXCJuZG9jXCI6IG5kb2MsIFwic0xpbmVhMVwiOiBzTGluZWExLCBcInNDb2Rlc3RhZG9cIjogc0NvZGVzdGFkbyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM01hZXN0cm8vcmVnaXN0cmFyQ29sb25pYS8nICsgSWRLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHBvc3RzID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGVuZXIgcHJvbW9jaW9uZXMgXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNfR2V0UHJvbW9jaW9uZXNNYWVzdHJvQXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb1JlY0xpc3RhUHJlYzogYW55O1xyXG5cclxuICAgICAgICBvUmVjTGlzdGFQcmVjID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zX0dldFByb21vY2lvbmVzTWFlc3Ryby8nICsgaWRfa2F0aW9zKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gb1JlY0xpc3RhUHJlYztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0ZW5lciBEaW5hbWljYXMgcG9yIGFjdGl2aWRhZCBcclxuICAgIHB1YmxpYyBhc3luYyBNM0dldERpbkJ5QWN0aXZpZGFkKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRGF0YTogYW55LCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0RGluQnlBY3RpdmlkYWQvJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIganNSZXNwOmFueSA9IHJlc3A7XHJcbiAgICAgICAgICAgIC8vanNSZXNwID0gSlNPTi5wYXJzZShqc1Jlc3ApO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIHZhciBvUmVjTGlzdGFQcmVjOiBhbnk7XHJcblxyXG4gICAgICAgIC8vIG9SZWNMaXN0YVByZWMgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldERpbkJ5QWN0aXZpZGFkLycgKyBpZF9rYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAvLyByZXR1cm4gb1JlY0xpc3RhUHJlYztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGEgaW5mbyBiYXNpY2EgZGUgbGFzIHViaWNhY2lvbmVzIGNvbiBIdWIgdGlwbyBXRUIgYWN0aXZvcyBlbiBlbCBtb21lbnRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBnZXRVYmljYWNpb25lc1dlYihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldFViaWNhY2lvbmVzV2ViLycgKyBpZEthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqICBSZXRvcm5hIGxhIGluZm8gYmFzaWNhIGRlIGxhcyB1YmljYWNpb25lcyBjb24gSHViIHRpcG8gV0VCIGFjdGl2b3MgZW4gZWwgbW9tZW50byBxdWUgYWJhcnF1ZW4gdW4gY29kcG9zdGFsIGVuIGNvbmNyZXRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIGdldFViaWNhY2lvbmVzQnlDb2RQb3N0YWwoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9kYXRhID0geyBcImNvZFBvc3RhbFwiOiBzdHJpbmcgfTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXRVYmljYWNpb25lc0J5Q29kUG9zdGFsLycgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCBwYXRoIGRlIGxhIGZhY3R1cmEgZWxlY3Ryw4PCs25pY2EgYSBwYXJ0aXIgZGUgdW4gSWREaWFyaW8gYXNvY2lhZG8gYWwgcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFBhdGhGRUZyb21EaWFyaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgdGlwb0dlbmVyYWNpb246IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL2dldFBhdGhGRUZyb21EaWFyaW8vJyArIGlkS2F0aW9zICsgJy8nICsgdGlwb0dlbmVyYWNpb24sIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIHJlc3B1ZXN0YTogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3B1ZXN0YSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREaWFyaW9BZGljaW9uYWxlc3hEaWFyaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5R2VuZXJhbGVzKCdEaWFyaW8vZ2V0RGlhcmlvQWRpY2lvbmFsZXN4RGlhcmlvLycgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3RhOiBhbnkgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcHVlc3RhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgSVVfSHViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvSHViOiBhbnksIHVUQWN0aXZvOiBzdHJpbmcsIHVOQWN0aXZvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogaWRfa2F0aW9zLnRyaW0oKSwgJ29IdWInOiBvSHViLCAndVRBY3Rpdm8nOiB1VEFjdGl2bywgJ3VOQWN0aXZvJzogdU5BY3Rpdm8gfTtcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zTWFlc3Ryby9JVV9IdWInLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZWwgY3Rpdm8gZGVzZGUgc2Vydmlkb3JcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkX2thdGlvcyBcclxuICAgICAqIEBwYXJhbSBpZHByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gdWJpY2FjaW9uIFxyXG4gICAgICogQHBhcmFtIGh1YiBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgR2V0Q3Rpdm9CWVByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGlkcHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkcHJvY2Vzbyc6IGlkcHJvY2VzbywgJ3ViaWNhY2lvbic6IHViaWNhY2lvbiwgJ2h1Yic6IGh1YiB9O1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL0dldEN0aXZvQllQcm9jZXNvLycgKyBpZF9rYXRpb3MudHJpbSgpLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBWYWxpZGFyQ3Rpdm9zVlNMb2NhbChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBpbmZQcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZywgZnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zL1ZhbGlkYXJDdGl2b3NWU0xvY2FsLycgKyBpZF9rYXRpb3MgKyAnLycgKyB1YmljYWNpb24gKyAnLycgKyBodWIsIGluZlByb2Nlc28pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgZnVuY2lvblJlc3AocmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcCh7IFwiZXJyb3JcIjogZXJyb3IgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIEdlbmVyYXJBdXRvcml6YWNpb25DdWVudGFzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGRhdGEpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuXHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNMy9HZW5lcmFyQXV0b3JpemFjaW9uQ3VlbnRhcycsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBzaSBlbCBjb2RpZ28gaW5ncmVzYWRvIGNvcnJlc3BvbmRlIGFsIGRvY3VtZW50byB5IHNpIGVsIGNvZGlnbyBlc3RhIGVuIGVzdGFkbyBhY3Rpdm9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHZhbGlkYWNpb25BdXRvcml6YWNpb25NM0N1ZW50YXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgZGF0YSkge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG5cclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zL3ZhbGlkYWNpb25BdXRvcml6YWNpb25NM0N1ZW50YXMnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFzeW5jIFZlcmlmaWNhclBhZ29UYXJqZXRhQkJWQShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgakRhdGEgPSB7IFwiSWRrYXRpb3NcIjogc0lES2F0aW9zLCBcImlkS2V5XCI6IHNJZEtleSB9XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvVmVyaWZpY2FyUGFnb1RhcmpldGFCQlZBJywgakRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm87XHJcbiAgICB9Ly9FbmQgZ2V0X0luZm9Qcm9jZXNvXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGUyAyMDE5MDgxMzogUmV0b3JuYSBsb3MgY29kaWdvcyBkZSBsb3MgU0tQKHNrcFRvRmluZCkgeSBzdSByZXNwZWN0aXZvIHNpZ25pZmljYWRvIHBhcmEgdW4gcHJvZHVjdG8gZGFkb1xyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGVzY3JpcGNpb25TS1BzKGlkS2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsXHJcbiAgICAgICAgZGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vbGV0IGRhdGEgPSB7XCJTS1AxXCI6XCJTS1AxXCIsIFNLUFRvRmluZDogMiB9fTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTNDb25zdWx0YXMvZ2V0RGVzY3JpcGNpb25TS1BzL1wiICsgaWRLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKGRhdGEuU0tQMSwgSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFzeW5jIGdldFRvdGFsZXNDaWVycmVDYWphKHBvc3RTZXJ2aWNlOiBQb3N0U2VydmljZU0zLCBzSWRLYXRpb3M6IHN0cmluZywgc3ViaWNhY2lvbjogc3RyaW5nLCBzaHViOiBzdHJpbmcsIHN1c3VhcmlvOiBzdHJpbmcsIHNGZWNoYUk6IHN0cmluZywgc0ZlY2hhRjogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNlY29wY2lvbmVzOiBhbnk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IHNJZEthdGlvcywgJ3ViaWNhY2lvbic6IHN1YmljYWNpb24sICdodWInOiBzaHViLCAndXN1YXJpbyc6IHN1c3VhcmlvLCAnRmVjaGFJJzogc0ZlY2hhSSwgJ0ZlY2hhRic6IHNGZWNoYUYgfVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gYXdhaXQgcG9zdFNlcnZpY2UuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0VG90YWxlc0NpZXJyZUNhamEnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gSlNPTi5wYXJzZShzZWNvcGNpb25lcylcclxuICAgICAgICByZXR1cm4gc2Vjb3BjaW9uZXNcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRDaWVycmVzeFViaWNhY2lvbihwb3N0U2VydmljZTogUG9zdFNlcnZpY2VNMywgc0lkS2F0aW9zOiBzdHJpbmcsIHN1YmljYWNpb246IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nLCBzRmVjaGE6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBzZWNvcGNpb25lczogYW55O1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBzSWRLYXRpb3MsICd1YmljYWNpb24nOiBzdWJpY2FjaW9uLCAnaWRQcm9jZXNvJzogc0lkUHJvY2VzbywgJ0ZlY2hhJzogc0ZlY2hhIH1cclxuICAgICAgICBzZWNvcGNpb25lcyA9IGF3YWl0IHBvc3RTZXJ2aWNlLmdldFdpdGhCb2R5TTMoJ00zL2dldENpZXJyZXN4VWJpY2FjaW9uJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICBzZWNvcGNpb25lcyA9IEpTT04ucGFyc2Uoc2Vjb3BjaW9uZXMpXHJcbiAgICAgICAgcmV0dXJuIHNlY29wY2lvbmVzXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0Q2llcnJlc3hFbXByZXNhKHBvc3RTZXJ2aWNlOiBQb3N0U2VydmljZU0zLCBzSWRLYXRpb3M6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nLCBzRmVjaGE6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBzZWNvcGNpb25lczogYW55O1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBzSWRLYXRpb3MsICdpZFByb2Nlc28nOiBzSWRQcm9jZXNvLCAnRmVjaGEnOiBzRmVjaGEgfVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gYXdhaXQgcG9zdFNlcnZpY2UuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0Q2llcnJlc3hFbXByZXNhJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICBzZWNvcGNpb25lcyA9IEpTT04ucGFyc2Uoc2Vjb3BjaW9uZXMpXHJcbiAgICAgICAgcmV0dXJuIHNlY29wY2lvbmVzXHJcbiAgICB9XHJcblxyXG4gICAgLy9UcmFlIGVsIG0zcHJvY2Vzb3Mgc2VncHVuIGVsIGlkcHJlc3RhbW9cclxuICAgIHB1YmxpYyBzaW11bGFycGFnb0VubGluZWEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZE0zOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvVmFsaWRhY2lvblBhZ29JbnRlZ3JhY2lvblRlc3QvJyArIHNJREthdGlvcyArICcvJyArIHNJZE0zICsgJy8nICsgc0lkUHJvY2Vzbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZhbGlkYXJQcmRzTWlzbW9Qcm92ZWVkb3IoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG5vbWJyZUFkaWNpb25hbFByb3ZlZWRvcjogc3RyaW5nLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0Z1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNNYWVzdHJvL3ZhbGlkYXJQcmRzTWlzbW9Qcm92ZWVkb3IvXCIgKyBpZF9rYXRpb3MgKyBcIi9cIiArIG5vbWJyZUFkaWNpb25hbFByb3ZlZWRvciwgb00zUHJvY2Vzb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXNwWydfYm9keSddKS50b1N0cmluZygpKSlcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB2YWxpZGFyUHJkc01pc21vUHJvdmVlZG9yXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uUmVzcChKU09OLnBhcnNlKEpTT04ucGFyc2UoZXJyWydfYm9keSddKS5NZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2YWxpZGFyUmVzdHJpY2Npb25JbnZOZWdhdGl2byhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9GdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby92YWxpZGFyUmVzdHJpY2Npb25JbnZOZWdhdGl2by9cIiArIGlkX2thdGlvcywgb00zUHJvY2Vzb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXNwWydfYm9keSddKS50b1N0cmluZygpKSlcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB2YWxpZGFyUmVzdHJpY2Npb25JbnZOZWdhdGl2b1wiKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKGVyclsnX2JvZHknXSkuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mb1ByZEdhc3Rvc0VudmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG5cclxuICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNNYWVzdHJvL2dldEluZm9QcmRHYXN0b3NFbnZpby9cIiArIGlkX2thdGlvcywgb00zUHJvY2Vzb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04ucGFyc2UocmVzcFsnX2JvZHknXSkudG9TdHJpbmcoKSkuUkVTUFVFU1RBXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmEgdW5hIHNhbGRveGN1ZW50YSBhbGVhdG9yaW8gcG9yIGVsIHZhbG9yIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgPSB7XCJwcm9jZXNvXCIscHJvY2VzbyxcInZhbG9yXCI6dmFsb3IsXCJub21icmVEb2NcIjogbm9tYnJlRG9jfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbTNfZ2VuZXJhcl9NM1NYQ19hbGVhdG9yaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55KSB7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9tM19nZW5lcmFyX00zU1hDX2FsZWF0b3Jpby9cIiArIGlka2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXNwWydfYm9keSddKS50b1N0cmluZygpKS5SRVNQVUVTVEE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdHVhbGl6YSB1biBjb25jZXB0byBkZWwgTTNfc2FsZG9zSXRlbVViXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBNM19hY3R1YWxpemFyQ29uY2VwdG9TSVUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL00zX2FjdHVhbGl6YXJDb25jZXB0b1NJVS9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNvQWxDaWVycmVVYmljKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9wcm9jZXNvQWxDaWVycmVVYmljL1wiICsgaWRfa2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcClcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBwcm9jZXNvQWxDaWVycmVVYmljXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0X1Byb2Nlc29zQWJpZXJ0b3MoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXRfUHJvY2Vzb3NBYmllcnRvcy8nICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UoU3RyaW5nKHJlc3ApKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGdldF9Qcm9jZXNvc0FiaWVydG9zXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9JbmZvUHJvY2Vzb1xyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IE0zUEVuY0l0ZW1zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBlbmMtaXRlbXNcIjtcclxuaW1wb3J0IHsgTTNQcmRHZW5lcmFsIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHZW5lcmFsLnR5cGVcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUEl0ZW1zV0VCLCBNM1BEZXRhbGxlQ3Vwb24gfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zRGF0YSB9IGZyb20gXCIuLi9EYXRhL20zLWRhdGFcIjtcclxuaW1wb3J0IHsgREVGQVVMVF9WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9kZWZhdWx0X3ZhbHVlX2FjY2Vzc29yXCI7XHJcbmltcG9ydCB7IHhtbFRvSnNvblRGIH0gZnJvbSBcIi4uLy4uL0NvbnZlcnQveG1sVG9KU29uLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zUEltcHVlc3RvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wLWltcHVlc3Rvc1wiO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcbmltcG9ydCB7IE0zRU5DUFJPTU8gfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zRU5DUFJPTU8uY2xhc3NcIjtcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBwcm9tb2Npb25lc1NlcnZpY2UgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvcHJvbW9jaW9uZXMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQcm9tb2Npb25Qcm9jZXNhZGEsIFByb21vY2lvbmVzQXNvY2lhZGFzLCBQcm9tb2Npb25Db21iaW5hZGEgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zUHJvbW9Qcm9jZXNhZGEuY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNDb3VjaE1hZXN0cm8gfSBmcm9tIFwiLi4vRGF0YS9tMy1jb3VjaC1tYWVzdHJvXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhc1wiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTGlzdGFQcmVjaW8gfSBmcm9tIFwiLi9tMy1saXN0YS1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbG9hZC1sLXByZWNpby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGEgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9zcmMvcmVuZGVyM1wiO1xyXG5pbXBvcnQgeyBNM1ByZXNlbnRhY2lvbmVzIH0gZnJvbSBcIi4uL01hZXN0cm8vbTMtcHJlc2VudGFjaW9uZXNcIjtcclxuaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSBcIkBhbmd1bGFyL2NvbXBpbGVyL3NyYy91dGlsXCI7XHJcbmltcG9ydCB7IE0zUHJkUGFja0RldCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkUGFja0RldFwiO1xyXG5pbXBvcnQgeyBNM1ByZEFkaWNpb25hbGVzIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zT3RDbGFzaWZpY2FjaW9uZXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtb3QtY2xhc2lmaWNhY2lvbmVzXCI7XHJcbmltcG9ydCB7IE0zUHJkTGlzdGEgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZExpc3RhLnR5cGVcIjtcclxuaW1wb3J0IHsgTWF0aFRGIH0gZnJvbSBcIi4uL01pc2NlbGFuZWEvTWF0aFRGLmNsYXNzXCI7XHJcbmltcG9ydCB7IEVDQU5DRUxFRCB9IGZyb20gXCJjb25zdGFudHNcIjtcclxuaW1wb3J0ICogYXMgeG1sMmpzIGZyb20gJ3htbDJqcyc7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG52YXIgYmlnRGVjaW1hbCA9IHJlcXVpcmUoJ2pzLWJpZy1kZWNpbWFsJyk7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZWdTZXJ2aWNlIHtcclxuICAgIHB1YmxpYyBvTWF0aFRGOiBNYXRoVEYgPSBuZXcgTWF0aFRGKCk7XHJcbiAgICBwcml2YXRlIG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm87XHJcbiAgICBwdWJsaWMgb0xpc3RhT2JzZXF1aW9zOiBBcnJheTxhbnk+ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvYnNlcXVpb3NFeGM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBvYnNlcXVpb09Qcm9tbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9zQ2FudGlkYWQ6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbElkQWN0aXZhUHJvbW8gPSBbXTtcclxuICAgIHByaXZhdGUgR29Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zO1xyXG4gICAgcHJpdmF0ZSBnc0lka2F0aW9zO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBJc1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJZGthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8gPSBpb00zQ291Y2hNYWVzdHJvO1xyXG4gICAgICAgIHRoaXMuR29Qb3N0U2VydmljZU0zID0gSXNQb3N0U2VydmljZU0zO1xyXG4gICAgICAgIHRoaXMuZ3NJZGthdGlvcyA9IHNJZGthdGlvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBWYWxpZGFyIG51bWVybyBkZSBpdGVtcyBhZ3JlZ2Fkb3MuIHNpIGVzIG1heW9yIGEgMS4wMDAgcHJlbmRlIHBhcmFtZXRybyBcclxuICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTnVtZXJvSXRlbXMob2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5NM0VOQy5sZW5ndGggPiAxMDAwKSB7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5BcGxEZXNkZVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5NM0VOQyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFByb2Nlc2FtaWVudG9TZXJ2aWNlKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgYXBsUmV0b21hckluZm86IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyTnVtZXJvSXRlbXMob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JZE0zID0gb0pzb24uUkVTUFVFU1RBLklETTM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJT0NJRVJSRVxyXG5cclxuICAgICAgICAgICAgLy9BY3R1YWxpemFjaW9uIGRlIGVzdGFkb3MuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuRXN0YWRvRGVzO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvSnNvbi5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIGFwbFJldG9tYXJJbmZvOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklkTTMgPSBvSnNvbi5SRVNQVUVTVEEuSURNMztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW8gPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU87XHJcblxyXG4gICAgICAgICAgICAvL0FjdHVhbGl6YWNpb24gZGUgZXN0YWRvcy5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5Fc3RhZG9EZXM7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgUmVnaXN0cm9FdmVudG9NM09mZkxpbmUoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBBcnJheTxNM1Byb2Nlc29zPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vL1JldG9tYXIgaW5mb3JtYWNpb24gcGFyYSBlbCBwcm9jZXNvLlxyXG4gICAgcHVibGljIFJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXI6IGFueSwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhVXNlciAhPSBudWxsICYmIG9NM1Byb2Nlc29zLklkTTMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5JZE0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGFwbFJldG9tYXJJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID09IHVuZGVmaW5lZCB8fCBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZVxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIGRhdG9zIGVuIGJhc2UgZGUgZGF0b3MgcG91Y2hEQi5cclxuICAgIHB1YmxpYyBQcm9jZXNhbWllbnRvU2VydmljZVBvdWNoREIob00zRGF0YTogTTNEYXRhLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgIC8vQ2FyZ2FyIGRldGFsbGUgZGUgaXRlbXNcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4oYXN5bmMgcmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLnZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNQcm9jZXNvcy5NM0VOQywgcHJvZHVjdFVuaXRTZWxlY3RlZCwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkX2FjdHVhbCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2xldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLmdldENhbnRpZGFkKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAoK2NhbnRpZGFkX2FjdHVhbCkgKyArb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCBNM0VuYyA9IHRoaXMuZ2V0X00zRU5DX2J5X2lkcHJkX2xvdGUob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVLCBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUpO1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UgJiYgcHJvZC5Mb3RlID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSAmJiAhKHByb2QuSWRFbmNQYWRyZSA+IDApKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9EYXRhQ2Fycml0b0NvbXByYXMpO1xyXG4gICAgICAgIH0sIGFzeW5jIGVycm9yID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9EYXRhVXNlciwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgaW9NM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BZ3JlZ2FyIGEgY2Fycml0byBwcm9kdWN0by5cclxuICAgIHB1YmxpYyBhZGR0b2NhcnQob00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwsIHZhbG9yRGVzY3VlbnRvID0gMCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MDcyMiBzZSBhZ3JlZ2EgcGFyYSBjdWFuZG8gZXMgZWwgcHJpbWVyIHByb2R1Y3RvIHF1ZSBzZSBhZ3JlZ2Fyw4PCoVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0VOQy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvRGF0YVVzZXIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGlvTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy52YWxpZGFyRXhpc3RhUHJvZHVjdG8ob00zUHJvY2Vzb3MuTTNFTkMsIHByb2R1Y3RVbml0U2VsZWN0ZWQsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGlmIChjYW50aWRhZF9hY3R1YWwgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9sZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy5nZXRDYW50aWRhZChvTTNQcm9jZXNvcywgcHJvZHVjdFVuaXRTZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gKCtjYW50aWRhZF9hY3R1YWwpICsgb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVICYmIHByb2QuTG90ZSA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUgJiYgIShwcm9kLklkRW5jUGFkcmUgPiAwKSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQsIHZhbG9yRGVzY3VlbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCwgdmFsb3JEZXNjdWVudG8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9WYWxpZGEgcXVlIGV4aXN0YSBwcm9kdWN0byBlbiBsb3MgZW5jYWJlemFkb3MuIFRydWU6IFNpIGV4aXN0ZSwgRmFsc2UgZGUgb3RybyBtb2RvXHJcbiAgICAvLyBTZSBjYW1iaWEgZnVuY2lvbmFsaWRhZCBkZSByZXR1cm4uXHJcbiAgICBwdWJsaWMgdmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM0xpc3RhRW5jOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1ByZEdybDogTTNQcmRHZW5lcmFsLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKTogbnVtYmVyIHtcclxuICAgICAgICB2YXIgb0VuYzogTTNQRW5jSXRlbXMgPSBudWxsO1xyXG4gICAgICAgIHZhciBjYW50aWRhZDogbnVtYmVyID0gMDtcclxuICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9IC0xO1xyXG4gICAgICAgIGlmIChvTTNMaXN0YUVuYyAhPT0gdW5kZWZpbmVkICYmIG9NM1ByZEdybCAhPT0gdW5kZWZpbmVkICYmIG9NM0xpc3RhRW5jLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgIG9FbmMgPSBvTTNMaXN0YUVuYy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBvTTNQcmRHcmwuU0tVICYmICFlbmMuSWRFbmNQYWRyZSAmJiB0aGlzLmdldENhbnRpZGFkUG9zaXRpdmEoZW5jKSk7XHJcbiAgICAgICAgICAgIGlmIChvRW5jICE9PSB1bmRlZmluZWQgJiYgb0VuYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA3MTcgVmFsaWRhciBhaG9yYSBlbCBwcmVjaW8uXHJcbiAgICAgICAgICAgICAgICB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlc0dlbmVyYWwob00zUHJkR3JsLCArb0VuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLlZhbGlkYXJQcmVjaW9zUHJkcyhvRW5jLCBvTTNQcmRHcmwuTG9NM1ByZExpc3RhKSAmJiAhdGhpcy5WYWxpZGFyRXN0YVBhcXVldGUob0VuYywgb00zTGlzdGFFbmMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSBvRW5jLklEO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnRpZGFkID0gK29FbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbnRpZGFkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENhbnRpZGFkUG9zaXRpdmEob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjYW50aWRhZCA9IDA7XHJcbiAgICAgICAgbGV0IGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIilcclxuXHJcbiAgICAgICAgaWYgKGRldENhbnRpZGFkKSB7XHJcbiAgICAgICAgICAgIGNhbnRpZGFkID0gK2RldENhbnRpZGFkLlZhbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHF1ZSBlbCBlbmNhYmV6YWRvIGNvbiBlbCBwcm9kdWN0byBhZ3JlZ2Fkbywgc2VhIHVuIHBhcXVldGVcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gb00zTGlzdGFFbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyRXN0YVBhcXVldGUob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb00zTGlzdGFFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNMaXN0YUVuYy5maW5kKHggPT4geC5JZEVuY1BhZHJlID09IG9NM1BFbmNJdGVtcy5JRCkpIHtcclxuICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBsb3MgcHJlY2lvcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgKiBAcGFyYW0gb0VuYyBcclxuICAgICAqIEBwYXJhbSBvTTNQcmRMaXN0YSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJQcmVjaW9zUHJkcyhvRW5jOiBNM1BFbmNJdGVtcywgb00zUHJkTGlzdGE6IE0zUHJkTGlzdGEpIHtcclxuICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb0VuYzogbnVtYmVyID0gK29FbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9MaXN0OiBudW1iZXIgPSBvTTNQcmRMaXN0YS5QUkVDSU87XHJcblxyXG4gICAgICAgICAgICBpZiAoZFByZWNpb0xpc3QgPT0gZFByZWNpb0VuYykge1xyXG4gICAgICAgICAgICAgICAgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIFZhbGlkYXJQcmVjaW9zUHJkc1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyBVcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIHRpcG9VYmljYWNpb246IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvblxyXG4gICAgICAgICwgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uID0gbnVsbCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiA9IG51bGwpIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgLy9JREhVQlxyXG4gICAgICAgIGlmICh0aXBvVWJpY2FjaW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG4gICAgICAgICAgICBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBtM1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIG0zVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICBpZiAobTNVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgdmFyIGxvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgICAgICAgICBsb00zUEl0ZW1zV0VCID0gb00zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHRoaXMuZ3NJZGthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICB0aGlzLlByb2NQcm9tb0FmdGVyQWRkVG9DYXJ0KG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIsIGxvTTNQSXRlbXNXRUIsIG0zVWJpY2FjaW9uLCB0cnVlKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coeCk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhvRGF0YSk7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzQXN5bmMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh4KVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvIGVuIHByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9Pa1wiKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLm9FbmNhYmV6YWRvTTNDb21wb25lbnQuUmVjYXJnYXJDYXJyaXRvKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuTG9hZENhcnQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWN0dWFsaXphY2lvbiBkZSBNMyBwcm9jZXNvcywgY29uIGRhdGEgbGlzdGEgcGFyYSBhY3R1YWxpemFyLlxyXG4gICAgcHVibGljIHVwZGF0ZUFQb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgdGlwb1ViaWNhY2lvbjogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vSURIVUJcclxuICAgICAgICBpZiAodGlwb1ViaWNhY2lvbi50b1VwcGVyQ2FzZSgpID09IFwiV0VCXCIpIHtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICAgICAgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0bykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICBhd2FpdCBvTTNEYXRhLkRlbGV0ZShzS2V5Q2Fycml0byk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL0VsaW1pbmFyIGRvY3VtZW50byBkZSBjb3VjaC9wb3VjaCwgaW5pY2lvIHkgYWN0dWFsXHJcbiAgICBwdWJsaWMgRGVsRG9jc1N0YXJ0QW5kQ3VycmVudChvTTNEYXRhOiBNM0RhdGEsIHNJREthdGlvczogc3RyaW5nLCBvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFViaWNhY2lvbkN1cnJlbnQsIEh1YkN1cnJlbnQpIHtcclxuICAgICAgICAvL0VsaW1pbmFyIEluaWNpYWxcclxuICAgICAgICBpZiAob2xNM1Byb2Nlc29zLklERGlhcmlvQ2llcnJlICE9PSB1bmRlZmluZWQgJiYgb2xNM1Byb2Nlc29zLklERGlhcmlvQ2llcnJlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhVXNlciA9IHsgXCJVc3VhcmlvU2lzdGVtYVwiOiB7IFwiVERPQ1wiOiBvbE0zUHJvY2Vzb3MuVERvYywgXCJORE9DXCI6IG9sTTNQcm9jZXNvcy5ORG9jLCBcIlVCSUNBQ0lPTlwiOiBvbE0zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSwgXCJJREhVQlwiOiBvbE0zUHJvY2Vzb3MuSURIdWIgfSB9XHJcbiAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJEZWxldGUgc3RhcnRcIik7XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAvL0VsaW1pbmFyIGFjdHVhbFxyXG4gICAgICAgICAgICBvRGF0YVVzZXIgPSB7IFwiVXN1YXJpb1Npc3RlbWFcIjogeyBcIlRET0NcIjogb2xNM1Byb2Nlc29zLlREb2MsIFwiTkRPQ1wiOiBvbE0zUHJvY2Vzb3MuTkRvYywgXCJVQklDQUNJT05cIjogVWJpY2FjaW9uQ3VycmVudC50b1N0cmluZygpLCBcIklESFVCXCI6IEh1YkN1cnJlbnQgfSB9XHJcbiAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJEZWxldGUgY3VycmVudFwiKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyBhc3luYyBHZXRDYXJyaXRvQ29tcHJhc1BvdWNoREIob00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLy9UcmFzbGFkYXIgaW5mb3JtYWNpw4PCs24gZGUgY2Fycml0bywgZG9zIHVzdWFyaW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgTW92ZUNhcnRJbnRvVXNlcihzSURLYXRpb3M6IHN0cmluZywgb00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXJPcmlnZW46IGFueSwgb0RhdGFVc2VyRGVzdGlubzogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvT3JpZ2VuO1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0b0Rlc3Rpbm87XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvT3JpZ2VuID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG9EZXN0aW5vID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIGxldCBvTTNQcm9jZXNvID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0b09yaWdlbik7XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvLlREb2MgPSBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlRET0M7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc28uTkRvYyA9IG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuTkRPQztcclxuICAgICAgICAgICAgZGVsZXRlIG9NM1Byb2Nlc29bXCJfcmV2XCJdO1xyXG4gICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvRGVzdGlubywgb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzIHkgZGUgYmFzZVxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmVjYWxjdWxhclByZWNpb3NQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWw7XHJcbiAgICAgICAgLy8gdmFyIGRQcmVjaW9Ub3RhbEJhc2U7XHJcbiAgICAgICAgLy8gdmFyIGRWYWxvcjogbnVtYmVyID0gMDtcclxuICAgICAgICAvLyB2YXIgZFZhbG9yTmV0bzogbnVtYmVyID0gMDtcclxuXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAvLyAgICAgZFByZWNpb1RvdGFsID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yIC8vKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpICogKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKTtcclxuICAgICAgICAvLyAgICAgZFByZWNpb1RvdGFsQmFzZSA9IHRoaXMuQ2FsY3VsYXJQcmVjaW9CYXNlRnJvbVByb2Nlc28oZW5jLCBkUHJlY2lvVG90YWwpO1xyXG4gICAgICAgIC8vICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxCQVNFXCIpLlZhbG9yID0gU3RyaW5nKE1hdGgucm91bmQoZFByZWNpb1RvdGFsQmFzZSAqIDEwMCkgLyAxMDApO1xyXG4gICAgICAgIC8vICAgICBkVmFsb3IgPSAoK2RWYWxvcikgKyAoK2RQcmVjaW9Ub3RhbEJhc2UpO1xyXG4gICAgICAgIC8vICAgICBkVmFsb3JOZXRvID0gKCtkVmFsb3JOZXRvKSArICgrZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5SZWNhbGN1bG9JbXB1ZXN0b3MoZW5jLCBkUHJlY2lvVG90YWxCYXNlKTtcclxuICAgICAgICAvLyB9KTtcclxuICAgICAgICAvLyAvL29NM1Byb2Nlc29zLlZhbG9yID0gZFZhbG9yO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IGRWYWxvck5ldG87XHJcbiAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vUmVjYWxjdWxhciBwcmVjaW9zLiByZWNvcnJpZW5kbyBsb3MgZW5jYWJlemFkb3MuXHJcbiAgICBwdWJsaWMgUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgdmFsb3IgPSAwO1xyXG4gICAgICAgIHZhciBWYWxvck5ldG8gPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkxMDEwIHNlIGNhbWJpYSBlbCB2YWxvciBkZWwgcHJlY2lvIHVuaXRhcmlvIGJhc2UsIHlhIHF1ZSBhbCBtb21lbnRvIGRlIGxsYW1hciBsYSBmdW5jacODwrNuIFZhbG9yZXNDYWxjdWxhZG9zUHJvY2Vzb1xyXG4gICAgICAgICAgICAvLyBzZSByZWNhbGN1bG8gZWwgcHJlY2lvIHRvdGFsLCBkZXBlbmRpZW5kbyBkZSBlc3RlIHZhbG9yLlxyXG4gICAgICAgICAgICBsZXQgcFRvdGFsQmFzZSA9IHRoaXMuQ2FsY3VsYXRlUHJlY2lvQmFzZShlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1RCTERJTVBQUkRcIikuVmFsb3IsXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9NYXRoVEYucm91bmQoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yLCAyKSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgZENhbnRpZGFkRW5jID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgaWYgKCtkQ2FudGlkYWRFbmMgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpLlZhbG9yID0gKCtwVG90YWxCYXNlIC8gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9VTklUQkFTRVwiKS5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKGVuYywgK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bGFyIHByZWNpbyBiYXNlIGRlIHVuIHByZWNpbywgdGVuaWVuZG8gZWwgdmFsb3IgdG90YWwgbyBuZXRvLlxyXG4gICAgcHVibGljIENhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRQcmVjaW9OZXRvOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZFZhbG9ySW1wdWVzdG86IG51bWJlciA9IDE7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JJbXB1ZXN0byA9ICgrZFZhbG9ySW1wdWVzdG8pICsgKCtpbXAuUG9yY2VudGFqZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgoK2RQcmVjaW9OZXRvKSAvICgrZFZhbG9ySW1wdWVzdG8pKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1JlY2FsY3VsbyBkZSB2YWxvciBkZSBpbXB1ZXN0b3MsIGN1YW5kbyBjYW1iaWEgZWwgdmFsb3IuIFNlYSBwb3IgY2FudGlkYWQsIGVsaW1pbmFjacODwrNuLi4uXHJcbiAgICAvLyBwdWJsaWMgUmVjYWxjdWxvSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRQcmVjaW9CYXNlOiBudW1iZXIpIHtcclxuICAgIC8vICAgICB2YXIgZFRvdGFsSW1wdWVzdG86IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAvLyAgICAgICAgIGltcC5WYWxvciA9ICgrZFByZWNpb0Jhc2UpICogKCtpbXAuUG9yY2VudGFqZSk7XHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBudWV2byBjb25jZXB0b1xyXG4gICAgLy8gICAgICAgICBpbXAuQmFzZSA9IGRQcmVjaW9CYXNlO1xyXG4gICAgLy8gICAgICAgICBkVG90YWxJbXB1ZXN0byA9ICgrZFRvdGFsSW1wdWVzdG8pICsgKCtpbXAuVmFsb3IpO1xyXG4gICAgLy8gICAgICAgICAvL1N1bWEgZGUgcHJlY2lvIGJhc2UgXHJcbiAgICAvLyAgICAgICAgIGRQcmVjaW9CYXNlID0gKCtkUHJlY2lvQmFzZSkgKyAoK2ltcC5WYWxvcik7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyAgICAgZFRvdGFsSW1wdWVzdG8gPSBNYXRoLnJvdW5kKGRUb3RhbEltcHVlc3RvICogMTAwKSAvIDEwMDtcclxuICAgIC8vICAgICBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxJTVBVRVNUT1NcIikuVmFsb3IgPSBkVG90YWxJbXB1ZXN0by50b1N0cmluZygpO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWFjaW9uIG51ZXZvIE0zIHByb2Nlc29zLCBlc3RlIHZhIHZhY2lvIHNpbiBuaXNpcXVpZXJhIE0zUEVuY0l0ZW1zLiBcclxuICAgICAqIFNlIHV0aWxpemEgcHJpbmNpcGFsbWVudGUgcGFyYSBsYXMgY3JlYWNpb24gZGVzZGUgMCB1biBNMyBQcm9jZXNvLiBRdWUgcGFzYSBkZSBlc3RhZG9zICcnIGFsIHByaW1lciBlc3RhZG9cclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRwcm9jZXNvX2Rlc3Rpbm8gXHJcbiAgICAgKiBAcGFyYW0gdGRvYyBcclxuICAgICAqIEBwYXJhbSBuZG9jIFxyXG4gICAgICogQHBhcmFtIGVzdGFkb3NfZnV0dXJvcyBcclxuICAgICAqIEBwYXJhbSBpZEh1YiBcclxuICAgICAqIEBwYXJhbSBpZFViaWNhY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENyZWF0ZU0zTmV3UHJvY2Vzb0VtcHR5KGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRwcm9jZXNvX2Rlc3Rpbm86IHN0cmluZywgdGRvYzogc3RyaW5nLCBuZG9jOiBzdHJpbmcsXHJcbiAgICAgICAgZXN0YWRvc19mdXR1cm9zOiBBcnJheTxhbnk+LCBpZEh1Yjogc3RyaW5nLCBpZFViaWNhY2lvbjogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IGlkcHJvY2Vzb19kZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBlc3RhZG9zX2Z1dHVyb3NbMF0uRV9EZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBlc3RhZG9zX2Z1dHVyb3NbMF0uU0VfRGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9ICtpZEh1YjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSAraWRVYmljYWNpb247XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLklESHViID0gK2lkSHViO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5VYmljMSA9ICtpZFViaWNhY2lvbjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVERvYyA9IHRkb2M7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk5Eb2MgPSBuZG9jO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5UaXBvVGVyY2VybyA9IDE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlViaWMyID0gLTE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmUgPSAtMTtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvL0N1YW5kbyBzZSBhZ3JlZ2EgcG9yIHByaW1lcmEgdmV6IGFsIGNhcnJpdG8gZGUgY29tcHJhLlxyXG4gICAgcHVibGljIExvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb0RhdGFVc2VyOiBhbnksIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICAvL3NJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OXHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IGlvTTNQcm9jZXNvcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5UaXBvVGVyY2VybyA9IDE7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVERvYyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk5Eb2MgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQztcclxuICAgICAgICBvTTNQcm9jZXNvcy5VYmljMSA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT047XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVWJpYzIgPSAtMTtcclxuICAgICAgICAvLy9BR1JFR0FSIE5VRVZBIEZVTkNJT05BTElEQUQgREUgSFVCUy4gRkxVSk8gREUgVFJBQkFKT1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLklESHViID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSBvTTNQcm9jZXNvcy5JREh1YjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9IG9NM1Byb2Nlc29zLlViaWMxO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlID0gLTE7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUgPSAtMTtcclxuXHJcbiAgICAgICAgLy8vRklOIEFHUkVHQVIgTlVFVkEgRlVOQ0lPTkFMSURBRCBERSBIVUJTLiBGTFVKTyBERSBUUkFCQUpPXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IFwiXCI7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gXCJcIjtcclxuXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9PSBcIlwiICYmIGlvTTNQcm9jZXNvcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9IFwiUmVnaXN0cm9cIjtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gXCJBY3Rpdm9cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvTTNQSXRlbXNXRUIuU3ViRXN0YWRvX28gIT0gXCJcIiAmJiBvTTNQSXRlbXNXRUIuRXN0YWRvX28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBvTTNQSXRlbXNXRUIuU3ViRXN0YWRvX287XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IG9NM1BJdGVtc1dFQi5Fc3RhZG9fbztcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklkUHJvY2VzbyA9PSBcIlwiICYmIGlvTTNQcm9jZXNvcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gXCJNM0VDQ1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLnB1c2godGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcikpO1xyXG4gICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG51bGwsIDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZClcclxuXHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3IgPSBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWw7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAvL3RoaXMuUHJvY2VzYW1pZW50b1NlcnZpY2UoUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3MsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9DYXJnYXIgbnVldm9zIGFkaWNpb25hbGVzIGFkaWNpb25hbGVzXHJcbiAgICBwdWJsaWMgTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIHByb2R1Y3Q6IFR5cGVNM1ByZEdycCk6IE0zUEl0ZW1zV0VCIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuQ2xhdmVQcmRTUlYgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJDTEFWRVBST0RTRVJWXCIpLlZBTE9SO1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuQ2xhdmVQcmRVbmlkYWQgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJDTEFWRVVOSURBRFwiKS5WQUxPUjtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlVuaWRhZCA9IHByb2R1Y3QuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBcIlVOSURBRFwiKS5WQUxPUjtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvTTNQSXRlbXNXRUI7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYXJnYXIgcHJvY2Vzb3MsIHJldG9tYW5kbyBkZXNkZSBkYXRhXHJcbiAgICBwdWJsaWMgTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwsIHZhbG9yRGVzY3VlbnRvID0gMCk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yID0gKCtvTTNQcm9jZXNvcy5WYWxvcikgKyAoK29NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwpO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9NM1Byb2Nlc29zLlZhbG9yO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9PSBcIlwiICYmIG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IG9NM1BJdGVtc1dFQi5JZFByb2Nlc287XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLnB1c2godGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcikpO1xyXG4gICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG51bGwsIHZhbG9yRGVzY3VlbnRvLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpXHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb2VuY2FiZXphZG9JdGVtczogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9QYWRyZU0zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgdmFsb3JEZXNjdWVudG8gPSAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy9WYWxpZGFjaW9uIGRlIEludmVudGFyaW8uXHJcbiAgICAgICAgbGV0IGFkaVZlbnRhTmVnID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKHggPT4geC5BVFJJQlVUTyA9PSBcIlZFTlRBTkVHXCIpXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW1wiSW52ZW50YXJpb0Vycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvLnRvVXBwZXJDYXNlKCkgPT0gXCJNM0VDQ1wiICYmIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFIDwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCAmJiBvTTNVYmljYWNpb24uTTNIVUJTWzBdLlRpcG8gPT0gXCJXRUJcIiAmJiAhKGFkaVZlbnRhTmVnICYmIGFkaVZlbnRhTmVnLlZBTE9SKSkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXSA9ICdObyBoYXkgaW52ZW50YXJpbyBwYXJhIGFncmVnYXIgJyArIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgKyAnIEl0ZW1zJztcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFO1xyXG4gICAgICAgIH0gLy9lbHNlIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIG9NM1BFbmNJdGVtcyA9IHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybEl0ZW0ob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvUGFkcmVNM1BFbmNJdGVtcywgdmFsb3JEZXNjdWVudG8pO1xyXG5cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgZGVsZXRlIG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob1BhZHJlTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgLy9UaWVuZSB1biBlbmNhYmV6YWRvIHBhZHJlLlxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA9IG9QYWRyZU0zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgdmFyIG9sTTNQcmRQYWNrRGV0OiBBcnJheTxNM1ByZFBhY2tEZXQ+O1xyXG4gICAgICAgICAgICBvbE0zUHJkUGFja0RldCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5NM1BBQ0tcclxuICAgICAgICAgICAgaWYgKG9sTTNQcmRQYWNrRGV0ICYmIG9sTTNQcmRQYWNrRGV0Lmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCB2YWxvckRlc2N1ZW50b1BhY2sgPSB0aGlzLmNhbGN1bGFyUG9yY2VudGFqZURlc2N1ZW50b0NvbWJvKHByb2RHUlBTZWxlY3RlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbE0zUHJkUGFja0RldC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvTTNQcmRQYWNrRGV0OiBNM1ByZFBhY2tEZXQgPSBvbE0zUHJkUGFja0RldFtpXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFja00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1ByZFBhY2tEZXQub00zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQiA9IG9NM1ByZFBhY2tEZXQub00zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCID0gT2JqZWN0LmFzc2lnbih7fSwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IG9NM1ByZFBhY2tEZXQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5QYXRoSW1hZ2VuID0gb00zUHJkUGFja0RldC5nc1BhdGhJbWFnZW47XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgKiBvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5DYWxjdWxhclByZWNpb3NQQ0tHKG9NM1ByZFBhY2tEZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyBpICsgMjsgLy9Fc3RvIGZ1bmNpb25hIHNpIHRpZW5lIHNvbG8gMiBuaXZlbGVzXHJcbiAgICAgICAgICAgICAgICAgICAgLy9TaSBlc3RvIHNlIGN1bXBsZSBlc3RlIHByb2R1Y3RvIGVzIHVuIHBhY2sgeSB0aWVuZSBwcm9kdWN0b3MgYXNvY2lhZG9zLlxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZEdlbmVyYWwgPSBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLk0zQ29kcy5maW5kKHggPT4geC5JZENvZGlnbyA9PSBcIlVQQ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZEdlbmVyYWwgJiYgcHJkR2VuZXJhbC5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLkNvZGlnb0JhcnJhcyA9IHByZEdlbmVyYWwuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJubyBhw4PCsWFkaSBjb2RpZ28gZGUgYmFycmFzIGEgcHJvZHVjdG8gaGlqbzogXCIgKyBvTTNQcmRQYWNrRGV0LlNLVUhJSk8pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgb00zUHJkUGFja0RldC5NM0dSUCwgb00zUHJvY2Vzb3MuTTNFTkMsIHBhY2tNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRW5jSXRlbXMsIDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyMywgZXN0byBlcyBjdWFuZG8gc2UgbW9kaWZpY2EgbGEgY2FudGlkYWQgZGUgcHJvZGN1dG9zIGV4aXN0ZW50ZXMuXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklEID0gb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkgZW52aW8gZGUgcGFkcmUgZGVzZGUgaW5zdHJ1Y2Npb24gbWFzIGFycmliYVxyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklERW5jUGFkcmUgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlID0gb00zUEl0ZW1zV0VCLklERW5jUGFkcmU7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuVGlwb0FncnVwYWNpb24gPSBvTTNQSXRlbXNXRUIuVGlwb0FncnVwYWNpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCAmJiBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLmZvckVhY2goZGluID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQRGluYW1CeUFjdGl2aWRhZC5wdXNoKHsuLi4gZGlufSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMucHVzaChvTTNQRW5jSXRlbXMpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdID0gb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNQcm9jZXNhZG8gPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgLy99XHJcbiAgICB9XHJcblxyXG4gICAgY2FsY3VsYXJQb3JjZW50YWplRGVzY3VlbnRvQ29tYm8ocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICBsZXQgdmFsb3JEZXNjdWVudG9QYWNrID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JJdGVtc0NvbWJvU3VtYSA9IDA7XHJcbiAgICAgICAgbGV0IHZhbG9yRmluYWxDb21ibyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG5cclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTTNQQUNLLmZvckVhY2gocHJkUGFjayA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZCA9IHByZFBhY2suTTNHUlAuQ2FudGlkYWQgPyBwcmRQYWNrLk0zR1JQLkNhbnRpZGFkIDogMTtcclxuICAgICAgICAgICAgbGV0IGluZk5pdmVsZXNQcmNpbyA9IHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByZFBhY2suTTNHUlAsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5JRExJU1RBKVxyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTylcclxuICAgICAgICAgICAgdmFsb3JJdGVtc0NvbWJvU3VtYSArPSAocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPICogY2FudGlkYWQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodmFsb3JJdGVtc0NvbWJvU3VtYSA+IHZhbG9yRmluYWxDb21ibykge1xyXG4gICAgICAgICAgICB2YWxvckRlc2N1ZW50b1BhY2sgPSAxMDAgLSAodmFsb3JGaW5hbENvbWJvICogMTAwIC8gdmFsb3JJdGVtc0NvbWJvU3VtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodmFsb3JEZXNjdWVudG9QYWNrKVxyXG4gICAgICAgIHJldHVybiB2YWxvckRlc2N1ZW50b1BhY2s7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxvIGRlIHByZWNpb3MgZGUgaGlqb3MgZGVsIHBhcXVldGVcclxuICAgICAqIEBwYXJhbSBvTTNQcmRQYWNrRGV0IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcmVjaW9zUENLRyhvTTNQcmRQYWNrRGV0OiBNM1ByZFBhY2tEZXQpIHtcclxuICAgICAgICBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBsb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29kaWdvOiBzdHJpbmcsIHZhbG9yLCBkQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gbmV3IE0zUEVuY0l0ZW1zKCk7XHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uSWRQcm9kdWN0byA9IGNvZGlnbztcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLkxvdGUgPSBcIjFcIjtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMODwrNnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5PcmRlbiA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIk9yZGVuXCIpICsgMTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk5vbWJyZSA9IGBDb21ibyAtICR7cHJvZHVjdG9zSGlqb3NEZWxDb21iby5tYXAoeD0+IHguSWRQcm9kdWN0bykuam9pbignLScpfWA7XHJcblxyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzJyksIFwiRkVDSEFJTlwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJ0cnVlXCIsIFwiRVNQUk9EUFJPTU9DT01CT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJ0cnVlXCIsIFwiRVNQUk9EUFJPTU9cIikpOyAvLyBUUlVFLT4gU0kgRVMgVU4gUFJPRFVDVE8gUE9SIFBST01PQ0lPTiwgRkFMU0UtPiBERSBPVFJPIE1PRE9cclxuICAgICAgICAvL0RldGFsbGVzIGRlIGZhY3R1cmEgZWxlY3Ryb25pY2FcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIkVOQ1BST01PXCIsIFwiVElQT19QUkRcIikpO1xyXG4gICAgICAgIC8qKkZJTiBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcblxyXG4gICAgICAgIC8vKiogSU5JQ0lPIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFJFQ0lPVU5JVEJBU0VcIikpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3Rvc1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVE5FVE9cIikpOy8vQ29uIGRlc2N1ZW50byBpbmNsdWlkby0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJWVU5JVFBST01PXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVU5JVEZJREVMXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgIC8vKiogRklOIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRDYW50aWRhZC50b1N0cmluZygpLCBcIkNBTlRJREFEXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiRklERUxJWkFDSU9OXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTFBST01PXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJDVEJMRElNUFBSRFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFNJTkRUT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJTVUJUT1RBTFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTEJBU0VcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIikpO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHByb2R1Y3RvQ29tYm8pO1xyXG4gICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8uZm9yRWFjaChwcm9kdWN0byA9PiB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMODwrNnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgICAgIHByb2R1Y3RvLklkRW5jUGFkcmUgPSBwcm9kdWN0b0NvbWJvLklEO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHByb2R1Y3RvKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICByZXR1cm4gcHJvZHVjdG9Db21ibztcclxuICAgIH1cclxuXHJcbiAgICByZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc0FwbFN1bWFWYWxvciA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihvTTNFTkMgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKTtcclxuICAgICAgICAgICAgbGV0IGRldEVzUHJkQ29tYm8gPSBvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJFU1BST0RQUk9NT0NPTUJPXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGV0Q2FudGlkYWQgJiYgK2RldENhbnRpZGFkLlZhbG9yID4gMCAmJiAhKGRldEVzUHJkQ29tYm8gJiYgZGV0RXNQcmRDb21iby5WYWxvciA9PSBcInRydWVcIilcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciA9IDA7XHJcblxyXG4gICAgICAgIC8vZm9yIChjb25zdCBvTTNFTkMgb2YgdGhpcy5vTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICFlbmMuSWRFbmNQYWRyZSB8fCBlbmMuSWRFbmNQYWRyZSA8PSAwKSkge1xyXG4gICAgICAgIGZvciAoY29uc3Qgb00zRU5DIG9mIHByb2R1Y3Rvc0FwbFN1bWFWYWxvcikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gKz0gK29NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciArPSArb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiU1VCVE9UQUxcIikuVmFsb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIE0zUHJvY2VzbyBlbmNhYmV6YWRvIGl0ZW1zLCBkZXNkZSBwcm9kdWN0byBnZW5lcmFsXHJcbiAgICBwdWJsaWMgTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybEl0ZW0ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9lbmNhYmV6YWRvSXRlbXM6IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvUGFkcmVNM1BFbmNJdGVtczogTTNQRW5jSXRlbXMgPSB1bmRlZmluZWQsIHZhbG9yRGVzY3VlbnRvID0gMCk6IE0zUEVuY0l0ZW1zIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQcmRHZW5lcmFsOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgdmFyIGRQUkVDSU9Vbml0QmFzZSA9IDA7XHJcbiAgICAgICAgdmFyIGluZk5pdmVsZXNQcmNpbztcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgICAgIHZhciBkVG90YWxJbXB1ZXN0b3NUb3RhbDogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZFVuaXRhcmlvTW9uZWRlcm86IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRVbml0YXJpb1Byb21vOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIC8vVmVyaWZpY2FyIGVsIHByZWNpbyBhIHVzYXIsIHVzYW5kbyBsYSBsb2dpY2EgZGUgbml2ZWxlcyBkZSBwcmVjaW9zLlxyXG4gICAgICAgIGluZk5pdmVsZXNQcmNpbyA9IHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcbiAgICAgICAgaWYgKHZhbG9yRGVzY3VlbnRvID4gMCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gKiB2YWxvckRlc2N1ZW50byAvIDEwMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPIC0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSB0aGlzLkNhbGN1bGFyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9WYWxpZGEgc2kgZWwgcHJvZHVjdG8gZXN0w4PCoSByZXN0aW5naWRvXHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXJQcm9kdWN0b1Jlc3RyaW5naWRvKG9Qcm9tb2Npb25Qcm9jZXNhZGEpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhcyhvTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FsY3VsbyBkZWwgdG90YWwgZGUgcHVudG9zIHkgZWwgdmFsb3IgdG90YWwgZGUgbGEgcHJvbW9jacODwrNuIHBvciBsYSBjcWFudGlkYWQgZGUgcHJvZHVjdG9zIGRlIGxhIG1pc21hIHJlZmVyZW5jaWFcclxuICAgICAgICAgICAgZFVuaXRhcmlvTW9uZWRlcm8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybzsgLy9Vbml0YXJpbyBNb25lZGVyb1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy9ObyBzZSB1dGlsaXphLCBzZSBkZWphIHBhcmEgdXNvcyBhZGVsYW50ZVxyXG5cclxuICAgICAgICAgICAgZFVuaXRhcmlvUHJvbW8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uOyAvL1Byb21vY2lvbiB1bml0YXJpb1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vTm8gc2UgdXRpbGl6YSwgc2UgZGVqYSBwYXJhIHVzb3MgYWRlbGFudGVcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zRGV0Q3Vwb25lcyA9IHRoaXMuZ2V0X2xpc3RfY3Vwb25lc19mcm9tX3Byb21vKG9Qcm9tb2Npb25Qcm9jZXNhZGEsICtvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FsY3VsbyBkZSBwcmVjaW8gdG90YWwsIGRlc3B1ZXMgZGUgcHJvbW9jaW9uZXNcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAgICAgLy9DYXJnYXIgcHJvZHVjdG8gXHJcbiAgICAgICAgICAgIG9NM1ByZEdlbmVyYWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF07XHJcblxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0byA9IG9NM1ByZEdlbmVyYWwuU0tVO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTG90ZSA9IG9NM1ByZEdlbmVyYWwuTE9URTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob2VuY2FiZXphZG9JdGVtcywgXCJJRFwiKSArIDE7IC8vSkFHTSwgY2FtYmlvIGRlIElELCBjYXNvIGN1YW5kbyBzZSBhZ3JlZ2EgcHJkOjEsIHByZDoyIHkgZGUgbnVldm8gcHJkOjEuIEVuIGVzdGUgY2FzbyBlbiBsw4PCs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk9yZGVuID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob2VuY2FiZXphZG9JdGVtcywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Ob21icmUgPSBvTTNQcmRHZW5lcmFsLk5PTUJSRTE7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5ESVNQT05JQkxFID0gb00zUHJkR2VuZXJhbC5ESVNQT05JQkxFO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuUGF0aEltYWdlID0gb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW47XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Db2RpZ29CYXJyYXMgPSBvTTNQSXRlbXNXRUIuQ29kaWdvQmFycmFzO1xyXG4gICAgICAgICAgICBpZiAob00zVWJpY2FjaW9uICYmIG9NM1ViaWNhY2lvbi5NM1ViaUFkaWNpb25hbGVzKXtcclxuICAgICAgICAgICAgICAgIGxldCB1YmlJbXBGaWpvID0gb00zVWJpY2FjaW9uLk0zVWJpQWRpY2lvbmFsZXMuZmluZCh4ID0+IHguQXRyaWJ1dG8gPT0gXCJJTVBGSUpPXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHViaUltcEZpam8gJiYgdWJpSW1wRmlqby5WYWxvciAhPSBcIlwiKXtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJEID0gdWJpSW1wRmlqby5WYWxvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcFRvdGFsQmFzZSA9IHRoaXMuQ2FsY3VsYXRlUHJlY2lvQmFzZShvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCB0aGlzLm9NYXRoVEYucm91bmQoYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKSwgMikpO1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLmRDYW50aWRhZCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBkUFJFQ0lPVW5pdEJhc2UgPSBwVG90YWxCYXNlIC8gb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRQUkVDSU9Vbml0QmFzZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRUb3RhbEltcHVlc3Rvc1RvdGFsID0gdGhpcy5Mb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCBvTTNQRW5jSXRlbXMsIHBUb3RhbEJhc2UsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpO1xyXG4gICAgICAgICAgICAvKiogSU5JQ0lPIElORk9STUFDSU9OIEdFTkVSQUwgKi9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzJyksIFwiRkVDSEFJTlwiKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERQUkQsIFwiQ1RCTERQUkRcIikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQmlzT2JzZXF1aW8udG9TdHJpbmcoKSwgXCJFU09CU0VRVUlPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLlNLUDEsIFwiUFJEX0VTVElMT1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgXCJDVEJMRElNUFBSRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLm9ic2VydmFjaW9uLnRvU3RyaW5nKCksIFwiT0JTRVJWQUNJT05cIikpOyAgICAgICAgICAgICAgICAgIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4pIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4sIFwiUEFUSElNQUdFTlwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQmlzUHJvZHVjdG9Qcm9tby50b1N0cmluZygpLCBcIkVTUFJPRFBST01PXCIpKTsgLy8gVFJVRS0+IFNJIEVTIFVOIFBST0RVQ1RPIFBPUiBQUk9NT0NJT04sIEZBTFNFLT4gREUgT1RSTyBNT0RPXHJcbiAgICAgICAgICAgIC8vRGV0YWxsZXMgZGUgZmFjdHVyYSBlbGVjdHJvbmljYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHByb2RHUlBTZWxlY3RlZC5USVBPLCBcIlRJUE9fUFJEXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuVW5pZGFkLCBcIlVOSURBRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkNsYXZlUHJkU1JWLCBcIkNMQVZFUFJPRFNFUlZcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DbGF2ZVByZFVuaWRhZCwgXCJDTEFWRVVOSURBRFwiKSk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkSXRlbXNJbnRlcmZheihvTTNQRW5jSXRlbXMsIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB0aGlzLkFkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXMsIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIHRoaXMuY2FtcG9zQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCKVxyXG4gICAgICAgICAgICB0aGlzLkxvYWREZXRhbGxlTml2ZWxlc1ByZWNpbyhpbmZOaXZlbGVzUHJjaW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkSW5mb1Byb21vY2lvbmVzQURldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy8gTGlzdGEgZGUgUHJvbW9jaW9uZXMgXHJcbiAgICAgICAgICAgIC8qKkZJTiBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcblxyXG4gICAgICAgICAgICAvLyoqIElOSUNJTyBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRQUkVDSU9Vbml0QmFzZS50b1N0cmluZygpLCBcIlBSRUNJT1VOSVRCQVNFXCIpKTsgLy9QcmVjaW8gU2luIGltcHVlc3Rvc1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRUb3RhbEltcHVlc3Rvc1RvdGFsLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCh0aGlzLm9NYXRoVEYucm91bmQodGhpcy5HZXRVbml0YXJpb0J5VG90YWwob00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVUVTVE9TXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCtvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8gLSArZFRvdGFsSW1wdWVzdG9zVW5pdGFyaW8pLnRvU3RyaW5nKCksIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3RvcyAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK2RQUkVDSU9Vbml0QmFzZSArICtkVW5pdGFyaW9Qcm9tbykudG9TdHJpbmcoKSwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zIC8vLS0tLS0tIE51bmNhIENhbWJpYSAvL0ZTIDIwMTkwNzI1IENvcnJlY2Npb24gZW4gbGEgZm9tcmEgZGUgY2FsY3VsYXJsb1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTy50b1N0cmluZygpLCBcIlBVTklUXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLnRvU3RyaW5nKCksIFwiUFVOSVRORVRPXCIpKTsvL0NvbiBkZXNjdWVudG8gaW5jbHVpZG8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFVuaXRhcmlvTW9uZWRlcm8udG9TdHJpbmcoKSwgXCJVTklURklERUxcIikpOy8vVW5pdGFyaW8gZmlkZWxpemFjaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVW5pdGFyaW9Qcm9tby50b1N0cmluZygpLCBcIlZVTklUUFJPTU9cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3NJZGthdGlvcyA9PSBcIkNUTlwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGlzdGFTUiA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZCh4ID0+IHguSURMSVNUQSA9PSBcIjJcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAobGlzdGFTUikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUocHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKS5QUkVDSU8udG9TdHJpbmcoKSwgXCJQUkVDSU9TUlwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8qKiBGSU4gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuXHJcbiAgICAgICAgICAgIC8vICoqKiBJbmZvcm1hY2lvbiBkZSBhY2Npb25lcyBlbiBlbCBjbGllbnRlICoqKlxyXG4gICAgICAgICAgICBpZiAocHJvZEdSUFNlbGVjdGVkLmVuY29udHJhZG9Mb2NhbCkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIkxPQ0FMXCIsIFwiQ09OU1VMVE9FTlwiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIlNFUlZJRE9SXCIsIFwiQ09OU1VMVE9FTlwiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgdGhpcy5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ob00zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vaWYgKCFvUGFkcmVNM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciA9ICgrb00zUHJvY2Vzb3MuVmFsb3IpICsgKCtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiU1VCVE9UQUxcIikuVmFsb3IpIC8vICgrb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9ICgrb00zUHJvY2Vzb3MuVmFsb3JOZXRvKSArICgrb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICAvL1ZlcmlmaWNhciBvYnNlcXVpb3MgZGVsIHByb2R1Y3RvIHF1ZSBzZSBpbmdyZXNvIGFsIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgICAgICB0aGlzLlZlcmlmaWNhck9ic2VxdWlvcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLnR1cm5PblByb21vcyhvUHJvbW9jaW9uUHJvY2VzYWRhKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdID0gXCJQcm9kdWN0byBSZXN0cmluZ2lkb1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1BFbmNJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgdHJ1ZSBzaSBlc3RlIHByb2R1Y3RvIHNlIGVuY3VlbnRyYSByZXN0cmluZ2lkb1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGFyUHJvZHVjdG9SZXN0cmluZ2lkbyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgbGV0IHByb21vUmVzdHJpbmdpZG8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maW5kKHggPT4geC5UaXBvID09IFwiUkVTVFJJQ0NJT05cIik7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb1Jlc3RyaW5naWRvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgIC8qKlxyXG4gICAgICogRXhjbHV5ZSB0b2RvcyBsb3MgaW1wdWVzdG9zIGRlamFuZG8gc29sbyBlbCBGSUpPIHNpIGVzIGRlIGxhIHViaWNhY2lvbiBkYWRhIFxyXG4gICAgICovXHJcbiAgICAgcHVibGljIEdldE1heEF0cmlidXRvRnJvbUxpc3RhKGxpc3RhLCBhdHJpYnV0bykge1xyXG4gICAgICAgIGlmIChsaXN0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBsaXN0SUQgPSBsaXN0YS5tYXAoeCA9PiB4W2F0cmlidXRvXSk7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBsaXN0SUQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxvcmVzIENhbGN1bGFkb3MgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIGRDYW50aWRhZCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIC8qKiBJTklDSU8gVkFMT1JFUyBESU5BTUlDT1MgKi9cclxuICAgICAgICAvLyB2YXIgZFRvdGFsSW1wdWVzdG9zID0gKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWxTaW5EdG8gPSB0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVFwiKVxyXG4gICAgICAgIC8vIHZhciBkU3ViVG90YWwgPSBNYXRoLnJvdW5kKCgrZFByZWNpb1RvdGFsU2luRHRvIC0gK2RUb3RhbEltcHVlc3RvcykgKiAxMDApIC8gMTAwO1xyXG5cclxuICAgICAgICBsZXQgc3ViVG90YWwgPSAwO1xyXG4gICAgICAgIGxldCBwcmVjaW9Ub3RhbFNpbkR0byA9IDA7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wdWVzdG9zXHJcbiAgICAgICAgLy9BZ3JlZ2FyIEltcHVlc3Rvc1xyXG4gICAgICAgIHRvdGFsSW1wdWVzdG9zID0gdGhpcy5hZ3JlZ2FySW1wdWVzdG8ob00zUEVuY0l0ZW1zLCBkQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAvL0ZTIDIwMTkwNzI1IEFycmVnbG8gZW4gZWwgY2FsY3VsbyBkZSB0b3RhbGVzIGVuIGNhc28gZGUgaGFiZXIgaW1wdWVzdG9zXHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvL1N1YnRvdGFsIFN1bWFzIGRlIGxhcyBiYXNlc1xyXG4gICAgICAgICAgICBzdWJUb3RhbCA9IHRoaXMub01hdGhURi5yb3VuZCgoKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFJFQ0lPVU5JVEJBU0VcIiksIDIpKSArICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVlVOSVRQUk9NT1wiKSkpLCAyKTtcclxuICAgICAgICAgICAgdG90YWxJbXB1ZXN0b3MgPSB0aGlzLmdldFZhbG9yVG90YWxGcm9tSW1wdWVzdG9zKG9NM1BFbmNJdGVtcywgXCJWYWxvclwiKTtcclxuICAgICAgICAgICAgcHJlY2lvVG90YWxTaW5EdG8gPSBzdWJUb3RhbCArIHRvdGFsSW1wdWVzdG9zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9TZSBhc3VtZSBxdWUgbm8gaGF5IGltcHVlc3RvcyBlbnRvbmNlcyBlbCBzdWJUb3RhbCBlcyBpZ3VhbCBhbCBwcmVjaW9Ub3RhbFNpbkR0b1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbFNpbkR0byA9IHRoaXMub01hdGhURi5yb3VuZCh0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVFwiKSwgMik7XHJcbiAgICAgICAgICAgIHN1YlRvdGFsID0gcHJlY2lvVG90YWxTaW5EdG87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIGRDYW50aWRhZC50b1N0cmluZygpLCBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQodG90YWxJbXB1ZXN0b3MsIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVUVTVE9TXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VW5pdGFyaW9CeVRvdGFsKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVUVTVE9TXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVOSVRcIik7XHJcblxyXG4gICAgICAgIC8vTGEgZmlkZWxpemFjaW9uIGVzIHVuIHBvcmNhbnRhamUgcG9yIGVuZGUgbm8gZGViZSBtdWx0aXBsaWNhcnNlIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlVOSVRGSURFTFwiKS50b1N0cmluZygpLCBcIkZJREVMSVpBQ0lPTlwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVU5JVEZJREVMXCIpLlZhbG9yLCBcIkZJREVMSVpBQ0lPTlwiKTtcclxuICAgICAgICAvL3RoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUTkVUT1wiKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIik7XHJcbiAgICAgICAgLy90aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUTkVUT1wiKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFJFQUxcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgcHJlY2lvVG90YWxTaW5EdG8udG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFNJTkRUT1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBzdWJUb3RhbC50b1N0cmluZygpLCBcIlNVQlRPVEFMXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgXCJGVVRcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVlVOSVRQUk9NT1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxQUk9NT1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQUkVDSU9VTklUQkFTRVwiKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxCQVNFXCIpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zICAgICAgICBcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKChzdWJUb3RhbCArICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxJTVBVRVNUT1NcIikuVmFsb3IgLSArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKTtcclxuXHJcbiAgICAgICAgLyoqIEZJTiBWQUxPUkVTIERJTkFNSUNPUyAqL1xyXG5cclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGggPiAwICYmIGRDYW50aWRhZCA9PSAwKSB7Ly9TaSBsYSBjYW50aWRhZCBlcyAwIHNpZ25pZmljYSBxdWUgc2UgZXN0w4PCoSBib3JyYW5kbyBlbCBpdGVtIG8gZXMgdW4gb2JzZXF1aW8sIHBvciBsbyBxdWUgbm8gdGllbmUgc2VudGlkbyBxdWUgdGVuZ2EgTTNQSW1wdWVzdG9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3RvcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGEgc3VtYXRvcmlhIGRlIGxvcyB2YWxvcmVzIGRlIHVuIGF0cmlidXRvIGRhZG8gZGVsIGFycmVnbG8gZGUgaW1wdWVzdG9zXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIGF0cmlidXRvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmFsb3JUb3RhbEZyb21JbXB1ZXN0b3Mob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgYXRyaWJ1dG86IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHN1bWF0b3JpYSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltcHVlc3RvID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvc1tfaV07XHJcbiAgICAgICAgICAgIHN1bWF0b3JpYSA9IHN1bWF0b3JpYSArICgraW1wdWVzdG9bYXRyaWJ1dG9dKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub01hdGhURi5yb3VuZChzdW1hdG9yaWEsMik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZ3JlZ2FySW1wdWVzdG8ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBkZXRfY3RibGRfaW1wX3ByZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVEJMRElNUFBSRFwiKTtcclxuICAgICAgICBsZXQgZGV0X3ByZWNpb191bml0X2Jhc2UgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIik7XHJcbiAgICAgICAgbGV0IHZhbG9yVG90YWxJbXB1ZXN0b3M6IG51bWJlciA9IDA7XHJcbiAgICAgICAgaWYgKGRldF9jdGJsZF9pbXBfcHJkICYmIGRldF9wcmVjaW9fdW5pdF9iYXNlKSB7XHJcbiAgICAgICAgICAgIHZhbG9yVG90YWxJbXB1ZXN0b3MgPSB0aGlzLkxvYWRNM1BJbXB1ZXN0b3NGcm9tUHJkR3JsKGRldF9jdGJsZF9pbXBfcHJkLlZhbG9yLCBvTTNQRW5jSXRlbXMsICtiaWdEZWNpbWFsLm11bHRpcGx5KGRldF9wcmVjaW9fdW5pdF9iYXNlLlZhbG9yLCBjYW50aWRhZCksIGNhbnRpZGFkLCArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JUb3RhbEltcHVlc3RvcywyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgdmFsb3I6IHN0cmluZywgc0NvbmNlcHRvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0RldDogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgIG9EZXQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IHNDb25jZXB0byk7XHJcbiAgICAgICAgaWYgKG9EZXQpIHtcclxuICAgICAgICAgICAgLy8gRXhpc3RlIEFjdHVhbGl6YVxyXG4gICAgICAgICAgICBvRGV0LlZhbG9yID0gdmFsb3I7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy9ObyBleGlzdGUgYWdyZWdhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IudG9TdHJpbmcoKSwgc0NvbmNlcHRvKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvciB0b3RhbFxyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIE51ZXZhIENhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBEZXNjVW5pdGFyaW8gXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0VG90YWxCeVVuaXRhcmlvKGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIERlc2NVbml0YXJpbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHVuaXRhcmlvID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBEZXNjVW5pdGFyaW8pLlZhbG9yO1xyXG4gICAgICAgICAgICByZXR1cm4gK2JpZ0RlY2ltYWwubXVsdGlwbHkodW5pdGFyaW8sIGNhbnRpZGFkKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvciB1bml0YXJpb1xyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBEZXNjVG90YWwgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0VW5pdGFyaW9CeVRvdGFsKGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIERlc2NUb3RhbDogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCtjYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdG90YWwgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IERlc2NUb3RhbCkuVmFsb3I7XHJcbiAgICAgICAgICAgIHJldHVybiArdG90YWwgLyArY2FudGlkYWQ7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBkZXRhbGxlcyByZWxhY2lvbmFkb3MgY29uIGxhIGluZm9ybWFjaW9uIGRlIHN3IGV4dGVybm8uXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBndWFyZGFyw4PCoSBsb3MgbnVldm9zIGF0cmlidXRvcy5cclxuICAgICAqIEBwYXJhbSBvQWRpY2lvbmFsZXMgRGVzZGUgZG9uZGUgc2Ugc2FjYXLDg8KhIGxhIGluZm9ybWFjacODwrNuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSXRlbXNJbnRlcmZheihvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvQWRpY2lvbmFsZXM6IEFycmF5PE0zUHJkQWRpY2lvbmFsZXM+KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9BZGljaW9uYWxlc0ZpbHRlcjogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz47XHJcbiAgICAgICAgICAgIG9BZGljaW9uYWxlc0ZpbHRlciA9IG9BZGljaW9uYWxlcy5maWx0ZXIoYSA9PiBhLkFUUklCVVRPLnN0YXJ0c1dpdGgoXCJDU0lBX1wiKSk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0FkaWNpb25hbGVzRmlsdGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9BZGljaW9uYWxlc0ZpbHRlcltpXS5WQUxPUiwgb0FkaWNpb25hbGVzRmlsdGVyW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGVzIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgZ3VhcmRhcsODwqEgbG9zIG51ZXZvcyBhdHJpYnV0b3MuXHJcbiAgICAgKiBAcGFyYW0gb0FkaWNpb25hbGVzIERlc2RlIGRvbmRlIHNlIHNhY2Fyw4PCoSBsYSBpbmZvcm1hY2nDg8Kzbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvQWRpY2lvbmFsZXM6IEFycmF5PE0zUHJkQWRpY2lvbmFsZXM+KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvQWRpY2lvbmFsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob0FkaWNpb25hbGVzW2ldLlZBTE9SLCBcIkFEQ19cIiArIG9BZGljaW9uYWxlc1tpXS5BVFJJQlVUTykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNhbXBvc0FkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzW2ldLlZBTE9SLCBcIkNBTUFEQ19cIiArIG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlc1tpXS5BVFJJQlVUTykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMgTm9tYnJlLCBJRC4gYSBkZXRhbGxlIGRlbCBlbmNhYmV6YWRvIGRlIHByb2R1Y3RvIGFncmVnYWRvXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBJbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkOiBudW1iZXIsIGFwbGljYWRhcyA9IHRydWUpIHtcclxuICAgICAgICB2YXIgc05vbWJyZXM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIHNJZHM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIHNWYWxvcmVzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBkYXRhO1xyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhICYmIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICYmIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKGFwbGljYWRhcykge1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHggPT4geC5BcGxpY2FkYSkuZmlsdGVyKHggPT4geC5Qcm9tb2Npb25Db21iaW5hZGEgPT0gbnVsbCkuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc05vbWJyZXMgPSBzTm9tYnJlcyArIHByb21vLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNJZHMgPSBzSWRzICsgcHJvbW8uSURQcm9tb2Npb24gKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsb3JlcyA9IHNWYWxvcmVzICsgYmlnRGVjaW1hbC5tdWx0aXBseShwcm9tby5WYWxvciwgaUNhbnRpZGFkKSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiAheC5BcGxpY2FkYSkuZmlsdGVyKHggPT4geC5Qcm9tb2Npb25Db21iaW5hZGEgPT0gbnVsbCkuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc05vbWJyZXMgPSBzTm9tYnJlcyArIHByb21vLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNJZHMgPSBzSWRzICsgcHJvbW8uSURQcm9tb2Npb24gKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsb3JlcyA9IHNWYWxvcmVzICsgYmlnRGVjaW1hbC5tdWx0aXBseShwcm9tby5WYWxvciwgaUNhbnRpZGFkKSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGF0YSA9IHsgXCJOT01CUkVTXCI6IHNOb21icmVzLCBcIklEXCI6IHNJZHMsIFwiVkFMT1JFU1wiOiBzVmFsb3JlcyB9XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGUgZGUgcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gc05vbWJyZXMgXHJcbiAgICAgKiBAcGFyYW0gc0lkcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEluZm9Qcm9tb2Npb25lc0FEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkKVxyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5OT01CUkVTLCBcIk5PTUJfUFJPTU9DXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLklELCBcIklEX1BST01PQ1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5WQUxPUkVTLCBcIlZBTF9QUk9NT0NcIikpO1xyXG5cclxuICAgICAgICAgICAgLy9BaG9yYSBzZSBhZ3JlZ2EgdW5hIGRpbmFtaWNhIHBvciBhdHJpYnV0byBkZSBsYSBwcm9tbyBwYXJhIGZhY2lsaXRhciBsYSByZXRvbWEgZGUgZXN0YSBpbmZvcm1hY2nDg8KzblxyXG4gICAgICAgICAgICBsZXQgbGlzdE5vbWJyZSA9IGRhdGEuTk9NQlJFUy5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RJZCA9IGRhdGEuSUQucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIGxldCBsaXN0VmFsb3IgPSBkYXRhLlZBTE9SRVMucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST01PQ19cIiArIF9pKSk7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3RJZFtfaV0sIFwiSURfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdFZhbG9yW19pXSwgXCJWQUxfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkLCBmYWxzZSlcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuTk9NQlJFUywgXCJOT01CX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5JRCwgXCJJRF9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuVkFMT1JFUywgXCJWQUxfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGEgZGV0YWxsZSBpbmZvcm1hY2lvbiBkZSBuaXZlbGVzIGRlIHByZWNpb1xyXG4gICAgICogQHBhcmFtIGluZk5pdmVsZXNQcmNpbyBJbmZvcm1hY2lvbiBkZSBuaXZlbGVzIGRlIHByZWNpb1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgY2FyZ2Fyw4PCoSBsYSBpbmZvcm1hY2lvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTG9hZERldGFsbGVOaXZlbGVzUHJlY2lvKGluZk5pdmVsZXNQcmNpbywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChpbmZOaXZlbGVzUHJjaW8gJiYgaW5mTml2ZWxlc1ByY2lvLk5JVkVMICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShpbmZOaXZlbGVzUHJjaW8uTklWRUwsIFwiTklWRUxQUkVDSU9cIikpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjb24gcXVlIG5pdmVsIGRlIHByZWNpbyB2YSBhIHRyYWJhamFyXHJcbiAgICAgKiBAcGFyYW0gcHJvZEdSUFNlbGVjdGVkIEVsIHByb2R1Y3RvIGluZ3Jlc2Fkb1xyXG4gICAgICogQHBhcmFtIGlDYW50aWRhZCBMYSBjYW50aWRhZCBkZSBwcm9kdWN0b3MgcXVlIHZhIGEgaW5ncmVzYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhclByZWNpb0J5Tml2ZWxlcyhwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJlc2VudGFjaW9uZXM6IE0zUHJlc2VudGFjaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcE5pdmVsZXMgPSB7fTtcclxuICAgICAgICAgICAgaWYgKHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcyAmJlxyXG4gICAgICAgICAgICAgICAgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5maW5kKHggPT4gaUNhbnRpZGFkID49IHguVE9QRSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUHJlc2VudGFjaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwTml2ZWxlcyA9IHsgXCJQUkVDSU9cIjogb00zUHJlc2VudGFjaW9uZXMuVkFMT1IsIFwiTklWRUxcIjogb00zUHJlc2VudGFjaW9uZXMuTklWRUxQUlMgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4galJlc3BOaXZlbGVzO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFZlcmlmaWNhclByZWNpb0J5Tml2ZWxlc0dlbmVyYWwob00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcmVzZW50YWNpb25lczogTTNQcmVzZW50YWNpb25lcztcclxuICAgICAgICAgICAgdmFyIGpSZXNwTml2ZWxlcyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAob00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcyAmJiBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcyA9IG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZmluZCh4ID0+IGlDYW50aWRhZCA+PSB4LlRPUEUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1ByZXNlbnRhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb00zUHJlc2VudGFjaW9uZXMuVkFMT1I7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3BOaXZlbGVzID0geyBcIlBSRUNJT1wiOiBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiwgXCJOSVZFTFwiOiBvTTNQcmVzZW50YWNpb25lcy5OSVZFTFBSUyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBqUmVzcE5pdmVsZXM7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbG9zIGN1cG9uZXMgZ2VuZXJhZG9zIGRlIGxhIGxpc3RhIGRlIHByb21vcHJvY2VzYWRhc1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRfbGlzdF9jdXBvbmVzX2Zyb21fcHJvbW8ob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBjYW50aWRhZDogbnVtYmVyKTogQXJyYXk8TTNQRGV0YWxsZUN1cG9uPiB7XHJcbiAgICAgICAgdmFyIGxpc3RfY3Vwb25lcyA9IEFycmF5PE0zUERldGFsbGVDdXBvbj4oKTtcclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBwcm9tb19hc29jaWFkYSA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzW19pXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9fYXNvY2lhZGEuSWRDdXBvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXBvbiA9IG5ldyBNM1BEZXRhbGxlQ3Vwb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXBvbi5JZEN1cG9uID0gcHJvbW9fYXNvY2lhZGEuSWRDdXBvbjtcclxuICAgICAgICAgICAgICAgICAgICBjdXBvbi5DYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RfY3Vwb25lcy5wdXNoKGN1cG9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxpc3RfY3Vwb25lcztcclxuICAgIH1cclxuXHJcbiAgICAvL0FzaWduYXIgYSBwcm9tb2Npb25lcyBjb21iaWFuYXMgZGVzZGUgbG8gcXVlIHNlIGVuY29udHLDg8KzIGFsIGVuY2FiZXphZG8gaXRlbSwgZGVsIHByb2R1Y3RvIHNlbGVjY2lvbmFkb1xyXG4gICAgcHVibGljIEFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhICE9IG51bGwgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vQXNvID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2UgYWdyZWdhIHByb21vY2lvbiBjb21iaW5hZGEgYSBlbmNhYmV6YWRvIGRlIGl0ZW1zLlxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMucHVzaChwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vL0FncmVnYXIgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIilcclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkob00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKEpTT04uc3RyaW5naWZ5KG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMpLCBcIlBST01PQ09NQklcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXNBTTNQcm9jZXNvKG9NM1Byb2Nlc29zLCBwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc2lnbmFyIHByb21vY2lvbmVzIGNvbWJpYW5kYXMgYSBNMyBQcm9jZXNvLCBlc3RlLCB2YWxpZGEgcXVlIG5vIGV4aXN0YSB1biBwcm9tb2Npb24gYW50ZXJpb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzQU0zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAgICAgaWYgKCFvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKSkge1xyXG4gICAgICAgICAgICAvLy8vLy8vIGV4aXN0ZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vLy8vLyBObyBFeGlzdGVcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcy5wdXNoKG9Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcykge1xyXG4gICAgICAgICAgICB0aGlzLkFkZERpbmFtaWNhUHJvY2Vzb0NvbWJpbmFkYXMob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBkaW5hbWljYXMgcHJvY2VzbyBkZSBjb21iaW5hZGFzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXNGaW5kZWQ6IE0zUERpbmFtaWNhcztcclxuICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNGaW5kZWQpIHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+ID0gSlNPTi5wYXJzZShvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJQcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9Qcm9tb0NvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IGFyclByb21vW2ldLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vQ29tYmkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLnB1c2goYXJyUHJvbW9baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBcIkNPTUJJTkFEQVwiO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bG8gZGUgcHJvbW9jaW9uZXNcclxuICAgIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICB2YXIgbFRpcG9zID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIkRJUkVDVEFcIik7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJNT05FREVST1wiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIk1BTlVBTFwiKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAob00zRU5DUFJPTU8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhcnJQcm9tbyA9IG9wcm9tb2Npb25lc1NlcnZpY2UuVmVyaWZpY2FyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgbFRpcG9zKTtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlByb2Nlc2FyUHJvbW9jaW9uKGFyclByb21vLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM0VOQ1BST01PLCB0aGlzLmdzSWRrYXRpb3MpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBoYXkgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9WZXJpZmljYXIgb2JzZXF1aW9zIHkgYWdyZWdhcmxvcy5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJPYnNlcXVpb3Mob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBjYW50aWRhZDogbnVtYmVyLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vY2lvbmVzQXNvY2lhZGFzOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz47XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zQ2FudGlkYWQgPSAwO1xyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIocHJvbW8gPT4gcHJvbW8uTGlzdE9ic1NLVSAhPSBudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCAmJiBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXF1aW9PUHJvbW8gPT0gLTFcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9tby5MaXN0T2JzU0tVLmxlbmd0aCkgcHJvbW8uTGlzdE9ic1NLVSA9IFtwcm9tby5MaXN0T2JzU0tVXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYVNpVGllbmVPdHJhUHJvbW8ocHJvbW8sIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9IHByb21vLklEUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJtYXJMaXN0YU9ic2VxdWlvc1NLVShwcm9tbywgb00zUEVuY0l0ZW1zLCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0dXJuT25Qcm9tb3Mob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vY2lvbmVzQXNvY2lhZGFzOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz47XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcihwcm9tbyA9PiBwcm9tby5sSWRBY3RpdmFQcm9tbyAmJiBwcm9tby5sSWRBY3RpdmFQcm9tby5sZW5ndGggPiAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMgJiYgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxJZEFjdGl2YVByb21vID0gdGhpcy5sSWRBY3RpdmFQcm9tby5jb25jYXQocHJvbW8ubElkQWN0aXZhUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlcyh0aGlzLmxJZEFjdGl2YVByb21vKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRHVwbGljYXRlcyhhcnI6IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgdW5pcXVlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHVuaXF1ZS5pbmRleE9mKGFycltpXSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB1bmlxdWUucHVzaChhcnJbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFybWFyTGlzdGFPYnNlcXVpb3NTS1UocHJvbW86IFByb21vY2lvbmVzQXNvY2lhZGFzLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBjYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkUmVhbCA9IE1hdGguZmxvb3IoY2FudGlkYWQgLyBwcm9tby5DYW50aWRhZE9ic2VxKTtcclxuICAgICAgICBpZiAocHJvbW8uUmVnbGFPYnNlcSA9PSBcIkVYQ1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpbyhwcm9tbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gY2FudGlkYWRSZWFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICBwcm9tby5MaXN0T2JzU0tVLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LkNhbnRpZGFkID0gY2FudGlkYWRSZWFsICogK2VsZW1lbnQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9MaXN0YU9ic2VxdWlvcyA9IHByb21vLkxpc3RPYnNTS1U7XHJcbiAgICB9XHJcblxyXG4gICAgYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpbyhwcm9tbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAocHJvbW8uTGlzdE9ic1NLVS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHByb21vLkxpc3RPYnNTS1UuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaWRFbmNQYWRyZSA9IG9NM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChjb21iaS5BY2Npb24uUmVnbGFPYnNlcSA9PSBcIkVYQ1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpb0NvbWJpbmFkbyhjb21iaS5BY2Npb24uT0JTRVFVSU9TLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zQ2FudGlkYWQgPSBjYW50aWRhZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpb0NvbWJpbmFkbyhjb21iaS5BY2Npb24uT0JTRVFVSU9TLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICBjb21iaS5BY2Npb24uT0JTRVFVSU9TLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LkNhbnRpZGFkID0gY2FudGlkYWQgKiArZWxlbWVudC5DYW50aWRhZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gY29tYmkuQWNjaW9uLk9CU0VRVUlPUztcclxuICAgIH1cclxuXHJcbiAgICBhc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKG9ic2VxdWlvcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChvYnNlcXVpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvYnNlcXVpb3MuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaWRFbmNQYWRyZSA9IG9NM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vUmV0b3JuYSB0cnVlIHNpIGhheSBvdHJhIHByb21vIGFwbGljYWRhIGRvbmRlIG5pIGxhIHByb21vIGRlIG9ic2VxdWlvIG8gbGEgYXBsaWNhZGEgc29uIGZpamFzIHkgdW5hIGRlIGxhcyBkb3MgZXMgRVhDXHJcbiAgICB2YWxpZGFTaVRpZW5lT3RyYVByb21vKHByb21vT2JzZXF1aW86IFByb21vY2lvbmVzQXNvY2lhZGFzLCBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHByb21vT2JzZXF1aW8uUmVnbGEgIT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICBsZXQgb1Byb21vc05vT2JzZXF1aW9zID0gYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHggPT4geC5JRFByb21vY2lvbiAhPSBwcm9tb09ic2VxdWlvLklEUHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tbyBvZiBvUHJvbW9zTm9PYnNlcXVpb3MpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5SZWdsYSAhPSBcIkFDTVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb21vLkFwbGljYWRhICYmIChwcm9tby5SZWdsYSA9PSBcIkVYQ1wiIHx8IHByb21vT2JzZXF1aW8uUmVnbGEgPT0gXCJFWENcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vcHJvY2VzYW1pZW50byBkZSBvYnNlcXVpb3NcclxuICAgIHB1YmxpYyBhc3luYyBQcm9jZXNhck9ic2VxdWlvcyhvRGF0YVVzZXI6IGFueSxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9PUHJvbW8gPSAtMTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zICE9IG51bGwgJiYgdGhpcy5vTGlzdGFPYnNlcXVpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9MaXN0YU9ic2VxdWlvcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXS5TS1UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkwODEwIHZhbGlkYSwgY3VhbnRvcyBwcm9kdWN0b3Mgc2UgYWdyZWdhIGVuIGVsIG9ic2VxdWlvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uQ2FudGlkYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSB0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXS5DYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTExMTIgc2UgYWdyZWcgZnVuY2lvbmFsaWRhZCBkZSBvYnNlcXVpb3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLkJpc09ic2VxdWlvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUGFkcmUgPSB0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXS5pZEVuY1BhZHJlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuVGlwb0FncnVwYWNpb24gPSBcIk9CU1FcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5HdWFyZGFyUHJvbW9jaW9uKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLCBvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBFbkxpbmVhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9MaXN0YU9ic2VxdWlvcyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vR3VhcmRhciBwcm9tb2Npb24gc2VndW4gdW4gc2t1XHJcbiAgICAvLzEuIEJ1c2NhciBlbCBwcm9kdWN0byBzZWd1biBlbCBza3VcclxuICAgIC8vMi4gQWdyZWdhciBlbCBwcm9kdWN0byBhIG0zcHJvY2Vzb3NcclxuICAgIC8vMy4gQWdyZWdhciBhbCBjYXJyaXRvIGRlIGNvbXByYXMuXHJcbiAgICBwdWJsaWMgYXN5bmMgR3VhcmRhclByb21vY2lvbihwcm9tbywgb0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvLyAyMDE4MTEyMSAgdmFyIHNLZXlDYXJyaXRvO1xyXG4gICAgICAgIC8vIDIwMTgxMTIxIHZhciBvTTNQcm9jZXNvcztcclxuICAgICAgICB2YXIgcHJvY2Vzb1Byb21vO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgLy8gMjAxODExMjEgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gMjAxODExMjEgb00zUHJvY2Vzb3MgPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKTtcclxuICAgICAgICBwcm9jZXNvUHJvbW8gPSBhd2FpdCB0aGlzLkFkaWNpb25hclByb21vY2lvbkFQcm9jZXNvKHByb21vLCBvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9EYXRhVXNlcik7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIHBvdWNoIERCXHJcbiAgICAgICAgLy8gMjAxODExMjEgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIHByb2Nlc29Qcm9tbyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGxvcyBwcm9kdWN0byBzZWd1biBzdSBTS1UsIHNhY2FuZG8gbGEgaW5mb3JtYWNpb24gZGVzZGUgcG91Y2hEQi5cclxuICAgIHB1YmxpYyBhc3luYyBBZGljaW9uYXJQcm9tb2Npb25BUHJvY2Vzbyhwcm9tbywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdmFyIG9Qcm9kdWN0bzogVHlwZU0zUHJkR3JwID0gbnVsbDtcclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCB0aGlzLkdldFByb2R1Y3RvQnlTS1UocHJvbW8uU0tVLCBFbkxpbmVhLCBvTTNQcm9jZXNvcywgb0RhdGFVc2VyKTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgaWYgKG9Qcm9kdWN0byAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vWWEgbm8gc2UgZGVqYSBwcmVjaW8gY2VybyBzaW5vIHF1ZSBjb21vIGVzIG9ic2VxdWlvIHNpbXVsYSB1biBkZXNjdWVudG8gZGVsIDEwMCUgXHJcbiAgICAgICAgICAgIC8vUHJvZHVjdG8uTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICAgICAgICAgIC8vQWdyZWdhciBhIG0zcHJvY2Vzb3MgZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgICAgIC8vb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgb1Byb2R1Y3RvLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgbnVsbCwgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuYWRkdG9jYXJ0KG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvLCBudWxsLCBudWxsLCBvRGF0YVVzZXIsIHRoaXMuZ3NJZGthdGlvcywgb00zVWJpY2FjaW9uLCBudWxsLCBvTTNQcm9jZXNvcywgbnVsbCwgMTAwKTsvLypTZSBtYW5kYSB2YWxvciBkZSBkZXNjdWVubnRvIDEwMCAlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gc2VndW4gZWwgU0tVXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0UHJvZHVjdG9CeVNLVShzU0tVLCBFbkxpbmVhOiBib29sZWFuLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnksIGRpc3BvbmlibGVNM0VuYyA9IG51bGwpIHtcclxuICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgIHZhciBwcm9kdWN0b3M7XHJcbiAgICAgICAgdmFyIG9Qcm9kdWN0bzogVHlwZU0zUHJkR3JwID0gbnVsbDtcclxuICAgICAgICB2YXIgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8gPSBuZXcgU2VydmljZUxvYWRMaXN0YVByZWNpbyh0aGlzLmdzSWRrYXRpb3MpO1xyXG5cclxuICAgICAgICAvL29TZXJ2aWNlTGlzdGFQcmVjaW8uR2VuZXJhdGVEYXRhVmFsaWRhY2lvbihvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvKTtcclxuICAgICAgICBpZiAoIUVuTGluZWEgJiYgIW9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbykge1xyXG4gICAgICAgICAgICB2YXIgc0lEUHJvZHVjdG9zID0gdGhpcy5nc0lka2F0aW9zICsgXCI/UFJEXCI7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvcyA9IGF3YWl0IHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChzSURQcm9kdWN0b3MpO1xyXG4gICAgICAgICAgICBvUHJvZHVjdG8gPSBvU2VydmljZU0zTWFlc3Ryby5HZXRNM1ByZEdycEZyb21MaXN0KHByb2R1Y3Rvcy5NM0xpc3RQcm9kdWN0b3MuTTNHUlAsIHNTS1UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0byA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLk0zR2V0UHJvZHVjdG9CeVNLVUFzeW5jKHRoaXMuR29Qb3N0U2VydmljZU0zLCB0aGlzLmdzSWRrYXRpb3MsIHNTS1UsIG9EYXRhVXNlciwgb00zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvUHJvZHVjdG8uTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRSA8PSAwICYmIGRpc3BvbmlibGVNM0VuYykge1xyXG4gICAgICAgICAgICBvUHJvZHVjdG8uTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRSA9IGRpc3BvbmlibGVNM0VuYztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhvUHJvZHVjdG8sIG9EYXRhVXNlciwgdGhpcy5Hb1Bvc3RTZXJ2aWNlTTMpO1xyXG4gICAgICAgIC8vb1NlcnZpY2VMaXN0YVByZWNpby5WYWxpZGFyTGlzdGFQcmVjaW9zKG9Qcm9kdWN0bywgdGhpcy5Hb1Bvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZGthdGlvcyk7XHJcbiAgICAgICAgcmV0dXJuIG9Qcm9kdWN0bztcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bGFyIHByZWNpbyBzaW4gaW1wdWVzdG9zLiBMYSBmb3JtYSBlcyBjYWxjdWxhciB0b2RvIGVsIHZhbG9yIGRlbCBpbXB1ZXN0by4gRUo6IDEyMC4wOSAvIDEuMTYuIFNpIGVsIHZhbG9yIGRlbCBpbXB1ZXN0byBlczogMTYlXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXRlUHJlY2lvQmFzZShDVEJMRElNUFBSRDogc3RyaW5nLCBkVmFsb3JOZXRvOiBudW1iZXIpIHtcclxuICAgICAgICAvL3ZhciBkVmFsb3JJbXB1ZXN0bzogbnVtYmVyID0gMTtcclxuICAgICAgICB2YXIgZFZhbG9yQmFzZTogbnVtYmVyID0gZFZhbG9yTmV0bztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb3htbFRvSnNvblRGID0gbmV3IHhtbFRvSnNvblRGKCk7XHJcbiAgICAgICAgICAgIHZhciBqSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICBpZiAoQ1RCTERJTVBQUkQgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgakltcHVlc3RvcyA9IG94bWxUb0pzb25URi5jb252ZXJ0WG1sVG9Kc29uKENUQkxESU1QUFJEKTtcclxuICAgICAgICAgICAgICAgIGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL0pBR00gIDIwMTkwNjI2IENhbWJpbyBkZSBjYWxjdWxvIGRlIGJhc2UgZGUgbG9zIGltcHVlc3Rvcy5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wLiQuTWV0b2RvbG9naWEgPT0gXCJQT1JDRU5UQUpFXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZFZhbG9yQmFzZSA9ICgrZFZhbG9yQmFzZSkgLyAoMSArICtpbXAuJC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkVmFsb3JCYXNlID0gKCtkVmFsb3JCYXNlKSAtICgraW1wLiQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cob00zUEVuY0l0ZW1zLk0zSW1wdWVzdG9zKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDYXRjaFwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9yZXR1cm4gKCgrZFZhbG9yTmV0bykgLyAoK2RWYWxvckltcHVlc3RvKSk7XHJcbiAgICAgICAgcmV0dXJuIGRWYWxvckJhc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYXJnYXIgaW5mb3JtYWNpw4PCs24gZGUgaW1wdWVzdG9zLCBkZXNkZSBlbCBwcm9kdWN0byBnZW5lcmFsXHJcbiAgICBwdWJsaWMgTG9hZE0zUEltcHVlc3Rvc0Zyb21QcmRHcmwoQ1RCTERJTVBQUkQ6IHN0cmluZywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyxcclxuICAgICAgICBkVmFsb3JOZXRvOiBudW1iZXIsIGNhbnRpZGFkOiBudW1iZXIsIHZhbG9yVG90YWxQcm9kdWN0b1VuaXQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBveG1sVG9Kc29uVEYgPSBuZXcgeG1sVG9Kc29uVEYoKTtcclxuICAgICAgICAgICAgdmFyIG9NM1BJbXB1ZXN0b3M6IE0zUEltcHVlc3RvcztcclxuICAgICAgICAgICAgbGV0IHZhbG9yQmFzZVRvdGFsID0gdGhpcy5vTWF0aFRGLnJvdW5kKGRWYWxvck5ldG8sIDQpO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JOZXRvVG90YWwgPSB2YWxvckJhc2VUb3RhbDtcclxuICAgICAgICAgICAgbGV0IHZhbG9yVG90YWxQcm9kdWN0b1RvdGFsID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JUb3RhbFByb2R1Y3RvVW5pdCwgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICB2YXIgakltcHVlc3RvcztcclxuICAgICAgICAgICAgdmFyIGRUb3RhbEltcHVlc3RvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICBpZiAoQ1RCTERJTVBQUkQgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgakltcHVlc3RvcyA9IG94bWxUb0pzb25URi5jb252ZXJ0WG1sVG9Kc29uKENUQkxESU1QUFJEKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA2MjYgQ2FtYmlvIGVuIG9yZGVuIGRlIGxvcyBpbXB1ZXN0b3MuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JSZWFsSW1wID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1wID0gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE9baV07XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3RvcyA9IG5ldyBNM1BJbXB1ZXN0b3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvID0gaW1wLiQuQ29kSW1wO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuUG9yY2VudGFqZSA9IGltcC4kLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXAuJC5NZXRvZG9sb2dpYSA9PSBcIlBPUkNFTlRBSkVcIikgey8vUE9SQ0VOVEFKRVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxvclJlYWxJbXAgPSArYmlnRGVjaW1hbC5tdWx0aXBseShpbXAuJC5WYWxvciwgdmFsb3JOZXRvVG90YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLlZhbG9yID0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yUmVhbEltcCwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvTTNQSW1wdWVzdG9zLlZhbG9yIDwgdmFsb3JSZWFsSW1wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5jZWlsKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5mbG9vcigrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Ugey8vRklKT1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxvclJlYWxJbXAgPSAraW1wLiQuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuVmFsb3IgPSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JSZWFsSW1wLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG9NM1BJbXB1ZXN0b3MuVmFsb3IgPCB2YWxvclJlYWxJbXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmNlaWwoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmZsb29yKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxODA5MTIgTnVldm8gY29uY2VwdG8gZGUgYmFzZVxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuQmFzZSA9IHRoaXMub01hdGhURi5yb3VuZCh2YWxvck5ldG9Ub3RhbCwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSB0aGlzLm9NYXRoVEYucm91bmQoKCtkVG90YWxJbXB1ZXN0byksMikgKyB0aGlzLm9NYXRoVEYucm91bmQoKCtvTTNQSW1wdWVzdG9zLlZhbG9yKSwyKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxODA5MTIgU3VtYSBkZSBWYWxvciBOZXRvXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsb3JOZXRvVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoKCt0aGlzLm9NYXRoVEYucm91bmQodmFsb3JOZXRvVG90YWwsIDIpKSArIHRoaXMub01hdGhURi5yb3VuZCgoK29NM1BJbXB1ZXN0b3MuVmFsb3IpLDIpLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLy9Tb2xvIGFkaWNpb25lIGEgaW1wdWVzdG9zLCBjdWFuZG8gZXMgdG90YWwgaW1wdWVzdG9zXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGltcEV4aXN0ZTogTTNQSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcEV4aXN0ZSA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZmluZChpbXAgPT4gaW1wLkNvZEltcHVlc3RvID09IG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBFeGlzdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Cb3JyYSBlbiBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MgPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZpbHRlcihpbXAgPT4gaW1wLkNvZEltcHVlc3RvICE9IG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLnB1c2gob00zUEltcHVlc3Rvcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5mb3JFYWNoKGltcCA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDcyNiBzZSBhZ3JlZ2EgdmFsaWRhY2lvbiwgeWEgcXVlIGVzdGFiYSBxdWVkYW5kbyBsYSByZXN0YSwgY29uIHZhbG9yZXMgY29tbzogMC4wMDAwMDAwMDAwMSA9IDEuMTU2NDU2NDU2NGU4NDUgRUpcclxuICAgICAgICAgICAgaWYgKGRUb3RhbEltcHVlc3RvICE9IDApIHtcclxuICAgICAgICAgICAgICAgIC8vRGlmZXJlbmNpYSByZWRvbmRlYWRhIGEgZG9zIGRlY2ltYWxlc1xyXG4gICAgICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSB0aGlzLm9NYXRoVEYucm91bmQoZFRvdGFsSW1wdWVzdG8sIDIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSB0aGlzLm9NYXRoVEYucm91bmQoKCt2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtICt0aGlzLm9NYXRoVEYucm91bmQodmFsb3JCYXNlVG90YWwsMikgLSArZFRvdGFsSW1wdWVzdG8pLCAyKTtcclxuICAgICAgICAgICAgICAgIGlmIChpc05hTihkaWZlcmVuY2lhKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZmVyZW5jaWEgPSB0aGlzLm9NYXRoVEYucm91bmQoKygrdmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgLSArdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yQmFzZVRvdGFsLCAyKSAtICtkVG90YWxJbXB1ZXN0bykudG9GaXhlZCg0KSwyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckRlSW1wdWVzdG9zKG9NM1BFbmNJdGVtcywgZGlmZXJlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gXCJUT1RBTElNUFVFU1RPU1wiXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKCh2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtIHRoaXMub01hdGhURi5yb3VuZCh2YWxvckJhc2VUb3RhbCwyKSksIDIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2F0Y2hcIilcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRlMgMjAxOTA3MjVcclxuICAgICAqIENvcnJpZ2UgZWwgdmFsb3IgcXVlIHRvbW8gZWwgaW1wdWVzdG8gZGVzcHVlcyBkZSBoYWJlcnNlIHJlZG9uZGVhZG9cclxuICAgICAqIFNpIGFsIHJlY29ycmVyIHRvZG9zIGxvcyBpbXB1ZXN0b3MgbGEgZGlmZXJlbmNpYSBubyBzZSB6YW5qYSwgTkkgTU9ET1MgZWwgZXJyb3IgZXN0w4PCoSBlbiBvdHJhIHBhcnRlXHJcbiAgICAgKiBTZSBjcmVhIGVzdGEgZnVuY2nDg8KzbiBwYXJhIHJlc29sdmVyIGxvcyBlcnJvcmVzIGRlIHRpbWJyYWRvIGRlIGZhY3R1cmEgZWxlY3Ryw4PCs25pY2FcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gZGlmZXJlbmNpYSBEaWZlcmVuY2lhIHF1ZSBzZSBkZWJlIHNhbGRhciBwYXJhIGNvbnNlZ3VpciBlbCB2YWxvciB0b3RhbCBkZSBpbXB1ZXN0b3MgcmVxdWVyaWRvXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckRlSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRpZmVyZW5jaWE6IG51bWJlcikge1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbXB1ZXN0byA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3NbX2ldO1xyXG4gICAgICAgICAgICAvL1NpIGxhIGRpZmVyZW5jaWEgZXMgcG9zaXRpdmEgcXVpZXJlIGRlY2lyIHF1ZSBsYSBzdW1hIGRlIGxvcyBpbXB1ZXN0b3MgZXMgbWVub3IgYSBsYSByZWFsXHJcbiAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9TaSBlbCBpbXB1ZXN0byBzZSByZWRvbmRlbyBoYWNpYSBhYmFqbyBxdWllcmUgZGVjaXIgcXVlIHNlIHB1ZG8gcmVkb25kZWFyIGhhY2lhIGFycmliYVxyXG4gICAgICAgICAgICAgICAgLy9FbnRvbmNlcyBsbyBcInJlZG9uZGVhIGhhY2lhIGFycmliYVwiIHkgcmVzdGEgdW5hIGNlbnRlc2ltYSBhIGxhIGRpZmVyZW5jaWFcclxuICAgICAgICAgICAgICAgIGlmIChpbXB1ZXN0by5WYWxvciA8IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5WYWxvciA9IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG87XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uQmFzZSA9IHRoaXMub01hdGhURi5yb3VuZChpbXB1ZXN0by5WYWxvciAvIGltcHVlc3RvLlBvcmNlbnRhamUsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZmVyZW5jaWEgPSBkaWZlcmVuY2lhIC0gMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vU2kgVmFsb3I+VmFsb3JSZWFsIHF1aWVyZSBkZWNpciBxdWUgcmVkb25kZW8gaGFjaWEgYXJyaWJhIHkgbm8gZGViZSBtb2RpZmljYXIgZXNlIHZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9TaSBsYSBkaWZlcmVuY2lhIGVzIG5lZ2F0aXZhIHF1aWVyZSBkZWNpciBxdWUgbGEgc3VtYSBkZSBsb3MgaW1wdWVzdG9zIGVzIG1heW9yIGEgbGEgcmVhbFxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vU2kgZWwgaW1wdWVzdG8gc2UgcmVkb25kZW8gaGFjaWEgYXJyaWJhIHF1aWVyZSBkZWNpciBxdWUgc2UgcHVkbyByZWRvbmRlYXIgaGFjaWEgYWJham9cclxuICAgICAgICAgICAgICAgIC8vRW50b25jZXMgbG8gXCJyZWRvbmRlYSBoYWNpYSBhYmFqb1wiIHkgc3VtYSB1bmEgY2VudGVzaW1hIGEgbGEgZGlmZXJlbmNpYVxyXG4gICAgICAgICAgICAgICAgaWYgKGltcHVlc3RvLlZhbG9yID4gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLlZhbG9yID0gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bztcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKGltcHVlc3RvLlZhbG9yIC8gaW1wdWVzdG8uUG9yY2VudGFqZSwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IGRpZmVyZW5jaWEgKyAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9TaSBWYWxvcjxWYWxvclJlYWwgcXVpZXJlIGRlY2lyIHF1ZSByZWRvbmRlbyBoYWNpYSBhYmFqbyB5IG5vIGRlYmUgbW9kaWZpY2FyIGVzZSB2YWxvclxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1NpIHlhIHNlIHNhbGRvIGxhIGRpZmVyZW5jaWEgcm9tcGUgZWwgY2ljbG8gZGFuZG8gcG9yIGNvbmNsdWlkbyBlbCBhanVzdGVcclxuICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Mb2FkIHBvciB1bmlkYWQgZGV0YWxsZSBkZWwgbTNwcm9jZXNvIGl0ZW1zLlxyXG4gICAgcHVibGljIExvYWRNM1BEZXRhbGxlKHNWYWxvcjogc3RyaW5nLCBzQ29uY2VwdG86IHN0cmluZyk6IE0zUERldGFsbGVJdGVtcyB7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtcy5Ob21icmVDb25jZXB0byA9IHNDb25jZXB0bztcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gc1ZhbG9yO1xyXG4gICAgICAgIHJldHVybiBvTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0dlbmVyYXIgcHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgcHVibGljIGFzeW5jIEdlbmVyYXJQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMgfHwgKG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMgJiYgIW9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiUFVFTlRFX0RJQVJJT1wiKSkpIHtcclxuICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgbnVsbCk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhckNvbWJpbmFkYShvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9Db21wYXJlIE0zUHJvY2Vzb3MuIChGaXJzdDogQFBhcmFtOiBpbE0zUHJvY2Vzb3NTUUwgVlMgU2Vjb25kOiBHZXQgRnJvbSBDb3VjaERCL1BvdWNoREIpXHJcbiAgICBwdWJsaWMgYXN5bmMgQ29tcGFyZU0zUHJvY2VzbyhzSURLYXRpb3M6IHN0cmluZywgb00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgaWxNM1Byb2Nlc29zU1FMOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9SZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vR2V0IGRhdGEsIGZyb20gUG91Y2hEQi9Db3VjaERCXHJcbiAgICAgICAgICAgIHZhciBQcm9wZXJ0eUNvbXBhcmUgPSBbXCJWYWxvck5ldG9cIiwgXCJWYWxvclwiXTtcclxuICAgICAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcm9jZXNvc0NPVUNIOiBNM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICAvL0dldCBkYXRhLCBmcm9tIFBvdWNoREIvQ291Y2hEQlxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNIID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcblxyXG4gICAgICAgICAgICAvL1N0YXJ0IENvbXBhcmVcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBQcm9wZXJ0eUNvbXBhcmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbE0zUHJvY2Vzb3NTUUxbUHJvcGVydHlDb21wYXJlW2ldXSAhPSBvTTNQcm9jZXNvc0NPVUNIW1Byb3BlcnR5Q29tcGFyZVtpXV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYlJlc3ApIHtcclxuICAgICAgICAgICAgICAgIC8vQ29tcGFyZTogSUQsIElkUHJvZHVjdG8geSBDQU5USURBRFxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbE0zUHJvY2Vzb3NTUUwuTTNFTkMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5JRCAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uSUQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5JZFByb2R1Y3RvICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5JZFByb2R1Y3RvIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0guTTNFTkNbal0uTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9SZXNwID0geyBcImJSZXNwXCI6IGJSZXNwLCBcIk0zUHJvY2Vzb3NcIjogb00zUHJvY2Vzb3NDT1VDSCB9O1xyXG4gICAgICAgICAgICByZXR1cm4gb1Jlc3A7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBDb21wYXJlTTNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIG9SZXNwID0geyBcImJSZXNwXCI6IHRydWUsIFwiTTNQcm9jZXNvc1wiOiBudWxsIH07XHJcbiAgICAgICAgICAgIHJldHVybiBvUmVzcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FkaWNpb25hciBjb21lcmNpYWwgYWwgcHJvY2VzbywgbG8gYWRpY2lvbmEgYWwgYXJyZWdsbyBkZSBkaW5hbWljb3MgYXNvY2lhZG8gYWwgcHJvY2Vzby5cclxuICAgIHB1YmxpYyBBZGRDb21lcmNpYWxUb00zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgVGRvY0NvbWVyY2lhbDogc3RyaW5nLCBOZG9jQ29tZXJjaWFsOiBzdHJpbmcpIHtcclxuICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2godGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiVENPTUVSQ0lBTFwiLCBUZG9jQ29tZXJjaWFsKSk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIk5DT01FUkNJQUxcIiwgTmRvY0NvbWVyY2lhbCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ3JlYWNpb24geSByZXRvcm5vIGRlIHR1cGxhIGRlIGRpbmFtaWNvcywgYXRhZG9zIGEgcHJvY2VzbyBtMy5cclxuICAgIHB1YmxpYyBDcmVhdGVUdXBsYURpbmFtaWNhKG5vbWJyZSwgdmFsb3IpIHtcclxuICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IG5vbWJyZTtcclxuICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gdmFsb3I7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQRGluYW1pY2FzO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9BY3R1YWxpemEgbGEgY2FudGlkYWQgZGUgXHJcbiAgICBwdWJsaWMgc2V0Q2FudGlkYWRBTExZVVBEQ291Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGlDYW50aWRhZCkge1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkID09IDAgJiYgb00zUHJvY2Vzb3MuSUREaWFyaW8gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLy9BdW4gbm8gZXN0YSByZWdpc3RyYWRvIGVsIHByb2Nlc28gY29tbyB0YWwsIHNlIHB1ZWRlIGJvcnJhciBkZSByYWl6XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIFwiV0VCXCIsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkID09IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkdldENhcnJpdG9Db21wcmFzUG91Y2hEQihvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgXCJXRUJcIiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vL1NlIGNhbnRpZGFkIGRlIHVuIHByb2R1Y3RvIGVzcGVjaWZpY29cclxuICAgIHB1YmxpYyBzZXRDYW50aWRhZFlVUERDb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbixcclxuICAgICAgICBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIHRpcG9VYmljYWNpb24sIElERW5jLFxyXG4gICAgICAgIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBmb3J6YXJCb3JyYWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICBpZiAoKGlDYW50aWRhZCA9PSAwICYmIG9NM1Byb2Nlc29zLklERGlhcmlvID09PSB1bmRlZmluZWQgJiYgdGlwb1ViaWNhY2lvbiA9PSBcIldFQlwiKSB8fCBmb3J6YXJCb3JyYWQpIHtcclxuICAgICAgICAgICAgLy8vQXVuIG5vIGVzdGEgcmVnaXN0cmFkbyBlbCBwcm9jZXNvIGNvbW8gdGFsLCBzZSBwdWVkZSBib3JyYXIgZGUgcmFpelxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgcHJvZC5JRCA9PSBJREVuYykgJiYgIShwcm9kLklkRW5jUGFkcmUgPT0gSURFbmMpKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBsb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEpBR00gMjAxOTEwMjEsIG5vIGhhY2VyIGzDg8KzZ2ljYSBkZSBwcm9tb2Npb25lcyB5IHZhcmlvcywgY3XDg8KhbmRvIHNlIGJvcnJhIGVsIGl0ZW0uXHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9TZSB0b21hIGVuIGN1ZW50YSBlbCBwcmQgeSBzdXMgaGlqb3MgY29uIGVsIElkRW5jUGFkcmVcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiBlbmMuSUQgPT0gSURFbmMpIHx8IGVuYy5JZEVuY1BhZHJlID09IElERW5jKS5mb3JFYWNoKHByZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJkLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gaUNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9vTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGlDYW50aWRhZDsvL0FudGlndWEgbG9naWNhXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDYW50aWRhZFYyKG9NM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIElERW5jLCBvRGF0YVVzZXIsIHNJREthdGlvcywgbTNVYmljYWNpb24sIG9NM0VOQ1BST01PKS50aGVuKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG0zVWJpY2FjaW9uLCByZXNwLk0zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICAvL3RoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FtYmlhciBjYW50aWRhZCBkZSBtM3Byb2Nlc29cclxuICAgIC8vSkFHTSAyMDE5MTAxOCBTZSBhZ3JlZ2EgbnVldmEgZnVuY2lvbmFsaWRhZCBhIGxhIGNhbnRpZGFkOiBcclxuICAgIC8vMS5TZSBib3JyYSBlbCBwcm9kdWN0byBkZSBsYSBsaXN0YSBkZWwgcHJvY2Vzb1xyXG4gICAgLy8yLiBTZSBhZ3JlZ2EgZGUgbnVldm8gZWwgcHJvZHVjdG8gY29uIGxhIG51ZXZhIGNhbnRpZGFkLlxyXG4gICAgcHVibGljIGFzeW5jIHNldENhbnRpZGFkVjIob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUsIGlDYW50aWRhZCwgSURFbmMsIG9EYXRhVXNlcjogYW55XHJcbiAgICAgICAgLCBzSURLYXRpb3M6IHN0cmluZywgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4pIHtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIHZhciBvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gaUNhbnRpZGFkO1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MTExNCwgQWdyZWdhciBpbWFnZW5cclxuICAgICAgICB2YXIgb00zUEVuY0l0ZW1zID0gb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIGVuYy5JRCA9PSBJREVuYyk7XHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuUGF0aEltYWdlbiA9IG9NM1BFbmNJdGVtcy5QYXRoSW1hZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICEoZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIChlbmMuSUQgPT0gSURFbmMgfHwgZW5jLklkRW5jUGFkcmUgPT0gSURFbmMpKSk7XHJcblxyXG4gICAgICAgIG9Qcm9kdWN0byA9IGF3YWl0IHRoaXMuR2V0UHJvZHVjdG9CeVNLVShpZFByb2R1Y3RvLCB0cnVlLCBvTTNQcm9jZXNvcywgb0RhdGFVc2VyLCBvTTNQRW5jSXRlbXMuRElTUE9OSUJMRSk7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCID0gdGhpcy5Mb2FkQWRpY2lvbmFsZXMob00zUEl0ZW1zV0VCLCBvUHJvZHVjdG8pO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5hZGR0b2NhcnQob00zUEl0ZW1zV0VCLCBvUHJvZHVjdG8sIG51bGwsIG51bGwsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBtM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICByZXR1cm4geyBcIk0zUHJvY2Vzb1wiOiBvTTNQcm9jZXNvcywgXCJNM1BJdGVtc1dFQlwiOiBvTTNQSXRlbXNXRUIgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRfTTNFTkNfYnlfaWRwcmRfbG90ZShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlKVxyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBjYW50aWRhZCBkZSB1biBlbmNhYmV6YWRvLCBwcm9kdWN0byBlc3BlY2lmaWNvLlxyXG4gICAgcHVibGljIGdldENhbnRpZGFkKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvZHVjdG86IE0zUHJkR2VuZXJhbCkge1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBvUHJvZHVjdG8uU0tVICYmIGVuYy5Mb3RlID09IG9Qcm9kdWN0by5MT1RFKS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWRUb3RhbChvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikgPiAwKS5cclxuICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLCAwKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy9SRUdJT04gREUgUkVDRVBDSU9OXHJcbiAgICAvL1NlIGFncmVnYSBhdHJpYnV0byBkZSBDdXJyZW50IGNhbnRpZGFkIGRlIHJlY2VwY2lvblxyXG4gICAgcHVibGljIE1lcmdlUmVjZXBZRW5jKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFJlY2VwY2lvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERQUkQsIFwiQ1RCTERQUkRcIikpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM1BSZWNlcGNpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM1BSZWNlcGNpb24uZmlsdGVyKHJlY2VwID0+IHJlY2VwLklkUmVjZXBjaW9uID09IGlkUmVjZXBjaW9uKS5mb3JFYWNoKHJlYyA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSUQgPT0gcmVjLklkRW5jKS5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUocmVjLkNhbnRpZGFkLnRvU3RyaW5nKCksIFwiQ1VSQ1JFQ1wiKSk7Ly9DVVJSRU5UIENBTlRJREFEIFJFQ0VQQ0lPTlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9EZWphciBsb3MgZGUgdGFsbGVzIGRlIGxhIHZhcmlhYmxlOiBDVVJDUkVDIGVuPTAsIEVzdG8gcGFyYSBmbHVqb3MsIGRvbmRlIGFncmVnYSBpbmZvIHByb2Nlc2EgeSBhaMODwq0gbWlzbW8gYWdyZWdhIG3Dg8Khcy5cclxuICAgIHB1YmxpYyBSZW1vdmVDdXJDUmVjKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9IG51bGwpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBvRGV0YWxsZTogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgb0RldGFsbGUgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1VSQ1JFQ1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChvRGV0YWxsZSAhPT0gdW5kZWZpbmVkICYmIG9EZXRhbGxlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBvRGV0YWxsZS5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy9GSU4gUkVHSU9OIERFIFJFQ0VQQ0lPTlxyXG5cclxuICAgIC8vLy8vLy9SRUdJT04gRU5UUkVHQVxyXG4gICAgLy9TZSBhZ3JlZ2EgYXRyaWJ1dG8gZGUgQ3VycmVudCBjYW50aWRhZCBkZSBlbnZpb1xyXG4gICAgcHVibGljIE1lcmdlRW50cFlFbmMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zUEVudmlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zUEVudmlvcy5mb3JFYWNoKGVudiA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbEVuYzogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgICAgICAgICAgbEVuYyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gZW5jLklkRW52aW8gPT0gZW52LklkRW52aW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChsRW5jICE9PSB1bmRlZmluZWQgJiYgbEVuYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbEVuYy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yLCBcIkNVUkNFTlRcIikpOy8vQ1VSUkVOVCBDQU5USURBRCBSRUNFUENJT05cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9EZWphciBsb3MgZGUgdGFsbGVzIGRlIGxhIHZhcmlhYmxlOiBDVVJDUkVDIGVuPTAsIEVzdG8gcGFyYSBmbHVqb3MsIGRvbmRlIGFncmVnYSBpbmZvIHByb2Nlc2EgeSBhaMODwq0gbWlzbW8gYWdyZWdhIG3Dg8Khcy5cclxuICAgIHB1YmxpYyBSZW1vdmVDdXJDRW50KG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9IG51bGwpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBvRGV0YWxsZTogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgb0RldGFsbGUgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1VSQ0VOVFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChvRGV0YWxsZSAhPT0gdW5kZWZpbmVkICYmIG9EZXRhbGxlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBvRGV0YWxsZS5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgIH1cclxuICAgIC8vLy8vLy9GSU4gUkVHSU9OIEVOVFJFR0FcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9tb2Npb25lcyBxdWUgc2UgcHJvY2VzYW4gZGVzcHVlcyBkZSBhZ3JlZ2FyIGFsIGNhcnJpdG9cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBvRGF0YVVzZXIgXHJcbiAgICAgKiBAcGFyYW0gb00zUEl0ZW1zV0VCIFxyXG4gICAgICogQHBhcmFtIG9NM1ViaWNhY2lvbiBcclxuICAgICAqIEBwYXJhbSBFbkxpbmVhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgUHJvY1Byb21vQWZ0ZXJBZGRUb0NhcnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4pIHtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5Qcm9jZXNhck9ic2VxdWlvcyhvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBFbkxpbmVhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhciBwcm9tb2Npb25lcyBkZXNwdWVzIGRlIGZpbmFsaXphciBlbCByZWdpc3Ryb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvY1Byb21vQWZ0ZXJGaW5hbGl6YXIob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuXHJcbiAgICAgICAgdGhpcy5HZW5lcmFyUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3MsIG9EYXRhVXNlcik7XHJcbiAgICAgICAgdGhpcy5Qcm9tb0FmdGVyUHJvY2VzbyhvTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUHJvbW9BZnRlclByb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb3Byb21vY2lvbmVzU2VydmljZSA9IG5ldyBwcm9tb2Npb25lc1NlcnZpY2Uob0RhdGFVc2VyLCBudWxsKTtcclxuICAgICAgICAgICAgdmFyIGxUaXBvc1Byb21vID0gbmV3IEFycmF5PFN0cmluZz4oKTtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgbFRpcG9zUHJvbW8ucHVzaChcIkFGVEVSXCIpO1xyXG4gICAgICAgICAgICBhcnJQcm9tbyA9IG9wcm9tb2Npb25lc1NlcnZpY2UuVmVyaWZpY2FyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIG51bGwsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGxUaXBvc1Byb21vKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG9wcm9tb2Npb25lc1NlcnZpY2UuUHJvY2VzYXJQcm9tb0FmdGVyKGFyclByb21vLCBvTTNQcm9jZXNvcywgb00zRU5DUFJPTU8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuQWRkSW5mb1Byb21vY2lvbmVzQURpbmFtaWNhcyhvTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBhIGluZm9ybWFjaW9uIGRpbmFtaWNhIGRlbCBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEluZm9Qcm9tb2Npb25lc0FEaW5hbWljYXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCAwKTtcclxuICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzID0gdGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiVkFMX1BST01PQ1wiLCBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJOT01CX1BST01PQ1wiLCBkYXRhLk5PTUJSRVMpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJJRF9QUk9NT0NcIiwgZGF0YS5JRClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGllbmUgZWwgcHJvY2VzbyBhc29zaWFkbyBhIHVuIGlkcHJlc3RhbW9zXHJcbiAgICBhc3luYyBnZXRfbTNfcHJvY2Vzb19ieV9pZF9wcmVzdGFtb19hc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRfcHJlc3RhbW86IHN0cmluZykge1xyXG4gICAgICAgIHZhciByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvZ2V0TTNQcm9jZXNvQnlJZFByZXN0YW1vLycgKyBpZF9rYXRpb3MgKyAnLycgKyBpZF9wcmVzdGFtbykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEdldENvbmNlcHRvTTNTYWxkb3NJdGVtVWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYi8nICsgc0lES2F0aW9zLCBqRGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSBvIG1vZGlmaWNhIGxhIGNhbnRpZGFkIGRlIHVuIG9iamV0byBNM090Q2xhc2lmaWNhY2lvbmVzIGRlbnRybyBkZWxhIGxpc3RhIGRlIHVuIFByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9kdWN0IFxyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRQcm9kdWN0b1RvT3RyYXNDbGFzKHByb2R1Y3Q6IFR5cGVNM1ByZEdycCwgY2FudGlkYWQ6IG51bWJlciwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBmdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zID0gaW9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBvTTNPdENsYXNpZmljYWNpb25lczogTTNPdENsYXNpZmljYWNpb25lcztcclxuICAgICAgICB2YXIgcHJvZHVjdFVuaXRTZWxlY3RlZDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHByb2R1Y3RVbml0U2VsZWN0ZWQgPSBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdO1xyXG5cclxuICAgICAgICBsZXQgcHJvZHVjdG9FeGlzdGUgPSB0aGlzLnZhbGlkYXJFeGlzdGFPdHJhQ2xhc2lmKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIHByb2R1Y3QpO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b0V4aXN0ZSkge1xyXG4gICAgICAgICAgICBwcm9kdWN0b0V4aXN0ZS5DYW50aWRhZCA9IHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkICsgY2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLlZhbG9yID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkocHJvZHVjdFVuaXRTZWxlY3RlZC5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBwcm9kdWN0b0V4aXN0ZS5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLk9yZGVuID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIk9yZGVuXCIpICsgMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcyA9IG5ldyBNM090Q2xhc2lmaWNhY2lvbmVzKCk7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLkNhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLklkUHJvZHVjdG8gPSBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuTm9tYnJlID0gcHJvZHVjdFVuaXRTZWxlY3RlZC5OT01CUkUxO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5WYWxvciA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KHByb2R1Y3RVbml0U2VsZWN0ZWQuTG9NM1ByZExpc3RhLlBSRUNJTywgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5JRCA9IHRoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgXCJJRFwiKSArIDE7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLk9yZGVuID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIk9yZGVuXCIpICsgMTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMucHVzaChvTTNPdENsYXNpZmljYWNpb25lcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlvTTNQcm9jZXNvcyA9IHRoaXMucmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3MoaW9NM1Byb2Nlc29zKTtcclxuICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWxpbWluYSB1biBvYmpldG8gTTNPdENsYXNpZmljYWNpb25lcyBwb25pZW5kbyBzdSB2YWxvciB5IGNhbnRpZGFkIGVuIGNlcm9cclxuICAgICAqIEBwYXJhbSBvTTNPdENsYXNpZmljYWNpb25lcyBcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGRlbGV0ZVByb2R1Y3RvRnJvbU90cmFzQ2xhcyhvTTNPdENsYXNpZmljYWNpb25lczogTTNPdENsYXNpZmljYWNpb25lcywgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvQWN0dWFsID0gaW9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBvTTNPdENsYXNpZmljYWNpb25lcy5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG9BY3R1YWwpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuQ2FudGlkYWQgPSAwO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5WYWxvciA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlvTTNQcm9jZXNvcyA9IHRoaXMucmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3MoaW9NM1Byb2Nlc29zKTtcclxuICAgICAgICByZXR1cm4gaW9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhIGVsIHZhbG9yIGRlIE0zUHJvY2Vzb3MuVmFsT3RyYUNsYXNpIGEgcGFydGlyIGRlIGxhIHN1bWF0b3JpYSBkZSBsb3Mgb2JqZXRvcyBkZW50cm8gZGVsIGFycmVnbG8gTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHJlY2FsY3VsYXJWYWxPdHJhQ2xhc2lNM1Byb2Nlc29zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsT3RyYUNsYXNpID0gb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5yZWR1Y2UoZnVuY3Rpb24gKHN1bWEsIG9NM090Q2xhc2lmaWNhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdW1hICsgb00zT3RDbGFzaWZpY2FjaW9uZXMuVmFsb3I7XHJcbiAgICAgICAgfSwgMClcclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBwcm9kdWN0byBkZW50cm8gZGUgdW4gbGEgbGlzdGEgZGUgTTNPdENsYXNpZmljYWNpb25lc1xyXG4gICAgICogQHBhcmFtIGxpc3RNM090Q2xhc2lmaWNhY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3QgXHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXJFeGlzdGFPdHJhQ2xhc2lmKGxpc3RNM090Q2xhc2lmaWNhY2lvbmVzOiBBcnJheTxNM090Q2xhc2lmaWNhY2lvbmVzPiwgcHJvZHVjdDogVHlwZU0zUHJkR3JwKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvRXhpc3RlID0gbGlzdE0zT3RDbGFzaWZpY2FjaW9uZXMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdLlNLVSk7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RvRXhpc3RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAqIExpbXBpYSBsb3MgZGV0YWxsZXMgeSBsb3MgaW1wdWVzdG9zIGRlIHVuIHByb2R1Y3RvIGRhZG8gZW4gdW4gcHJvY2VzbyBkZSBkZXZvbHVjaW9uXHJcbiAgICogQHBhcmFtIHByb2R1Y3RvQm9ycmFkbyBcclxuICAgKiBAcGFyYW0gcHJvY2Vzb0Rldm9sdWNpb24gXHJcbiAgICovXHJcbiAgICBkZWxldGVQcmREZXZvbHVjaW9uKHByb2R1Y3RvQm9ycmFkbywgcHJvY2Vzb0Rldm9sdWNpb246IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG8gPSBwcm9jZXNvRGV2b2x1Y2lvbi5NM0VOQy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IHByb2R1Y3RvQm9ycmFkby5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG8pIHtcclxuICAgICAgICAgICAgcHJvZHVjdG8uTTNERVQuZm9yRWFjaChkZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTigrZGV0LlZhbG9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHByb2R1Y3RvLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgaW1wLkJhc2UgPSAwO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBanVzdGEgbG9zIFZhbG9yZXMgZW4gY2FzbyBkZSBlbmNvbnRyYXIgZGlmZXJlbmNpYXMgcGFyYSBwb2RlciBnZW5lcmFyIEZFXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvclZhbG9yZXNDRkRJRnJvbnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IDA7XHJcbiAgICAgICAgbGV0IHRvdGFsRGVzY3VlbnRvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbERlc2N1ZW50b3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIGxldCB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPSB0aGlzLmdldFZhbG9yVG90YWxJbXBvcnRlSW1wdWVzdG9zKG9NM1Byb2Nlc29zKTtcclxuXHJcbiAgICAgICAgZGlmZXJlbmNpYSA9IHRoaXMub01hdGhURi5yb3VuZChvTTNQcm9jZXNvcy5WYWxvck5ldG8gLSAob00zUHJvY2Vzb3MuVmFsb3IgKyB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgLSB0b3RhbERlc2N1ZW50b3MpLCAzKTtcclxuICAgICAgICBpZiAoZGlmZXJlbmNpYSAhPSAwKSB7XHJcbiAgICAgICAgICAgIGlmICh0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckltcHVlc3Rvc0NGREkoZGlmZXJlbmNpYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hanVzdGFkb3JEZXNjdWVudG9zQ0ZESShkaWZlcmVuY2lhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgdmFsb3IgdG90YWwgZGUgcHJvbW9jaW9uZXMgYXBsaWNhZGFzIGVuIGVsIHByb2Nlc28gZW4gY3Vlc3Rpw4PCs25cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZ2V0VmFsb3JUb3RhbERlc2N1ZW50b3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0b3RhbERlc2N1ZW50b3MgPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldGFsbGVQcm9tbyA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgICAgIGlmIChkZXRhbGxlUHJvbW8pIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsRGVzY3VlbnRvcyArPSArZGV0YWxsZVByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbERlc2N1ZW50b3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHZhbG9yIHRvdGFsIGRlIGltcHVlc3RvcyBjb2JyYWRvcyBlbiBlbCBwcm9jZXNvIGVuIGN1ZXN0acODwrNuXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGdldFZhbG9yVG90YWxJbXBvcnRlSW1wdWVzdG9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdG90YWxJbXBvcnRlSW1wdWVzdG9zID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIGVuYy5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgdG90YWxJbXBvcnRlSW1wdWVzdG9zICs9ICtpbXAuVmFsb3I7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdG90YWxJbXBvcnRlSW1wdWVzdG9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTXVldmUgZWwgdmFsb3IgZGUgdW4gaW1wdWVzdG8gZW4gMC4wMSB5IHN1IGNvcnJlc3BvbmRpZW50ZSBiYXNlIHBhcmEgcXVlIGN1YWRyZSBsb3MgdmFsb3JlcyBhbCB0aW1icmFyIGxhIEZFXHJcbiAgICAgKiBAcGFyYW0gZGlmZXJlbmNpYSBcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9ySW1wdWVzdG9zQ0ZESShkaWZlcmVuY2lhOiBudW1iZXIsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IGFqdXN0byA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGVuYyBvZiBvTTNQcm9jZXNvcy5NM0VOQykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpbXAgb2YgZW5jLk0zUEltcHVlc3Rvcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wLlZhbG9yID0gaW1wLlZhbG9yICsgMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IGltcC5WYWxvciAtIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpbXAuQmFzZSA9IGltcC5WYWxvciAvIGltcC5Qb3JjZW50YWplO1xyXG4gICAgICAgICAgICAgICAgYWp1c3RvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhanVzdG8pIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTXVldmUgZWwgdmFsb3IgZGUgdW4gZGVzY3VlbnRvIGVuIDAuMDEgcGFyYSBxdWUgY3VhZHJlIGxvcyB2YWxvcmVzIGFsIHRpbWJyYXIgbGEgRkVcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIFxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JEZXNjdWVudG9zQ0ZESShkaWZlcmVuY2lhOiBudW1iZXIsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IGRldGFsbGVUb3RhbFByb21vOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgZm9yIChsZXQgZW5jIG9mIG9NM1Byb2Nlc29zLk0zRU5DKSB7XHJcbiAgICAgICAgICAgIGRldGFsbGVUb3RhbFByb21vID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKTtcclxuICAgICAgICAgICAgaWYgKGRldGFsbGVUb3RhbFByb21vICYmICtkZXRhbGxlVG90YWxQcm9tby5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFsbGVUb3RhbFByb21vLlZhbG9yID0gKCtkZXRhbGxlVG90YWxQcm9tby5WYWxvciAtIDAuMDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tby5WYWxvciA9ICgrZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgKyAwLjAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFByZHNHZW5lcmFsRnJvbU0zUHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSWRLYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRQcmRzR2VuZXJhbEZyb21NM1Byb2Nlc28vJyArIHNJZEthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuZXJyb3IuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1RyeCB7XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlbCBkaWFyaW8gZGUgdHJhbnNhY2Npb25lcyBkZXNkZSBzZXJ2aWNpbyByZXN0IE0zVHJ4LiBNaWNyb3NlcnZpY2lvIE0zLlxyXG4gICAgcHVibGljIE0zX0dldERpYXJpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGFTZW5kOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNUcngvTTNfR2V0RGlhcmlvLycgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFEaWFyaW87XHJcbiAgICAgICAgICAgIG9EYXRhRGlhcmlvID0gcmVzcDtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5kYXRhLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvRGF0YURpYXJpby5SRVNQVUVTVEEuZGF0YSA9IG5ldyBBcnJheShvRGF0YURpYXJpby5SRVNQVUVTVEEuZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCBkaWFyaW8gZGUgdHJhbnNhY2Npb25lcyBkZXRhbGxhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIHNJREthdGlvcyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNfZ2V0RGlhcmlvVHJ4KFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNUcngvbTNfZ2V0RGlhcmlvVHJ4LycgKyBzSURLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9EYXRhRGlhcmlvO1xyXG4gICAgICAgICAgICBvRGF0YURpYXJpbyA9IHJlc3A7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YURpYXJpby5SRVNQVUVTVEEuRGlhcmlvLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvRGF0YURpYXJpby5SRVNQVUVTVEEuRGlhcmlvID0gbmV3IEFycmF5KG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5EaWFyaW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgdHJhbnNhY2Npb24uXHJcbiAgICBwdWJsaWMgTTNfR2V0SW5mb1RSWChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGFTZW5kOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL2xldCBkYXRhID0geyAnVG9wJzogdG9wIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM1RyeC9NM19HZXRJbmZvVFJYLycgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFUUlg7XHJcbiAgICAgICAgICAgIG9EYXRhVFJYID0gcmVzcDtcclxuXHJcbiAgICAgICAgICAgIGlmIChvRGF0YVRSWC5SRVNQVUVTVEEuVElQT1MubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9EYXRhVFJYLlJFU1BVRVNUQS5USVBPUyA9IG5ldyBBcnJheShvRGF0YVRSWC5SRVNQVUVTVEEuVElQT1MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRGF0YVRSWC5SRVNQVUVTVEEuVElQT1MuZm9yRWFjaCh0aXBvID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aXBvLlRSWC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpcG8uVFJYID0gbmV3IEFycmF5KHRpcG8uVFJYKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhvRGF0YVRSWCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcblxyXG5cclxuICAgIC8vQ2FtYmlvIGRlIGVzdGFkbyBkZSB1YmljYWNpb25cclxuICAgIHB1YmxpYyBDYW1iaW9Fc3RhZG9VYmljYWNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9NM1ViaWNhY2lvbjogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zVHJ4L0NhbWJpb0VzdGFkb1ViaWNhY2lvbi8nICsgc0lES2F0aW9zLCBvTTNVYmljYWNpb24pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLl9ib2R5KTtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLl9ib2R5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG5cclxuICAgIC8vQ2FtYmlvIGRlIGVzdGFkbyBkZSBIVUJcclxuICAgIHB1YmxpYyBDYW1iaW9Fc3RhZG9IdWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9NM1ViaWNhY2lvbjogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zVHJ4L0NhbWJpb0VzdGFkb0h1Yi8nICsgc0lES2F0aW9zLCBvTTNVYmljYWNpb24pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLl9ib2R5KTtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLl9ib2R5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG59IiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4vTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUHJlY0xpc3RQcmVjaW9zIH0gZnJvbSBcIi4uL01hZXN0cm8vbTMtcHJlYy1saXN0LXByZWNpb3MudHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VMaXN0YVByZWNpbyB7XHJcblxyXG4gICAgcHJpdmF0ZSBnb0RhdGE6IGFueTtcclxuICAgIHByaXZhdGUgZ3NJZEthdGlvczogYW55O1xyXG4gICAgcHJpdmF0ZSBsUHJlY2lvc1NlbGVjdGVkOiBzdHJpbmcgPSBcIi0xXCI7XHJcblxyXG4gICAgLy9HZW5lcmFyIEpTT04gZ2Vuw4PCqXJpY28sIHBhcmEgdmFsaWRhciBsYSBsaXN0YSBkZSBwcmVjaW9cclxuICAgIGNvbnN0cnVjdG9yKGxvZ2VkX3VzZXI6IGFueSwgc0lkUHJvY2Vzbzogc3RyaW5nKXtcclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiVVNFUlwiOiBsb2dlZF91c2VyLCBcIlByb2Nlc29cIjogc0lkUHJvY2VzbyB9XHJcbiAgICAgICAgdGhpcy5nb0RhdGEgPSBvRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgcHVibGljIGFzeW5jIEdldExpc3RhUHJlY2lvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gSWRLYXRpb3M7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgICAgIHZhciBvTGlzdFByZWNMUDogTTNQcmVjTGlzdFByZWNpb3M7XHJcbiAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gdGhpcy5HZXRMUHJlY2lvc0luU3RvcmFnZShJZEthdGlvcyk7XHJcbiAgICAgICAgICAgIGlmKCFvTGlzdFByZWNMUCl7XHJcbiAgICAgICAgICAgICAgICBvTGlzdFByZWNMUCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLk0zR0VUX0xJU1RBUFJFQ0lPU19BU3luYyhQb3N0U2VydmljZU0zLCBJZEthdGlvcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNhdmVMUHJlY2lvc0luU3RvcmFnZShvTGlzdFByZWNMUCxJZEthdGlvcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5WYWxpZGFyQVBMUmVnbGEob0xpc3RQcmVjTFApO1xyXG4gICAgICAgICAgICAvL3RoaXMuRmluZExQcmVjaW8ob0xpc3RQcmVjTFApO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sUHJlY2lvc1NlbGVjdGVkO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGFyIGxhIGxpc3RhIGRlIHByZWNpb3MgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGxsYXZlOiBSZWdQcmVjaW8gKyBpZGthdGlvc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgU2F2ZUxQcmVjaW9zSW5TdG9yYWdlKGxQcmVjaW86YW55LCBnc0lka2F0aW9zOiBzdHJpbmcpe1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiUmVnUHJlY2lvXCIgKyBnc0lka2F0aW9zLCBKU09OLnN0cmluZ2lmeShsUHJlY2lvKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGFyIGxhIGxpc3RhIGRlIHByZWNpb3MgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGxsYXZlOiBSZWdQcmVjaW8gKyBpZGthdGlvc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgU2F2ZUNvbmZpZ0xQcmVjaW9zSW5TdG9yYWdlKGxQcmVjaW86YW55LCBnc0lka2F0aW9zOiBzdHJpbmcpe1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcobFByZWNpbyk7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcIkNvbmZpZ0xQXCIgKyBnc0lka2F0aW9zLCBsUHJlY2lvKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqXHJcbiAgICAgKiBPYnRlbmVyIGxpc3RhIGRlIHByZWNpb3MgZGVzZGUgc3RvcmFnZSB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRMUHJlY2lvc0luU3RvcmFnZShnc0lka2F0aW9zOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBzUHJlY2lvcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiUmVnUHJlY2lvXCIgKyBnc0lka2F0aW9zKTtcclxuICAgICAgICB2YXIgb1ByZWNpb3M6YW55O1xyXG4gICAgICAgIGlmKHNQcmVjaW9zKXtcclxuICAgICAgICAgICAgb1ByZWNpb3MgPSBKU09OLnBhcnNlKHNQcmVjaW9zKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9QcmVjaW9zO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0Q29uZmlnTFByZWNpb3NJblN0b3JhZ2UoZ3NJZGthdGlvczogc3RyaW5nKXtcclxuICAgICAgICB2YXIgc1ByZWNpb3MgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnTFBcIiArIGdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHZhciBvUHJlY2lvczphbnk7XHJcbiAgICAgICAgaWYoc1ByZWNpb3Mpe1xyXG4gICAgICAgICAgICBvUHJlY2lvcyA9IEpTT04ucGFyc2Uoc1ByZWNpb3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1ByZWNpb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQnVzdWNhciBsYSBsaXN0YSBkZSBwcmVjaW8sIGluZ3Jlc2EgZWwgb2JqZXRvIGRlIHByZWNlbmRlbmNpYSBkZSByZWdsYXMgZGUgbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgcHVibGljIEZpbmRMUHJlY2lvKG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcykge1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChvTGlzdFByZWNMUCAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQICE9IG51bGwgJiYgb0xpc3RQcmVjTFAuSUQgIT09IHVuZGVmaW5lZCAmJiBvTGlzdFByZWNMUC5JRCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAob0xpc3RQcmVjTFAuUFJFQ0VERU5DSUEgIT09IHVuZGVmaW5lZCAmJiBvTGlzdFByZWNMUC5QUkVDRURFTkNJQSAhPSBudWxsICYmIG9MaXN0UHJlY0xQLlBSRUNFREVOQ0lBLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByZWMgb2Ygb0xpc3RQcmVjTFAuUFJFQ0VERU5DSUEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJBUExSZWdsYShwcmVjKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMuRmluZExQcmVjaW8ocHJlYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vVmFsaWRhciByZWdsYXMsIGluZ3Jlc2EgZWwgb2JqZXRvIGRlIHByZWNlbmRlbmNpYSBkZSByZWdsYXMgZGUgbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgcHVibGljIFZhbGlkYXJBUExSZWdsYShvTGlzdFByZWNMUDogTTNQcmVjTGlzdFByZWNpb3MpOiBib29sZWFue1xyXG4gICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChvTGlzdFByZWNMUCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob0xpc3RQcmVjTFAuUHJvcGllZGFkKTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAob0xpc3RQcmVjTFAuUHJvcGllZGFkLnRvVXBwZXJDYXNlKCkudHJpbSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkVNUFJFU0FcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nc0lkS2F0aW9zLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVQklDQUNJT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nb0RhdGEuVVNFUi5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9DRVNPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdGhpcy5Db21wYXJlKG9MaXN0UHJlY0xQLlZhbG9yLnRvU3RyaW5nKCksIHRoaXMuZ29EYXRhLlByb2Nlc28udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJIVUJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nb0RhdGEuVVNFUi5Vc3VhcmlvU2lzdGVtYS5JREhVQi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nb0RhdGEuVVNFUi5Vc3VhcmlvU2lzdGVtYVtvTGlzdFByZWNMUC5Qcm9waWVkYWQudG9VcHBlckNhc2UoKS50cmltKCldLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWNhdGNoIChleCl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZXJyb3I6IFwiICsgZXgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoYlJlc3Ape1xyXG4gICAgICAgICAgICB0aGlzLmxQcmVjaW9zU2VsZWN0ZWQgPSBvTGlzdFByZWNMUC5MaXN0YVByZWNpb3M7XHJcbiAgICAgICAgICAgIHRoaXMuRmluZExQcmVjaW8ob0xpc3RQcmVjTFApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBDb21wYXJlKHZhbHVlMSwgdmFsdWUyKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlMSA9PSB2YWx1ZTIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgY29uZmlndXJhY2lvbi9lbmNhYmV6YWRvIGxpc3RhIGRlIHByZWNpb3NcclxuICAgIHB1YmxpYyBhc3luYyBHZXRDb25maWdMaXN0YVByZWNpb3MoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgSWRLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3NJZEthdGlvcyA9IElkS2F0aW9zO1xyXG4gICAgICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgICAgICB2YXIgb0xpc3RQcmVjTFA6IE0zUHJlY0xpc3RQcmVjaW9zO1xyXG4gICAgICAgICAgICBvTGlzdFByZWNMUCA9IHRoaXMuR2V0Q29uZmlnTFByZWNpb3NJblN0b3JhZ2UoSWRLYXRpb3MpO1xyXG4gICAgICAgICAgICBpZighb0xpc3RQcmVjTFApe1xyXG4gICAgICAgICAgICAgICAgb0xpc3RQcmVjTFAgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5HZXRFbmNhYmV6YWRvTGlzdGFzUHJlY2lvKFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2F2ZUNvbmZpZ0xQcmVjaW9zSW5TdG9yYWdlKG9MaXN0UHJlY0xQLElkS2F0aW9zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gb0xpc3RQcmVjTFA7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNEaW5Qcm9jZXNvc3tcclxuICAgIHB1YmxpYyBpZF9wcm9jZXNvOnN0cmluZztcclxuICAgIHB1YmxpYyBpZF9zdWJfcHJvY2VzbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgaWRfZGluYW1pY2E6c3RyaW5nO1xyXG4gICAgcHVibGljIHRpcG9fZGluYW06c3RyaW5nO1xyXG4gICAgcHVibGljIHRpdHVsbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgZXN0cnVjdHVyYV9kZXN0aW5vOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgVkRlZmF1bHQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBSZXF1ZXJpZG86Ym9vbGVhbjtcclxufSIsImltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNQSXRlbXNXRUIgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1ByZFBhY2tEZXQge1xyXG4gICAgcHVibGljIExPVEU6IHN0cmluZztcclxuICAgIHB1YmxpYyBMT1RFSElKTzogc3RyaW5nO1xyXG4gICAgcHVibGljIFNLVUhJSk86IHN0cmluZztcclxuICAgIHB1YmxpYyBDYW50aWRhZDogbnVtYmVyO1xyXG4gICAgcHVibGljIFRpcG9QYWNrOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZ3NQYXRoSW1hZ2VuOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQjtcclxuICAgIHB1YmxpYyBNM0dSUCA9IG5ldyBUeXBlTTNQcmRHcnAoKTtcclxuICAgIHB1YmxpYyBPcmRlbjogbnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yQWRpY2lvbmFsOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRHcnA6IHN0cmluZztcclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNVYmlBZGljaW9uYWxlc3tcclxuICAgIHB1YmxpYyBBdHJpYnV0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG59IiwiaW1wb3J0IHsgTTNVYmlBZGljaW9uYWxlcyB9IGZyb20gXCIuL00zVWJpQWRpY2lvbmFsZXMudHlwZVwiO1xyXG5pbXBvcnQgeyBNM0h1YnMgfSBmcm9tIFwiLi9tMy1odWJzLnR5cGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1ViaWNhY2lvbntcclxuICAgIHB1YmxpYyBJRFViaWNhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvVWJpY2FjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBURG9jQWRtaW46c3RyaW5nO1xyXG4gICAgcHVibGljIE5Eb2NBZG1pbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSkNvbmZpZ3VyYWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIFNlcmllOnN0cmluZztcclxuICAgIHB1YmxpYyBFc3RhZG86bnVtYmVyO1xyXG4gICAgcHVibGljIERvY3VtZW50b0lEOnN0cmluZztcclxuICAgIHB1YmxpYyBNM1ViaUFkaWNpb25hbGVzOkFycmF5PE0zVWJpQWRpY2lvbmFsZXM+O1xyXG4gICAgcHVibGljIE0zSFVCUyA9IG5ldyBBcnJheTxNM0h1YnM+KCk7XHJcbiAgICBwdWJsaWMgRmVjaGFUcmFiYWpvOkRhdGU7XHJcbiAgICBwdWJsaWMgQVBMVWJpY0V4dGVybmFzOkJvb2xlYW47XHJcbiAgICBcclxufSIsImltcG9ydCB7IE0zQ09ORElQUk9NTyB9IGZyb20gXCIuL00zQ09ORElQUk9NTy5jbGFzc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zQ09ORElBR1JVUEFDSU9Oe1xyXG4gICAgcHVibGljIElkUHJvbW9jaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZEFncnVwYWNpb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQ29uZGljaW9uZXM6c3RyaW5nO1xyXG4gICAgcHVibGljIE9wZXJhZG9yOnN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgTTNDT05ESVBST01POkFycmF5PE0zQ09ORElQUk9NTz47XHJcbn0iLCJpbXBvcnQgeyBNM0RFVENPTkRJUFJPTU8gfSBmcm9tIFwiLi9NM0RFVENPTkRJUFJPTU8uY2xhc3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM0NPTkRJUFJPTU97XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQ29uZGljaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb25jZXB0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG4gICAgcHVibGljIEpBZGljaW9uYWxlczpzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIE0zREVUQ09ORElQUk9NTzogQXJyYXk8TTNERVRDT05ESVBST01PPjtcclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNERVRDT05ESVBST01Pe1xyXG4gICAgcHVibGljIElkUHJvbW9jaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZENvbmRpY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ29uY2VwdG86c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuICAgIHB1YmxpYyBKQWRpY2lvbmFsZXM6c3RyaW5nO1xyXG59IiwiaW1wb3J0IHsgTTNDT05ESUFHUlVQQUNJT04gfSBmcm9tIFwiLi9NM0NPTkRJQUdSVVBBQ0lPTi5jbGFzc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zRU5DUFJPTU97XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwbzI6c3RyaW5nO1xyXG4gICAgcHVibGljIFZpZ2VuY2lhOkRhdGU7XHJcbiAgICBwdWJsaWMgSW5pY2lvOkRhdGU7XHJcbiAgICBwdWJsaWMgRXN0YWRvOmJvb2xlYW47XHJcbiAgICBwdWJsaWMgSkFkaWNpb25hbGVzOnN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgRXN0YWRvTWFudWFsZXM6Ym9vbGVhbiA9ZmFsc2U7XHJcbiAgICBwdWJsaWMgRXNNYW51YWw6Ym9vbGVhbj0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIEVzdGFkb0FwbEN1cG9uOmJvb2xlYW4gPWZhbHNlO1xyXG4gICAgcHVibGljIEVzQXBsQ3Vwb246Ym9vbGVhbj0gZmFsc2U7XHJcbiAgICBwdWJsaWMgVG9wZTpudW1iZXI7XHJcblxyXG4gICAgcHVibGljIE0zQ09ORElBR1JVUEFDSU9OOkFycmF5PE0zQ09ORElBR1JVUEFDSU9OPjtcclxufSIsImltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNVYmlBZGljaW9uYWxlcyB9IGZyb20gXCJwcm9qZWN0cy9yZWdsYW5lZ29jaW9tMzEvc3JjL3B1YmxpY19hcGlcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1ViaWNhY2lvblNlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgZ29NM1ViaWNhY2lvbjogTTNVYmljYWNpb247XHJcbiAgICBjb25zdHJ1Y3RvcihvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgdGhpcy5nb00zVWJpY2FjaW9uID0gb00zVWJpY2FjaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXREaXJlY2Npb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShcIkRJUkVDQ0lPTlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0VGVsZWZvbm8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShcIlRFTEVGT05PXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRMb25nKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkdldEFkaWNpb25hckJ5QXRyaWJ1dGUoXCJMT05HXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRMYXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShcIkxBVFwiKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBHZXRBZGljaW9uYXJCeUF0cmlidXRlKEF0cmlidXRvOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb0FkaWNpb25hbDogTTNVYmlBZGljaW9uYWxlcyA9IHRoaXMuZ29NM1ViaWNhY2lvbi5NM1ViaUFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BdHJpYnV0byA9PSBBdHJpYnV0byk7XHJcbiAgICAgICAgICAgIGlmIChvQWRpY2lvbmFsICE9PSB1bmRlZmluZWQgJiYgb0FkaWNpb25hbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb0FkaWNpb25hbC5WYWxvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gXCJOL0FcIjtcclxuICAgICAgICB9Y2F0Y2h7XHJcbiAgICAgICAgICAgIHJldHVybiBcIk4vQVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBNM1BJdGVtc1dFQiwgTTNQRGV0YWxsZUl0ZW1zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNSZWdTZXJ2aWNlIH0gZnJvbSBcIi4vbTMtcmVnLXNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNDb3VjaE1hZXN0cm8gfSBmcm9tIFwiLi4vRGF0YS9tMy1jb3VjaC1tYWVzdHJvXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4vTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhc1wiO1xyXG5pbXBvcnQgeyBNM1BlclhQcm9jZXNvIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBlci14LXByb2Nlc29cIjtcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbG9hZC1sLXByZWNpby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvdWNoUFJEU1NlcnZpY2UgfSBmcm9tIFwiLi4vT2ZmbGluZS9jb3VjaC1wcmRzLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JlZ01hc2l2byB7XHJcblxyXG4gICAgcHJpdmF0ZSBnc0lkS2F0aW9zOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHJlYWRlcjogRmlsZVJlYWRlcjtcclxuICAgIHByaXZhdGUgc2VwYXJhZG9yOiBzdHJpbmcgPSBcIixcIjtcclxuICAgIHByaXZhdGUgb00zUHJvY2VzbyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICBwcml2YXRlIHByb2dyZXNzOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIENvbmZNYXNpdmE6IGFueTtcclxuICAgIHB1YmxpYyByb3VuZGVkX3Byb2dyZXNzOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgZ2JCYXJDb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBjb25zdHJ1Y3Rvcihpc0lkS2F0aW9zOiBzdHJpbmcsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBpQ29uZk1hc2l2YTogYW55LCBpYkJhcmNvZGU6IGJvb2xlYW4sXHJcbiAgICAgICAgcHJpdmF0ZSBvQ291Y2hQUkRTU2VydmljZTogQ291Y2hQUkRTU2VydmljZSkge1xyXG4gICAgICAgIHRoaXMub00zUHJvY2VzbyA9IGlvTTNQcm9jZXNvO1xyXG4gICAgICAgIHRoaXMuZ3NJZEthdGlvcyA9IGlzSWRLYXRpb3M7XHJcbiAgICAgICAgdGhpcy5Db25mTWFzaXZhID0gaUNvbmZNYXNpdmE7XHJcbiAgICAgICAgdGhpcy5nYkJhckNvZGUgPSBpYkJhcmNvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldF9yb3VuZGVkX3Byb2dyZXNzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvdW5kZWRfcHJvZ3Jlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vQWRpY2lvbmFyIHByb2R1Y3RvcyBlbiBtYXNpdm9cclxuICAgIHB1YmxpYyBhc3luYyBBZGljaW9uYXJNYXNpdm8ob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb0RhdFVzZXI6IGFueSwgb0RhdGFQcm9jOiBhbnksIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24gPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5HZXRSZWFkZXIob0RhdGFQcm9jKTtcclxuICAgICAgICBsZXQgY3N2OiBzdHJpbmc7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRlcikge1xyXG4gICAgICAgICAgICBjc3YgPSBvRGF0YVByb2MuVGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNzdiA9IHRoaXMucmVhZGVyLnJlc3VsdC50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYXJyQ1NWOiBBcnJheTxzdHJpbmc+ID0gY3N2LnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICAgICAgICB2YXIgcHJvY2VzbzogW00zUHJvY2Vzb3MsIHN0cmluZ10gPSBhd2FpdCB0aGlzLmFkaWNpb25hcl9tYXNpdm9fZnJvbV9hcnJheShvTTNDb3VjaE1hZXN0cm8sIFBvc3RTZXJ2aWNlTTMsIG9EYXRVc2VyLCBhcnJDU1YsIG9NM1ViaWNhY2lvbik7XHJcblxyXG4gICAgICAgIHJldHVybiBwcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjb3JyZSB5IGFkaWNpb25hIGxvcyBwcm9kdWN0b3MgZW4gdW4gYXJyYXkgYSB1biBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb00zQ291Y2hNYWVzdHJvIFxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gb0RhdFVzZXIgXHJcbiAgICAgKiBAcGFyYW0gYXJyQ1NWIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRpY2lvbmFyX21hc2l2b19mcm9tX2FycmF5KG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm8sIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9EYXRVc2VyOiBhbnksIGFyckNTVjogQXJyYXk8c3RyaW5nPiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwsIGFwbEV4Yzogc3RyaW5nID0gXCIwXCIpIHtcclxuXHJcbiAgICAgICAgbGV0IHRvdGFsID0gYXJyQ1NWLmxlbmd0aDtcclxuICAgICAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgICAgIHZhciBwcm9kdWN0OiBUeXBlTTNQcmRHcnBcclxuICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShvTTNDb3VjaE1hZXN0cm8sIFBvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZEthdGlvcyk7XHJcbiAgICAgICAgdmFyIHByZHNGYWlsczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgcHJkZmFpbGFjdHVhbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG4gICAgICAgIHZhciByZXN1bHQ6IGFueTtcclxuICAgICAgICBsZXQgYXJyYXlSZXNwOiBbTTNQcm9jZXNvcywgc3RyaW5nXSA9IFt0aGlzLm9NM1Byb2Nlc28sIFwiXCJdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG90YWw7IGkrKykge1xyXG4gICAgICAgICAgICBwcmRmYWlsYWN0dWFsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZhciBsaW5lOiBzdHJpbmcgPSBhcnJDU1ZbaV07XHJcbiAgICAgICAgICAgIGlmIChsaW5lKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1Y7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuU2V0RXN0cnVjdENTVihsaW5lKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdiQmFyQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJmdWUgbG9jYWw6IFwiICsgb2VzdHJ1Y3RDU1Yuc2t1KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vQ291Y2hQUkRTU2VydmljZS5nZXQob2VzdHJ1Y3RDU1Yuc2t1KS50aGVuKGFzeW5jIHByZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwib2J0dXZvIGxvY2FsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHRoaXMuZ3NJZEthdGlvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ocHJkLkxpc3RDb2RzLCBvRGF0VXNlciwgUG9zdFNlcnZpY2VNMykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiYXNpZ25vIGxwIGxvY2FsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJkLkxpc3RDb2RzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gcHJkLkxpc3RDb2RzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBhc3luYyBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZXJyb3IgbHAgLSBpbnRlbnRvIHNlcnZlcjogXCIgKyBvZXN0cnVjdENTVi5za3UgKyBcIjogXCIgKyBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHsgXCJpZF91YmljYWNpb25cIjogb0RhdFVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBcIkNvZGlnb1wiOiBvZXN0cnVjdENTVi5za3UgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLkdldF9NM1Byb2R1Y3RvRXNwZWNCeUNvZGVBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIGRhdGEsIG9EYXRVc2VyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBjYXRjaCBscDogXCIgKyBvZXN0cnVjdENTVi5za3UgKyBcIjogXCIgKyBlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnJNc2c6IHN0cmluZyA9IGVyci51cmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZEZhaWwgPSBlcnJNc2cuc3Vic3RyaW5nKGVyck1zZy5pbmRleE9mKFwiQ29kaWdvXCIpICsgNyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJkc0ZhaWxzICs9IHByZEZhaWwgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmRmYWlsYWN0dWFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG9NM1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTTNVYmljYWNpb24gJiYgb00zVWJpY2FjaW9uLklEVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zVWJpY2FjaW9uICYmIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHZXRQcm9kdWN0b0J5U0tVQXN5bmMoUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lkS2F0aW9zLCBvZXN0cnVjdENTVi5za3UsIG9EYXRVc2VyLCBvTTNVYmljYWNpb24uSURVYmljYWNpb24sIGFwbEV4Yyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHZXRQcm9kdWN0b0J5U0tVQXN5bmMoUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lkS2F0aW9zLCBvZXN0cnVjdENTVi5za3UsIG9EYXRVc2VyLCBcIi0xXCIsIGFwbEV4Yyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJvZHVjdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXByZGZhaWxhY3R1YWwgJiYgcHJvZHVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJlY2lvU2lBUGxpY2EocHJvZHVjdCwgb2VzdHJ1Y3RDU1YpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkUHJkVG9NM1Byb2Nlc28ocHJvZHVjdCwgb2VzdHJ1Y3RDU1YsIG9NM1JlZ1NlcnZpY2UsIG9EYXRVc2VyLCBvTTNVYmljYWNpb24pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZXJyb3IgcHJvZHVjdCBubyBzZSBsbGVubzogXCIgKyBvZXN0cnVjdENTVi5za3UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBjb3VudCAqIDEwMCAvIHRvdGFsO1xyXG4gICAgICAgICAgICB0aGlzLnJvdW5kZWRfcHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKHRoaXMucHJvZ3Jlc3MgKiAxMDApIC8gMTAwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFycmF5UmVzcFswXSA9IHRoaXMub00zUHJvY2VzbztcclxuICAgICAgICBhcnJheVJlc3BbMV0gPSBwcmRzRmFpbHM7XHJcbiAgICAgICAgcmV0dXJuIGFycmF5UmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbWJpYXIgcHJlY2lvIGRlIHByb2R1Y3RvLlxyXG4gICAgcHVibGljIHNldFByZWNpb1NpQVBsaWNhKHByb2R1Y3Q6IFR5cGVNM1ByZEdycCwgb2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YpIHtcclxuICAgICAgICBpZiAob2VzdHJ1Y3RDU1YucHJlY2lvICE9PSBOYU4gJiYgb2VzdHJ1Y3RDU1YucHJlY2lvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcHJvZHVjdC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb2VzdHJ1Y3RDU1YucHJlY2lvO1xyXG4gICAgICAgICAgICBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmZvckVhY2gob00zUHJlc2VudGFjaW9uZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zUHJlc2VudGFjaW9uZXMuVkFMT1IgPSBvZXN0cnVjdENTVi5wcmVjaW87XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0FkaWNpb25hciBhIG0zcHJvY2VzbywgcHJvZHVjdG8gZXNwZWNpZmljbywgc2UgZW52aWEgY2FudGlkYWQuXHJcbiAgICBwdWJsaWMgQWRkUHJkVG9NM1Byb2Nlc28ocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBvZXN0cnVjdENTVjogZXN0cnVjdENTViwgb00zUmVnU2VydmljZTogTTNSZWdTZXJ2aWNlLCBvRGF0VXNlcjogYW55LCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uID0gbnVsbCkge1xyXG4gICAgICAgIHZhciBvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gb2VzdHJ1Y3RDU1YuY2FudGlkYWQ7XHJcbiAgICAgICAgaWYgKG9lc3RydWN0Q1NWLlBhdGhJbWFnZW4pIHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4gPSBvZXN0cnVjdENTVi5QYXRoSW1hZ2VuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvTTNQSXRlbXNXRUIgPSBvTTNSZWdTZXJ2aWNlLkxvYWRBZGljaW9uYWxlcyhvTTNQSXRlbXNXRUIsIHByb2R1Y3QpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vTTNQcm9jZXNvLk0zRU5DLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIC8vL1ByaW1lcmEgdmV6IFxyXG4gICAgICAgICAgICAvLy9OTyBTRSBFU1RBIEVOVklBTkRPIElORk9STUFDSU9OIERFIFBST01PQ0lPTkVTXHJcbiAgICAgICAgICAgIHRoaXMub00zUHJvY2VzbyA9IG9NM1JlZ1NlcnZpY2UuTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2R1Y3QsIG9NM1BJdGVtc1dFQiwgb0RhdFVzZXIsIG9NM1ViaWNhY2lvbiwgbnVsbCwgdGhpcy5vTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgLy9BZ3JlZ2FyIGRpbmFtaWNhc1xyXG4gICAgICAgICAgICB0aGlzLkFkaWNpb25hckRpbmFtaWNhKG9lc3RydWN0Q1NWKTtcclxuICAgICAgICAgICAgdGhpcy5BZGljaW9uYXJQZXJzb25hc0FQcm9jZXNvKG9lc3RydWN0Q1NWKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zUmVnU2VydmljZS5Mb2FkTTNQcm9jZXNvRnJvbURhdGEodGhpcy5vTTNQcm9jZXNvLCBwcm9kdWN0LCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgbnVsbCwgb0RhdFVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkFkaWNpb25hckRldGFsbGUob2VzdHJ1Y3RDU1YpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGNhcHR1cmFzIGRpbmFtaWNhc1xyXG4gICAgICogQHBhcmFtIG9lc3RydWN0Q1NWIEVzdHJ1Y3R1cmEgY29uIGluZm9ybWFjaW9uIGRlIGxpbmVhIGEgYWdyZWdhclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRpY2lvbmFyRGluYW1pY2Eob2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZGluYW1pY2FzID0gb2VzdHJ1Y3RDU1YuRGluYW1pY2FzXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGluYW1pY2FzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcyA9IG5ldyBBcnJheTxNM1BEaW5hbWljYXM+KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IGRpbmFtaWNhc1tpXS5BdHJpYnV0bztcclxuICAgICAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSBkaW5hbWljYXNbaV0uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBhZGljaW9uYXIgZGluYW1pY2FcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIHBlcnNvbmFzIGEgcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIG9lc3RydWN0Q1NWIEVzdHJ1Y3R1cmEgY29uIGluZm9ybWFjaW9uIGEgYWdyZWdhclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRpY2lvbmFyUGVyc29uYXNBUHJvY2VzbyhvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBwZXJzb25hcyA9IG9lc3RydWN0Q1NWLlBlcnNvbmFzO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBlcnNvbmFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb00zUGVyWFByb2Nlc28gPSBuZXcgTTNQZXJYUHJvY2VzbygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9NM1Byb2Nlc28uTTNQZXJYUHJvY2Vzbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5NM1BlclhQcm9jZXNvID0gbmV3IEFycmF5PE0zUGVyWFByb2Nlc28+KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvTTNQZXJYUHJvY2Vzby5UZG9jID0gcGVyc29uYXNbaV0uVGRvYztcclxuICAgICAgICAgICAgICAgIG9NM1BlclhQcm9jZXNvLk5kb2MgPSBwZXJzb25hc1tpXS5OZG9jO1xyXG4gICAgICAgICAgICAgICAgb00zUGVyWFByb2Nlc28uVGlwb1BlcnNvbmEgPSBwZXJzb25hc1tpXS5BdHJpYnV0bztcclxuICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5NM1BlclhQcm9jZXNvLnB1c2gob00zUGVyWFByb2Nlc28pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBhZGljaW9uYXIgcGVyc29uYXNcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGUgYWwgdWx0aW1vIGVuY2FiZXphZG8gYWdyZWdhZG8uXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gZGUgbGluZWEgYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJEZXRhbGxlKG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRldGFsbGVzID0gb2VzdHJ1Y3RDU1YuTTNEZXRcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXRhbGxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5Ob21icmVDb25jZXB0byA9IGRldGFsbGVzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IGRldGFsbGVzW2ldLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zRU5DW3RoaXMub00zUHJvY2Vzby5NM0VOQy5sZW5ndGggLSAxXS5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLm9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBvZXN0cnVjdENTVi4pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBkZXRhbGxlXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0ZW5lciB5IHNldGVhciBsYSBpbmZvcm1hY2lvbiBkZSBhcmNoaXZvIENTViB5IHNlcGFyYWRvci5cclxuICAgIHB1YmxpYyBHZXRSZWFkZXIob0RhdGFQcm9jOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnJlYWRlciA9IG9EYXRhUHJvYy5DU1Y7XHJcbiAgICAgICAgdGhpcy5zZXBhcmFkb3IgPSBvRGF0YVByb2MuU2VwYXJhZG9yO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vU2V0ZWFyIGVzdHJ1Y3V0YXIgZGUgQ1NWXHJcbiAgICBwdWJsaWMgU2V0RXN0cnVjdENTVihsaW5lOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YgPSB7IFwiY2FudGlkYWRcIjogbnVsbCwgXCJwcmVjaW9cIjogbnVsbCwgXCJza3VcIjogbnVsbCwgXCJQYXRoSW1hZ2VuXCI6IG51bGwsIFwiRGluYW1pY2FzXCI6IFtdLCBcIlBlcnNvbmFzXCI6IFtdLCBcIk0zRGV0XCI6IFtdIH07XHJcbiAgICAgICAgICAgIHZhciBvQXJyQ1NWOiBBcnJheTxzdHJpbmc+ID0gbGluZS5zcGxpdCh0aGlzLnNlcGFyYWRvcik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5Db25mTWFzaXZhICYmIHRoaXMuQ29uZk1hc2l2YS5Db2x1bW5hcykge1xyXG4gICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YgPSB0aGlzLkVzdHJ1Y3REeW5hbWljKG9BcnJDU1YpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YgPSB0aGlzLkVzdHJ1Y3REZWZhdWx0KG9BcnJDU1YpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gb2VzdHJ1Y3RDU1Y7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBjcmVhbmRvIGVzdHJ1Y3R1cmEuIFJldmlzYXIgbGluZWFzXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzdHJ1Y3R1cmEgZGluYW1pY2EgZGUgY2FyZ3VlIG1hc2l2YVxyXG4gICAgICogQHBhcmFtIG9BcnJDU1YgYXJyZWdsbyBjb24gaW5mb3JtYWNpb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBFc3RydWN0RHluYW1pYyhvQXJyQ1NWOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICAgICAgdmFyIGNvbHVtbmFzOiBBcnJheTxhbnk+ID0gdGhpcy5Db25mTWFzaXZhLkNvbHVtbmFzO1xyXG4gICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTViA9IHsgXCJjYW50aWRhZFwiOiBudWxsLCBcInByZWNpb1wiOiBudWxsLCBcInNrdVwiOiBudWxsLCBcIlBhdGhJbWFnZW5cIjogbnVsbCwgXCJEaW5hbWljYXNcIjogW10sIFwiUGVyc29uYXNcIjogW10sIFwiTTNEZXRcIjogW10gfTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5hcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbmFzW2ldLkVzdHJ1Y3R1cmEpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJDYW50aWRhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLmNhbnRpZGFkID0gK29BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlByZWNpb1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLnByZWNpbyA9ICtvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJTS1VcIjpcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5za3UgPSBvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJESU5BTUlDQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaW4gPSB7IFwiQXRyaWJ1dG9cIjogY29sdW1uYXNbaV0uQXRyaWJ1dG8sIFwiVmFsb3JcIjogb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl0gfTtcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5EaW5hbWljYXMucHVzaChkaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk0zREVUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG0zRGV0ID0geyBcIkF0cmlidXRvXCI6IGNvbHVtbmFzW2ldLkF0cmlidXRvLCBcIlZhbG9yXCI6IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dIH07XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuTTNEZXQucHVzaChtM0RldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiVElQT1BFUlNPTkFcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsb3IgPSBvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdGRvYzogc3RyaW5nID0gXCI1XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5kb2M6IHN0cmluZztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbG9yLnNwbGl0KFwiLVwiKS5sZW5ndGggPj0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZG9jID0gdmFsb3Iuc3BsaXQoXCItXCIpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZG9jID0gdmFsb3Iuc3BsaXQoXCItXCIpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5kb2MgPSB2YWxvcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwZXJzb25hID0geyBcIkF0cmlidXRvXCI6IGNvbHVtbmFzW2ldLkF0cmlidXRvLCBcIlRkb2NcIjogdGRvYywgXCJOZG9jXCI6IG5kb2MgfTtcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5QZXJzb25hcy5wdXNoKHBlcnNvbmEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2VzdHJ1Y3RDU1Y7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3RydWN0dXJhIGRlZmF1bHQuXHJcbiAgICAgKiBAcGFyYW0gb0FyckNTViBBcnJlZ2xvIGNvbiBpbmZvcm1hY2lvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRXN0cnVjdERlZmF1bHQob0FyckNTVjogQXJyYXk8c3RyaW5nPikge1xyXG4gICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTViA9IHsgXCJjYW50aWRhZFwiOiBudWxsLCBcInByZWNpb1wiOiBudWxsLCBcInNrdVwiOiBudWxsLCBcIlBhdGhJbWFnZW5cIjogbnVsbCwgXCJEaW5hbWljYXNcIjogW10sIFwiUGVyc29uYXNcIjogW10sIFwiTTNEZXRcIjogW10gfTtcclxuICAgICAgICAvL3ZhciBvQXJyQ1NWOiBBcnJheTxzdHJpbmc+ID0gbGluZS5zcGxpdCh0aGlzLnNlcGFyYWRvcik7XHJcblxyXG4gICAgICAgIGlmIChvQXJyQ1NWLmxlbmd0aCA+PSAxKSB7XHJcbiAgICAgICAgICAgIG9lc3RydWN0Q1NWLnNrdSA9IG9BcnJDU1ZbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvQXJyQ1NWLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgICAgIG9lc3RydWN0Q1NWLmNhbnRpZGFkID0gK29BcnJDU1ZbMV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob0FyckNTVi5sZW5ndGggPj0gMykge1xyXG4gICAgICAgICAgICBvZXN0cnVjdENTVi5wcmVjaW8gPSArb0FyckNTVlsyXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9BcnJDU1YubGVuZ3RoID49IDQpIHtcclxuICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuUGF0aEltYWdlbiA9IG9BcnJDU1ZbM107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvZXN0cnVjdENTVjtcclxuICAgIH1cclxuXHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBlc3RydWN0Q1NWIHtcclxuICAgIHNrdTogc3RyaW5nO1xyXG4gICAgY2FudGlkYWQ6IG51bWJlcjtcclxuICAgIHByZWNpbzogbnVtYmVyO1xyXG4gICAgUGF0aEltYWdlbjogc3RyaW5nO1xyXG4gICAgRGluYW1pY2FzOiBBcnJheTxhbnk+O1xyXG4gICAgUGVyc29uYXM6IEFycmF5PGFueT47XHJcbiAgICBNM0RldDogQXJyYXk8YW55PjtcclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhc1wiO1xyXG5pbXBvcnQgeyBNM1BJdGVtc1dFQiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBhc3luYyB9IGZyb20gXCJxXCI7XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JlZ01hc2l2b0FLWlNlcnZpY2Uge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSB1biBFbmNJdGVtIHkgcHVlZGUgcXVlIHVuYSBkaW5hbWljYSBjb24gZWwgaWRwcmVzdGFtbyBhIHVuIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkX2thdGlvcyBcclxuICAgICAqIEBwYXJhbSBpZF9wcmVzdGFtbyBcclxuICAgICAqIEBwYXJhbSBtM1ByZCBcclxuICAgICAqIEBwYXJhbSB1c2VyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRkX2RpbmFtaWNhX2lkcHJlc3RhbW9fdG9fcHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRfcHJlc3RhbW86IHN0cmluZyxcclxuICAgICAgICBtM1ByZCwgdXNlciwgb3Ryb3NQYXJhbWV0cm9zOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdmFyIHJlc3A7XHJcbiAgICAgICAgdmFyIHBkaW5hbWljYSA9IG5ldyBNM1BEaW5hbWljYXNcclxuICAgICAgICBwZGluYW1pY2EuTm9tYnJlID0gXCJJZFByZXN0YW1vXCI7XHJcbiAgICAgICAgcGRpbmFtaWNhLlZhbG9yID0gaWRfcHJlc3RhbW87XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJlc3BvbnNlX3Byb2Nlc29fbTM6IE0zUHJvY2Vzb3NcclxuICAgICAgICAgICAgdmFyIG0zX3JlZ19zZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBpZF9rYXRpb3MpO1xyXG4gICAgICAgICAgICByZXNwb25zZV9wcm9jZXNvX20zID0gYXdhaXQgbTNfcmVnX3NlcnZpY2UuZ2V0X20zX3Byb2Nlc29fYnlfaWRfcHJlc3RhbW9fYXN5bmMoUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zLCBpZF9wcmVzdGFtbyk7XHJcblxyXG4gICAgICAgICAgICAvL1NlIGRlamFuIHBlZ2Fkb3MgbG9zIGVzdGFkb3MgZGUgZGVzdGlub1xyXG4gICAgICAgICAgICByZXNwb25zZV9wcm9jZXNvX20zLkVzdGFkb0RlcyA9IHJlc3BvbnNlX3Byb2Nlc29fbTMuRXN0YWRvQW50O1xyXG4gICAgICAgICAgICByZXNwb25zZV9wcm9jZXNvX20zLlN1YkVzdGFkb0RlcyA9IHJlc3BvbnNlX3Byb2Nlc29fbTMuU3ViRXN0YWRvQW50O1xyXG5cclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IHRoaXMuYWRkX3BkaW5hbWljYV90b19leGlzdGluZ19wcm9jZXNvKFBvc3RTZXJ2aWNlTTMsIHJlc3BvbnNlX3Byb2Nlc29fbTMsIGlkX2thdGlvcywgbTNQcmQsIHVzZXIsIHBkaW5hbWljYSwgb3Ryb3NQYXJhbWV0cm9zKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcblxyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgdGhpcy5hZGRfcGRpbmFtaWNhX3RvX25ld19wcm9jZXNvKFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvcywgbTNQcmQsIHVzZXIsIHBkaW5hbWljYSwgb3Ryb3NQYXJhbWV0cm9zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2EgdW4gRW5jSXRlbSB5IGRpbmFtaWNhIGNvbiBlbCBpZHByZXN0YW1vIGEgdW4gcHJvY2VzbyBudWV2b1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG0zUHJkIFxyXG4gICAgICogQHBhcmFtIHVzZXIgXHJcbiAgICAgKiBAcGFyYW0gcGRpbmFtaWNhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRkX3BkaW5hbWljYV90b19uZXdfcHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBtM1ByZDogYW55LCB1c2VyOiBhbnksIHBkaW5hbWljYTogTTNQRGluYW1pY2FzLCBvdHJvc1BhcmFtZXRyb3M6IEFycmF5PGFueT4pIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQjtcclxuICAgICAgICBvTTNQSXRlbXNXRUIgPSB0aGlzLkdldE0zUEl0ZW1zV0VCKG90cm9zUGFyYW1ldHJvcyk7XHJcbiAgICAgICAgdmFyIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIGlkX2thdGlvcyk7XHJcbiAgICAgICAgdmFyIHJlc3BvbnNlID0gb00zUmVnU2VydmljZS5Mb2FkTTNQcm9jZXNvRW1wdHlQREIobTNQcmQsIG9NM1BJdGVtc1dFQiwgdXNlciwgbnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgcmVzcG9uc2UubE0zUERpbmFtaWNhcy5wdXNoKHBkaW5hbWljYSk7XHJcblxyXG4gICAgICAgIC8vU2UgZGVqYW4gcGVnYWRvcyBsb3MgZXN0YWRvcyBkZSBkZXN0aW5vXHJcbiAgICAgICAgcmVzcG9uc2UuRXN0YWRvRGVzID0gXCJBY3Rpdm9cIjtcclxuICAgICAgICByZXNwb25zZS5TdWJFc3RhZG9EZXMgPSBcIlJlZ2lzdHJvXCI7XHJcblxyXG4gICAgICAgIHZhciBtM19wcm9jZXNvID0gYXdhaXQgb00zUmVnU2VydmljZS5wcm9jZXNhbWllbnRvX3NlcnZpY2VfYXN5bmMoaWRfa2F0aW9zLCBQb3N0U2VydmljZU0zLCByZXNwb25zZSwgdXNlcik7XHJcbiAgICAgICAgcmV0dXJuIG0zX3Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2EgdW4gRW5jSXRlbSBhIHVuIHByb2Nlc28gZXhpc3RlbnRlXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBtM19wcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGlkX2thdGlvcyBcclxuICAgICAqIEBwYXJhbSBtM1ByZCBcclxuICAgICAqIEBwYXJhbSB1c2VyIFxyXG4gICAgICogQHBhcmFtIHBkaW5hbWljYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRkX3BkaW5hbWljYV90b19leGlzdGluZ19wcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG0zX3Byb2Nlc286IE0zUHJvY2Vzb3MsIGlkX2thdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG0zUHJkOiBhbnksIHVzZXI6IGFueSwgcGRpbmFtaWNhOiBNM1BEaW5hbWljYXMsIG90cm9zUGFyYW1ldHJvczogQXJyYXk8YW55Pikge1xyXG5cclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IHRoaXMuR2V0TTNQSXRlbXNXRUIob3Ryb3NQYXJhbWV0cm9zKTtcclxuICAgICAgICB2YXIgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgaWRfa2F0aW9zKTtcclxuXHJcbiAgICAgICAgdmFyIHJlc3BvbnNlID0gb00zUmVnU2VydmljZS5Mb2FkTTNQcm9jZXNvRnJvbURhdGEobTNfcHJvY2VzbywgbTNQcmQsIG9NM1BJdGVtc1dFQiwgbnVsbCwgbnVsbCwgdXNlcik7XHJcbiAgICAgICAgcmVzcG9uc2UubE0zUERpbmFtaWNhcy5wdXNoKHBkaW5hbWljYSk7XHJcblxyXG4gICAgICAgIHZhciBtM19wcm9jZXNvID0gYXdhaXQgb00zUmVnU2VydmljZS5wcm9jZXNhbWllbnRvX3NlcnZpY2VfYXN5bmMoaWRfa2F0aW9zLCBQb3N0U2VydmljZU0zLCByZXNwb25zZSwgdXNlcik7XHJcbiAgICAgICAgcmV0dXJuIG0zX3Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgR2V0TTNQSXRlbXNXRUIob3Ryb3NQYXJhbWV0cm9zOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAxO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gPSBcIk0zVkVOVEFcIjtcclxuICAgICAgICBvdHJvc1BhcmFtZXRyb3MuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCW3guTm9tYnJlXSA9IHguVmFsb3JcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiBvTTNQSXRlbXNXRUI7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZXZlcnNvU2VydntcclxuXHJcblxyXG4gICAgXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJSZXZlcnNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsc0lES2F0aW9zOiBzdHJpbmcsIHRkb2NBY3Rpdm86c3RyaW5nLCBuZG9jQWN0aXZvOnN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM1JldmVyc28vUmV2ZXJzYXIvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIG5kb2NBY3Rpdm8gKyBcIi9cIiArIHRkb2NBY3Rpdm8sIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9LCApO1xyXG4gICAgfVxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM1BEaW5hbUJ5QWN0aXZpZGFke1xyXG4gICAgcHVibGljIElkRGluYW1pY2E6c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG59IiwiZXhwb3J0IGNsYXNzIE0zRGluQnlBY3RpdmlkYWR7XHJcbiAgICBwdWJsaWMgSURBY3RpdmlkYWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIEFjdGl2aWRhZDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSUREaW5hbWljYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwb0RpbmFtaWNhOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIFJlcXVlcmlkbzpib29sZWFuO1xyXG5cclxuICAgIC8vU29sbyBQcmVzZW50YWNpb25cclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIE0zU2FsZG9zWEN1ZW50YXtcclxuICAgIHB1YmxpYyBEb2N1bWVudG86c3RyaW5nO1xyXG4gICAgcHVibGljIFREb2NUaXR1bGFyOm51bWJlcjtcclxuICAgIHB1YmxpYyBORG9jVGl0dWxhcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTm9tQ3VlbnRhOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxDdWVudGE6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQRGluYW1CeUFjdGl2aWRhZCB9IGZyb20gXCIuL20zLXBkaW5hbS1ieS1hY3RpdmlkYWRcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZWdpc3Ryb1RyeCB7XHJcblxyXG4gICAgcHVibGljIEFjdGl2aWRhZDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSUQ6bnVtYmVyO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxuXHJcbiAgICAvL0F0cmlidXRvcyB1bmljbyBkZWwgRnJvbnRcclxuICAgIHB1YmxpYyBBY3R1YWw6c3RyaW5nID0gdW5kZWZpbmVkXHJcbn0iLCJpbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBjdXBvbmVzU2VydmljZSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRpZW5lIHRvZG9zIGxvcyBjdXBvbmVzIGdlbmVyYWRvcyBwb3IgdW4gcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNfZ2V0X2N1cG9uZXNfZ2VuZXJhZG9zX2J5X3Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBcclxuICAgICAgICAvL3ZhciBkYXRhID0geyBcImlkX20zXCI6IGlkbTMsIFwiaWRfcHJvY2Vzb1wiOiBwcm9jZXNvIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvbTNfZ2V0X2N1cG9uZXNfZ2VuZXJhZG9zX2J5X3Byb2Nlc28vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgdmFyIGN1cG9uZXMgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICB2YXIgcmVzcF9jdXBvbmVzOkFycmF5PGFueT47XHJcbiAgICAgICAgICBpZighY3Vwb25lcy5DVVBPTkVTLkNVUE9OLmxlbmd0aCl7XHJcbiAgICAgICAgICAgIHJlc3BfY3Vwb25lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgIHJlc3BfY3Vwb25lcy5wdXNoKGN1cG9uZXMuQ1VQT05FUy5DVVBPTik7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmVzcF9jdXBvbmVzID0gY3Vwb25lcy5DVVBPTkVTLkNVUE9OO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBmdW5jaW9uT0socmVzcF9jdXBvbmVzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBwdWJsaWMgZ2V0Q3Vwb25CeUlkRGV0KFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICBcclxuICAgICAgICAvL3ZhciBkYXRhID0geyBcImlkRGV0Q3Vwb25cIjogaWREZXRDdXBvbn07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvZ2V0Q3Vwb25CeUlkRGV0L1wiICsgaWRrYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVycik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvbWFwJztcclxuaW1wb3J0IHsgZmFrZUFzeW5jIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VPZmZMaW5lIHtcclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVcIiArIGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGVuIEJEIHBvdWNoLlxyXG4gICAgcHVibGljIEFkZERvY3VtZW50KGlkOiBzdHJpbmcsIGRvY3VtZW50OiBhbnkpIHtcclxuICAgICAgICBkb2N1bWVudC5faWQgPSBpZDtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJBZGREb2N1bWVudFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXQoaWQpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBZGREb2N1bWVudCBlbmNvbnJ0cm8gZG9jdW1lbnRcIik7XHJcbiAgICAgICAgICAgIGRvY3VtZW50Ll9yZXYgPSByZXN1bHQuX3JldjtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yLnN0YXR1cyk7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRvY3VtZW50W1wiX3JldlwiXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBEZXN0cm95KCkge1xyXG4gICAgLy8gICAgIHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAvLyAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiT2ZmbGluZVwiKTtcclxuICAgIC8vICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAvLyAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cm95VG90YWwoKXtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc0RlbGV0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSwgZGVsZXRlZDogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRBbGxEb2NzT2ZmTGluZVNpbkRvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlc3Ryb3koZnVuY2lvblJlcDpGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lTG9nXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvblJlcCh7XCJSZXNwXCI6XCJPS1wifSk7XHJcbiAgICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgZnVuY2lvblJlcCh7XCJSZXNwXCI6XCJFcnJvclwiLCBcIkRlc2NcIjplcnJ9KTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBEZWxldGVBbGxEb2NzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLmZpbHRlcihyb3cgPT4gIXJvdy5pZC5zdGFydHNXaXRoKFwiQ1RJVk9TXCIpKS5tYXAoZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX2lkOiByb3cuaWQsIF9yZXY6IHJvdy5kb2MuX3JldiwgX2RlbGV0ZWQ6IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbihkZWxldGVEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYnVsa0RvY3MoZGVsZXRlRG9jcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlbGV0ZShpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuaW1wb3J0IHBvdWNoZGJzaXplIGZyb20gJ3BvdWNoZGItc2l6ZSc7XHJcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvbWFwJztcclxuaW1wb3J0IHsgTTNEZXZpY2VzU2VydmljZSB9IGZyb20gJ3NmLXJlZ2xhbmVnb2Npby1ncmwnO1xyXG5cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgYmRPZmZMaW5lTG9nIHtcclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIFxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBvTTNEZXZpY2VzU2VydmljZTpNM0RldmljZXNTZXJ2aWNlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVMb2dcIiArIGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYXIgZW4gQkQgcG91Y2guXHJcbiAgICBwdWJsaWMgQWRkRG9jdW1lbnQoaWQ6IHN0cmluZywgZG9jdW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGRvY3VtZW50Ll9pZCA9IGlkO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXQoaWQpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuX3JldiA9IHJlc3VsdC5fcmV2O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQsIHsgZm9yY2U6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cm95KGZ1bmNpb25SZXA6RnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiT2ZmbGluZUxvZ1wiICsga2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXAoe1wiUmVzcFwiOlwiT0tcIn0pO1xyXG4gICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25SZXAoe1wiUmVzcFwiOlwiRXJyb3JcIiwgXCJEZXNjXCI6ZXJyfSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsb3NlSW5zdGFuY2UoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5jbG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBJbnN0YW5jZUFnYWluKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVMb2dcIiArIGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgfSBjYXRjaHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc0RlbGV0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSwgZGVsZXRlZDogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGVBbGxEb2NzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLmZpbHRlcihyb3cgPT4gIXJvdy5pZC5zdGFydHNXaXRoKFwiQ1RJVk9TXCIpKS5tYXAoZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX2lkOiByb3cuaWQsIF9yZXY6IHJvdy5kb2MuX3JldiwgX2RlbGV0ZWQ6IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbihkZWxldGVEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYnVsa0RvY3MoZGVsZXRlRG9jcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbGltaW5hIGRlbCBMb2cgbG9zIGRvY3MgY29uIGZlY2hhIGFudGVyaW9yIG8gaWd1YWwgYSB7e21heERpYXN9fSBkZSBsYSBmZWNoYSBhY3R1YWxcclxuICAgICAqIFNlIGNvbmNhdGVuYSBcIiAgMDA6MDBcIiBhIGxhIGZlY2hhIHBvciB1biBlcnJvciBlbiBsYSBmdW5jaW9uYWxpZGFkIGRlIFwibmV3IERhdGUoKVwiXHJcbiAgICAgKiBTZSB1dGlsaXphICgxMDAwICogMzYwMCAqIDI0KSBwYXJhIGNhbGN1bGFyIGVsIG51bWVybyBkZSBtaWxpc2VndW5kb3MgZW4gdW4gZMODwq1hXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBEZWxldGVPbGREb2NzKG1heERpYXM6bnVtYmVyKSB7XHJcbiAgICAgICAgLy9sZXQgbWF4RGlhcyA9IDM7XHJcblxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJEZWxldGVPbGREb2NzXCIpXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pLnRoZW4oYWxsRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoYWxsRG9jcylcclxuICAgICAgICAgICAgdGhpcy5BZGRMb2dTb2NrZXQoYWxsRG9jcyk7XHJcbiAgICAgICAgICAgIGFsbERvY3Mucm93cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhlbGVtZW50LmRvYy5GZWNoYSk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGVsZW1lbnQuZG9jLkZlY2hhLnN1YnN0cmluZygwLCAxMCkgKyBcIiAgMDA6MDBcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcobmV3IERhdGUoZWxlbWVudC5kb2MuRmVjaGEuc3Vic3RyaW5nKDAsIDEwKSArIFwiICAwMDowMFwiKSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGVsZW1lbnQuZG9jLkZlY2hhLnN1YnN0cmluZygwLCAxMCkgKyBcIiAgMDA6MDBcIikuZ2V0VGltZSgpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygoRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGVsZW1lbnQuZG9jLkZlY2hhLnN1YnN0cmluZygwLCAxMCkgKyBcIiAgMDA6MDBcIikuZ2V0VGltZSgpKSAvICgxMDAwICogMzYwMCAqIDI0KSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxEb2NzLnJvd3MuZmlsdGVyKHJvdyA9PiBNYXRoLmZsb29yKChEYXRlLm5vdygpIC0gbmV3IERhdGUocm93LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpLmdldFRpbWUoKSkgLyAoMTAwMCAqIDM2MDAgKiAyNCkpID49IG1heERpYXMpXHJcbiAgICAgICAgICAgIC5tYXAoIHJvdyA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0xsYW1hciBzb2NrZXQuIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX2lkOiByb3cuaWQsIF9yZXY6IHJvdy5kb2MuX3JldiwgX2RlbGV0ZWQ6IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbihkZWxldGVEb2NzID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgQWRkTG9nU29ja2V0KG9sTTNQcm9jZXNvczogYW55KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHBhcmFtczogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgcGFyYW1zID0gW3sgXCJub21icmVcIjogXCJNM1Byb2Nlc29cIiwgXCJ2YWxvclwiOiBKU09OLnN0cmluZ2lmeShvbE0zUHJvY2Vzb3MpIH1dO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vTTNEZXZpY2VzU2VydmljZS5EZXZpY2VfTVBvcyh0aGlzLkFkZExvZ1NvY2tldE9LLCBwYXJhbXMsIFwiTE9HTTNQcm9jZXNvc1wiLCBudWxsKVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFkZExvZ1NvY2tldE9LID0oKT0+e1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIERlbGV0ZShpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTTNDb3VjaE1hZXN0cm8gfSBmcm9tIFwiLi4vRGF0YS9tMy1jb3VjaC1tYWVzdHJvXCJcclxuaW1wb3J0IHsgdmFyaWFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tcGlsZXIvc3JjL291dHB1dC9vdXRwdXRfYXN0XCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi4vU2VydmljZXMvTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQW55QVJlY29yZCB9IGZyb20gXCJkbnNcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTTNNYWVzdHJvT2ZmbGluZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm8pIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGZvcm1hcyBkZSBwYWdvXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgSWQgZGUgbGEgRW1wcmVzYSBcclxuICAgICAqIEBwYXJhbSByZXNwT2tfZ2V0X2Zvcm1hc19wYWdvIEZ1bmNpb24gY29uIHJlc3B1ZXN0YSBPS1xyXG4gICAgICogQHBhcmFtIHJlc3BFcnJvcl9nZXRfZm9ybWFzX3BhZ28gRnVuY2lvbiBjb24gcmVzcHVlc3RhIEVSUk9SXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRGb3JtYXNQYWdvKGlkS2F0aW9zLCBpZFByb2Nlc286IHN0cmluZywgcmVzcE9rX2dldF9mb3JtYXNfcGFnbzogRnVuY3Rpb24sIHJlc3BFcnJvcl9nZXRfZm9ybWFzX3BhZ286IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KFwiRm9ybWFzUGFnb1wiKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh4KTtcclxuXHJcbiAgICAgICAgICAgIHJlc3BPa19nZXRfZm9ybWFzX3BhZ28odGhpcy5GaWx0cmFyQnlQcm9jZXNvKGlkUHJvY2VzbywgeC5Gb3JtYXNQYWdvKSk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICByZXNwRXJyb3JfZ2V0X2Zvcm1hc19wYWdvKGVycm9yKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsdHJhciBsYXMgZm9ybWFzIGRlIHBhZ28sIGRlcGVuZGllbmRvIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9jZXNvLlxyXG4gICAgICogQHBhcmFtIGlkUHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBmb3JtYXNQYWdvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRmlsdHJhckJ5UHJvY2VzbyhpZFByb2Nlc286IHN0cmluZywgZm9ybWFzUGFnbzogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGZvcm1hc1BhZ28pO1xyXG4gICAgICAgICAgICBpZiAoaWRQcm9jZXNvICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGZvcm1hc1BhZ28gPSBmb3JtYXNQYWdvLmZpbHRlcih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh4KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoeC5QUk9DRVNPUykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXguUFJPQ0VTT1MubGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5QUk9DRVNPUyA9IG5ldyBBcnJheTxhbnk+KHguUFJPQ0VTT1MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geC5QUk9DRVNPUy5maW5kKHkgPT4geS5JZFByb2Nlc28gPT0gaWRQcm9jZXNvKSAhPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZm9ybWFzUGFnbyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIEZpbHRyYXJCeVByb2Nlc29cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hc1BhZ287XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZm9ybWFzUGFnbztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RXN0cnVjdHVyYShlc3Q6c3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChlc3QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBkaW7Dg8KhbWljYXMgcG9yIGFjdGl2aWRhZFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIElkIGRlIGxhIGVtcHJlc2FcclxuICAgICAqIEBwYXJhbSBMb2FkRGluYW1pY2FzT0sgRnVuY2lvbiBkZSByZXNwdWVzdGEgT0tcclxuICAgICAqIEBwYXJhbSBMb2FkRGluYW1pY2FzRXJyb3IgRnVuY2lvbiBkZSByZXNwdWVzdGEgRVJST1JcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldERpbmFtaWNhc0J5QUN0aXZpZGFkKGlkS2F0aW9zLCBvRGF0YSwgTG9hZERpbmFtaWNhc09LOiBGdW5jdGlvbiwgTG9hZERpbmFtaWNhc0Vycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBkaW5hbVxyXG4gICAgICAgIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChcIkRJTkJZQUNUXCIpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBkaW5hbSA9IHguTTNEaW5CeUFjdGl2aWRhZDtcclxuICAgICAgICAgICAgICAgIGRpbmFtID0gZGluYW0uZmlsdGVyKHggPT4geC5BY3RpdmlkYWQgPT0gb0RhdGEuQWN0aXZpZGFkICYmIHguSURBY3RpdmlkYWQgPT0gb0RhdGEuaWRBY3RpdmlkYWQgJiYgeC5JZFByb2Nlc28gPT0gb0RhdGEuaWRQcm9jZXNvKTtcclxuICAgICAgICAgICAgICAgIExvYWREaW5hbWljYXNPSyhkaW5hbSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2h7XHJcbiAgICAgICAgICAgICAgICBkaW5hbSA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgICAgICBMb2FkRGluYW1pY2FzT0soZGluYW0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgTG9hZERpbmFtaWNhc0Vycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSB1YmljYWNpb25lc1xyXG4gICAgICogQHBhcmFtIHNJZFViaWNhY2lvbmVzIElkIGRlIGxhIHViaWNhY2lvbiBhIGJ1c2NhciBlbiBiYXNlIGRlIGRhdG9zIE5vU1FMXHJcbiAgICAgKiBAcGFyYW0gb1NlcnZpY2VNM01hZXN0cm8gU2VydmljaW8gbWFlc3RybywgZXN0YSB0aWVuZSBmdW5jaW9uYWxpZGFkIHBhcmEgYnVzY2FyIGVzcGVjaWZpY2FtZW50ZSB1biB1YmljYWNpb25cclxuICAgICAqIEBwYXJhbSBGdW5jaW9uT0sgRnVuY2lvbiBxdWUgcmV0b21hIGxhIGZ1bmNpb25hbGlkYWQgY3VhbmRvIGVzIE9LLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VWJpY2FjaW9uZXMoaWRrYXRpb3M6IHN0cmluZywgc0lkVWJpY2FjaW9uZXM6IHN0cmluZywgb1NlcnZpY2VNM01hZXN0cm86IFNlcnZpY2VNM01hZXN0cm8sIEZ1bmNpb25PSzogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL0NhcmdhciBpbmZvcm1hY2lvbiBkZSB1YmljYWNpb25cclxuICAgICAgICB2YXIgb00zVWJpY2FjaW9uO1xyXG4gICAgICAgIHZhciBzSWRVYmljYWNpb25lc0NvdWNoID0gaWRrYXRpb3MudHJpbSgpLnRvVXBwZXJDYXNlKCkgKyBcIj9VQklDXCI7O1xyXG4gICAgICAgIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChzSWRVYmljYWNpb25lc0NvdWNoKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIG9NM1ViaWNhY2lvbiA9IG9TZXJ2aWNlTTNNYWVzdHJvLkdldFViaWNhY2lvbkZyb21MaXN0KHJlc3VsdC5MaXN0VWJpY2FjaW9uZXMuTTNVQklDQUNJT04sIHNJZFViaWNhY2lvbmVzKTtcclxuICAgICAgICAgICAgRnVuY2lvbk9LKG9NM1ViaWNhY2lvbik7XHJcblxyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgIFxyXG5cclxuICAgIC8vIC8qKlxyXG4gICAgLy8gICogT2J0ZW5lciBsYSBpbmZvcm1hY2lvbiBkZSBsYXMgcHJvbW9jaW9uZXNcclxuICAgIC8vICAqIEBwYXJhbSBzSURQcm9tbyBJZCBkZSBsYSBwcm9tb2Npb24gYSBidXNjYXIgZW4gYmFzZSBkZSBkYXRvcyBOb1NRTFxyXG4gICAgLy8gICogQHBhcmFtIEZ1bmNpb25PSyBGdW5jaW9uIHF1ZSByZXRvbWEgbGEgZnVuY2lvbmFsaWRhZCBjdWFuZG8gZXMgT0suXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHB1YmxpYyBHZXRQcm9tb2Npb25lcyhpZGthdGlvczogc3RyaW5nLCBGdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAvLyAgICAgdmFyIExpc3RQcm9tbztcclxuICAgIC8vICAgICB2YXIgc0lEUHJvbW8gPSBpZGthdGlvcy50cmltKCkudG9VcHBlckNhc2UoKSArIFwiP1Byb21vY2lvbmVzXCI7XHJcbiAgICAvLyAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KHNJRFByb21vKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAvLyAgICAgICAgIGlmKHJlc3VsdC5NM0VOQ1BST01PKXtcclxuICAgIC8vICAgICAgICAgICAgIExpc3RQcm9tbyA9IHJlc3VsdC5NM0VOQ1BST01PO1xyXG4gICAgLy8gICAgICAgICB9ZWxzZSBpZihyZXN1bHQuTTNMaXN0RU5DUFJPTU8uTTNFTkNQUk9NTyl7XHJcbiAgICAvLyAgICAgICAgICAgICBMaXN0UHJvbW8gPSByZXN1bHQuTTNMaXN0RU5DUFJPTU8uTTNFTkNQUk9NTztcclxuICAgIC8vICAgICAgICAgfWVsc2V7XHJcbiAgICAvLyAgICAgICAgICAgICBMaXN0UHJvbW8gPSB1bmRlZmluZWQ7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIEZ1bmNpb25PSyhMaXN0UHJvbW8pO1xyXG4gICAgLy8gICAgIH0sIGVycm9yID0+IHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsYSBpbmZvcm1hY2lvbiBzaW5jcsODwrNuaWNhbWVudGUgZGUgdGVtcGxhdGUuIHNlZ3VuIGVsIHJlcG9ydGUgZW50cmFudGUgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBBc3luY2dldF90ZW1wbGF0ZV9yZXBvcnRlKGlka2F0aW9zOiBzdHJpbmcsIGlkcmVwKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlO1xyXG4gICAgICAgICAgICAvL3ZhciBzSUQgPSBpZGthdGlvcy50cmltKCkudG9VcHBlckNhc2UoKSArIFwiP1RlbXBsYXRlc1wiO1xyXG4gICAgICAgICAgICB2YXIgc0lEID0gXCJURU1QTEFURVNcIjtcclxuICAgICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoc0lEKTtcclxuICAgICAgICAgICAgaWYgKHRlbXBsYXRlLlJFU1BVRVNUQS5SUFRlbXBsYXRlLmxlbmd0aCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gbmV3IEFycmF5PGFueT4odGVtcGxhdGUuUkVTUFVFU1RBLlJQVGVtcGxhdGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5SRVNQVUVTVEEuUlBUZW1wbGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLy9TZSBjcmVhbiBsb3Mgbm9kb3MgcGFkcmUgUkVTUFVFU1RBIHkgUlBUZW1wbGF0ZSwgcGFyYSBzaW11bGFyIGlndWFsLCBjb21vIGxvIHJlc3BvbmRlIHNlcnZpZG9yLlxyXG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVVbm8gPSB7IFwiUkVTUFVFU1RBXCI6IHsgXCJSUFRlbXBsYXRlXCI6IHRlbXBsYXRlLmZpbmQodCA9PiB0LklkUmVwID09IGlkcmVwKSB9IH07XHJcbiAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZVVubztcclxuICAgICAgICB9IGNhdGNoe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbn0gICAiLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgU2VydmljZU9mZkxpbmUgfSBmcm9tIFwiLi9TZXJ2aWNlL2JkLW9mZmxpbmUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gXCIuLi9TZXJ2aWNlcy9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuLi9TZXJ2aWNlcy9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBiZE9mZkxpbmVMb2cgfSBmcm9tIFwiLi9TZXJ2aWNlL2JkLW9mZmxpbmUtbG9nLnNlcnZpY2VcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM1Byb2Nlc29zT2ZmbGluZSB7XHJcblxyXG4gICAgLy9wcml2YXRlIHNLZXlDdGl2b3M6IHN0cmluZyA9IFwiQ1RJVk9TXCI7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9TZXJ2aWNlT2ZmTGluZTogU2VydmljZU9mZkxpbmUsIHByaXZhdGUgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsXHJcbiAgICAgICAgcHJpdmF0ZSBvYmRPZmZMaW5lTG9nOiBiZE9mZkxpbmVMb2cpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIE0zUHJvY2Vzb3MsIHNlZ3VuIGVsIElEIE0zXHJcbiAgICAgKiBAcGFyYW0gaWQgSWQgZGVsIE1vdG9yIDNcclxuICAgICAqIEBwYXJhbSBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MgUmVzcHVlc3RhIE9LIGRlIGdldCBkZSBNMyBwcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIFJlc3BvbnNlRXJyb3JMb2FkTTNQcm9jZXNvcyBSZXNwdWVzdGEgRXJyb3IgZGUgZ2V0IGRlIE0zIHByb2Nlc29zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRQcm9jZXNvQnlJZChpZCwgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MTEwOCBjYW1iaW8gZGUgZG9uZGUgdHJhZXIgZWwgcHJvY2VzbyBsbyB0cmFlIGRlc2RlIG9mZmxpbmVcclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQoaWQpLnRoZW4ocHJvY2VzbyA9PiB7XHJcbiAgICAgICAgICAgIC8vdGhpcy5vYmRPZmZMaW5lTG9nLmdldChpZCkudGhlbihwcm9jZXNvID0+IHtcclxuICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKHByb2Nlc28pO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgLy9SZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3MoZXJyb3IpO1xyXG4gICAgICAgICAgICB0aGlzLkdldFByb2Nlc29CeUlkRnJvbUxvZyhpZCwgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zLCBSZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0UHJvY2Vzb0J5SWRGcm9tTG9nKGlkLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uLCBSZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9KQUdNIDIwMTkxMTA4IGNhbWJpbyBkZSBkb25kZSB0cmFlciBlbCBwcm9jZXNvIGxvIHRyYWUgZGVzZGUgb2ZmbGluZVxyXG4gICAgICAgIC8vdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KGlkKS50aGVuKHByb2Nlc28gPT4ge1xyXG4gICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5nZXQoaWQpLnRoZW4ocHJvY2VzbyA9PiB7XHJcbiAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhwcm9jZXNvKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIFJlc3BvbnNlRXJyb3JMb2FkTTNQcm9jZXNvcyhlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgTTMgUHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBpZCBJZCBkZWwgTTMgUHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIG9sTTNQcm9jZXNvcyBPYmpldG8gTTMgUHJvY2Vzb3MgYSBhZ3JlZ2FyXHJcbiAgICAgKiBAcGFyYW0gUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zIEZ1bmNpb24gT0sgcmVzcHVlc3RhIHF1ZSBhdHJhcGFyw4PCoS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZFByb2Nlc28oaWRrYXRpb3M6IHN0cmluZywgb2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIGlmIChvbE0zUHJvY2Vzb3MuSWRNMykge1xyXG4gICAgICAgICAgICB0aGlzLkFkZFRvRG9jT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5HZXRJZE0zT2ZmbGluZShpZGthdGlvcywgb2xNM1Byb2Nlc29zLlRNSWRQcm9jZXNvLCBvbE0zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zLklESHViLnRvU3RyaW5nKCkpLnRoZW4oaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgb2xNM1Byb2Nlc29zLklkTTMgPSBpZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuQWRkVG9Eb2NPZmZsaW5lKG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBZGRUb0RvY09mZmxpbmUob2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uLCBpbnRlbnRvID0gMCkge1xyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkFkZERvY3VtZW50KG9sTTNQcm9jZXNvcy5JZE0zLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5TYXZlSWRNMyhvbE0zUHJvY2Vzb3MuSWRNMywgb2xNM1Byb2Nlc29zLlRNSWRQcm9jZXNvLCBvbE0zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zLklESHViLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLkFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5TYXZlSWRNMyhvbE0zUHJvY2Vzb3MuSWRNMywgb2xNM1Byb2Nlc29zLlRNSWRQcm9jZXNvLCBvbE0zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zLklESHViLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAvLyAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKG9sTTNQcm9jZXNvcy5JZE0zKTtcclxuICAgICAgICAgICAgLy8gfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgICAgdGhpcy5BZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKTtcclxuXHJcbiAgICAgICAgICAgIC8vUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKG9sTTNQcm9jZXNvcy5JZE0zKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiZXJyb3JcIjogZXJyb3IsIFwib2xNM1Byb2Nlc29zXCI6IG9sTTNQcm9jZXNvcywgXCJJbnRlbnRvXCI6IGludGVudG8sIFwiZnVuY3Rpb25cIjogXCJBZGRUb0RvY09mZmxpbmVcIiB9KSk7XHJcbiAgICAgICAgICAgIGlmIChpbnRlbnRvID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5JbnN0YW5jZUFnYWluKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZFRvRG9jT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcywgMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MoeyBcIkVycm9yXCI6IFwiRXJyb3IgZW4gZ3VhcmRhciBlbiBiYXNlIGRlIGRhdG9zIHBjcGFsLlwiIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBsb2cgb2ZmbGluZSBkZSBwcm9jZXNvcy5cclxuICAgICAqIEBwYXJhbSBvbE0zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgaW50ZW50bzogbnVtYmVyID0gMCkge1xyXG4gICAgICAgIC8vQWdyZWdhciBhIExvZyBTb2NrZXRcclxuICAgICAgICAvL3RoaXMuQWRkTG9nU29ja2V0KG9sTTNQcm9jZXNvcylcclxuICAgICAgICAvL3JldHVybiB0aGlzLm9iZE9mZkxpbmVMb2cuQWRkRG9jdW1lbnQob2xNM1Byb2Nlc29zLklkTTMudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zKVxyXG4gICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5BZGREb2N1bWVudChvbE0zUHJvY2Vzb3MuSWRNMy50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHgpO1xyXG4gICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3Mob2xNM1Byb2Nlc29zLklkTTMpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICB2YXIgc0ZlY2hhTm93OiBzdHJpbmcgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZTU1ERFRISG1tc3MnKVxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVycm9yTG9nXCIgKyBzRmVjaGFOb3csIEpTT04uc3RyaW5naWZ5KHsgXCJlcnJvclwiOiBlcnJvciwgXCJvbE0zUHJvY2Vzb3NcIjogb2xNM1Byb2Nlc29zLCBcIkludGVudG9cIjogaW50ZW50bywgXCJmdW5jdGlvblwiOiBcIkFkZExvZ09mZmxpbmVcIiB9KSk7XHJcbiAgICAgICAgICAgIGlmIChpbnRlbnRvID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5JbnN0YW5jZUFnYWluKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MsIDEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKHsgXCJFcnJvclwiOiBcIkVycm9yIGVuIGd1YXJkYXIgZW4gYmFzZSBkZSBkYXRvcyBsb2NhbC5cIiB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIEFkZExvZ1NvY2tldE9LID0gKCkgPT4ge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xvc2VJbnN0YW5jZUxvZ09mZigpIHtcclxuICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuY2xvc2VJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0T2ZmTGluZUxvZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vYmRPZmZMaW5lTG9nLkdldEFsbERvY3MoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldDFEb2NPZmZMaW5lTG9nKGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub2JkT2ZmTGluZUxvZy5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV2ZXJzYXIgbTMgcHJvY2VzbywgZW4gZWwgbG9nIGxvY2FsLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmV2ZXJzYXJFbkxvZyhpZCkge1xyXG4gICAgICAgIHRoaXMuR2V0MURvY09mZkxpbmVMb2coaWQpLnRoZW4ob00zUCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvUmVzdWx0OiBNM1Byb2Nlc29zID0gb00zUDtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvUmVzdWx0LmxNM1BFbmNGUC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb1Jlc3VsdC5sTTNQRW5jRlBbaV0uVmFsQ2FtYmlvID0gMDtcclxuICAgICAgICAgICAgICAgIG9SZXN1bHQubE0zUEVuY0ZQW2ldLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgIG9SZXN1bHQubE0zUEVuY0ZQW2ldLlZhbE90cmFDbGFzaSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb1Jlc3VsdC5JZEVzdGFkbyA9IFwiUlZcIjtcclxuICAgICAgICAgICAgdGhpcy5BZGRMb2dPZmZsaW5lKG9SZXN1bHQsIG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cnVpckJETG9nKGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9iZE9mZkxpbmVMb2cuRGVzdHJveShmdW5jaW9uUmVzcCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlc3RydWlyQkRPZmYoZnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub1NlcnZpY2VPZmZMaW5lLkRlc3Ryb3koZnVuY2lvblJlc3ApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBTdW1hckN0aXZvKGlkbTM6IHN0cmluZykge1xyXG4gICAgICAgIC8vIHZhciBzUGFydDE7XHJcbiAgICAgICAgLy8gdmFyIHNQYXJ0MjtcclxuXHJcbiAgICAgICAgLy8gc1BhcnQxID0gaWRtMy5zdWJzdHJpbmcoMCwgOCk7XHJcbiAgICAgICAgLy8gc1BhcnQyID0gaWRtMy5zdWJzdHJpbmcoOCwgaWRtMy5sZW5ndGgpO1xyXG4gICAgICAgIC8vIHNQYXJ0MiA9ICtzUGFydDIgKyAxO1xyXG4gICAgICAgIC8vIGlkbTMgPSBzUGFydDEgKyBzUGFydDI7XHJcbiAgICAgICAgLy8gcmV0dXJuIGlkbTM7XHJcbiAgICAgICAgdmFyIHNQYXJ0MTtcclxuICAgICAgICB2YXIgc1BhcnQyO1xyXG4gICAgICAgIHNQYXJ0MSA9IGlkbTMuc3Vic3RyaW5nKDAsIDkpO1xyXG4gICAgICAgIHNQYXJ0MiA9IGlkbTMuc3Vic3RyaW5nKDkpO1xyXG4gICAgICAgIHNQYXJ0MiA9ICtzUGFydDIgKyAxO1xyXG4gICAgICAgIGlkbTMgPSBzUGFydDEgKyBcIlwiICsgc1BhcnQyO1xyXG4gICAgICAgIHJldHVybiBpZG0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0dWFsaXphciBlbCBNMyBQcm9jZXNvcywgdGVuaWVuZG8gZWwgSWQgZGVsIGRvY3VtZW50byBndWFyZGFkbyBlbiBsYSBCRCBOb1NRTFxyXG4gICAgICogQHBhcmFtIGlkIElkIGRlbCBkb2N1bWVudG8gQmQgTm9TUUxcclxuICAgICAqIEBwYXJhbSBvbE0zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgYSBhbG1hY2VuYXIgLyBBY3R1YWxpemFyXHJcbiAgICAgKiBAcGFyYW0gUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zIFJlc3B1ZXN0YSBkZSBPSy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZFByb2Nlc28oaWQsIG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgaW50ZW50byA9IDApIHtcclxuXHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuQWRkRG9jdW1lbnQoaWQudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAvL1Jlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhpZCk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB2YXIgc0ZlY2hhTm93OiBzdHJpbmcgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZTU1ERFRISG1tc3MnKVxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVycm9yTG9nXCIgKyBzRmVjaGFOb3csIEpTT04uc3RyaW5naWZ5KHsgXCJlcnJvclwiOiBlcnJvciwgXCJvbE0zUHJvY2Vzb3NcIjogb2xNM1Byb2Nlc29zLCBcIkludGVudG9cIjogaW50ZW50bywgXCJmdW5jdGlvblwiOiBcInVwZFByb2Nlc29cIiB9KSk7XHJcbiAgICAgICAgICAgIGlmIChpbnRlbnRvID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5JbnN0YW5jZUFnYWluKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZFByb2Nlc28oaWQsIG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zLCAxKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyh7IFwiRXJyb3JcIjogXCJFcnJvciBlbiBndWFyZGFyIGVuIGJhc2UgZGUgZGF0b3MgcGNwYWwuXCIgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdHVhbGl6YXIgZWwgTTMgUHJvY2Vzb3MsIHRlbmllbmRvIGVsIElkIGRlbCBkb2N1bWVudG8gZ3VhcmRhZG8gZW4gbGEgQkQgTm9TUUxcclxuICAgICAqIEBwYXJhbSBpZCBJZCBkZWwgZG9jdW1lbnRvIEJkIE5vU1FMXHJcbiAgICAgKiBAcGFyYW0gb2xNM1Byb2Nlc29zIE0zIFByb2Nlc29zIGEgYWxtYWNlbmFyIC8gQWN0dWFsaXphclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgdXBkUHJvY2Vzb0FzeW5jKGlkLCBvbE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5BZGREb2N1bWVudChpZC50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHRoaXMuQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3MsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRBbGxEb2NzT2ZmTGluZVNpbkRvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub1NlcnZpY2VPZmZMaW5lLkdldEFsbERvY3NPZmZMaW5lU2luRG9jcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc2FyVGlja2V0T2ZmbGluZShpZGthdGlvcywgcHJvY2Vzbywgb0RhdGFVc2VyOiBhbnksIGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBsTTNQcm9jZXNvcyA9IG5ldyBBcnJheTxNM1Byb2Nlc29zPigpO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBpZGthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlZhbGlkYXJUaWNrZXRDZXJyYWRvKHByb2Nlc28pKSB7XHJcbiAgICAgICAgICAgIGxNM1Byb2Nlc29zLnB1c2gocHJvY2Vzbyk7XHJcblxyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lKGlka2F0aW9zLCB0aGlzLm9Qb3N0U2VydmljZU0zLCBsTTNQcm9jZXNvcywgb0RhdGFVc2VyKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHgpIHtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcCh0cnVlLCBcIk9LXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcChmYWxzZSwgXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgcHJvY2Vzb3MgcXVlIHNlIHByb2Nlc2Fyb24gbWllbnRyYXMgc2UgZXN0YWJhIGZ1ZXJhIGRlIGxpbmVhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyUHJvY2Vzb3NBZ3JlZ2Fkb3NPZmZMaW5lKGlka2F0aW9zLCBvRGF0YVVzZXI6IGFueSwgZnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIkVudHJvIFZhbGlkYXJQcm9jZXNvc0FncmVnYWRvc09mZkxpbmVcIilcclxuICAgICAgICB2YXIgbE0zUHJvY2Vzb3MgPSBuZXcgQXJyYXk8TTNQcm9jZXNvcz4oKTtcclxuICAgICAgICB2YXIgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgaWRrYXRpb3MpO1xyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkdldEFsbERvY3MoKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIC8vIGhhbmRsZSByZXN1bHRcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yb3dzW2ldLmlkICYmICFyZXN1bHQucm93c1tpXS5pZC5zdGFydHNXaXRoKFwiQ1RJVk9TXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG0zUHJvY2VzbzogTTNQcm9jZXNvcyA9IHJlc3VsdC5yb3dzW2ldLmRvYztcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5WYWxpZGFyVGlja2V0Q2VycmFkbyhtM1Byb2Nlc28pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxNM1Byb2Nlc29zLnB1c2gocmVzdWx0LnJvd3NbaV0uZG9jKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkFudGVzIFJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lXCIpXHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuUmVnaXN0cm9FdmVudG9NM09mZkxpbmUoaWRrYXRpb3MsIHRoaXMub1Bvc3RTZXJ2aWNlTTMsIGxNM1Byb2Nlc29zLCBvRGF0YVVzZXIpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRpbyBSZXNwdWVzdGEgUmVnaXN0cm9FdmVudG9NM09mZkxpbmVcIilcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHgpXHJcbiAgICAgICAgICAgICAgICBpZiAoeCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJpZiAxXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuRGVsZXRlQWxsRG9jcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKHRydWUsIFwiT0tcIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJpZiAyXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLy9SZXNwdWVzdGEgY29uIGVycm9yZXNcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMub1NlcnZpY2VPZmZMaW5lLkRlbGV0ZUFsbERvY3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcChmYWxzZSwgXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFjaW9uIGRlIHF1ZSBlbCB0aWNrZXQgZXN0YSBjZXJyYWRvLlxyXG4gICAgICogQHBhcmFtIG0zUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJUaWNrZXRDZXJyYWRvKG0zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBiQ2VycmFkbzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgaWYgKG0zUHJvY2Vzby5NM0VOQyAhPSBudWxsICYmIG0zUHJvY2Vzby5sTTNQRW5jRlAgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAobTNQcm9jZXNvICYmIG0zUHJvY2Vzby5TdWJFc3RhZG9BbnQgIT0gXCJEZWNsaW5hZG9cIiAmJiBtM1Byb2Nlc28uTTNFTkMubGVuZ3RoID4gMCAmJiBtM1Byb2Nlc28ubE0zUEVuY0ZQLmxlbmd0aCA9PSAwICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldENhbnRpZGFkVG90YWxCeU0zUHJvY2VzbyhtM1Byb2Nlc28pID4gMCkge1xyXG4gICAgICAgICAgICAgICAgYkNlcnJhZG8gPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYkNlcnJhZG8gPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBiQ2VycmFkbztcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldENhbnRpZGFkVG90YWxCeU0zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAmJiBvTTNQcm9jZXNvcy5NM0VOQykge1xyXG4gICAgICAgICAgICB2YXIgZENhbnRpZGFkID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikgPiAwKS5cclxuICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLCAwKTtcclxuICAgICAgICAgICAgaWYgKGRDYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdG9kb3MgbG9zIGRvY3VtZW50b3MgT2ZmIGxpbmUgcXVlIHNlIGhhbiBndWFyZGFkbyBjb21vIG9mZmxpbmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBHZXRBbGxEb2NzT2ZmbGluZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgbE0zUHJvY2Vzb3MgPSBuZXcgQXJyYXk8TTNQcm9jZXNvcz4oKTtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IHRoaXMub1NlcnZpY2VPZmZMaW5lLkdldEFsbERvY3MoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yb3dzW2ldLmlkICE9IFwiQ1RJVk9TXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBsTTNQcm9jZXNvcy5wdXNoKHJlc3VsdC5yb3dzW2ldLmRvYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGxNM1Byb2Nlc29zO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB0b2RvcyBsb3MgZG9jdW1lbnRvcyBPZmYgbGluZSBxdWUgc2UgaGFuIGd1YXJkYWRvIGNvbW8gb2ZmbGluZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldEFsbERvY3NPZmZsaW5lRGVsZXRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vU2VydmljZU9mZkxpbmUuR2V0QWxsRG9jc0RlbGV0ZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlQ3Rpdm9zKHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5vU2VydmljZU9mZkxpbmUuRGVsZXRlKHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSlcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWxsQ3Rpdm9zKHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBsb3MgY29uc2VjdXRpdm9zIHF1ZSBlc3RhbiBsb2NhbG1lbnRlIHZzIGxvcyBxdWUgZXN0YW4gZW4gZWwgc2Vydmlkb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFjaW9uQ3Rpdm9zVlNTZXJ2ZXIoaWthdGlvczogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaWRIdWI6IHN0cmluZywgZnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5nZXRBbGxDdGl2b3ModWJpY2FjaW9uLCBpZEh1YikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgaWYgKHgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgICAgICAgICBvU2VydmljZU0zTWFlc3Ryby5WYWxpZGFyQ3Rpdm9zVlNMb2NhbCh0aGlzLm9Qb3N0U2VydmljZU0zLCBpa2F0aW9zLCBKU09OLnN0cmluZ2lmeSh4KSwgdWJpY2FjaW9uLCBpZEh1YiwgZnVuY2lvblJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZWwgY29uc2VjdXRpdm8gZW4gZWwgcXVlIHZhLCBlbCBwcm9jZXNvIG9mZmxpbmUgcXVlIHJlY2liZSBjb21vIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIHViaWNhY2lvbiBcclxuICAgICAqIEBwYXJhbSBodWIgXHJcbiAgICAgKiBAcGFyYW0gc0lkUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIEdldEN0aXZvT2ZmTGluZSh1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZykge1xyXG4gICAgICAgIHZhciBjdGl2bzogc3RyaW5nID0gXCIwXCI7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSk7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9EYXRhRmluZGVkOiBhbnkgPSBvRGF0YS5DdGl2b3MuZmluZCh4ID0+IHguSWRQcm9jZXNvID09IHNJZFByb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9EYXRhRmluZGVkLkN0aXZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3Rpdm8gPSBvRGF0YUZpbmRlZC5DdGl2by5zdWJzdHJpbmcoOSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHsgfVxyXG4gICAgICAgIHJldHVybiBjdGl2bztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgaWQgbTMgXHJcbiAgICAgKiBAcGFyYW0gc0lkTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lkUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNhdmVJZE0zKHNJZE0zOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSkudGhlbihkYXRhID0+IHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhOiBBcnJheTxhbnk+ID0gZGF0YS5DdGl2b3M7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YUZpbmRlZDogYW55ID0gb0RhdGEuZmluZCh4ID0+IHguSWRQcm9jZXNvID09IHNJZFByb2Nlc28pO1xyXG4gICAgICAgICAgICBpZiAob0RhdGFGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjdGl2b0FudCA9ICtvRGF0YUZpbmRlZC5DdGl2by5zdWJzdHJpbmcoOSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3Rpdm9BY3QgPSArc0lkTTMuc3Vic3RyaW5nKDkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0aXZvQWN0ID4gY3Rpdm9BbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvRGF0YUZpbmRlZC5DdGl2byA9IHNJZE0zO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0RhdGEucHVzaCh7IFwiSWRQcm9jZXNvXCI6IHNJZFByb2Nlc28sIFwiQ3Rpdm9cIjogc0lkTTMgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLlNhdmVDdGl2b3Mob0RhdGEsIHViaWNhY2lvbiwgaHViKTtcclxuICAgICAgICAgICAgaWYgKHNJZFByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIlRJQ0tFVFZFTlRBXCIpIHtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiQ3Rpdm9UaWNrZXRWZW50YVwiLCBzSWRNMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YSA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgIG9EYXRhLnB1c2goeyBcIklkUHJvY2Vzb1wiOiBzSWRQcm9jZXNvLCBcIkN0aXZvXCI6IHNJZE0zIH0pXHJcbiAgICAgICAgICAgIHRoaXMuU2F2ZUN0aXZvcyhvRGF0YSwgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgICAgICBpZiAoc0lkUHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiVElDS0VUVkVOVEFcIikge1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJDdGl2b1RpY2tldFZlbnRhXCIsIHNJZE0zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR3VhcmRhciBjdGl2b3MsIElkbTMuXHJcbiAgICAgKiBAcGFyYW0gb0RhdGEgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgU2F2ZUN0aXZvcyhvRGF0YTogQXJyYXk8YW55PiwgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nLCBpbnRlbnRvID0gMCkge1xyXG4gICAgICAgIHZhciBvRGF0YVNlbmQgPSB7IFwiQ3Rpdm9zXCI6IG9EYXRhIH1cclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5BZGREb2N1bWVudCh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YiksIG9EYXRhU2VuZCkudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJPS1wiKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZXJyb3JMb2dDdGl2b3NcIiArIHNGZWNoYU5vdywgSlNPTi5zdHJpbmdpZnkoeyBcImVycm9yXCI6IGVycm9yLCBcIkN0aXZvc1wiOiBvRGF0YVNlbmQsIFwiZnVuY3Rpb25cIjogXCJTYXZlQ3Rpdm9zXCIgfSkpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIGlmIChpbnRlbnRvID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2F2ZUN0aXZvcyhvRGF0YSwgdWJpY2FjaW9uLCBodWIsIDEpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlT2xkRG9jcyhtYXhEaWFzOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuRGVsZXRlT2xkRG9jcyhtYXhEaWFzKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgSWQgbTMsIGN1YW5kbyBlc3RhIGZ1ZXJhIGRlIGxpbmVhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgR2V0SWRNM09mZmxpbmUoaWRrYXRpb3M6IHN0cmluZywgaWRwcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRGF0YUlkTTM7XHJcbiAgICAgICAgdmFyIGlkTTM7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb0RhdGFJZE0zID0gYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSk7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YUZpbmRlZDogYW55ID0gb0RhdGFJZE0zLkN0aXZvcy5maW5kKHggPT4geC5JZFByb2Nlc28gPT0gaWRwcm9jZXNvKTtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gb0RhdGFGaW5kZWQuQ3Rpdm87XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5TdW1hckN0aXZvKGlkTTMpO1xyXG4gICAgICAgICAgICAgICAgaWRNMyA9IHRoaXMudmFsaWRhckF1bWVudG9DdGl2byhpZE0zLCBpZHByb2Nlc28pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWRNMyA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkYXRlLmdldE1vbnRoKCkgKyBcIlwiICsgZGF0ZS5nZXREYXkoKSArIFwiXCIgKyBkYXRlLmdldEhvdXJzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaW51dGVzKCkgKyBcIlwiICsgZGF0ZS5nZXRTZWNvbmRzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5HZXRDdGl2byhpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAvLyBpZE0zID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRhdGUuZ2V0TW9udGgoKSArIFwiXCIgKyBkYXRlLmdldERheSgpICsgXCJcIiArIGRhdGUuZ2V0SG91cnMoKSArIFwiXCIgKyBkYXRlLmdldE1pbnV0ZXMoKSArIFwiXCIgKyBkYXRlLmdldFNlY29uZHMoKSArIFwiXCIgKyBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgICAgICBpZE0zID0gdGhpcy5HZXRDdGl2byhpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpZE0zO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB2YWxpZGFyQXVtZW50b0N0aXZvKGlkTTMsIGlkcHJvY2Vzbykge1xyXG4gICAgICAgIGlmIChpZHByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIlRJQ0tFVFZFTlRBXCIpIHtcclxuICAgICAgICAgICAgbGV0IHVsdGltb0lkTTMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkN0aXZvVGlja2V0VmVudGFcIik7XHJcbiAgICAgICAgICAgIGlmICh1bHRpbW9JZE0zID09IGlkTTMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5TdW1hckN0aXZvKGlkTTMpO1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ0N0aXZvc1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiaWRNM1wiOiBpZE0zLCBcImZ1bmN0aW9uXCI6IFwidmFsaWRhckF1bWVudG9DdGl2b1wiIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaWRNMztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIEdldEN0aXZvKGlka2F0aW9zOiBzdHJpbmcsIGlkcHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgIHZhciBzQ3Rpdm87XHJcbiAgICAgICAgc0N0aXZvID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uR2V0Q3Rpdm9CWVByb2Nlc28odGhpcy5vUG9zdFNlcnZpY2VNMywgaWRrYXRpb3MsIGlkcHJvY2VzbywgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgIHJldHVybiBzQ3Rpdm87XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsbGF2ZSBkZSBwb3VjaERCXHJcbiAgICAgKiBAcGFyYW0gdWJpYyBcclxuICAgICAqIEBwYXJhbSBodWIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRLZXkodWJpYywgaHViKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiQ1RJVk9TX1wiICsgdWJpYyArIGh1YjtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM05vdGlmU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0ZW5lciBsYSBpbmZvcm1hY2lvbiBkZSBsYXMgbm90aWRpY2FjaW9uZXMgcG9yIGh1YlxyXG4gICAqIEBwYXJhbSBzSURLYXRpb3MgRW1wcmVzYVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBNM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0KHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLm9Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM05vdGlmQ29udHJvbGxlci9NM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0L1wiICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnRvUHJvbWlzZSgpO1xyXG4gICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuICAgIGNhdGNoe1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViXHJcbiAgICogQHBhcmFtIHNJREthdGlvcyBFbXByZXNhXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIE0zR2V0TTNOb3RpZmljYWNpb25lc1hIdWJPYmplY3RXaXRoVGltZU91dChzSURLYXRpb3M6IHN0cmluZywgb0RhdGFTZW5kOiBhbnksIHRpbWVPdXQ6IG51bWJlcikge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLm9Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTNUaW1lT3V0KFwiTTNOb3RpZkNvbnRyb2xsZXIvTTNHZXRNM05vdGlmaWNhY2lvbmVzWEh1Yk9iamVjdC9cIiArIHNJREthdGlvcywgb0RhdGFTZW5kLCB0aW1lT3V0KS50b1Byb21pc2UoKTtcclxuICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcbiAgICBjYXRjaHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViIGRlIHVuIGlkUmVwIGRhZG9cclxuICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAqIEBwYXJhbSBkYXRhIFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBtM19nZXRfbm90aWZpY2FjaW9uX3hfaHViX29iamVjdChzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55KSB7XHJcbiAgICAvL3ZhciBkYXRhID0ge1wiaWRfcmVwXCI6XCJcIiwgXCJpZF91YmljYWNpb25cIjpcIlwiLCBcImlkX2h1YlwiOlwiXCJ9XHJcbiAgICB0cnkge1xyXG4gICAgICB2YXIgcmVzcCA9IGF3YWl0IHRoaXMub1Bvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTm90aWZDb250cm9sbGVyL20zX2dldF9ub3RpZmljYWNpb25feF9odWJfb2JqZWN0L1wiICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3ApKTtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbiAgICBjYXRjaHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBndWFyZGFyQ2FtYmlvc0NvbmZpZ3VyYWNpb25JbXByZXNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSwgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNOb3RpZkNvbnRyb2xsZXIvZ3VhcmRhckNhbWJpb3NDb25maWd1cmFjaW9uSW1wcmVzaW9uL1wiICsgc0lES2F0aW9zLnRyaW0oKSwgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICB9LFxyXG4gICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgb0Z1bmNpb25FcnIoZXJyb3JbXCJfYm9keVwiXSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTW9kZWxNM05vdGlme1xyXG4gICAgcHVibGljIElkUmVwOnN0cmluZztcclxuICAgIHB1YmxpYyBJRFViaWNhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRIdWI6c3RyaW5nO1xyXG4gICAgcHVibGljIENvcnJlcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ29uZGljaW9uZXM6c3RyaW5nO1xyXG4gICAgcHVibGljIERhdGE6c3RyaW5nO1xyXG4gICAgcHVibGljIENvbmZJbXA6c3RyaW5nO1xyXG59IiwiZXhwb3J0IGNsYXNzIE0zUHJlc2VudGFjaW9uZXN7XHJcbiAgICBwdWJsaWMgTklWRUxQUlM6c3RyaW5nO1xyXG4gICAgcHVibGljIFZBTE9SOm51bWJlcjtcclxuICAgIHB1YmxpYyBUT1BFOm51bWJlcjtcclxufSIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgcmVzZXJ2ZVNsb3RzIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNM0NvbnN1bHRhcyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIGludmVudGFyaW8sIHRlbmllbmRvIGVuIGN1ZW50YSBsb3MgcGFjayBhc29jaWFkb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIEVtcHJlc2FcclxuICAgICAqIEBwYXJhbSBkYXRhIEpzb24gY29uIGluZm9ybWFjaW9uIGRlIFNLUDEgKE1vZGVsbykgeSBVYmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIE0zX0dFVElOVkVOVEFSSU9CWVBBQ0soc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG4gICAgICAgIHZhciByZXNwID0gYXdhaXQgdGhpcy5Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9NM19HRVRJTlZFTlRBUklPQllQQUNLL1wiICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGFySW52ZW50YXJpb05lZ2F0aXZvUHJvZHVjdG8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNMy92YWxpZGFySW52ZW50YXJpb05lZ2F0aXZvUHJvZHVjdG8vXCIgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgb0Z1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyb3IuZXJyb3IuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBCdXNjYXJDb25jZXB0b0VuTTNTSVUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKXtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9NM19HRVRDb25jZXB0b0Zyb21TSVUvXCIgKyBpZEthdGlvcyArIFwiL1wiICsgZGF0YS5zVWJpY2FjaW9uICsgXCIvXCIgKyBkYXRhLnNDb25jZXB0bywge30pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnJvci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgVEVDTEFTUkFQSURBU3tcclxuICAgIHB1YmxpYyBDb21wb25lbnRlOnN0cmluZztcclxuICAgIHB1YmxpYyBUZWNsYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRnVuY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRFbGVtZW50bzpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hQUkRTU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgaWRrYXRpb3M6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBhcGxTeW5jQ291Y2hBdXRvID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgYXBsUGFxdWV0ZXMgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmlka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGbGFnU3luY0NvdWNoKCkge1xyXG4gICAgICAgIHZhciBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIHZhciBvU1ViaWNhY2lvbjtcclxuICAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgbGV0IGNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gbnVsbCAmJiBjb25maWcuU3luY0NvdWNoQXV0byAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmbGFnID0gY29uZmlnLlN5bmNDb3VjaEF1dG87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgdGhpcy5pZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICBpZiAodGhpcy5pZGthdGlvcykgdGhpcy5HZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiUFJEXCIgKyB0aGlzLmlka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiYWRhcHRlclwiKVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5kYXRhYmFzZS5hZGFwdGVyKTtcclxuICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHRoaXMudmFsaWRhclBhcXVldGVzKClcclxuICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJQYXF1ZXRlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5hcGxQYXF1ZXRlcykge1xyXG4gICAgICAgICAgICBsZXQgdWJpY2FjaW9uID0gdGhpcy5nZXRVYmljYWNpb24oKTtcclxuICAgICAgICAgICAgaWYgKHViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNhXCIgKyB1YmljYWNpb24gKyBcIl9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3luY0NvdWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZGthdGlvcykge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGFyUGFxdWV0ZXMoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRVYmljYWNpb24oKSB7XHJcbiAgICAgICAgbGV0IHNTVWJpY2FjaW9uID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNVYmljYWNpb25cIik7XHJcbiAgICAgICAgbGV0IG9TVWJpY2FjaW9uO1xyXG5cclxuICAgICAgICBpZiAoc1NVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgb1NVYmljYWNpb24gPSBKU09OLnBhcnNlKHNTVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgaWYgKG9TVWJpY2FjaW9uLklEVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1NVYmljYWNpb24uSURVYmljYWNpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldEthdGlvc00zRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIEthdGlvcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnS2F0aW9zXCIgKyB0aGlzLmlka2F0aW9zLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICAgIGlmIChLYXRpb3MgIT09IHVuZGVmaW5lZCAmJiBLYXRpb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgakthdGlvc00zID0gSlNPTi5wYXJzZShLYXRpb3MpO1xyXG4gICAgICAgICAgICBpZiAoakthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3MgJiYgakthdGlvc00zLkthdGlvcy5LYXRpb3NNMykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFwbCA9IGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMuZmluZCh4ID0+IHguTGxhdmUudG9VcHBlckNhc2UoKSA9PSBcIkFQTFBBUVNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBsICYmIGFwbC5WYWxvciA9PSBcIjFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBsUGFxdWV0ZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KGlka2F0aW9zKSB7XHJcbiAgICAgICAgdmFyIHJlc3B1ZXN0YTtcclxuICAgICAgICByZXNwdWVzdGEgPSBhd2FpdCB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKVxyXG4gICAgICAgIHJldHVybiByZXNwdWVzdGFcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hcGxTeW5jQ291Y2hBdXRvID0gdGhpcy5nZXRGbGFnU3luY0NvdWNoKCk7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0aGlzLmFwbFN5bmNDb3VjaEF1dG8sXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmluZm8oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZVByZChpZCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGVBbGxEb2NzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLm1hcChyb3cgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX2lkOiByb3cuaWQsIF9yZXY6IHJvdy5kb2MuX3JldiwgX2RlbGV0ZWQ6IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbihkZWxldGVEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYnVsa0RvY3MoZGVsZXRlRG9jcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaENvZHNQUkRTU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBpZGthdGlvcztcclxuICAgIHByaXZhdGUgYXBsU3luY0NvdWNoQXV0byA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmxhZ1N5bmNDb3VjaCgpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGxldCBjb25maWc7XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uTTNIVUJTICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXSAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IG51bGwgJiYgY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGNvbmZpZy5TeW5jQ291Y2hBdXRvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcblxyXG4gICAgICAgIHRoaXMuaWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJhZGFwdGVyXCIpXHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmRhdGFiYXNlLmFkYXB0ZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBzeW5jQ291Y2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlka2F0aW9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hcGxTeW5jQ291Y2hBdXRvID0gdGhpcy5nZXRGbGFnU3luY0NvdWNoKCk7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0aGlzLmFwbFN5bmNDb3VjaEF1dG8sXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBDT0RTIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gQ09EUyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KCkge1xyXG4gICAgICAgIHZhciByZXNwdWVzdGE7XHJcbiAgICAgICAgcmVzcHVlc3RhID0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hQcm9tb2Npb25lc1NlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHByaXZhdGUgZWxlbWVudFJlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwicHJvbW9jaW9uZXNfXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgICAgICAvL3RoaXMuc3luYyh0aGlzLkdldFNlcnZlcihzSWRrYXRpb3MpKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKHNJZGthdGlvcyk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTMgKyBcInByb21vY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmNXaXRoREIocmVtb3RlRGF0YWJhc2U6IFBvdWNoREIpIHtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIHN5bmNBd2FpdChyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgICAgICB0aGlzLnN5bmNXaXRoREIocmVtb3RlRGF0YWJhc2UpO1xyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YWJhc2UuY29tcGFjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBjaGFuZ2VzKHJlbW90ZTogc3RyaW5nKXtcclxuICAgIC8vICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUpO1xyXG4gICAgLy8gICAgIHJlbW90ZURhdGFiYXNlLmNoYW5nZXMoe1xyXG4gICAgLy8gICAgICAgICBzaW5jZTogJ25vdycsXHJcbiAgICAvLyAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAvLyAgICAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZVxyXG4gICAgLy8gICAgICAgfSkub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChjaGFuZ2UpIHtcclxuICAgIC8vICAgICAgICAgLy8gY2hhbmdlLmlkIGNvbnRhaW5zIHRoZSBkb2MgaWQsIGNoYW5nZS5kb2MgY29udGFpbnMgdGhlIGRvY1xyXG4gICAgLy8gICAgICAgICBpZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgIC8vICAgICAgICAgICAvLyBkb2N1bWVudCB3YXMgZGVsZXRlZFxyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgIC8vIGRvY3VtZW50IHdhcyBhZGRlZC9tb2RpZmllZFxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIGhhbmRsZSBlcnJvcnNcclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGUoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKS50aGVuKGRvYyA9PntcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKGRvYyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlbGVtZW50UmVtb3ZlZCgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmNoYW5nZXMoeyBsaXZlOiB0cnVlLCBzaW5jZTogJ25vdycsIGluY2x1ZGVfZG9jczogdHJ1ZSB9KVxyXG4gICAgICAgIC5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZS5kZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVtLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL3JlbmRlckRvY3NTb21laG93KCk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJlbW92ZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZW07XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCICBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFViaWNhY2lvbmVzU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcz0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJ1YmljYWNpb25lc19cIiArIHNJZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6c3RyaW5nO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInViaWNhY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFVCSUNBQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6c3RyaW5ne1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpe1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZihzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpe1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgIFxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBVQklDQUNJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gVUJJQ0FDSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ2hhbmdlSXRlbSgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmNoYW5nZXMoeyBsaXZlOiB0cnVlLCBzaW5jZTogJ25vdycsIGluY2x1ZGVfZG9jczogdHJ1ZSB9KVxyXG4gICAgICAgIC5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgLy9pZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL3JlbmRlckRvY3NTb21laG93KCk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7aW5jbHVkZV9kb2NzOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7aW5jbHVkZV9kb2NzOiBmYWxzZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zTm90aWZpY2FjaW9uZXNBUFAge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuICAgICAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJub3RpZmljYWNpb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpLnRyaW0oKSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJub3RpZmljYWNpb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpLnRyaW0oKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIEdldERhdGFQb3VjaEJEKGlzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9hcm1hciBrZXkgZGUgZG9jdW1lbnRvIHF1ZSBzZSBxdWllcmUgY29uc3VsdGFyXHJcbiAgICBwdWJsaWMgR2V0S2V5RG9jdW1lbnRvREIoaXNJREthdGlvczogc3RyaW5nLCBpc0RvY3VtZW50bzogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGlzSURLYXRpb3MgKyBcIj9cIiArIGlzRG9jdW1lbnRvO1xyXG4gICAgfVxyXG5cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tCeVRpcG8gfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wYWNrLWJ5LXRpcG9cIjtcclxuaW1wb3J0IHsgTTNQYWNrQnlSZWdsYXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wYWNrLWJ5LXJlZ2xhc1wiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTTNQSXRlbXNXRUIgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTTNQYWNrQnlpcG8ge1xyXG5cclxuXHJcbiAgICBwcml2YXRlIG9wZXJhdG9ycyA9IHtcclxuICAgICAgICAnPCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA8ICtiIH0sXHJcbiAgICAgICAgJz4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgPiArYiB9LFxyXG4gICAgICAgICc8PSc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA8PSArYiB9LFxyXG4gICAgICAgICc+PSc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA+PSArYiB9LFxyXG4gICAgICAgICdJR1VBTCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09IGIgfSxcclxuICAgICAgICAnRElGRic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICE9IGIgfSxcclxuICAgICAgICAnRU4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB9LFxyXG4gICAgICAgICdBTkQnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiIH0sXHJcbiAgICAgICAgJ09SJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfHwgYiB9LFxyXG4gICAgICAgICcqJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRydWUgfSxcclxuICAgICAgICAnTU9EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthICUgK2IgPT0gMCB9LFxyXG4gICAgICAgIC8vIC4uLlxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHNpIGVsIHByb2R1Y3RvIHF1ZSBzZXLDg8KhIGhpam8sIGN1bXBsZSBjb24gbGFzIGNhcmFjdGVyaXN0aWNhc1xyXG4gICAgICogQHBhcmFtIG0zUHJvY1BLRyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJTaUVzVGlwbyhtM1Byb2NQS0c6IFR5cGVNM1ByZEdycCwgcHJvZHVjdG86IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChtM1Byb2NQS0cuTTNQQUNLQllUSVBPLmZpbmQoeCA9PiB4LkRFU1RJTk8gPT0gcHJvZHVjdG8uVElQTykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBsaWNhY2lvbiBkZSByZWdsYXMgZGUgcGFxdWV0ZXMsIHRlbmllbmRvIGVuIGN1ZW50YSBhbCBpbmZvcm1hY2nDg8KzbiBkZWwgcHJvZHVjdG8gaW5ncmVzYWRvLlxyXG4gICAgICogQHBhcmFtIG0zUHJvY1BLRyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0byBcclxuICAgICAqIEBwYXJhbSBvTTNQSXRlbXNXRUIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZW5lcmFWYWxpZGFjaW9uZXMobTNQcm9jUEtHOiBUeXBlTTNQcmRHcnAsIHByb2R1Y3RvOiBUeXBlTTNQcmRHcnAsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYlJlc3A6Ym9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBvTTNQQUNLQllUSVBPOiBNM1ByZFBhY2tCeVRpcG8gPSBtM1Byb2NQS0cuTTNQQUNLQllUSVBPLmZpbmQoeCA9PiB4LkRFU1RJTk8gPT0gcHJvZHVjdG8uVElQTyk7XHJcbiAgICAgICAgICAgIGlmIChvTTNQQUNLQllUSVBPKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgb00zUEFDS0JZVElQTy5NM1BBQ0tSRUdMQVMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUGFja0J5UmVnbGFzOiBNM1BhY2tCeVJlZ2xhcyA9IG9NM1BBQ0tCWVRJUE8uTTNQQUNLUkVHTEFTW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2UgZXN0YSB2YWxpZGFuZG8gZWwgcGFwYSBkZWwgcGFxdWV0ZS5cclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLm9wZXJhdG9yc1tvTTNQYWNrQnlSZWdsYXMuT3BlcmFjaW9uXSh0aGlzLkdldFBhcmFtZXRyb3Mob00zUGFja0J5UmVnbGFzLlBhcmFtMSwgbTNQcm9jUEtHKSAsIHRoaXMuR2V0UGFyYW1ldHJvcyhvTTNQYWNrQnlSZWdsYXMuUGFyYW0yLCBtM1Byb2NQS0cpKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhY2lvbkFjY2lvbihvTTNQYWNrQnlSZWdsYXMuQWNjaW9uLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2h7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFjacODwrNuIGRlIGFjY2lvbiBkZSByZWdsYXMgZGUgcGFxdWV0ZS5cclxuICAgICAqIEBwYXJhbSBzQWNjaW9uIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFZhbGlkYWNpb25BY2Npb24oc0FjY2lvbjpzdHJpbmcsIG9NM1BJdGVtc1dFQjpNM1BJdGVtc1dFQil7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBpZihzQWNjaW9uICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvQWNjaW9uOmFueSA9IEpTT04ucGFyc2Uoc0FjY2lvbik7XHJcbiAgICAgICAgICAgICAgICBpZihvQWNjaW9uLkFjY2lvbil7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9BY2Npb24uQWNjaW9uKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNhbnRpZGFkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gb0FjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1jYXRjaChleCl7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpw4PCs24gZGUgcGFyYW1ldHJvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhcyByZWdsYXMuXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1ldHJvIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3RvIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEdldFBhcmFtZXRyb3MocGFyYW1ldHJvOiBzdHJpbmcsIHByb2R1Y3RvOiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICB2YXIgc1BhcmFtOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByZWdsYTogc3RyaW5nID0gcGFyYW1ldHJvLnNwbGl0KFwiX1wiKVswXTtcclxuICAgICAgICAgICAgc3dpdGNoIChyZWdsYS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiQURJXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgc1BhcmFtID0gcHJvZHVjdG8uTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoeCA9PiB4LkFUUklCVVRPID09IHBhcmFtZXRyby5zcGxpdChcIl9cIilbMV0pLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNPTlNUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgc1BhcmFtID0gcGFyYW1ldHJvLnNwbGl0KFwiX1wiKVsxXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVnbGEudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiU0tQXCIpICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJhbSA9IHByb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdW3JlZ2xhXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoe1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNQYXJhbTtcclxuICAgIH1cclxuXHJcblxyXG5cclxufSIsImltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsdHJvc0RpYXJpb09mZkxpbmUge1xyXG4gICAgcHVibGljIEZpbHRyYXJCeUZlY2hhc09mZihEYXRhLCBBZGRUb0RvYzogRnVuY3Rpb24pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcm93czogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgLy92YXIgbmV3Um93cyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgIHZhciBmZWNoYUkgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiRmVjaGFJdENPRkZcIik7XHJcbiAgICAgICAgICAgIHZhciBmZWNoYUYgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiRmVjaGFGdENPRkZcIik7XHJcbiAgICAgICAgICAgIHJvd3MgPSBEYXRhLnJvd3M7XHJcblxyXG4gICAgICAgICAgICBpZiAoZmVjaGFGICYmIGZlY2hhSSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGlGSW5pY2lvID0gdGhpcy5HZXRGZWNoYU51bWJlcihmZWNoYUkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGlGRmluYWwgPSB0aGlzLkdldEZlY2hhTnVtYmVyKGZlY2hhRik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpRkluaWNpbylcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGlGRmluYWwpXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNwOiBhbnkgPSByb3dzW2ldLmRvYztcclxuICAgICAgICAgICAgICAgICAgICBpZiAobTNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmZWNoYVByb2MgPSB0aGlzLkdldEZlY2hhTnVtYmVyKG0zcC5GZWNoYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZmVjaGFQcm9jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoK2ZlY2hhUHJvYyA+PSAraUZJbmljaW8gJiYgK2ZlY2hhUHJvYyA8PSAraUZGaW5hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXdSb3dzLnB1c2gocm93c1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRUb0RvYyhtM3ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmlsdHJhckJ5RmVjaGFzT2ZmXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgRmlsdHJhckJ5VGV4dG8oRGF0YSwgc1RleHRvOiBzdHJpbmcsIEFkZFRvRG9jOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByb3dzOiBBcnJheTxhbnk+O1xyXG5cclxuICAgICAgICAgICAgcm93cyA9IERhdGEucm93cztcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbTNwOiBhbnkgPSByb3dzW2ldLmRvYztcclxuICAgICAgICAgICAgICAgIGlmIChtM3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobTNwLklkTTMuaW5jbHVkZXMoc1RleHRvKSB8fCAobTNwLm5kb2NVQWN0aXZvICYmIG0zcC5uZG9jVUFjdGl2by5pbmNsdWRlcyhzVGV4dG8pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25ld1Jvd3MucHVzaChyb3dzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkVG9Eb2MobTNwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaWx0cmFyQnlGZWNoYXNPZmZcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgR2V0RmVjaGFOdW1iZXIoc2RhdGU6IHN0cmluZykge1xyXG4gICAgICAgIC8vdmFyIGRhdGUgPSBuZXcgRGF0ZShzZGF0ZSk7XHJcbiAgICAgICAgdmFyIGQgPSBtb21lbnQoc2RhdGUpLmZvcm1hdCgnWVlZWU1NREQnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG4vLyBASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFBlcnhpcG8ge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCkge1xyXG5cclxuICAgICAgICBzSWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwicGVyeHRpcG9fXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInBlcnh0aXBvX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBwZXJ4dGlwbyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHJldHJ5OiBmYWxzZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gcGVyeHRpcG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIHBlcnh0aXBvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuLy8gQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ291Y2hEaW5hbUJ5UHJvY2Vzb3Mge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImRpbmFteHByb2NfXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImRpbmFteHByb2NfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIGRpbmFteHByb2NfICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICBcclxufVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV0cnk6IGZhbHNlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBkaW5hbXhwcm9jXyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gZGluYW14cHJvY18gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3Moe2luY2x1ZGVfZG9jczogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YT0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcbn0iXSwibmFtZXMiOlsibW9tZW50IiwidHNsaWJfMS5fX3ZhbHVlcyIsIl8uY2xvbmVEZWVwIiwiUG9zdFNlcnZpY2VNMyIsInRzbGliXzEuX19kZWNvcmF0ZSIsInRzbGliXzEuX19wYXJhbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztJQXNCSSx1QkFDWSxNQUNBO1FBREEsU0FBSSxHQUFKLElBQUk7UUFDSixlQUFVLEdBQVYsVUFBVTtRQUVsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7S0FDdkI7Ozs7SUFFTSxvQ0FBWTs7Ozs7UUFFZixJQUFJLElBQUksQ0FBTTs7UUFDZCxJQUFJLFdBQVcsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZELElBQUksV0FBVyxFQUFFOztZQUNiLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUMsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzlCLElBQUksR0FBRyxXQUFXLENBQUM7YUFDdEI7U0FDSjthQUNJO1lBQ0QsSUFBSSxHQUFHLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ3REO1FB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