dmencu 3.2.21 → 3.4.0

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 (258) hide show
  1. package/README.md +42 -42
  2. package/ayuda/asignacion.md +16 -0
  3. package/ayuda/circuito-encuesta.md +27 -0
  4. package/ayuda/control.md +13 -0
  5. package/ayuda/dm-cambiar-modo.md +16 -0
  6. package/ayuda/dm-relevamiento.md +20 -0
  7. package/ayuda/dm-sincronizar.md +18 -0
  8. package/ayuda/fin-de-campo.md +14 -0
  9. package/ayuda/metadatos.md +14 -0
  10. package/ayuda/procesar.md +13 -0
  11. package/ayuda/recepcion.md +20 -0
  12. package/ayuda/supervision.md +9 -0
  13. package/ayuda/usuarios.md +12 -0
  14. package/ayuda/varios.md +23 -0
  15. package/dist/client/client/client.js +101 -4
  16. package/dist/client/client/css/menu.styl +29 -0
  17. package/dist/client/unlogged/abrir-formulario.js +1 -1
  18. package/dist/client/unlogged/bypass-formulario.d.ts +6 -42
  19. package/dist/client/unlogged/bypass-formulario.js +84 -219
  20. package/dist/client/unlogged/calculos-encuesta.js +112 -38
  21. package/dist/client/unlogged/css/formulario-react.styl +9 -0
  22. package/dist/client/unlogged/helpers-casilleros.d.ts +1 -1
  23. package/dist/client/unlogged/helpers-casilleros.js +12 -18
  24. package/dist/client/unlogged/helpers-formulario.d.ts +16 -0
  25. package/dist/client/unlogged/helpers-formulario.js +88 -0
  26. package/dist/client/unlogged/redux-formulario.d.ts +1 -2
  27. package/dist/client/unlogged/redux-formulario.js +21 -31
  28. package/dist/client/unlogged/render-config.d.ts +5 -1
  29. package/dist/client/unlogged/render-config.js +14 -1
  30. package/dist/client/unlogged/render-formulario.d.ts +3 -6
  31. package/dist/client/unlogged/render-formulario.js +71 -69
  32. package/dist/client/unlogged/render-formulario.tsx +100 -57
  33. package/dist/client/unlogged/render-general.d.ts +2 -0
  34. package/dist/client/unlogged/render-general.js +2 -1
  35. package/dist/client/unlogged/render-general.tsx +2 -1
  36. package/dist/client/unlogged/render-init.d.ts +1 -0
  37. package/dist/client/unlogged/render-init.js +9 -2
  38. package/dist/client/unlogged/tipos.d.ts +93 -41
  39. package/dist/client/unlogged/tipos.js +1 -1
  40. package/dist/server/app-dmencu.d.ts +1435 -0
  41. package/dist/server/app-dmencu.js +1091 -0
  42. package/dist/server/ayuda.d.ts +19 -0
  43. package/dist/server/ayuda.js +224 -0
  44. package/dist/server/def-config.d.ts +1 -0
  45. package/dist/server/def-config.js +123 -0
  46. package/dist/server/procedures-dmencu.d.ts +43 -0
  47. package/dist/server/procedures-dmencu.js +2313 -0
  48. package/dist/server/server/app-dmencu.d.ts +49 -91
  49. package/dist/server/server/app-dmencu.js +151 -52
  50. package/dist/server/server/ayuda.d.ts +19 -0
  51. package/dist/server/server/ayuda.js +224 -0
  52. package/dist/server/server/procedures-dmencu.d.ts +34 -2
  53. package/dist/server/server/procedures-dmencu.js +93 -51
  54. package/dist/server/server/setters-rea-no-rea.d.ts +13 -0
  55. package/dist/server/server/setters-rea-no-rea.js +35 -0
  56. package/dist/server/server/table-areas.js +4 -4
  57. package/dist/server/server/table-areas_asignacion_general.js +2 -1
  58. package/dist/server/server/table-control_campo.js +4 -4
  59. package/dist/server/server/table-no_rea.js +4 -2
  60. package/dist/server/server/table-no_rea_sup.js +7 -3
  61. package/dist/server/server/table-personal.js +1 -1
  62. package/dist/server/server/table-tareas_tem.js +2 -2
  63. package/dist/server/server/table-tem.js +2 -2
  64. package/dist/server/server/types-dmencu.d.ts +53 -2
  65. package/dist/server/server/types-dmencu.js +2 -1
  66. package/dist/server/setters-rea-no-rea.d.ts +13 -0
  67. package/dist/server/setters-rea-no-rea.js +35 -0
  68. package/dist/server/table-acciones.d.ts +2 -0
  69. package/dist/server/table-acciones.js +45 -0
  70. package/dist/server/table-area_enc_proximas.d.ts +2 -0
  71. package/dist/server/table-area_enc_proximas.js +30 -0
  72. package/dist/server/table-areas.d.ts +4 -0
  73. package/dist/server/table-areas.js +112 -0
  74. package/dist/server/table-areas_asignacion_general.d.ts +2 -0
  75. package/dist/server/table-areas_asignacion_general.js +86 -0
  76. package/dist/server/table-barrios.d.ts +2 -0
  77. package/dist/server/table-barrios.js +35 -0
  78. package/dist/server/table-comunas.d.ts +2 -0
  79. package/dist/server/table-comunas.js +33 -0
  80. package/dist/server/table-control_campo.d.ts +12 -0
  81. package/dist/server/table-control_campo.js +119 -0
  82. package/dist/server/table-control_dias_carga.d.ts +2 -0
  83. package/dist/server/table-control_dias_carga.js +63 -0
  84. package/dist/server/table-control_resumen.d.ts +2 -0
  85. package/dist/server/table-control_resumen.js +19 -0
  86. package/dist/server/table-diccionario.d.ts +2 -0
  87. package/dist/server/table-diccionario.js +32 -0
  88. package/dist/server/table-dictra.d.ts +2 -0
  89. package/dist/server/table-dictra.js +46 -0
  90. package/dist/server/table-dicvar.d.ts +2 -0
  91. package/dist/server/table-dicvar.js +32 -0
  92. package/dist/server/table-encuestadores.d.ts +13 -0
  93. package/dist/server/table-encuestadores.js +75 -0
  94. package/dist/server/table-estados.d.ts +2 -0
  95. package/dist/server/table-estados.js +47 -0
  96. package/dist/server/table-estados_acciones.d.ts +2 -0
  97. package/dist/server/table-estados_acciones.js +40 -0
  98. package/dist/server/table-fracciones.d.ts +2 -0
  99. package/dist/server/table-fracciones.js +37 -0
  100. package/dist/server/table-grilla_hoja_ruta.d.ts +2 -0
  101. package/dist/server/table-grilla_hoja_ruta.js +93 -0
  102. package/dist/server/table-historial_tem.d.ts +2 -0
  103. package/dist/server/table-historial_tem.js +57 -0
  104. package/dist/server/table-hogares.d.ts +2 -0
  105. package/dist/server/table-hogares.js +156 -0
  106. package/dist/server/table-hogares_sup.d.ts +2 -0
  107. package/dist/server/table-hogares_sup.js +191 -0
  108. package/dist/server/table-inconsistencias_cumplen_condicion.d.ts +2 -0
  109. package/dist/server/table-inconsistencias_cumplen_condicion.js +33 -0
  110. package/dist/server/table-manzanas.d.ts +2 -0
  111. package/dist/server/table-manzanas.js +36 -0
  112. package/dist/server/table-mis_encuestadores.d.ts +2 -0
  113. package/dist/server/table-mis_encuestadores.js +77 -0
  114. package/dist/server/table-mis_tareas.d.ts +2 -0
  115. package/dist/server/table-mis_tareas.js +18 -0
  116. package/dist/server/table-mis_tareas_areas.d.ts +2 -0
  117. package/dist/server/table-mis_tareas_areas.js +20 -0
  118. package/dist/server/table-modos_dm.d.ts +2 -0
  119. package/dist/server/table-modos_dm.js +28 -0
  120. package/dist/server/table-no_rea.js +38 -0
  121. package/dist/server/table-no_rea_sup.js +36 -0
  122. package/dist/server/table-operaciones.d.ts +2 -0
  123. package/dist/server/table-operaciones.js +30 -0
  124. package/dist/server/table-parametros.d.ts +2 -0
  125. package/dist/server/table-parametros.js +40 -0
  126. package/dist/server/table-permisos.d.ts +2 -0
  127. package/dist/server/table-permisos.js +31 -0
  128. package/dist/server/table-personal.d.ts +5 -0
  129. package/dist/server/table-personal.js +62 -0
  130. package/dist/server/table-personal_rol.d.ts +2 -0
  131. package/dist/server/table-personal_rol.js +42 -0
  132. package/dist/server/table-personas.d.ts +2 -0
  133. package/dist/server/table-personas.js +448 -0
  134. package/dist/server/table-personas_sup.d.ts +2 -0
  135. package/dist/server/table-personas_sup.js +93 -0
  136. package/dist/server/table-radios.d.ts +2 -0
  137. package/dist/server/table-radios.js +37 -0
  138. package/dist/server/table-rea.d.ts +2 -0
  139. package/dist/server/table-rea.js +38 -0
  140. package/dist/server/table-rea_sup.d.ts +2 -0
  141. package/dist/server/table-rea_sup.js +38 -0
  142. package/dist/server/table-recepcionistas.d.ts +2 -0
  143. package/dist/server/table-recepcionistas.js +18 -0
  144. package/dist/server/table-recuperadores.d.ts +2 -0
  145. package/dist/server/table-recuperadores.js +18 -0
  146. package/dist/server/table-roles.d.ts +2 -0
  147. package/dist/server/table-roles.js +33 -0
  148. package/dist/server/table-roles_permisos.d.ts +2 -0
  149. package/dist/server/table-roles_permisos.js +36 -0
  150. package/dist/server/table-roles_subordinados.d.ts +2 -0
  151. package/dist/server/table-roles_subordinados.js +31 -0
  152. package/dist/server/table-semanas.d.ts +2 -0
  153. package/dist/server/table-semanas.js +42 -0
  154. package/dist/server/table-sincronizaciones.d.ts +2 -0
  155. package/dist/server/table-sincronizaciones.js +30 -0
  156. package/dist/server/table-supervisores.d.ts +2 -0
  157. package/dist/server/table-supervisores.js +18 -0
  158. package/dist/server/table-tareas.d.ts +2 -0
  159. package/dist/server/table-tareas.js +48 -0
  160. package/dist/server/table-tareas_areas.d.ts +7 -0
  161. package/dist/server/table-tareas_areas.js +112 -0
  162. package/dist/server/table-tareas_proximas.d.ts +2 -0
  163. package/dist/server/table-tareas_proximas.js +48 -0
  164. package/dist/server/table-tareas_tem.d.ts +14 -0
  165. package/dist/server/table-tareas_tem.js +206 -0
  166. package/dist/server/table-tareas_tem_analisis_campo.d.ts +2 -0
  167. package/dist/server/table-tareas_tem_analisis_campo.js +31 -0
  168. package/dist/server/table-tareas_tem_fin_campo.d.ts +3 -0
  169. package/dist/server/table-tareas_tem_fin_campo.js +56 -0
  170. package/dist/server/table-tareas_tem_ingreso.d.ts +2 -0
  171. package/dist/server/table-tareas_tem_ingreso.js +31 -0
  172. package/dist/server/table-tareas_tem_procesamiento.d.ts +2 -0
  173. package/dist/server/table-tareas_tem_procesamiento.js +34 -0
  174. package/dist/server/table-tareas_tem_recepcion.d.ts +6 -0
  175. package/dist/server/table-tareas_tem_recepcion.js +59 -0
  176. package/dist/server/table-tem.d.ts +3 -0
  177. package/dist/server/table-tem.js +247 -0
  178. package/dist/server/table-tem_asignacion.d.ts +2 -0
  179. package/dist/server/table-tem_asignacion.js +50 -0
  180. package/dist/server/table-tem_borradas.d.ts +2 -0
  181. package/dist/server/table-tem_borradas.js +35 -0
  182. package/dist/server/table-usuarios.d.ts +2 -0
  183. package/dist/server/table-usuarios.js +63 -0
  184. package/dist/server/table-visitas.d.ts +2 -0
  185. package/dist/server/table-visitas.js +91 -0
  186. package/dist/server/table-visitas_sup.d.ts +2 -0
  187. package/dist/server/table-visitas_sup.js +91 -0
  188. package/dist/server/table-viviendas.d.ts +2 -0
  189. package/dist/server/table-viviendas.js +299 -0
  190. package/dist/server/types-dmencu.d.ts +114 -0
  191. package/dist/server/types-dmencu.js +34 -0
  192. package/dist/server/unlogged/tipos.d.ts +93 -41
  193. package/dist/server/unlogged/tipos.js +1 -1
  194. package/dist/test/app-para-tests.d.ts +1117 -0
  195. package/dist/test/app-para-tests.js +95 -0
  196. package/dist/test/test-ayuda.d.ts +1 -0
  197. package/dist/test/test-ayuda.js +183 -0
  198. package/dist/test/test-caches-rea.d.ts +1 -0
  199. package/dist/test/test-caches-rea.js +243 -0
  200. package/dist/test/test-helpers-casilleros.d.ts +1 -0
  201. package/dist/test/test-helpers-casilleros.js +154 -0
  202. package/dist/test/test-helpers-formulario.d.ts +1 -0
  203. package/dist/test/test-helpers-formulario.js +95 -0
  204. package/dist/test/test-impacto-rea-no-rea-en-bd.d.ts +1 -0
  205. package/dist/test/test-impacto-rea-no-rea-en-bd.js +243 -0
  206. package/dist/test/test-menu-segun-rol.d.ts +1 -0
  207. package/dist/test/test-menu-segun-rol.js +170 -0
  208. package/dist/test/test-setters-rea-no-rea.d.ts +1 -0
  209. package/dist/test/test-setters-rea-no-rea.js +95 -0
  210. package/dist/test/test.d.ts +7 -0
  211. package/dist/test/test.js +9 -2
  212. package/dist/unlogged/helpers-casilleros.d.ts +1 -1
  213. package/dist/unlogged/helpers-casilleros.js +12 -18
  214. package/dist/unlogged/helpers-formulario.d.ts +16 -0
  215. package/dist/unlogged/helpers-formulario.js +88 -0
  216. package/dist/unlogged/tipos.d.ts +20 -2
  217. package/dist/unlogged/tipos.js +1 -1
  218. package/dist/unlogged/unlogged/abrir-formulario.js +1 -1
  219. package/dist/unlogged/unlogged/bypass-formulario.d.ts +6 -42
  220. package/dist/unlogged/unlogged/bypass-formulario.js +84 -219
  221. package/dist/unlogged/unlogged/css/formulario-react.styl +9 -0
  222. package/dist/unlogged/unlogged/helpers-casilleros.js +7 -14
  223. package/dist/unlogged/unlogged/helpers-formulario.d.ts +16 -0
  224. package/dist/unlogged/unlogged/helpers-formulario.js +88 -0
  225. package/dist/unlogged/unlogged/redux-formulario.d.ts +1 -2
  226. package/dist/unlogged/unlogged/redux-formulario.js +21 -31
  227. package/dist/unlogged/unlogged/render-config.d.ts +5 -1
  228. package/dist/unlogged/unlogged/render-config.js +14 -1
  229. package/dist/unlogged/unlogged/render-formulario.d.ts +3 -6
  230. package/dist/unlogged/unlogged/render-formulario.js +71 -69
  231. package/dist/unlogged/unlogged/render-formulario.tsx +100 -57
  232. package/dist/unlogged/unlogged/render-general.d.ts +2 -0
  233. package/dist/unlogged/unlogged/render-general.js +2 -1
  234. package/dist/unlogged/unlogged/render-general.tsx +2 -1
  235. package/dist/unlogged/unlogged/render-init.d.ts +1 -0
  236. package/dist/unlogged/unlogged/render-init.js +9 -2
  237. package/dist/unlogged/unlogged/tipos.d.ts +93 -41
  238. package/dist/unlogged/unlogged/tipos.js +1 -1
  239. package/dist/unlogged/unlogged/unlogged.js +15 -2
  240. package/install/accion_cumple_condicion.sql +1 -1
  241. package/install/generador_accion_cumple_condicion.sql +2 -2
  242. package/install/tarea_cumple_condicion.sql +1 -1
  243. package/install/xcalcular_resultado_trg.sql +1 -1
  244. package/package.json +24 -18
  245. package/dist/server/server/table-no_rea copy.js +0 -38
  246. package/dist/server/server/table-no_rea_sup copy.js +0 -36
  247. package/dist/unlogged/bypass-formulario.d.ts +0 -198
  248. package/dist/unlogged/bypass-formulario.js +0 -1226
  249. package/dist/unlogged/redux-formulario.d.ts +0 -440
  250. package/dist/unlogged/redux-formulario.js +0 -324
  251. package/dist/unlogged/render-config.d.ts +0 -52
  252. package/dist/unlogged/render-config.js +0 -161
  253. package/dist/unlogged/unlogged/bypass-formulario copy.d.ts +0 -198
  254. package/dist/unlogged/unlogged/bypass-formulario copy.js +0 -1226
  255. package/dist/unlogged/unlogged/helpers.d.ts +0 -14
  256. package/dist/unlogged/unlogged/helpers.js +0 -129
  257. /package/dist/server/{server/table-no_rea copy.d.ts → table-no_rea.d.ts} +0 -0
  258. /package/dist/server/{server/table-no_rea_sup copy.d.ts → table-no_rea_sup.d.ts} +0 -0
@@ -0,0 +1,1091 @@
1
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
2
+ if (k2 === undefined) k2 = k;
3
+ var desc = Object.getOwnPropertyDescriptor(m, k);
4
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
5
+ desc = { enumerable: true, get: function() { return m[k]; } };
6
+ }
7
+ Object.defineProperty(o, k2, desc);
8
+ }) : (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ o[k2] = m[k];
11
+ }));
12
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
13
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
14
+ };
15
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
16
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
17
+ return new (P || (P = Promise))(function (resolve, reject) {
18
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
19
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
20
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
21
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
22
+ });
23
+ };
24
+ (function (factory) {
25
+ if (typeof module === "object" && typeof module.exports === "object") {
26
+ var v = factory(require, exports);
27
+ if (v !== undefined) module.exports = v;
28
+ }
29
+ else if (typeof define === "function" && define.amd) {
30
+ define(["require", "exports", "procesamiento", "./procedures-dmencu", "./ayuda", "pg-promise-strict", "mini-tools", "cast-error", "yazl", "express", "fs", "path", "./table-roles", "./table-personal", "./table-recepcionistas", "./table-encuestadores", "./table-encuestadores", "./table-encuestadores", "./table-encuestadores", "./table-mis_encuestadores", "./table-recuperadores", "./table-supervisores", "./table-personal_rol", "./table-permisos", "./table-roles_permisos", "./table-modos_dm", "./table-parametros", "./table-roles_subordinados", "./table-no_rea", "./table-no_rea_sup", "./table-rea", "./table-rea_sup", "./table-tem", "./table-semanas", "./table-usuarios", "./table-operaciones", "./table-comunas", "./table-areas", "./table-sincronizaciones", "./table-tareas", "./table-tareas_tem", "./table-tareas_areas", "./table-areas_asignacion_general", "./table-grilla_hoja_ruta", "./table-tareas_areas", "./table-tareas_areas", "./table-tareas_areas", "./table-tareas_areas", "./table-mis_tareas", "./table-tem_asignacion", "./table-tareas_tem_recepcion", "./table-tareas_tem_ingreso", "./table-tareas_tem_fin_campo", "./table-tareas_tem_procesamiento", "./table-tareas_tem_analisis_campo", "./table-mis_tareas_areas", "./table-control_campo", "./table-control_resumen", "./table-control_dias_carga", "./table-viviendas", "./table-visitas", "./table-hogares", "./table-personas", "./table-visitas_sup", "./table-hogares_sup", "./table-personas_sup", "./table-diccionario", "./table-dictra", "./table-dicvar", "./table-estados", "./table-acciones", "./table-estados_acciones", "./table-tareas_proximas", "./table-historial_tem", "./table-inconsistencias_cumplen_condicion", "./table-tem_borradas", "./table-barrios", "./table-fracciones", "./table-radios", "./table-manzanas", "./table-area_enc_proximas", "./types-dmencu", "./ayuda", "./def-config", "best-globals"], factory);
31
+ }
32
+ })(function (require, exports) {
33
+ "use strict";
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.AppDmEncu = exports.TABLAS_REA_NO_REA = exports.TABLAS_ESTRUCTURA = void 0;
36
+ exports.getModoByPolicy = getModoByPolicy;
37
+ exports.permisosSegunUsuario = permisosSegunUsuario;
38
+ exports.quienConsultaAyuda = quienConsultaAyuda;
39
+ exports.refrescarEstructuraAlModificarTabla = refrescarEstructuraAlModificarTabla;
40
+ exports.emergeAppDmEncu = emergeAppDmEncu;
41
+ const procesamiento_1 = require("procesamiento");
42
+ const procedures_dmencu_1 = require("./procedures-dmencu");
43
+ const ayuda_1 = require("./ayuda");
44
+ const pg = require("pg-promise-strict");
45
+ const miniTools = require("mini-tools");
46
+ const cast_error_1 = require("cast-error");
47
+ const yazl = require("yazl");
48
+ const express = require("express");
49
+ const fs_1 = require("fs");
50
+ const path = require("path");
51
+ const table_roles_1 = require("./table-roles");
52
+ const table_personal_1 = require("./table-personal");
53
+ const table_recepcionistas_1 = require("./table-recepcionistas");
54
+ const table_encuestadores_1 = require("./table-encuestadores");
55
+ const table_encuestadores_2 = require("./table-encuestadores");
56
+ const table_encuestadores_3 = require("./table-encuestadores");
57
+ const table_encuestadores_4 = require("./table-encuestadores");
58
+ const table_mis_encuestadores_1 = require("./table-mis_encuestadores");
59
+ const table_recuperadores_1 = require("./table-recuperadores");
60
+ const table_supervisores_1 = require("./table-supervisores");
61
+ const table_personal_rol_1 = require("./table-personal_rol");
62
+ const table_permisos_1 = require("./table-permisos");
63
+ const table_roles_permisos_1 = require("./table-roles_permisos");
64
+ const table_modos_dm_1 = require("./table-modos_dm");
65
+ const table_parametros_1 = require("./table-parametros");
66
+ const table_roles_subordinados_1 = require("./table-roles_subordinados");
67
+ const table_no_rea_1 = require("./table-no_rea");
68
+ const table_no_rea_sup_1 = require("./table-no_rea_sup");
69
+ const table_rea_1 = require("./table-rea");
70
+ const table_rea_sup_1 = require("./table-rea_sup");
71
+ const table_tem_1 = require("./table-tem");
72
+ const table_semanas_1 = require("./table-semanas");
73
+ const table_usuarios_1 = require("./table-usuarios");
74
+ const table_operaciones_1 = require("./table-operaciones");
75
+ const table_comunas_1 = require("./table-comunas");
76
+ const table_areas_1 = require("./table-areas");
77
+ const table_sincronizaciones_1 = require("./table-sincronizaciones");
78
+ const table_tareas_1 = require("./table-tareas");
79
+ const table_tareas_tem_1 = require("./table-tareas_tem");
80
+ const table_tareas_areas_1 = require("./table-tareas_areas");
81
+ const table_areas_asignacion_general_1 = require("./table-areas_asignacion_general");
82
+ const table_grilla_hoja_ruta_1 = require("./table-grilla_hoja_ruta");
83
+ const table_tareas_areas_2 = require("./table-tareas_areas");
84
+ const table_tareas_areas_3 = require("./table-tareas_areas");
85
+ const table_tareas_areas_4 = require("./table-tareas_areas");
86
+ const table_tareas_areas_5 = require("./table-tareas_areas");
87
+ const table_mis_tareas_1 = require("./table-mis_tareas");
88
+ const table_tem_asignacion_1 = require("./table-tem_asignacion");
89
+ const table_tareas_tem_recepcion_1 = require("./table-tareas_tem_recepcion");
90
+ const table_tareas_tem_ingreso_1 = require("./table-tareas_tem_ingreso");
91
+ const table_tareas_tem_fin_campo_1 = require("./table-tareas_tem_fin_campo");
92
+ const table_tareas_tem_procesamiento_1 = require("./table-tareas_tem_procesamiento");
93
+ const table_tareas_tem_analisis_campo_1 = require("./table-tareas_tem_analisis_campo");
94
+ const table_mis_tareas_areas_1 = require("./table-mis_tareas_areas");
95
+ const table_control_campo_1 = require("./table-control_campo");
96
+ const table_control_resumen_1 = require("./table-control_resumen");
97
+ const table_control_dias_carga_1 = require("./table-control_dias_carga");
98
+ const table_viviendas_1 = require("./table-viviendas");
99
+ const table_visitas_1 = require("./table-visitas");
100
+ const table_hogares_1 = require("./table-hogares");
101
+ const table_personas_1 = require("./table-personas");
102
+ const table_visitas_sup_1 = require("./table-visitas_sup");
103
+ const table_hogares_sup_1 = require("./table-hogares_sup");
104
+ const table_personas_sup_1 = require("./table-personas_sup");
105
+ const table_diccionario_1 = require("./table-diccionario");
106
+ const table_dictra_1 = require("./table-dictra");
107
+ const table_dicvar_1 = require("./table-dicvar");
108
+ const table_estados_1 = require("./table-estados");
109
+ const table_acciones_1 = require("./table-acciones");
110
+ const table_estados_acciones_1 = require("./table-estados_acciones");
111
+ const table_tareas_proximas_1 = require("./table-tareas_proximas");
112
+ const table_historial_tem_1 = require("./table-historial_tem");
113
+ const table_inconsistencias_cumplen_condicion_1 = require("./table-inconsistencias_cumplen_condicion");
114
+ const table_tem_borradas_1 = require("./table-tem_borradas");
115
+ const table_barrios_1 = require("./table-barrios");
116
+ const table_fracciones_1 = require("./table-fracciones");
117
+ const table_radios_1 = require("./table-radios");
118
+ const table_manzanas_1 = require("./table-manzanas");
119
+ const table_area_enc_proximas_1 = require("./table-area_enc_proximas");
120
+ __exportStar(require("./types-dmencu"), exports);
121
+ __exportStar(require("./ayuda"), exports);
122
+ const def_config_1 = require("./def-config");
123
+ const best_globals_1 = require("best-globals");
124
+ const APP_DM_VERSION = "#22-12-15";
125
+ function getModoByPolicy(be) {
126
+ return be.config.server.policy == 'web' ? 'RELEVAMIENTO' : 'GABINETE';
127
+ }
128
+ // permisos que getContext agrega al contexto según el usuario logueado (o la falta de usuario)
129
+ function permisosSegunUsuario(caches, user) {
130
+ if (user == null) {
131
+ return { puede: caches.permisosParaNadie };
132
+ }
133
+ var rol = user.rol;
134
+ var permisosDelRol = rol != null ? caches.permisosRol[rol] : undefined;
135
+ if (permisosDelRol === null || permisosDelRol === void 0 ? void 0 : permisosDelRol.superuser) {
136
+ return { superuser: true, puede: caches.permisosSuperuser };
137
+ }
138
+ return { puede: permisosDelRol === null || permisosDelRol === void 0 ? void 0 : permisosDelRol.puede };
139
+ }
140
+ // lo que decide qué temas de ayuda ve el usuario: su rol, sus permisos y el modo de la instancia
141
+ function quienConsultaAyuda(context) {
142
+ var _a, _b;
143
+ return {
144
+ rol: (_b = (_a = context.user) === null || _a === void 0 ? void 0 : _a.rol) !== null && _b !== void 0 ? _b : null,
145
+ superuser: !!context.superuser,
146
+ puede: context.puede,
147
+ modo: getModoByPolicy(context.be),
148
+ };
149
+ }
150
+ // tablas cuya modificación cambia la estructura que se manda a los dispositivos (ver operativo_estructura_completa)
151
+ exports.TABLAS_ESTRUCTURA = ['casilleros', 'semanas'];
152
+ // tablas de rea/no rea, que además se guardan en be.caches.tableContent (ver refreshCaches)
153
+ exports.TABLAS_REA_NO_REA = ['rea', 'no_rea', 'rea_sup', 'no_rea_sup'];
154
+ // envuelve table_record_save/table_record_delete para que al modificar esas tablas los dispositivos
155
+ // reciban la estructura nueva (timestampEstructura) y, si son de rea/no rea, se recarguen las caches
156
+ // con el mismo cliente (dentro de la misma transacción)
157
+ function refrescarEstructuraAlModificarTabla(be, coreFunction) {
158
+ return function (context, parameters, ...resto) {
159
+ return __awaiter(this, void 0, void 0, function* () {
160
+ var result = yield coreFunction(context, parameters, ...resto);
161
+ if (exports.TABLAS_ESTRUCTURA.includes(parameters.table)) {
162
+ be.caches.timestampEstructura = new Date().getTime();
163
+ console.log('se tocó la estructura', be.caches.timestampEstructura);
164
+ }
165
+ if (exports.TABLAS_REA_NO_REA.includes(parameters.table)) {
166
+ be.caches.timestampEstructura = new Date().getTime();
167
+ yield be.refreshCaches(context.client);
168
+ }
169
+ return result;
170
+ });
171
+ };
172
+ }
173
+ const registrarCronJobPasarAProie = (be) => __awaiter(void 0, void 0, void 0, function* () {
174
+ const ejecutarPasaje = () => __awaiter(void 0, void 0, void 0, function* () {
175
+ const log = (msg, data = '') => console.log(`${best_globals_1.datetime.now().toYmdHms()} [CRON:PROIE] ${msg}`, data);
176
+ try {
177
+ log('🚀 inicia cron pasaje a proie');
178
+ var result = yield be.inTransaction(null, (client) => __awaiter(void 0, void 0, void 0, function* () {
179
+ return yield (0, procedures_dmencu_1.pasarEncuestasAProie)(client);
180
+ }));
181
+ log('✅ result proc pasaje a proie:', result);
182
+ }
183
+ catch (err) {
184
+ var error = (0, cast_error_1.unexpected)(err);
185
+ log(`❌ error pasaje a proie: ${error.message}`);
186
+ }
187
+ finally {
188
+ log('🏁 termina cron proie');
189
+ }
190
+ });
191
+ yield ejecutarPasaje();
192
+ const interval = setInterval(ejecutarPasaje, 1000 * 60 * 60);
193
+ be.shutdownCallbackListAdd({
194
+ message: 'apaga cron pasar a proie',
195
+ fun: function () {
196
+ return __awaiter(this, void 0, void 0, function* () {
197
+ clearInterval(interval);
198
+ return Promise.resolve();
199
+ });
200
+ }
201
+ });
202
+ });
203
+ const getManifestImageIcons = (APP_NAME, sufijo) => [
204
+ {
205
+ "src": `../img/${APP_NAME}-logo-dm-32${sufijo}.png`,
206
+ "sizes": "32x32",
207
+ "type": "image/png"
208
+ },
209
+ {
210
+ "src": `../img/${APP_NAME}-logo-dm-48${sufijo}.png`,
211
+ "sizes": "48x48",
212
+ "type": "image/png"
213
+ },
214
+ {
215
+ "src": `../img/${APP_NAME}-logo-dm-64${sufijo}.png`,
216
+ "sizes": "64x64",
217
+ "type": "image/png"
218
+ },
219
+ {
220
+ "src": `../img/${APP_NAME}-logo-dm-72${sufijo}.png`,
221
+ "sizes": "72x72",
222
+ "type": "image/png"
223
+ },
224
+ {
225
+ "src": `../img/${APP_NAME}-logo-dm-192${sufijo}.png`,
226
+ "sizes": "192x192",
227
+ "type": "image/png"
228
+ },
229
+ {
230
+ "src": `../img/${APP_NAME}-logo-dm-512${sufijo}.png`,
231
+ "sizes": "512x512",
232
+ "type": "image/png"
233
+ }
234
+ ];
235
+ function emergeAppDmEncu(Base) {
236
+ return class AppDmEncu extends Base {
237
+ constructor(...args) {
238
+ super(args);
239
+ this.getSufijoFrombaseUrl = (baseUrl) => baseUrl.includes('test') || baseUrl.includes('/pr') ? '_test' :
240
+ baseUrl.includes('capa') ? '_capa' : '';
241
+ this.getAppName = () => __awaiter(this, void 0, void 0, function* () {
242
+ var be = this;
243
+ return (yield be.inTransaction(null, (client) => client.query("select operativo from parametros where unico_registro").fetchUniqueValue())).value;
244
+ });
245
+ this.caches.tableContent = this.caches.tableContent || {};
246
+ this.caches.tableContent.no_rea = [];
247
+ this.caches.tableContent.no_rea_groups = [];
248
+ this.caches.metaEncIncluirCasillerosSaltoREL = false;
249
+ this.caches.timestampEstructura = new Date().getTime();
250
+ this.caches.tableContent.conReaHogar = {};
251
+ this.caches.ayuda = [];
252
+ }
253
+ // backend-plus lo declara sin parámetros pero lo llama con (context, usuario), por eso son opcionales
254
+ canChangePass(reqOrContext, userToChangePass) {
255
+ return __awaiter(this, void 0, void 0, function* () {
256
+ var be = this;
257
+ var usuarioLogueado = reqOrContext === null || reqOrContext === void 0 ? void 0 : reqOrContext.user;
258
+ if (reqOrContext == null || usuarioLogueado == null) {
259
+ return false;
260
+ }
261
+ var rol = usuarioLogueado.rol;
262
+ var result = yield be.inDbClient(null, (client) => __awaiter(this, void 0, void 0, function* () {
263
+ var q = be.db.quoteLiteral;
264
+ return (yield client.query(`
265
+ select *
266
+ from usuarios
267
+ where rol in (select rol_subordinado from roles_subordinados where rol = ${q(rol)})`).fetchAll()).rows;
268
+ }));
269
+ var puede = !!result.find((user) => user.usuario == userToChangePass);
270
+ var isAdmin = be.isAdmin(reqOrContext);
271
+ return isAdmin || puede;
272
+ });
273
+ }
274
+ getProcedures() {
275
+ const _super = Object.create(null, {
276
+ getProcedures: { get: () => super.getProcedures }
277
+ });
278
+ return __awaiter(this, void 0, void 0, function* () {
279
+ var be = this;
280
+ var procedimientoAReemplazar = ["caso_guardar", "caso_traer"];
281
+ var parentProc = yield _super.getProcedures.call(this);
282
+ parentProc = parentProc.filter((procedure) => !procedimientoAReemplazar.includes(procedure.action));
283
+ parentProc = parentProc.map(procDef => {
284
+ if (procDef.action == 'table_record_save' || procDef.action == 'table_record_delete') {
285
+ procDef.coreFunction = refrescarEstructuraAlModificarTabla(be, procDef.coreFunction);
286
+ }
287
+ return procDef;
288
+ });
289
+ return parentProc.concat(procedures_dmencu_1.ProceduresDmEncu);
290
+ });
291
+ }
292
+ checkDatabaseStructure(_client) {
293
+ return __awaiter(this, void 0, void 0, function* () {
294
+ });
295
+ }
296
+ addSchrödingerServices(mainApp, baseUrl) {
297
+ let be = this;
298
+ super.addSchrödingerServices(mainApp, baseUrl);
299
+ //permito levantar mis imagenes en aplicaciones dependientes
300
+ be.app.use('/img', express.static('node_modules/dmencu/dist/unlogged/unlogged/img'));
301
+ mainApp.use(function (req, _res, next) {
302
+ if (req.session && !req.session.install) {
303
+ req.session.install = Math.random().toString().replace('.', '');
304
+ }
305
+ next();
306
+ });
307
+ mainApp.get(baseUrl + '/salvar', function (req, res, _next) {
308
+ // @ts-ignore sé que voy a recibir useragent por los middlewares de Backend-plus
309
+ var { useragent } = req;
310
+ var htmlMain = be.mainPage({ useragent }, false, { skipMenu: true, offlineFile: true }).toHtmlDoc();
311
+ miniTools.serveText(htmlMain, 'html')(req, res);
312
+ });
313
+ mainApp.get(baseUrl + '/campo', function (req, res, _next) {
314
+ // @ts-ignore sé que voy a recibir useragent por los middlewares de Backend-plus
315
+ var { useragent, user } = req;
316
+ if (user) {
317
+ /** @type {{type:'js', src:string}[]} */
318
+ var webManifestPath = 'carga-dm/web-manifest.webmanifest';
319
+ var htmlMain = be.mainPage({ useragent, user }, false, { skipMenu: true, webManifestPath, offlineFile: true }).toHtmlDoc();
320
+ miniTools.serveText(htmlMain, 'html')(req, res);
321
+ }
322
+ else {
323
+ res.redirect(401, baseUrl + '/login#w=path&path=/campo');
324
+ }
325
+ });
326
+ mainApp.get(baseUrl + '/fallback-sincro', function (req, res, next) {
327
+ const jsonFallback = {
328
+ ok: false,
329
+ error: {
330
+ message: 'No se logró establecer la conexion con el servidor, compruebe su conexion de internet (respuesta desde fallback)'
331
+ }
332
+ };
333
+ miniTools.serveJson(jsonFallback)(req, res, next);
334
+ });
335
+ var createServiceWorker = function () {
336
+ return __awaiter(this, void 0, void 0, function* () {
337
+ var sw = yield fs_1.promises.readFile('node_modules/service-worker-admin/dist/service-worker-wo-manifest.js', 'utf8');
338
+ var manifest = yield be.createResourcesForCacheJson();
339
+ var swManifest = sw
340
+ .replace("'/*version*/'", JSON.stringify(manifest.version))
341
+ .replace("'/*appName*/'", JSON.stringify(manifest.appName))
342
+ .replace(/\[\s*\/\*urlsToCache\*\/\s*\]/, JSON.stringify(manifest.cache))
343
+ .replace(/\[\s*\/\*fallbacks\*\/\s*\]/, JSON.stringify(manifest.fallbacks || []))
344
+ .replace("'/*defaultFallback*/'", JSON.stringify(manifest.defaultFallback));
345
+ //.replace("/#CACHE$/", "/(a\\d+m\\d+p\\d+t\\d+_estructura.js)|(a\\d+m\\d+p\\d+t\\d+_hdr.json)/");
346
+ return swManifest;
347
+ });
348
+ };
349
+ mainApp.get(baseUrl + `/sw-manifest.js`, function (req, res, next) {
350
+ return __awaiter(this, void 0, void 0, function* () {
351
+ try {
352
+ miniTools.serveText(yield createServiceWorker(), 'application/javascript')(req, res);
353
+ }
354
+ catch (err) {
355
+ miniTools.serveErr(req, res, next)((0, cast_error_1.unexpected)(err));
356
+ }
357
+ });
358
+ });
359
+ mainApp.get(baseUrl + `/carga-dm/web-manifest.webmanifest`, function (req, res, next) {
360
+ return __awaiter(this, void 0, void 0, function* () {
361
+ const APP_NAME = yield be.getAppName();
362
+ const sufijo = be.getSufijoFrombaseUrl(baseUrl);
363
+ try {
364
+ const content = Object.assign({ "name": `${APP_NAME}${sufijo} Progressive Web App`, "short_name": `${APP_NAME}${sufijo} PWA`, "description": `Progressive Web App for ${APP_NAME}${sufijo}.`, "icons": getManifestImageIcons(APP_NAME, sufijo) }, be.getColorsJson(sufijo));
365
+ miniTools.serveText(JSON.stringify(content), 'application/json')(req, res);
366
+ }
367
+ catch (err) {
368
+ miniTools.serveErr(req, res, next)((0, cast_error_1.unexpected)(err));
369
+ }
370
+ });
371
+ });
372
+ }
373
+ getColorsJson(_sufijo) {
374
+ return {
375
+ "start_url": "../campo",
376
+ "display": "standalone",
377
+ "theme_color": "#3F51B5",
378
+ "background_color": "#6d60ed"
379
+ };
380
+ }
381
+ addLoggedServices() {
382
+ var be = this;
383
+ super.addLoggedServices();
384
+ be.app.get('/manifest.manifest', function (req, res, _next) {
385
+ return __awaiter(this, void 0, void 0, function* () {
386
+ miniTools.serveFile('src/client/manifest.manifest', {})(req, res);
387
+ });
388
+ });
389
+ this.app.get('/file', function (req, res) {
390
+ return __awaiter(this, void 0, void 0, function* () {
391
+ let result = yield be.inTransaction(req, (client) => client.query("select ruta from adjuntos where id_adjunto = $1", [req.query.id_adjunto])
392
+ .fetchUniqueValue());
393
+ var filePath = result.value;
394
+ miniTools.serveFile(filePath, {})(req, res);
395
+ });
396
+ });
397
+ this.app.get('/imagenes', function (req, res) {
398
+ return __awaiter(this, void 0, void 0, function* () {
399
+ miniTools.serveFile('local-images/' + req.query.pdf, {})(req, res);
400
+ });
401
+ });
402
+ this.app.get('/download/all', function (req, res, next) {
403
+ return __awaiter(this, void 0, void 0, function* () {
404
+ if (req.user == null || req.user.rol != 'admin') {
405
+ console.log('no está autorizado a bajarse todo', req.user);
406
+ return next();
407
+ }
408
+ let zip = new yazl.ZipFile();
409
+ zip.outputStream.pipe(res);
410
+ let base = 'local-attachments';
411
+ let files = yield fs_1.promises.readdir(base);
412
+ yield Promise.all(files.map(function (fileName) {
413
+ return __awaiter(this, void 0, void 0, function* () {
414
+ var filePath = base + '/' + fileName;
415
+ var stat = yield fs_1.promises.stat(filePath);
416
+ if (stat.isFile()) {
417
+ zip.addFile(filePath, fileName);
418
+ }
419
+ });
420
+ }));
421
+ zip.end();
422
+ });
423
+ });
424
+ }
425
+ postConfig() {
426
+ const _super = Object.create(null, {
427
+ postConfig: { get: () => super.postConfig }
428
+ });
429
+ return __awaiter(this, void 0, void 0, function* () {
430
+ yield _super.postConfig.call(this);
431
+ var be = this;
432
+ be.caches.metaEncIncluirCasillerosSaltoREL = false;
433
+ yield be.inTransaction(null, function (client) {
434
+ return __awaiter(this, void 0, void 0, function* () {
435
+ var qPermisos = `
436
+ SELECT jsonb_object_agg(r.rol,jsonb_build_object('superuser',r.superuser,'puede',(
437
+ SELECT jsonb_object_agg(rp.permiso,(
438
+ SELECT jsonb_object_agg(rpa.accion,rpa.habilitado)
439
+ FROM roles_permisos rpa
440
+ WHERE rpa.rol=rp.rol AND rpa.permiso=rp.permiso
441
+ ))
442
+ FROM roles_permisos rp
443
+ WHERE rp.rol=r.rol #condHabilitado#
444
+ )))
445
+ FROM roles r
446
+ `;
447
+ var results = [
448
+ yield client.query(qPermisos.replace('#condHabilitado#', '')).fetchUniqueValue(),
449
+ yield client.query(qPermisos.replace('#condHabilitado#', ` and rp.${pg.quoteIdent('habilitado')}`)).fetchUniqueValue(),
450
+ yield client.query(`
451
+ SELECT jsonb_object_agg(permiso,(
452
+ SELECT jsonb_object_agg(accion,true)
453
+ FROM permisos pa
454
+ WHERE pa.permiso=p.permiso
455
+ ))
456
+ FROM permisos p
457
+ `).fetchUniqueValue(),
458
+ yield client.query(`
459
+ SELECT jsonb_object_agg(permiso,(
460
+ SELECT jsonb_object_agg(accion,false)
461
+ FROM permisos pa
462
+ WHERE pa.permiso=p.permiso
463
+ ))
464
+ FROM permisos p
465
+ `).fetchUniqueValue()
466
+ ];
467
+ be.caches.permisosRol = results[0].value;
468
+ be.caches.permisosRolSoloTrue = results[1].value;
469
+ be.caches.permisosSuperuser = results[2].value;
470
+ be.caches.permisosParaNadie = results[3].value;
471
+ //console.dir(be.caches.permisosRolSoloTrue,{depth:9});
472
+ //console.dir(be.caches.permisosSuperuser,{depth:9});
473
+ //console.dir(be.caches.permisosParaNadie,{depth:9});
474
+ });
475
+ });
476
+ be.caches.ayuda = (0, ayuda_1.cargarAyuda)(be.getAyudaFuentes());
477
+ be.problemasDeAyuda().forEach(problema => console.error(problema));
478
+ yield this.refreshCaches();
479
+ yield registrarCronJobPasarAProie(be);
480
+ });
481
+ }
482
+ // carpetas con la ayuda para usuarios, en orden: un tema de una fuente posterior reemplaza u oculta
483
+ // al de una anterior con el mismo id. Las apps finales agregan la suya (ver docs/ayuda-online.md)
484
+ getAyudaFuentes() {
485
+ return [{ origen: 'dmencu', carpeta: path.join((0, ayuda_1.carpetaDelPaquete)(__dirname), 'ayuda') }];
486
+ }
487
+ // temas de ayuda del modo actual con permisos, roles u opciones de menú que no existen
488
+ problemasDeAyuda() {
489
+ var be = this;
490
+ var modo = getModoByPolicy(be);
491
+ var rutas = [];
492
+ Object.keys(be.caches.permisosRol).forEach(rol => {
493
+ var user = { rol, idper: '', usuario: '' };
494
+ var context = Object.assign(Object.assign({}, permisosSegunUsuario(be.caches, user)), { be, user, session: {}, username: '', machineId: '', navigator: '' });
495
+ rutas = rutas.concat((0, ayuda_1.rutasDelMenu)(be.getMenu(context).menu));
496
+ });
497
+ return (0, ayuda_1.problemasDeAyuda)(be.caches.ayuda.filter(tema => tema.modo == null || tema.modo == modo), be.caches.permisosSuperuser, Object.keys(be.caches.permisosRol), rutas);
498
+ }
499
+ configStaticConfig() {
500
+ super.configStaticConfig();
501
+ this.setStaticConfig(def_config_1.defConfig);
502
+ }
503
+ clientIncludes(req, opts) {
504
+ var be = this;
505
+ var unlogged = opts && opts.offlineFile;
506
+ var menuedResources = unlogged ? [
507
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'unlogged.js', path: 'dmencu' },
508
+ ] : [
509
+ { type: 'js', module: 'dmencu', modPath: '../../client/client', file: 'client.js', path: 'dmencu' },
510
+ ];
511
+ if (opts && opts.extraFiles) {
512
+ menuedResources = menuedResources.concat(opts.extraFiles);
513
+ }
514
+ let externalResources = [
515
+ { type: 'js', module: 'react', modPath: 'umd', file: 'react.production.min.js' },
516
+ { type: 'js', module: 'react-dom', modPath: 'umd', file: 'react-dom.production.min.js' },
517
+ //{ type: 'js', module: '@material-ui/core', modPath: 'umd', fileDevelopment:'material-ui.development.js', file:'material-ui.production.min.js' },
518
+ { type: 'js', module: '@mui/material', modPath: '../umd', file: 'material-ui.production.min.js' },
519
+ { type: 'js', module: 'redux', modPath: '../dist', file: 'redux.min.js' },
520
+ { type: 'js', module: 'react-redux', modPath: '../dist', file: 'react-redux.min.js' },
521
+ //{ type: 'js', module: 'qrcode', modPath: '../build', file: 'qrcode.js'},
522
+ ...super.clientIncludes(req, opts).filter(m => m.file != 'formularios.css')
523
+ .filter(m => !unlogged || true
524
+ && m.file != 'var-cal.js'
525
+ && m.file != 'var-cal.js'),
526
+ { type: 'js', module: 'service-worker-admin', file: 'service-worker-admin.js' },
527
+ { type: 'js', module: 'redux-typed-reducer', modPath: '../dist', file: 'redux-typed-reducer.js' }
528
+ ];
529
+ var resources = [
530
+ ...externalResources,
531
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'adapt.js', path: 'dmencu' },
532
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'tipos.js', path: 'dmencu' },
533
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'helpers-formulario.js', path: 'dmencu' },
534
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'calculos-encuesta.js', path: 'dmencu' },
535
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'render-config.js', path: 'dmencu' },
536
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'render-init.js', path: 'dmencu' },
537
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'redux-formulario.js', path: 'dmencu' },
538
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'helpers-casilleros.js', path: 'dmencu' },
539
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'bypass-formulario.js', path: 'dmencu' },
540
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'render-general.js', path: 'dmencu' },
541
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'render-formulario.js', path: 'dmencu' },
542
+ { type: 'js', module: 'dmencu', modPath: '../../unlogged/unlogged', file: 'abrir-formulario.js', path: 'dmencu' },
543
+ { type: 'css', module: 'dmencu', modPath: '../../unlogged/unlogged/css', file: 'formulario-react.css', path: 'css' },
544
+ { type: 'css', module: 'dmencu', modPath: '../../unlogged/unlogged/css', file: 'bootstrap.min.css', path: 'css' },
545
+ { type: 'ttf', module: 'dmencu', modPath: '../../unlogged/unlogged/css', file: 'Roboto-Regular.ttf', path: 'css' },
546
+ ...menuedResources,
547
+ { type: 'css', module: 'dmencu', modPath: '../../client/client/css', file: 'menu.css', path: 'css' },
548
+ ];
549
+ return resources;
550
+ // .map(m=>({...m, file:m.fileDevelopment||m.file}));
551
+ }
552
+ refreshCaches() {
553
+ return __awaiter(this, arguments, void 0, function* (client = null) {
554
+ this.caches.tableContent = this.caches.tableContent || {};
555
+ // Función auxiliar para ejecutar las queries con el cliente provisto o uno nuevo
556
+ const executeQueries = (dbClient) => __awaiter(this, void 0, void 0, function* () {
557
+ this.caches.tableContent.no_rea = (yield dbClient.query(`select * from no_rea order by operativo, orden, no_rea`).fetchAll()).rows;
558
+ this.caches.tableContent.rea = (yield dbClient.query(`select * from rea order by operativo, orden, rea`).fetchAll()).rows;
559
+ this.caches.tableContent.no_rea_groups = (yield dbClient.query(`
560
+ select grupo, jsonb_agg(to_json(r.*)) as codigos from no_rea r group by grupo order by 1
561
+ `).fetchAll()).rows;
562
+ this.caches.tableContent.no_rea_groups0 = (yield dbClient.query(`
563
+ select grupo0 as grupo, jsonb_agg(to_json(r.*)) as codigos from no_rea r group by grupo0 order by 1
564
+ `).fetchAll()).rows;
565
+ this.caches.tableContent.no_rea_sup = (yield dbClient.query(`select * from no_rea_sup order by operativo, orden, no_rea_sup`).fetchAll()).rows;
566
+ this.caches.tableContent.rea_sup = (yield dbClient.query(`select * from rea_sup order by operativo, orden, rea_sup`).fetchAll()).rows;
567
+ this.caches.tableContent.no_rea_sup_groups = (yield dbClient.query(`
568
+ select grupo_sup, jsonb_agg(to_json(r.*)) as codigos from no_rea_sup r group by grupo_sup order by 1
569
+ `).fetchAll()).rows;
570
+ this.caches.tableContent.no_rea_sup_groups0 = (yield dbClient.query(`
571
+ select grupo0_sup as grupo, jsonb_agg(to_json(r.*)) as codigos from no_rea_sup r group by grupo0_sup order by 1
572
+ `).fetchAll()).rows;
573
+ this.caches.tableContent.conReaHogar = (yield dbClient.query(`
574
+ select con_rea_hogar, operativo, config_sorteo from operativos join parametros using (operativo) where unico_registro
575
+ `).fetchUniqueRow()).row;
576
+ });
577
+ if (client) {
578
+ yield executeQueries(client);
579
+ }
580
+ else {
581
+ yield this.inDbClient(null, (dbClient) => __awaiter(this, void 0, void 0, function* () {
582
+ yield executeQueries(dbClient);
583
+ }));
584
+ }
585
+ console.log('caches', this.caches.tableContent);
586
+ console.log('caches ok');
587
+ });
588
+ }
589
+ //sqlNoreaCase(campoNecesario:string){
590
+ // var be=this;
591
+ // return `CASE ${be.caches.tableContent.no_rea.map(x=>
592
+ // ` WHEN norea = ${be.db.quoteLiteral(x.no_rea)}::integer THEN ${be.db.quoteLiteral(x[campoNecesario])}`
593
+ // ).join('')} WHEN TRUE THEN NULL END`
594
+ //}
595
+ getContext(req) {
596
+ var fatherContext = super.getContext(req);
597
+ return Object.assign(Object.assign({}, permisosSegunUsuario(this.caches, fatherContext.user)), fatherContext);
598
+ }
599
+ getContextForDump() {
600
+ var fatherContext = super.getContextForDump();
601
+ return Object.assign({ superuser: true, puede: this.caches.permisosSuperuser }, fatherContext);
602
+ }
603
+ getClientSetupForSendToFrontEnd(req) {
604
+ const _super = Object.create(null, {
605
+ getClientSetupForSendToFrontEnd: { get: () => super.getClientSetupForSendToFrontEnd }
606
+ });
607
+ return __awaiter(this, void 0, void 0, function* () {
608
+ var _a;
609
+ return Object.assign(Object.assign({}, (yield _super.getClientSetupForSendToFrontEnd.call(this, req))), { idper: (_a = req.user) === null || _a === void 0 ? void 0 : _a.idper });
610
+ });
611
+ }
612
+ createResourcesForCacheJson() {
613
+ return __awaiter(this, void 0, void 0, function* () {
614
+ var be = this;
615
+ const APP_NAME = yield be.getAppName();
616
+ const sufijo = be.getSufijoFrombaseUrl(be.config.server['base-url']);
617
+ var jsonResult = {
618
+ version: APP_DM_VERSION,
619
+ appName: 'dmencu',
620
+ cache: [
621
+ "campo",
622
+ "offline",
623
+ "fallback-sincro",
624
+ "lib/react.production.min.js",
625
+ "lib/react-dom.production.min.js",
626
+ "lib/material-ui.production.min.js",
627
+ "lib/redux.min.js",
628
+ "lib/react-redux.min.js",
629
+ //"lib/qrcode.js",
630
+ "lib/require-bro.js",
631
+ "lib/cast-error.js",
632
+ "lib/like-ar.js",
633
+ "lib/best-globals.js",
634
+ "lib/json4all.js",
635
+ "lib/js-to-html.js",
636
+ "lib/redux-typed-reducer.js",
637
+ "dmencu/adapt.js",
638
+ "dmencu/unlogged.js",
639
+ "lib/js-yaml.umd.min.js",
640
+ "lib/xlsx-now.umd.js",
641
+ "lib/xlsx-now-browser.umd.js",
642
+ "lib/lazy-some.js",
643
+ "lib/sql-tools.js",
644
+ "dialog-promise/dialog-promise.js",
645
+ "moment/min/moment.js",
646
+ "pikaday/pikaday.js",
647
+ "lib/polyfills-bro.js",
648
+ "lib/big.js",
649
+ "lib/type-store.js",
650
+ "lib/typed-controls.js",
651
+ "lib/ajax-best-promise.js",
652
+ "my-ajax.js",
653
+ "my-start.js",
654
+ "lib/my-localdb.js",
655
+ "lib/my-websqldb.js",
656
+ "lib/my-localdb.js.map",
657
+ "lib/my-websqldb.js.map",
658
+ "lib/my-things.js",
659
+ "lib/my-tables.js",
660
+ "lib/my-inform-net-status.js",
661
+ "lib/my-menu.js",
662
+ "lib/my-skin.js",
663
+ "lib/cliente-en-castellano.js",
664
+ "lib/service-worker-admin.js",
665
+ "lib/redux-typed-reducer.js",
666
+ "client_modules/operativos.js",
667
+ "client_modules/varcal.js",
668
+ "client_modules/form-structure.js",
669
+ "client_modules/meta-enc.js",
670
+ "client_modules/datos-ext.js",
671
+ "client_modules/consistencias.js",
672
+ "client_modules/procesamiento.js",
673
+ "dmencu/tipos.js",
674
+ "dmencu/render-config.js",
675
+ "dmencu/render-init.js",
676
+ "dmencu/helpers-casilleros.js",
677
+ "dmencu/helpers-formulario.js",
678
+ "dmencu/calculos-encuesta.js",
679
+ "dmencu/bypass-formulario.js",
680
+ "dmencu/redux-formulario.js",
681
+ "dmencu/render-general.js",
682
+ "dmencu/render-formulario.js",
683
+ "dmencu/abrir-formulario.js",
684
+ "client_modules/row-validator.js",
685
+ "client/menu.js",
686
+ "img/logo.png",
687
+ //"img/logo-dm.png",
688
+ "img/logo-128.png",
689
+ "img/main-loading.gif",
690
+ "img/borrar-valor.png",
691
+ "img/fondo-salteado-error.png",
692
+ "img/fondo-salteado.png",
693
+ "img/background-test.png",
694
+ //"client-setup",
695
+ "css/bootstrap.min.css",
696
+ "css/formulario-react.css",
697
+ "pikaday/pikaday.css",
698
+ "dialog-promise/dialog-promise.css",
699
+ "rel-enc/estados.css",
700
+ "css/my-tables.css",
701
+ "css/my-menu.css",
702
+ "css/my-things.css",
703
+ "css/menu.css",
704
+ "rel-enc/my-things2.css",
705
+ "css/formulario-react.css",
706
+ "css/Roboto-Regular.ttf",
707
+ "carga-dm/web-manifest.webmanifest",
708
+ ],
709
+ fallbacks: [
710
+ { path: 'dm_sincronizar', fallback: 'fallback-sincro' }
711
+ ],
712
+ defaultFallback: "offline"
713
+ };
714
+ jsonResult.cache = jsonResult.cache.concat(getManifestImageIcons(APP_NAME, sufijo).map((elem) => `menu/${elem.src}`));
715
+ var skin = be.config['client-setup'].skin;
716
+ if (skin && be.activeSkinFiles) {
717
+ var skinUrl = skin + '/';
718
+ jsonResult.cache.push(`${skin}/img/background-test.png`);
719
+ // Convertimos el Set a Array y mapeamos las rutas
720
+ var skinResources = Array.from(be.activeSkinFiles).map(function (pathRelativo) {
721
+ // Si es un .styl, lo pedimos como .css porque el Service Worker
722
+ // debe cachear el recurso final que el navegador solicita.
723
+ return skinUrl + pathRelativo.replace(/\.styl$/, '.css');
724
+ });
725
+ jsonResult.cache = jsonResult.cache.concat(skinResources);
726
+ }
727
+ return jsonResult;
728
+ });
729
+ }
730
+ getMenuControles(_context) {
731
+ return [
732
+ { menuType: 'proc', name: 'encuestas_procesamiento_pasar', label: 'pasar encuestas a procesamiento' },
733
+ { menuType: 'table', name: 'resumen', table: 'control_resumen', selectedByDefault: true },
734
+ { menuType: 'table', name: 'dominio', table: 'control_campo_dominio' },
735
+ { menuType: 'table', name: 'zona', table: 'control_campo_zona' },
736
+ { menuType: 'table', name: 'comuna', table: 'control_campo_comuna' },
737
+ { menuType: 'table', name: 'área', table: 'control_campo_area' },
738
+ ];
739
+ }
740
+ ;
741
+ getMenuVarios(context) {
742
+ var _a, _b, _c, _d, _e, _f;
743
+ let submenuVarios = [{ menuType: 'abrir_encuesta', name: 'abrir_encuesta' }];
744
+ if ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.campo) === null || _b === void 0 ? void 0 : _b.editar) {
745
+ submenuVarios.push({ menuType: 'table', name: 'hoja_ruta', table: 'grilla_hoja_ruta', label: 'hoja de ruta' });
746
+ }
747
+ if ((_d = (_c = context.puede) === null || _c === void 0 ? void 0 : _c.campo) === null || _d === void 0 ? void 0 : _d.administrar) {
748
+ submenuVarios.push({ menuType: 'proc', name: 'encuestador_dms_mostrar', label: 'forzar descarga encuestas DM' });
749
+ submenuVarios.push({ menuType: 'proc', name: 'encuesta_blanquear_previsualizar', label: 'blanquear encuesta' });
750
+ submenuVarios.push({ menuType: 'proc', name: 'encuesta_borrar_previsualizar', label: 'quitar encuesta de la muestra' });
751
+ submenuVarios.push({ menuType: 'proc', name: 'encuestas_capacitacion_borrar', label: 'quitar encuestas de capa de la muestra' });
752
+ submenuVarios.push({ menuType: 'proc', name: 'operativo_migrar', label: 'migrar operativo' });
753
+ submenuVarios.push({ menuType: 'proc', name: 'encuesta_capa_a_prod_pasar', label: 'pasar encuestas de capa a prod' });
754
+ }
755
+ if ((_f = (_e = context.puede) === null || _e === void 0 ? void 0 : _e.encuestas) === null || _f === void 0 ? void 0 : _f.procesar) {
756
+ submenuVarios.push({ menuType: 'proc', name: 'intercambiar_encuestas' });
757
+ }
758
+ return { menuType: 'menu', name: 'varios', menuContent: submenuVarios };
759
+ }
760
+ getMenuAsignacion(context) {
761
+ var _a, _b, _c, _d;
762
+ let filtroRecepcionista = context.user.rol == 'recepcionista' ? { recepcionista: context.user.idper } : {};
763
+ let submenuAsignacion = [];
764
+ if ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.campo) === null || _b === void 0 ? void 0 : _b.administrar) {
765
+ submenuAsignacion.push({ menuType: 'table', name: 'general', table: 'areas_asignacion_general' });
766
+ }
767
+ submenuAsignacion.push({ menuType: 'table', name: 'encuestador', table: 't_encu_areas', ff: Object.assign({ tarea: 'encu' }, filtroRecepcionista) }, { menuType: 'table', name: 'ingresador', table: 't_ingr_areas', ff: Object.assign({ tarea: 'ingr' }, filtroRecepcionista) }, { menuType: 'table', name: 'recuperador', table: 'tareas_tem_asignacion_recu', ff: Object.assign({ tarea_actual: 'recu', tarea: 'recu' }, filtroRecepcionista) });
768
+ if ((_d = (_c = context.puede) === null || _c === void 0 ? void 0 : _c.campo) === null || _d === void 0 ? void 0 : _d.administrar) {
769
+ submenuAsignacion.push({ menuType: 'table', name: 'supervisor', table: 'tareas_tem_asignacion_supe', ff: Object.assign({ tarea_actual: 'supe', tarea: 'supe' }, filtroRecepcionista) });
770
+ }
771
+ ;
772
+ return { menuType: 'menu', name: 'asignacion', label: 'asignación', menuContent: submenuAsignacion };
773
+ }
774
+ getMenuRecepcion(context) {
775
+ var _a, _b;
776
+ let submenuRecepcion = [];
777
+ submenuRecepcion.push({ menuType: 'table', name: 'encuestador', table: 'encuestadores_asignados' }, { menuType: 'table', name: 'recuperador', table: 'recuperadores_asignados' }, { menuType: 'table', name: 'ingresador', table: 'ingresadores_asignados' });
778
+ if ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.campo) === null || _b === void 0 ? void 0 : _b.administrar) {
779
+ submenuRecepcion.push({ menuType: 'table', name: 'supervisor', table: 'supervisores_asignados' }, { menuType: 'table', name: 'mis_supervisores', table: 'mis_supervisores_asignados' });
780
+ }
781
+ return { menuType: 'menu', name: 'recepcion', label: 'recepción', menuContent: submenuRecepcion };
782
+ }
783
+ getMenuCarto(context) {
784
+ var _a, _b;
785
+ let submenuCarto = [];
786
+ if ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.campo) === null || _b === void 0 ? void 0 : _b.administrar) {
787
+ submenuCarto.push({ menuType: 'table', name: 'comunas', table: 'comunas' }, { menuType: 'table', name: 'barrios', table: 'barrios' }, { menuType: 'table', name: 'fracciones', table: 'fracciones' }, { menuType: 'table', name: 'radios', table: 'radios' }, { menuType: 'table', name: 'manzanas', table: 'manzanas' });
788
+ return { menuType: 'menu', name: 'carto', label: 'cartografía', menuContent: submenuCarto };
789
+ }
790
+ return null;
791
+ }
792
+ getMenuConfigurar(context) {
793
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
794
+ const menuConfigurar = [];
795
+ if (((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.campo) === null || _b === void 0 ? void 0 : _b.administrar) || ((_d = (_c = context.puede) === null || _c === void 0 ? void 0 : _c.encuestas) === null || _d === void 0 ? void 0 : _d.procesar)) {
796
+ const submenuMuestra = [
797
+ { menuType: 'table', name: 'tem', label: 'TEM' },
798
+ { menuType: 'proc', name: 'muestra_generar', label: 'generar muestra' },
799
+ { menuType: 'table', name: 'semanas' },
800
+ { menuType: 'table', name: 'area_enc_proximas' },
801
+ ];
802
+ menuConfigurar.push({
803
+ menuType: 'menu',
804
+ name: 'muestra',
805
+ label: 'muestra',
806
+ menuContent: submenuMuestra
807
+ });
808
+ }
809
+ if ((_f = (_e = context.puede) === null || _e === void 0 ? void 0 : _e.casilleros_texto) === null || _f === void 0 ? void 0 : _f.editar) {
810
+ menuConfigurar.push({
811
+ menuType: 'menu',
812
+ name: 'metadatos',
813
+ menuContent: [
814
+ { menuType: 'table', name: 'operativos' },
815
+ { menuType: 'menu', name: 'rea/norea', menuContent: [
816
+ { menuType: 'table', name: 'rea' },
817
+ { menuType: 'table', name: 'no_rea' },
818
+ { menuType: 'table', name: 'rea_sup' },
819
+ { menuType: 'table', name: 'no_rea_sup' },
820
+ ] },
821
+ { menuType: 'table', name: 'formularios', table: 'casilleros_principales' },
822
+ { menuType: 'table', name: 'plano', table: 'casilleros' },
823
+ { menuType: 'table', name: 'variables', table: 'casilleros', fc: [{ column: 'var_name', operator: '!=\u2205', value: null }] },
824
+ { menuType: 'table', name: 'tipoc', label: 'tipos de celdas' },
825
+ { menuType: 'table', name: 'tipoc_tipoc', label: 'inclusiones de celdas' },
826
+ ]
827
+ });
828
+ }
829
+ if (context.superuser) {
830
+ menuConfigurar.push({
831
+ menuType: 'menu',
832
+ name: 'estados_acciones_tareas',
833
+ label: 'estados/acciones/tareas',
834
+ menuContent: [
835
+ { menuType: 'table', name: 'tareas' },
836
+ { menuType: 'table', name: 'estados' },
837
+ { menuType: 'table', name: 'acciones' },
838
+ { menuType: 'table', name: 'estados_acciones' },
839
+ { menuType: 'table', name: 'tareas_proximas' },
840
+ ]
841
+ }, { menuType: 'table', name: 'momentos_consistencia' }, { menuType: 'table', name: 'parametros' }, { menuType: 'table', name: 'modos_dm' });
842
+ }
843
+ if (((_h = (_g = context.puede) === null || _g === void 0 ? void 0 : _g.campo) === null || _h === void 0 ? void 0 : _h.administrar) || ((_k = (_j = context.puede) === null || _j === void 0 ? void 0 : _j.encuestas) === null || _k === void 0 ? void 0 : _k.procesar)) {
844
+ menuConfigurar.push({
845
+ menuType: 'menu',
846
+ name: 'usuarios',
847
+ menuContent: [
848
+ { menuType: 'table', name: 'usuarios', selectedByDefault: true },
849
+ { menuType: 'table', name: 'roles' },
850
+ { menuType: 'table', name: 'permisos' },
851
+ { menuType: 'table', name: 'roles_permisos' },
852
+ ]
853
+ });
854
+ }
855
+ return menuConfigurar;
856
+ }
857
+ // los mixins (meta-enc, procesamiento) lo declaran sin parámetros, pero backend-plus siempre lo llama con context.
858
+ // El tipo de retorno que declara operativos (MenuInfo[]) no admite formas que backend-plus sí acepta y dmencu usa
859
+ // (ff como objeto, fc con column); se devuelve MenuInfoBase[], que es lo que declara backend-plus.
860
+ // Quitar esta línea cuando se corrijan los tipos de menú en operativos/backend-plus (el compilador avisa si deja de hacer falta).
861
+ // @ts-expect-error MenuDefinition de operativos más estricto que el de backend-plus
862
+ getMenu(context) {
863
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
864
+ if (context == null) {
865
+ throw new Error('getMenu de dmencu requiere el context para armar el menú según los permisos');
866
+ }
867
+ let menu = [];
868
+ if (getModoByPolicy(context.be) === 'RELEVAMIENTO') {
869
+ if ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.relevar) {
870
+ menu.push({ menuType: 'path', name: 'relevamiento', path: '/campo' });
871
+ menu.push({ menuType: 'sincronizar_dm', name: 'sincronizar' }, { menuType: 'cambiar_modo_dm', name: 'cambiar_modo' });
872
+ }
873
+ }
874
+ else {
875
+ if ((_d = (_c = context.puede) === null || _c === void 0 ? void 0 : _c.campo) === null || _d === void 0 ? void 0 : _d.editar) {
876
+ menu.push(this.getMenuAsignacion(context), this.getMenuRecepcion(context));
877
+ if ((_f = (_e = context.puede) === null || _e === void 0 ? void 0 : _e.campo) === null || _f === void 0 ? void 0 : _f.administrar) {
878
+ menu.push({ menuType: 'table', name: 'tareas_tem_fin_campo', label: 'espera fin de campo' });
879
+ menu.push({ menuType: 'table', name: 'tareas_tem_analisis_campo', label: 'análisis de campo' });
880
+ }
881
+ menu.push({
882
+ menuType: 'menu', name: 'supervision', label: 'supervisión', menuContent: [
883
+ { menuType: 'table', name: 'supervisar', table: 'tareas_tem_ingreso', ff: { tarea: 'supe', asignado: context.user.idper } }
884
+ ]
885
+ });
886
+ }
887
+ if (((_h = (_g = context.puede) === null || _g === void 0 ? void 0 : _g.campo) === null || _h === void 0 ? void 0 : _h.editar) || ((_k = (_j = context.puede) === null || _j === void 0 ? void 0 : _j.campo) === null || _k === void 0 ? void 0 : _k.administrar) || ((_m = (_l = context.puede) === null || _l === void 0 ? void 0 : _l.encuestas) === null || _m === void 0 ? void 0 : _m.procesar)) {
888
+ menu.push(this.getMenuVarios(context));
889
+ }
890
+ if (((_p = (_o = context.puede) === null || _o === void 0 ? void 0 : _o.campo) === null || _p === void 0 ? void 0 : _p.administrar) || ((_r = (_q = context.puede) === null || _q === void 0 ? void 0 : _q.encuestas) === null || _r === void 0 ? void 0 : _r.procesar)) {
891
+ menu.push({ menuType: 'menu', name: 'control', menuContent: this.getMenuControles(context) });
892
+ /*{menuType:'table', name:'participacion' , table:'control_campo_participacion' },*/
893
+ }
894
+ if ((_t = (_s = context.puede) === null || _s === void 0 ? void 0 : _s.encuestas) === null || _t === void 0 ? void 0 : _t.procesar) {
895
+ menu.push({
896
+ menuType: 'menu', name: 'procesar', menuContent: [
897
+ { menuType: 'table', name: 'variables' },
898
+ { menuType: 'table', name: 'variables_cuestionario', table: 'casilleros', td: { editable: false, allow: { update: false, import: false, delete: false, insert: false } }, fc: [{ column: 'var_name', operator: '!=\u2205', value: null }] },
899
+ { menuType: 'table', name: 'consistencias' },
900
+ { menuType: 'table', name: 'consistencias_cuestionario', table: 'casilleros', ff: { tipoc: 'CONS' } },
901
+ { menuType: 'table', name: 'inconsistencias' },
902
+ { menuType: 'table', name: 'tabla_datos' },
903
+ { menuType: 'table', name: 'diccionario', label: 'diccionarios' },
904
+ { menuType: 'table', name: 'tareas_tem_procesamiento', label: 'encuestas' },
905
+ ]
906
+ });
907
+ }
908
+ const menuConfigurar = this.getMenuConfigurar(context);
909
+ if (menuConfigurar.length) {
910
+ menu.push({ menuType: 'menu', name: 'configurar', menuContent: menuConfigurar });
911
+ }
912
+ const menuCarto = this.getMenuCarto(context);
913
+ if (menuCarto) {
914
+ menu.push(menuCarto);
915
+ }
916
+ }
917
+ if ((0, ayuda_1.temasVisibles)(this.caches.ayuda, quienConsultaAyuda(context)).length) {
918
+ menu.push({ menuType: 'ayuda', name: 'ayuda' });
919
+ }
920
+ return { menu };
921
+ }
922
+ prepareGetTables() {
923
+ var be = this;
924
+ super.prepareGetTables();
925
+ this.getTableDefinition = Object.assign(Object.assign({}, this.getTableDefinition), { roles: table_roles_1.roles,
926
+ usuarios: table_usuarios_1.usuarios,
927
+ personal: table_personal_1.personal,
928
+ recepcionistas: table_recepcionistas_1.recepcionistas,
929
+ encuestadores_asignados: table_encuestadores_1.encuestadores_asignados,
930
+ ingresadores_asignados: table_encuestadores_1.ingresadores_asignados,
931
+ recuperadores_asignados: table_encuestadores_2.recuperadores_asignados,
932
+ supervisores_asignados: table_encuestadores_3.supervisores_asignados,
933
+ mis_supervisores_asignados: table_encuestadores_4.mis_supervisores_asignados,
934
+ mis_encuestadores: table_mis_encuestadores_1.mis_encuestadores,
935
+ recuperadores: table_recuperadores_1.recuperadores,
936
+ supervisores: table_supervisores_1.supervisores,
937
+ personal_rol: table_personal_rol_1.personal_rol,
938
+ permisos: table_permisos_1.permisos,
939
+ roles_permisos: table_roles_permisos_1.roles_permisos,
940
+ roles_subordinados: table_roles_subordinados_1.roles_subordinados,
941
+ no_rea: table_no_rea_1.no_rea,
942
+ no_rea_sup: table_no_rea_sup_1.no_rea_sup,
943
+ rea: table_rea_1.rea,
944
+ rea_sup: table_rea_sup_1.rea_sup,
945
+ semanas: table_semanas_1.semanas,
946
+ estados: table_estados_1.estados,
947
+ acciones: table_acciones_1.acciones,
948
+ estados_acciones: table_estados_acciones_1.estados_acciones,
949
+ tareas_proximas: table_tareas_proximas_1.tareas_proximas,
950
+ tem: table_tem_1.tem,
951
+ historial_tem: table_historial_tem_1.historial_tem,
952
+ modos_dm: table_modos_dm_1.modos_dm,
953
+ parametros: table_parametros_1.parametros,
954
+ operaciones: table_operaciones_1.operaciones,
955
+ comunas: table_comunas_1.comunas,
956
+ areas: table_areas_1.areas,
957
+ sincronizaciones: table_sincronizaciones_1.sincronizaciones,
958
+ tareas: table_tareas_1.tareas,
959
+ tareas_tem: table_tareas_tem_1.tareas_tem,
960
+ tareas_tem_asignacion_encu: table_tareas_tem_1.tareas_tem_asignacion_encu,
961
+ tareas_tem_asignacion_recu: table_tareas_tem_1.tareas_tem_asignacion_recu,
962
+ tareas_tem_asignacion_supe: table_tareas_tem_1.tareas_tem_asignacion_supe,
963
+ tareas_tem_asignacion_ingr: table_tareas_tem_1.tareas_tem_asignacion_ingr,
964
+ tareas_areas: table_tareas_areas_1.tareas_areas,
965
+ areas_asignacion_general: table_areas_asignacion_general_1.areas_asignacion_general,
966
+ grilla_hoja_ruta: table_grilla_hoja_ruta_1.grilla_hoja_ruta,
967
+ t_encu_areas: table_tareas_areas_2.t_encu_areas,
968
+ t_recu_areas: table_tareas_areas_3.t_recu_areas,
969
+ t_supe_areas: table_tareas_areas_4.t_supe_areas,
970
+ t_ingr_areas: table_tareas_areas_5.t_ingr_areas,
971
+ mis_tareas: table_mis_tareas_1.mis_tareas,
972
+ tem_asignacion: table_tem_asignacion_1.tem_asignacion,
973
+ tareas_tem_recepcion: table_tareas_tem_recepcion_1.tareas_tem_recepcion,
974
+ tareas_tem_ingreso: table_tareas_tem_ingreso_1.tareas_tem_ingreso,
975
+ tareas_tem_fin_campo: table_tareas_tem_fin_campo_1.tareas_tem_fin_campo,
976
+ tareas_tem_procesamiento: table_tareas_tem_procesamiento_1.tareas_tem_procesamiento,
977
+ tareas_tem_analisis_campo: table_tareas_tem_analisis_campo_1.tareas_tem_analisis_campo,
978
+ mis_tareas_areas: table_mis_tareas_areas_1.mis_tareas_areas,
979
+ control_campo: table_control_campo_1.control_campo,
980
+ control_resumen: table_control_resumen_1.control_resumen, control_campo_zona: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x zona solo cemento', camposCorte: [{ name: 'zona', typeName: 'text' }], sinhogfin: !context.be.caches.tableContent.conReaHogar.con_rea_hogar, filtroWhere: 'dominio=3' }), control_campo_comuna: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x comuna solo cemento', camposCorte: [{ name: 'zona', typeName: 'text' }, { name: 'nrocomuna', typeName: 'text' }], sinhogfin: !context.be.caches.tableContent.conReaHogar.con_rea_hogar, filtroWhere: 'dominio=3' }), control_campo_area: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x area', camposCorte: [{ name: 'zona', typeName: 'text' }, { name: 'nrocomuna', typeName: 'text' }, { name: 'area', typeName: 'integer' }, { name: 'participacion_a', typeName: 'text' }, { name: 'clase_a', typeName: 'text' }], sinhogfin: !context.be.caches.tableContent.conReaHogar.con_rea_hogar }), control_campo_participacion: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x participacion', camposCorte: [{ name: 'participacion', typeName: 'bigint' }], sinhogfin: !context.be.caches.tableContent.conReaHogar.con_rea_hogar }), control_campo_dominio: context => (0, table_control_campo_1.control_campo)(context, { nombre: 'control_campo_comuna', title: 'control campo x dominio', camposCorte: [{ name: 'dominio', typeName: 'integer' }], sinhogfin: !context.be.caches.tableContent.conReaHogar.con_rea_hogar }), control_dias_carga: table_control_dias_carga_1.control_dias_carga,
981
+ viviendas: table_viviendas_1.viviendas,
982
+ visitas: table_visitas_1.visitas,
983
+ hogares: table_hogares_1.hogares,
984
+ personas: table_personas_1.personas,
985
+ visitas_sup: table_visitas_sup_1.visitas_sup,
986
+ hogares_sup: table_hogares_sup_1.hogares_sup,
987
+ personas_sup: table_personas_sup_1.personas_sup,
988
+ diccionario: table_diccionario_1.diccionario,
989
+ dicvar: table_dicvar_1.dicvar,
990
+ dictra: table_dictra_1.dictra,
991
+ inconsistencias_cumplen_condicion: table_inconsistencias_cumplen_condicion_1.inconsistencias_cumplen_condicion,
992
+ tem_borradas: table_tem_borradas_1.tem_borradas,
993
+ barrios: table_barrios_1.barrios,
994
+ fracciones: table_fracciones_1.fracciones,
995
+ radios: table_radios_1.radios,
996
+ manzanas: table_manzanas_1.manzanas,
997
+ area_enc_proximas: table_area_enc_proximas_1.area_enc_proximas });
998
+ be.appendToTableDefinition('consistencias', function (tableDef, context) {
999
+ var _a, _b;
1000
+ tableDef.editable = tableDef.editable || ((_b = (_a = context === null || context === void 0 ? void 0 : context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.procesar);
1001
+ tableDef.fields.forEach(function (field) {
1002
+ if (field.name == 'error_compilacion') {
1003
+ if (field.visible) {
1004
+ console.error('************ QUITAR ESTO error_compilacion ya es visible');
1005
+ }
1006
+ field.visible = true;
1007
+ }
1008
+ });
1009
+ });
1010
+ be.appendToTableDefinition('inconsistencias', function (tableDef, context) {
1011
+ var _a, _b;
1012
+ tableDef.sql = Object.assign(Object.assign({}, tableDef.sql), { isTable: true });
1013
+ tableDef.fields.splice(2, 0, { name: 'vivienda', typeName: 'text', editable: false }, { name: 'hogar', typeName: 'bigint', editable: false }, { name: 'persona', typeName: 'bigint', editable: false }, { name: 'visita', typeName: 'bigint', editable: false });
1014
+ tableDef.editable = tableDef.editable || ((_b = (_a = context === null || context === void 0 ? void 0 : context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.justificar);
1015
+ tableDef.fields.forEach(function (field) {
1016
+ var _a, _b;
1017
+ if (field.name == 'pk_integrada') {
1018
+ field.visible = false;
1019
+ }
1020
+ if (field.name == 'justificacion') {
1021
+ field.editable = (context === null || context === void 0 ? void 0 : context.forDump) || ((_b = (_a = context === null || context === void 0 ? void 0 : context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.justificar);
1022
+ }
1023
+ });
1024
+ tableDef.fields = tableDef.fields.concat(['tarea_actual', 'tarea_anterior'].map(fn => {
1025
+ return { name: fn, typeName: 'text', editable: false, inTable: false };
1026
+ }));
1027
+ //sacar campos de vitales!
1028
+ const regExpFieldsVita = new RegExp('^(comp|infe|cod_causa|domi)$');
1029
+ tableDef.fields = tableDef.fields.filter(f => !(regExpFieldsVita.test(f.name)));
1030
+ var q_inconsist = tableDef.sql.from;
1031
+ tableDef.sql.from = `
1032
+ (select i.*, t.tarea_actual, tarea_anterior
1033
+ from ${q_inconsist} i
1034
+ join tem t on i.vivienda=t.enc and i.operativo=t.operativo
1035
+ left join tareas_tem tt on t.operativo=tt.operativo and t.enc=tt.enc and t.tarea_actual=tt.tarea
1036
+ left join lateral (
1037
+ select tarea as tarea_anterior
1038
+ from historial_tem ht
1039
+ where t.operativo = ht.operativo and t.enc = ht.enc
1040
+ order by ts_salida desc
1041
+ limit 1
1042
+ ) as ta on true
1043
+ )
1044
+ `;
1045
+ });
1046
+ be.appendToTableDefinition('operativos', function (tableDef, context) {
1047
+ tableDef.fields.splice(2, 0, {
1048
+ name: 'config_sorteo',
1049
+ typeName: 'jsonb',
1050
+ editable: false
1051
+ }, {
1052
+ name: 'habilitacion_boton_formulario',
1053
+ typeName: 'jsonb',
1054
+ editable: false
1055
+ }, {
1056
+ name: 'disform_cerrado',
1057
+ typeName: 'boolean',
1058
+ defaultValue: false,
1059
+ editable: (context === null || context === void 0 ? void 0 : context.forDump) || context != null && ['admin', 'dis_conceptual'].includes(context.user.rol)
1060
+ }, {
1061
+ name: 'con_rea_hogar',
1062
+ typeName: 'boolean',
1063
+ editable: false,
1064
+ defaultDbValue: 'true'
1065
+ }, {
1066
+ name: 'permite_generar_muestra',
1067
+ typeName: 'boolean',
1068
+ editable: false,
1069
+ defaultDbValue: 'false'
1070
+ });
1071
+ });
1072
+ be.appendToTableDefinition('variables', function (tableDef, context) {
1073
+ var _a, _b;
1074
+ var esAdmin = (context === null || context === void 0 ? void 0 : context.user.rol) === 'admin';
1075
+ tableDef.editable = tableDef.editable || ((_b = (_a = context === null || context === void 0 ? void 0 : context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.procesar);
1076
+ tableDef.allow = { delete: esAdmin };
1077
+ });
1078
+ be.appendToTableDefinition('momentos_consistencia', function (tableDef, _context) {
1079
+ tableDef.fields.push({ name: 'condicion', typeName: 'text', nullable: false, defaultDbValue: 'true' });
1080
+ });
1081
+ be.appendToTableDefinition('parametros', function (tableDef) {
1082
+ tableDef.fields.push({ name: 'modo_dm_defecto', typeName: 'text', editable: true, nullable: false, defaultDbValue: "'capa'" });
1083
+ tableDef.foreignKeys = tableDef.foreignKeys || [];
1084
+ tableDef.foreignKeys.push({ references: 'modos_dm', fields: [{ source: 'modo_dm_defecto', target: 'modo_dm' }] });
1085
+ });
1086
+ }
1087
+ };
1088
+ }
1089
+ exports.AppDmEncu = emergeAppDmEncu((0, procesamiento_1.emergeAppProcesamiento)((0, procesamiento_1.emergeAppConsistencias)((0, procesamiento_1.emergeAppVarCal)((0, procesamiento_1.emergeAppDatosExt)((0, procesamiento_1.emergeAppOperativos)(procesamiento_1.AppBackend))))));
1090
+ });
1091
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWRtZW5jdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvYXBwLWRtZW5jdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBLFlBQVksQ0FBQzs7O0lBcUhiLDBDQUVDO0lBR0Qsb0RBYUM7SUFHRCxnREFPQztJQXdCRCxrRkFnQkM7SUFpRUQsMENBMjRCQztJQWxvQ0QsaURBQTRMO0lBQzVMLDJEQUE2RTtJQUM3RSxtQ0FBNEg7SUFFNUgsd0NBQXdDO0lBQ3hDLHdDQUF3QztJQVV4QywyQ0FBa0Q7SUFFbEQsNkJBQTZCO0lBRTdCLG1DQUFtQztJQUVuQywyQkFBb0M7SUFDcEMsNkJBQTZCO0lBRTdCLCtDQUFzQztJQUN0QyxxREFBNEM7SUFDNUMsaUVBQXdEO0lBQ3hELCtEQUF3RjtJQUN4RiwrREFBZ0U7SUFDaEUsK0RBQStEO0lBQy9ELCtEQUFtRTtJQUNuRSx1RUFBOEQ7SUFDOUQsK0RBQXNEO0lBQ3RELDZEQUFvRDtJQUNwRCw2REFBb0Q7SUFDcEQscURBQTRDO0lBQzVDLGlFQUF3RDtJQUN4RCxxREFBNEM7SUFDNUMseURBQWdEO0lBQ2hELHlFQUFnRTtJQUVoRSxpREFBd0M7SUFDeEMseURBQWdEO0lBQ2hELDJDQUFrQztJQUNsQyxtREFBMEM7SUFDMUMsMkNBQWtDO0lBQ2xDLG1EQUEwQztJQUMxQyxxREFBNEM7SUFDNUMsMkRBQWtEO0lBQ2xELG1EQUEwQztJQUMxQywrQ0FBc0M7SUFDdEMscUVBQTREO0lBQzVELGlEQUF3QztJQUN4Qyx5REFNNEI7SUFDNUIsNkRBQW9EO0lBQ3BELHFGQUE0RTtJQUM1RSxxRUFBNEQ7SUFDNUQsNkRBQW9EO0lBQ3BELDZEQUFvRDtJQUNwRCw2REFBb0Q7SUFDcEQsNkRBQW9EO0lBQ3BELHlEQUFnRDtJQUNoRCxpRUFBd0Q7SUFDeEQsNkVBQW9FO0lBQ3BFLHlFQUFnRTtJQUNoRSw2RUFBb0U7SUFDcEUs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VSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQ3pGLENBQUM7Z0JBQ04sQ0FBQyxDQUFDLENBQUE7WUFDTixDQUFDO1NBQ0osQ0FBQTtJQUNMLENBQUM7SUFFVSxRQUFBLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBQSxzQ0FBc0IsRUFBQyxJQUFBLHNDQUFzQixFQUFDLElBQUEsK0JBQWUsRUFBQyxJQUFBLGlDQUFpQixFQUFDLElBQUEsbUNBQW1CLEVBQUMsMEJBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0ICogYXMgcHJvY2VzYW1pZW50byBmcm9tIFwicHJvY2VzYW1pZW50b1wiO1xyXG5pbXBvcnQgeyBlbWVyZ2VBcHBQcm9jZXNhbWllbnRvLCBlbWVyZ2VBcHBDb25zaXN0ZW5jaWFzLCBlbWVyZ2VBcHBWYXJDYWwsIGVtZXJnZUFwcERhdG9zRXh0LCBlbWVyZ2VBcHBPcGVyYXRpdm9zLCBBcHBCYWNrZW5kLCBDbGllbnRNb2R1bGVEZWZpbml0aW9uLCBPcHRzQ2xpZW50UGFnZSB9IGZyb20gXCJwcm9jZXNhbWllbnRvXCI7XHJcbmltcG9ydCB7IHBhc2FyRW5jdWVzdGFzQVByb2llLCBQcm9jZWR1cmVzRG1FbmN1IH0gZnJvbSBcIi4vcHJvY2VkdXJlcy1kbWVuY3VcIjtcclxuaW1wb3J0IHsgY2FyZ2FyQXl1ZGEsIGNhcnBldGFEZWxQYXF1ZXRlLCBwcm9ibGVtYXNEZUF5dWRhLCBRdWllbkNvbnN1bHRhQXl1ZGEsIHJ1dGFzRGVsTWVudSwgdGVtYXNWaXNpYmxlcyB9IGZyb20gXCIuL2F5dWRhXCI7XHJcblxyXG5pbXBvcnQgKiBhcyBwZyBmcm9tIFwicGctcHJvbWlzZS1zdHJpY3RcIjtcclxuaW1wb3J0ICogYXMgbWluaVRvb2xzIGZyb20gXCJtaW5pLXRvb2xzXCI7XHJcbmltcG9ydCB7XHJcbiAgICBBeXVkYUZ1ZW50ZSxcclxuICAgIENsaWVudCwgQ29udGV4dCwgQ29yZUZ1bmN0aW9uUGFyYW1ldGVycyxcclxuICAgIE1lbnVJbmZvQmFzZSxcclxuICAgIFB1ZWRlLFxyXG4gICAgUmVxdWVzdCwgUmVzcG9uc2UsXHJcbiAgICBTdWZpam9zQW1iaWVudGUsXHJcbn0gZnJvbSBcIi4vdHlwZXMtZG1lbmN1XCI7XHJcblxyXG5pbXBvcnQgeyBleHBlY3RlZCwgdW5leHBlY3RlZCB9IGZyb20gXCJjYXN0LWVycm9yXCI7XHJcblxyXG5pbXBvcnQgKiBhcyB5YXpsIGZyb20gXCJ5YXpsXCI7XHJcbmltcG9ydCB7IE5leHRGdW5jdGlvbiB9IGZyb20gXCJleHByZXNzLXNlcnZlLXN0YXRpYy1jb3JlXCI7XHJcbmltcG9ydCAqIGFzIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcclxuXHJcbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSBcImZzXCI7XHJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcclxuXHJcbmltcG9ydCB7IHJvbGVzIH0gZnJvbSBcIi4vdGFibGUtcm9sZXNcIjtcclxuaW1wb3J0IHsgcGVyc29uYWwgfSBmcm9tIFwiLi90YWJsZS1wZXJzb25hbFwiO1xyXG5pbXBvcnQgeyByZWNlcGNpb25pc3RhcyB9IGZyb20gXCIuL3RhYmxlLXJlY2VwY2lvbmlzdGFzXCI7XHJcbmltcG9ydCB7IGVuY3Vlc3RhZG9yZXNfYXNpZ25hZG9zLCBpbmdyZXNhZG9yZXNfYXNpZ25hZG9zIH0gZnJvbSBcIi4vdGFibGUtZW5jdWVzdGFkb3Jlc1wiO1xyXG5pbXBvcnQgeyByZWN1cGVyYWRvcmVzX2FzaWduYWRvcyB9IGZyb20gXCIuL3RhYmxlLWVuY3Vlc3RhZG9yZXNcIjtcclxuaW1wb3J0IHsgc3VwZXJ2aXNvcmVzX2FzaWduYWRvcyB9IGZyb20gXCIuL3RhYmxlLWVuY3Vlc3RhZG9yZXNcIjtcclxuaW1wb3J0IHsgbWlzX3N1cGVydmlzb3Jlc19hc2lnbmFkb3MgfSBmcm9tIFwiLi90YWJsZS1lbmN1ZXN0YWRvcmVzXCI7XHJcbmltcG9ydCB7IG1pc19lbmN1ZXN0YWRvcmVzIH0gZnJvbSBcIi4vdGFibGUtbWlzX2VuY3Vlc3RhZG9yZXNcIjtcclxuaW1wb3J0IHsgcmVjdXBlcmFkb3JlcyB9IGZyb20gXCIuL3RhYmxlLXJlY3VwZXJhZG9yZXNcIjtcclxuaW1wb3J0IHsgc3VwZXJ2aXNvcmVzIH0gZnJvbSBcIi4vdGFibGUtc3VwZXJ2aXNvcmVzXCI7XHJcbmltcG9ydCB7IHBlcnNvbmFsX3JvbCB9IGZyb20gXCIuL3RhYmxlLXBlcnNvbmFsX3JvbFwiO1xyXG5pbXBvcnQgeyBwZXJtaXNvcyB9IGZyb20gXCIuL3RhYmxlLXBlcm1pc29zXCI7XHJcbmltcG9ydCB7IHJvbGVzX3Blcm1pc29zIH0gZnJvbSBcIi4vdGFibGUtcm9sZXNfcGVybWlzb3NcIjtcclxuaW1wb3J0IHsgbW9kb3NfZG0gfSBmcm9tIFwiLi90YWJsZS1tb2Rvc19kbVwiO1xyXG5pbXBvcnQgeyBwYXJhbWV0cm9zIH0gZnJvbSBcIi4vdGFibGUtcGFyYW1ldHJvc1wiO1xyXG5pbXBvcnQgeyByb2xlc19zdWJvcmRpbmFkb3MgfSBmcm9tIFwiLi90YWJsZS1yb2xlc19zdWJvcmRpbmFkb3NcIjtcclxuXHJcbmltcG9ydCB7IG5vX3JlYSB9IGZyb20gXCIuL3RhYmxlLW5vX3JlYVwiO1xyXG5pbXBvcnQgeyBub19yZWFfc3VwIH0gZnJvbSBcIi4vdGFibGUtbm9fcmVhX3N1cFwiO1xyXG5pbXBvcnQgeyByZWEgfSBmcm9tIFwiLi90YWJsZS1yZWFcIjtcclxuaW1wb3J0IHsgcmVhX3N1cCB9IGZyb20gXCIuL3RhYmxlLXJlYV9zdXBcIjtcclxuaW1wb3J0IHsgdGVtIH0gZnJvbSBcIi4vdGFibGUtdGVtXCI7XHJcbmltcG9ydCB7IHNlbWFuYXMgfSBmcm9tIFwiLi90YWJsZS1zZW1hbmFzXCI7XHJcbmltcG9ydCB7IHVzdWFyaW9zIH0gZnJvbSAnLi90YWJsZS11c3Vhcmlvcyc7XHJcbmltcG9ydCB7IG9wZXJhY2lvbmVzIH0gZnJvbSAnLi90YWJsZS1vcGVyYWNpb25lcyc7XHJcbmltcG9ydCB7IGNvbXVuYXMgfSBmcm9tICcuL3RhYmxlLWNvbXVuYXMnO1xyXG5pbXBvcnQgeyBhcmVhcyB9IGZyb20gJy4vdGFibGUtYXJlYXMnO1xyXG5pbXBvcnQgeyBzaW5jcm9uaXphY2lvbmVzIH0gZnJvbSAnLi90YWJsZS1zaW5jcm9uaXphY2lvbmVzJztcclxuaW1wb3J0IHsgdGFyZWFzIH0gZnJvbSAnLi90YWJsZS10YXJlYXMnO1xyXG5pbXBvcnQge1xyXG4gICAgdGFyZWFzX3RlbSxcclxuICAgIHRhcmVhc190ZW1fYXNpZ25hY2lvbl9lbmN1LFxyXG4gICAgdGFyZWFzX3RlbV9hc2lnbmFjaW9uX3JlY3UsXHJcbiAgICB0YXJlYXNfdGVtX2FzaWduYWNpb25fc3VwZSxcclxuICAgIHRhcmVhc190ZW1fYXNpZ25hY2lvbl9pbmdyXHJcbn0gZnJvbSAnLi90YWJsZS10YXJlYXNfdGVtJztcclxuaW1wb3J0IHsgdGFyZWFzX2FyZWFzIH0gZnJvbSAnLi90YWJsZS10YXJlYXNfYXJlYXMnO1xyXG5pbXBvcnQgeyBhcmVhc19hc2lnbmFjaW9uX2dlbmVyYWwgfSBmcm9tICcuL3RhYmxlLWFyZWFzX2FzaWduYWNpb25fZ2VuZXJhbCc7XHJcbmltcG9ydCB7IGdyaWxsYV9ob2phX3J1dGEgfSBmcm9tICcuL3RhYmxlLWdyaWxsYV9ob2phX3J1dGEnO1xyXG5pbXBvcnQgeyB0X2VuY3VfYXJlYXMgfSBmcm9tICcuL3RhYmxlLXRhcmVhc19hcmVhcyc7XHJcbmltcG9ydCB7IHRfcmVjdV9hcmVhcyB9IGZyb20gJy4vdGFibGUtdGFyZWFzX2FyZWFzJztcclxuaW1wb3J0IHsgdF9zdXBlX2FyZWFzIH0gZnJvbSAnLi90YWJsZS10YXJlYXNfYXJlYXMnO1xyXG5pbXBvcnQgeyB0X2luZ3JfYXJlYXMgfSBmcm9tICcuL3RhYmxlLXRhcmVhc19hcmVhcyc7XHJcbmltcG9ydCB7IG1pc190YXJlYXMgfSBmcm9tICcuL3RhYmxlLW1pc190YXJlYXMnO1xyXG5pbXBvcnQgeyB0ZW1fYXNpZ25hY2lvbiB9IGZyb20gJy4vdGFibGUtdGVtX2FzaWduYWNpb24nO1xyXG5pbXBvcnQgeyB0YXJlYXNfdGVtX3JlY2VwY2lvbiB9IGZyb20gJy4vdGFibGUtdGFyZWFzX3RlbV9yZWNlcGNpb24nO1xyXG5pbXBvcnQgeyB0YXJlYXNfdGVtX2luZ3Jlc28gfSBmcm9tICcuL3RhYmxlLXRhcmVhc190ZW1faW5ncmVzbyc7XHJcbmltcG9ydCB7IHRhcmVhc190ZW1fZmluX2NhbXBvIH0gZnJvbSAnLi90YWJsZS10YXJlYXNfdGVtX2Zpbl9jYW1wbyc7XHJcbmltcG9ydCB7IHRhcmVhc190ZW1fcHJvY2VzYW1pZW50byB9IGZyb20gJy4vdGFibGUtdGFyZWFzX3RlbV9wcm9jZXNhbWllbnRvJztcclxuaW1wb3J0IHsgdGFyZWFzX3RlbV9hbmFsaXNpc19jYW1wbyB9IGZyb20gJy4vdGFibGUtdGFyZWFzX3RlbV9hbmFsaXNpc19jYW1wbyc7XHJcbmltcG9ydCB7IG1pc190YXJlYXNfYXJlYXMgfSBmcm9tICcuL3RhYmxlLW1pc190YXJlYXNfYXJlYXMnO1xyXG5pbXBvcnQgeyBjb250cm9sX2NhbXBvIH0gZnJvbSAnLi90YWJsZS1jb250cm9sX2NhbXBvJztcclxuaW1wb3J0IHsgY29udHJvbF9yZXN1bWVuIH0gZnJvbSAnLi90YWJsZS1jb250cm9sX3Jlc3VtZW4nO1xyXG5pbXBvcnQgeyBjb250cm9sX2RpYXNfY2FyZ2EgfSBmcm9tICcuL3RhYmxlLWNvbnRyb2xfZGlhc19jYXJnYSc7XHJcbmltcG9ydCB7IHZpdmllbmRhcyB9IGZyb20gJy4vdGFibGUtdml2aWVuZGFzJztcclxuaW1wb3J0IHsgdmlzaXRhcyB9IGZyb20gJy4vdGFibGUtdmlzaXRhcyc7XHJcbmltcG9ydCB7IGhvZ2FyZXMgfSBmcm9tICcuL3RhYmxlLWhvZ2FyZXMnO1xyXG5pbXBvcnQgeyBwZXJzb25hcyB9IGZyb20gJy4vdGFibGUtcGVyc29uYXMnO1xyXG5pbXBvcnQgeyB2aXNpdGFzX3N1cCB9IGZyb20gJy4vdGFibGUtdmlzaXRhc19zdXAnO1xyXG5pbXBvcnQgeyBob2dhcmVzX3N1cCB9IGZyb20gJy4vdGFibGUtaG9nYXJlc19zdXAnO1xyXG5pbXBvcnQgeyBwZXJzb25hc19zdXAgfSBmcm9tICcuL3RhYmxlLXBlcnNvbmFzX3N1cCc7XHJcbmltcG9ydCB7IGRpY2Npb25hcmlvIH0gZnJvbSAnLi90YWJsZS1kaWNjaW9uYXJpbyc7XHJcbmltcG9ydCB7IGRpY3RyYSB9IGZyb20gJy4vdGFibGUtZGljdHJhJztcclxuaW1wb3J0IHsgZGljdmFyIH0gZnJvbSAnLi90YWJsZS1kaWN2YXInO1xyXG5cclxuaW1wb3J0IHsgZXN0YWRvcyB9IGZyb20gJy4vdGFibGUtZXN0YWRvcyc7XHJcbmltcG9ydCB7IGFjY2lvbmVzIH0gZnJvbSAnLi90YWJsZS1hY2Npb25lcyc7XHJcbmltcG9ydCB7IGVzdGFkb3NfYWNjaW9uZXMgfSBmcm9tICcuL3RhYmxlLWVzdGFkb3NfYWNjaW9uZXMnO1xyXG5pbXBvcnQgeyB0YXJlYXNfcHJveGltYXMgfSBmcm9tICcuL3RhYmxlLXRhcmVhc19wcm94aW1hcyc7XHJcbmltcG9ydCB7IGhpc3RvcmlhbF90ZW0gfSBmcm9tICcuL3RhYmxlLWhpc3RvcmlhbF90ZW0nO1xyXG5pbXBvcnQgeyBpbmNvbnNpc3RlbmNpYXNfY3VtcGxlbl9jb25kaWNpb24gfSBmcm9tICcuL3RhYmxlLWluY29uc2lzdGVuY2lhc19jdW1wbGVuX2NvbmRpY2lvbic7XHJcbmltcG9ydCB7IHRlbV9ib3JyYWRhcyB9IGZyb20gJy4vdGFibGUtdGVtX2JvcnJhZGFzJztcclxuaW1wb3J0IHsgYmFycmlvcyB9IGZyb20gXCIuL3RhYmxlLWJhcnJpb3NcIjtcclxuaW1wb3J0IHsgZnJhY2Npb25lcyB9IGZyb20gXCIuL3RhYmxlLWZyYWNjaW9uZXNcIjtcclxuaW1wb3J0IHsgcmFkaW9zIH0gZnJvbSBcIi4vdGFibGUtcmFkaW9zXCI7XHJcbmltcG9ydCB7IG1hbnphbmFzIH0gZnJvbSBcIi4vdGFibGUtbWFuemFuYXNcIjtcclxuaW1wb3J0IHsgYXJlYV9lbmNfcHJveGltYXMgfSBmcm9tIFwiLi90YWJsZS1hcmVhX2VuY19wcm94aW1hc1wiO1xyXG5cclxuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMtZG1lbmN1XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2F5dWRhXCI7XHJcbmltcG9ydCB7IGRlZkNvbmZpZyB9IGZyb20gXCIuL2RlZi1jb25maWdcIlxyXG5pbXBvcnQgeyBQcm9jZWR1cmVEZWYgfSBmcm9tIFwiYmFja2VuZC1wbHVzXCI7XHJcbmltcG9ydCB7IHRhYmxlIH0gZnJvbSBcImNvbnNvbGVcIjtcclxuXHJcbmltcG9ydCB7IGRhdGV0aW1lIH0gZnJvbSBcImJlc3QtZ2xvYmFsc1wiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmVDb250ZXh0IH0gZnJvbSBcImJhY2tlbmQtcGx1c1wiO1xyXG5cclxuXHJcbmNvbnN0IEFQUF9ETV9WRVJTSU9OID0gXCIjMjItMTItMTVcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RvQnlQb2xpY3koYmU6IEFwcEJhY2tlbmQpIHtcclxuICAgIHJldHVybiBiZS5jb25maWcuc2VydmVyLnBvbGljeSA9PSAnd2ViJyA/ICdSRUxFVkFNSUVOVE8nIDogJ0dBQklORVRFJztcclxufVxyXG5cclxuLy8gcGVybWlzb3MgcXVlIGdldENvbnRleHQgYWdyZWdhIGFsIGNvbnRleHRvIHNlZ8O6biBlbCB1c3VhcmlvIGxvZ3VlYWRvIChvIGxhIGZhbHRhIGRlIHVzdWFyaW8pXHJcbmV4cG9ydCBmdW5jdGlvbiBwZXJtaXNvc1NlZ3VuVXN1YXJpbyhcclxuICAgIGNhY2hlczogUGljazxBcHBCYWNrZW5kWydjYWNoZXMnXSwgJ3Blcm1pc29zUm9sJyB8ICdwZXJtaXNvc1N1cGVydXNlcicgfCAncGVybWlzb3NQYXJhTmFkaWUnPixcclxuICAgIHVzZXI6IENvbnRleHRbJ3VzZXInXSB8IHVuZGVmaW5lZFxyXG4pOiB7IHN1cGVydXNlcj86IHRydWUsIHB1ZWRlPzogUHVlZGUgfSB7XHJcbiAgICBpZiAodXNlciA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgcHVlZGU6IGNhY2hlcy5wZXJtaXNvc1BhcmFOYWRpZSB9O1xyXG4gICAgfVxyXG4gICAgdmFyIHJvbCA9IHVzZXIucm9sO1xyXG4gICAgdmFyIHBlcm1pc29zRGVsUm9sID0gcm9sICE9IG51bGwgPyBjYWNoZXMucGVybWlzb3NSb2xbcm9sXSA6IHVuZGVmaW5lZDtcclxuICAgIGlmIChwZXJtaXNvc0RlbFJvbD8uc3VwZXJ1c2VyKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgc3VwZXJ1c2VyOiB0cnVlLCBwdWVkZTogY2FjaGVzLnBlcm1pc29zU3VwZXJ1c2VyIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBwdWVkZTogcGVybWlzb3NEZWxSb2w/LnB1ZWRlIH07XHJcbn1cclxuXHJcbi8vIGxvIHF1ZSBkZWNpZGUgcXXDqSB0ZW1hcyBkZSBheXVkYSB2ZSBlbCB1c3VhcmlvOiBzdSByb2wsIHN1cyBwZXJtaXNvcyB5IGVsIG1vZG8gZGUgbGEgaW5zdGFuY2lhXHJcbmV4cG9ydCBmdW5jdGlvbiBxdWllbkNvbnN1bHRhQXl1ZGEoY29udGV4dDogQ29udGV4dCk6IFF1aWVuQ29uc3VsdGFBeXVkYSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHJvbDogY29udGV4dC51c2VyPy5yb2wgPz8gbnVsbCxcclxuICAgICAgICBzdXBlcnVzZXI6ICEhY29udGV4dC5zdXBlcnVzZXIsXHJcbiAgICAgICAgcHVlZGU6IGNvbnRleHQucHVlZGUsXHJcbiAgICAgICAgbW9kbzogZ2V0TW9kb0J5UG9saWN5KGNvbnRleHQuYmUpLFxyXG4gICAgfTtcclxufVxyXG5cclxuLy8gbG8gcXVlIHVzYW4gcmVmcmVzaENhY2hlcyB5IHJlZnJlc2NhckVzdHJ1Y3R1cmFBbE1vZGlmaWNhclRhYmxhIGRlbCBjbGllbnRlIGRlIGJhc2UgKGVsIENsaWVudCBkZSBwZy1wcm9taXNlLXN0cmljdCBsbyBjdW1wbGUpXHJcbmV4cG9ydCB0eXBlIENvbnN1bHRhRGIgPSB7XHJcbiAgICBmZXRjaEFsbCgpOiBQcm9taXNlPHBnLlJlc3VsdFJvd3M+XHJcbiAgICBmZXRjaFVuaXF1ZVJvdygpOiBQcm9taXNlPHBnLlJlc3VsdE9uZVJvdz5cclxufVxyXG5leHBvcnQgdHlwZSBDbGllbnRlRGIgPSB7XHJcbiAgICBxdWVyeShzcWw6IHN0cmluZyk6IENvbnN1bHRhRGJcclxufVxyXG5cclxuLy8gdGFibGFzIGN1eWEgbW9kaWZpY2FjacOzbiBjYW1iaWEgbGEgZXN0cnVjdHVyYSBxdWUgc2UgbWFuZGEgYSBsb3MgZGlzcG9zaXRpdm9zICh2ZXIgb3BlcmF0aXZvX2VzdHJ1Y3R1cmFfY29tcGxldGEpXHJcbmV4cG9ydCBjb25zdCBUQUJMQVNfRVNUUlVDVFVSQSA9IFsnY2FzaWxsZXJvcycsICdzZW1hbmFzJ107XHJcbi8vIHRhYmxhcyBkZSByZWEvbm8gcmVhLCBxdWUgYWRlbcOhcyBzZSBndWFyZGFuIGVuIGJlLmNhY2hlcy50YWJsZUNvbnRlbnQgKHZlciByZWZyZXNoQ2FjaGVzKVxyXG5leHBvcnQgY29uc3QgVEFCTEFTX1JFQV9OT19SRUEgPSBbJ3JlYScsICdub19yZWEnLCAncmVhX3N1cCcsICdub19yZWFfc3VwJ107XHJcblxyXG5leHBvcnQgdHlwZSBSZWZyZXNjYWRvckVzdHJ1Y3R1cmEgPSB7XHJcbiAgICBjYWNoZXM6IHsgdGltZXN0YW1wRXN0cnVjdHVyYTogbnVtYmVyIH1cclxuICAgIHJlZnJlc2hDYWNoZXMoY2xpZW50OiBDbGllbnRlRGIpOiBQcm9taXNlPHZvaWQ+XHJcbn1cclxuXHJcbi8vIGVudnVlbHZlIHRhYmxlX3JlY29yZF9zYXZlL3RhYmxlX3JlY29yZF9kZWxldGUgcGFyYSBxdWUgYWwgbW9kaWZpY2FyIGVzYXMgdGFibGFzIGxvcyBkaXNwb3NpdGl2b3NcclxuLy8gcmVjaWJhbiBsYSBlc3RydWN0dXJhIG51ZXZhICh0aW1lc3RhbXBFc3RydWN0dXJhKSB5LCBzaSBzb24gZGUgcmVhL25vIHJlYSwgc2UgcmVjYXJndWVuIGxhcyBjYWNoZXNcclxuLy8gY29uIGVsIG1pc21vIGNsaWVudGUgKGRlbnRybyBkZSBsYSBtaXNtYSB0cmFuc2FjY2nDs24pXHJcbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNjYXJFc3RydWN0dXJhQWxNb2RpZmljYXJUYWJsYTxDIGV4dGVuZHMgeyBjbGllbnQ6IENsaWVudGVEYiB9LCBQIGV4dGVuZHMgeyB0YWJsZTogc3RyaW5nIH0sIFIsIFJlc3RvIGV4dGVuZHMgKG9iamVjdCB8IHVuZGVmaW5lZClbXT4oXHJcbiAgICBiZTogUmVmcmVzY2Fkb3JFc3RydWN0dXJhLFxyXG4gICAgY29yZUZ1bmN0aW9uOiAoY29udGV4dDogQywgcGFyYW1ldGVyczogUCwgLi4ucmVzdG86IFJlc3RvKSA9PiBQcm9taXNlPFI+XHJcbik6IChjb250ZXh0OiBDLCBwYXJhbWV0ZXJzOiBQLCAuLi5yZXN0bzogUmVzdG8pID0+IFByb21pc2U8Uj4ge1xyXG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBDLCBwYXJhbWV0ZXJzOiBQLCAuLi5yZXN0bzogUmVzdG8pIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMsIC4uLnJlc3RvKTtcclxuICAgICAgICBpZiAoVEFCTEFTX0VTVFJVQ1RVUkEuaW5jbHVkZXMocGFyYW1ldGVycy50YWJsZSkpIHtcclxuICAgICAgICAgICAgYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlIHRvY8OzIGxhIGVzdHJ1Y3R1cmEnLCBiZS5jYWNoZXMudGltZXN0YW1wRXN0cnVjdHVyYSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFRBQkxBU19SRUFfTk9fUkVBLmluY2x1ZGVzKHBhcmFtZXRlcnMudGFibGUpKSB7XHJcbiAgICAgICAgICAgIGJlLmNhY2hlcy50aW1lc3RhbXBFc3RydWN0dXJhID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLnJlZnJlc2hDYWNoZXMoY29udGV4dC5jbGllbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCByZWdpc3RyYXJDcm9uSm9iUGFzYXJBUHJvaWUgPSBhc3luYyAoYmU6IEFwcEJhY2tlbmQpID0+IHtcclxuICAgIGNvbnN0IGVqZWN1dGFyUGFzYWplID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGxvZyA9IChtc2c6IHN0cmluZywgZGF0YTogYW55ID0gJycpID0+XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2RhdGV0aW1lLm5vdygpLnRvWW1kSG1zKCl9IFtDUk9OOlBST0lFXSAke21zZ31gLCBkYXRhKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsb2coJ/CfmoAgaW5pY2lhIGNyb24gcGFzYWplIGEgcHJvaWUnKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBiZS5pblRyYW5zYWN0aW9uKG51bGwsIGFzeW5jIChjbGllbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBwYXNhckVuY3Vlc3Rhc0FQcm9pZShjbGllbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxvZygn4pyFIHJlc3VsdCBwcm9jIHBhc2FqZSBhIHByb2llOicsIHJlc3VsdCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHZhciBlcnJvciA9IHVuZXhwZWN0ZWQoZXJyKTtcclxuICAgICAgICAgICAgbG9nKGDinYwgZXJyb3IgcGFzYWplIGEgcHJvaWU6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICBsb2coJ/Cfj4EgdGVybWluYSBjcm9uIHByb2llJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIGF3YWl0IGVqZWN1dGFyUGFzYWplKCk7XHJcbiAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKGVqZWN1dGFyUGFzYWplLCAxMDAwICogNjAgKiA2MClcclxuICAgIGJlLnNodXRkb3duQ2FsbGJhY2tMaXN0QWRkKHtcclxuICAgICAgICBtZXNzYWdlOiAnYXBhZ2EgY3JvbiBwYXNhciBhIHByb2llJyxcclxuICAgICAgICBmdW46IGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuY29uc3QgZ2V0TWFuaWZlc3RJbWFnZUljb25zID0gKEFQUF9OQU1FOiBzdHJpbmcsIHN1Zmlqbzogc3RyaW5nKSA9PiBbXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTMyJHtzdWZpam99LnBuZ2AsXHJcbiAgICAgICAgXCJzaXplc1wiOiBcIjMyeDMyXCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTQ4JHtzdWZpam99LnBuZ2AsXHJcbiAgICAgICAgXCJzaXplc1wiOiBcIjQ4eDQ4XCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTY0JHtzdWZpam99LnBuZ2AsXHJcbiAgICAgICAgXCJzaXplc1wiOiBcIjY0eDY0XCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTcyJHtzdWZpam99LnBuZ2AsXHJcbiAgICAgICAgXCJzaXplc1wiOiBcIjcyeDcyXCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTE5MiR7c3VmaWpvfS5wbmdgLFxyXG4gICAgICAgIFwic2l6ZXNcIjogXCIxOTJ4MTkyXCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgXCJzcmNcIjogYC4uL2ltZy8ke0FQUF9OQU1FfS1sb2dvLWRtLTUxMiR7c3VmaWpvfS5wbmdgLFxyXG4gICAgICAgIFwic2l6ZXNcIjogXCI1MTJ4NTEyXCIsXHJcbiAgICAgICAgXCJ0eXBlXCI6IFwiaW1hZ2UvcG5nXCJcclxuICAgIH1cclxuXTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlbWVyZ2VBcHBEbUVuY3U8VCBleHRlbmRzIHByb2Nlc2FtaWVudG8uQ29uc3RydWN0b3I8cHJvY2VzYW1pZW50by5BcHBQcm9jZXNhbWllbnRvVHlwZT4+KEJhc2U6IFQpIHtcclxuICAgIHJldHVybiBjbGFzcyBBcHBEbUVuY3UgZXh0ZW5kcyBCYXNlIHtcclxuICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgICAgICAgICBzdXBlcihhcmdzKTtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50ID0gdGhpcy5jYWNoZXMudGFibGVDb250ZW50IHx8IHt9O1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhID0gW11cclxuICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9ncm91cHMgPSBbXVxyXG4gICAgICAgICAgICB0aGlzLmNhY2hlcy5tZXRhRW5jSW5jbHVpckNhc2lsbGVyb3NTYWx0b1JFTCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlcy50aW1lc3RhbXBFc3RydWN0dXJhID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5jb25SZWFIb2dhciA9IHt9O1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlcy5heXVkYSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBnZXRTdWZpam9Gcm9tYmFzZVVybCA9IChiYXNlVXJsOiBzdHJpbmcpID0+XHJcbiAgICAgICAgICAgIGJhc2VVcmwuaW5jbHVkZXMoJ3Rlc3QnKSB8fCBiYXNlVXJsLmluY2x1ZGVzKCcvcHInKSA/ICdfdGVzdCcgOlxyXG4gICAgICAgICAgICAgICAgYmFzZVVybC5pbmNsdWRlcygnY2FwYScpID8gJ19jYXBhJyA6ICcnO1xyXG5cclxuICAgICAgICBnZXRBcHBOYW1lID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgICAgICByZXR1cm4gKChhd2FpdCBiZS5pblRyYW5zYWN0aW9uKG51bGwsIChjbGllbnQ6IHBnLkNsaWVudCkgPT5cclxuICAgICAgICAgICAgICAgIGNsaWVudC5xdWVyeShcInNlbGVjdCBvcGVyYXRpdm8gZnJvbSBwYXJhbWV0cm9zIHdoZXJlIHVuaWNvX3JlZ2lzdHJvXCIpLmZldGNoVW5pcXVlVmFsdWUoKVxyXG4gICAgICAgICAgICApKS52YWx1ZSBhcyBzdHJpbmcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYmFja2VuZC1wbHVzIGxvIGRlY2xhcmEgc2luIHBhcsOhbWV0cm9zIHBlcm8gbG8gbGxhbWEgY29uIChjb250ZXh0LCB1c3VhcmlvKSwgcG9yIGVzbyBzb24gb3BjaW9uYWxlc1xyXG4gICAgICAgIG92ZXJyaWRlIGFzeW5jIGNhbkNoYW5nZVBhc3MocmVxT3JDb250ZXh0PzogUmVxdWVzdCB8IENvbnRleHQsIHVzZXJUb0NoYW5nZVBhc3M/OiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciB1c3VhcmlvTG9ndWVhZG8gPSByZXFPckNvbnRleHQ/LnVzZXI7XHJcbiAgICAgICAgICAgIGlmIChyZXFPckNvbnRleHQgPT0gbnVsbCB8fCB1c3VhcmlvTG9ndWVhZG8gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciByb2wgPSB1c3VhcmlvTG9ndWVhZG8ucm9sO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgYmUuaW5EYkNsaWVudChudWxsLCBhc3luYyAoY2xpZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcSA9IGJlLmRiLnF1b3RlTGl0ZXJhbDtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCAqIFxyXG4gICAgICAgICAgICAgICAgICBmcm9tIHVzdWFyaW9zIFxyXG4gICAgICAgICAgICAgICAgICB3aGVyZSByb2wgaW4gKHNlbGVjdCByb2xfc3Vib3JkaW5hZG8gZnJvbSByb2xlc19zdWJvcmRpbmFkb3Mgd2hlcmUgcm9sID0gJHtxKHJvbCl9KWApLmZldGNoQWxsKCkpLnJvd3M7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHZhciBwdWVkZSA9ICEhcmVzdWx0LmZpbmQoKHVzZXIpID0+IHVzZXIudXN1YXJpbyA9PSB1c2VyVG9DaGFuZ2VQYXNzKTtcclxuICAgICAgICAgICAgdmFyIGlzQWRtaW4gPSBiZS5pc0FkbWluKHJlcU9yQ29udGV4dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBpc0FkbWluIHx8IHB1ZWRlXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBvdmVycmlkZSBhc3luYyBnZXRQcm9jZWR1cmVzKCkge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgcHJvY2VkaW1pZW50b0FSZWVtcGxhemFyID0gW1wiY2Fzb19ndWFyZGFyXCIsIFwiY2Fzb190cmFlclwiXTtcclxuICAgICAgICAgICAgdmFyIHBhcmVudFByb2MgPSBhd2FpdCBzdXBlci5nZXRQcm9jZWR1cmVzKCk7XHJcbiAgICAgICAgICAgIHBhcmVudFByb2MgPSBwYXJlbnRQcm9jLmZpbHRlcigocHJvY2VkdXJlOiBhbnkpID0+ICFwcm9jZWRpbWllbnRvQVJlZW1wbGF6YXIuaW5jbHVkZXMocHJvY2VkdXJlLmFjdGlvbikpO1xyXG4gICAgICAgICAgICBwYXJlbnRQcm9jID0gcGFyZW50UHJvYy5tYXAocHJvY0RlZiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY0RlZi5hY3Rpb24gPT0gJ3RhYmxlX3JlY29yZF9zYXZlJyB8fCBwcm9jRGVmLmFjdGlvbiA9PSAndGFibGVfcmVjb3JkX2RlbGV0ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jRGVmLmNvcmVGdW5jdGlvbiA9IHJlZnJlc2NhckVzdHJ1Y3R1cmFBbE1vZGlmaWNhclRhYmxhKGJlLCBwcm9jRGVmLmNvcmVGdW5jdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY0RlZjtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudFByb2MuY29uY2F0KFByb2NlZHVyZXNEbUVuY3UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvdmVycmlkZSBhc3luYyBjaGVja0RhdGFiYXNlU3RydWN0dXJlKF9jbGllbnQ6IENsaWVudCkge1xyXG4gICAgICAgIH1cclxuICAgICAgICBvdmVycmlkZSBhZGRTY2hyw7ZkaW5nZXJTZXJ2aWNlcyhtYWluQXBwOiBwcm9jZXNhbWllbnRvLkV4cHJlc3MsIGJhc2VVcmw6IHN0cmluZykge1xyXG4gICAgICAgICAgICBsZXQgYmUgPSB0aGlzO1xyXG4gICAgICAgICAgICBzdXBlci5hZGRTY2hyw7ZkaW5nZXJTZXJ2aWNlcyhtYWluQXBwLCBiYXNlVXJsKTtcclxuICAgICAgICAgICAgLy9wZXJtaXRvIGxldmFudGFyIG1pcyBpbWFnZW5lcyBlbiBhcGxpY2FjaW9uZXMgZGVwZW5kaWVudGVzXHJcbiAgICAgICAgICAgIGJlLmFwcC51c2UoJy9pbWcnLCBleHByZXNzLnN0YXRpYygnbm9kZV9tb2R1bGVzL2RtZW5jdS9kaXN0L3VubG9nZ2VkL3VubG9nZ2VkL2ltZycpKVxyXG4gICAgICAgICAgICBtYWluQXBwLnVzZShmdW5jdGlvbiAocmVxOiBSZXF1ZXN0LCBfcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVxLnNlc3Npb24gJiYgIXJlcS5zZXNzaW9uLmluc3RhbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXEuc2Vzc2lvbi5pbnN0YWxsID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygpLnJlcGxhY2UoJy4nLCAnJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBuZXh0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsICsgJy9zYWx2YXInLCBmdW5jdGlvbiAocmVxLCByZXMsIF9uZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIHPDqSBxdWUgdm95IGEgcmVjaWJpciB1c2VyYWdlbnQgcG9yIGxvcyBtaWRkbGV3YXJlcyBkZSBCYWNrZW5kLXBsdXNcclxuICAgICAgICAgICAgICAgIHZhciB7IHVzZXJhZ2VudCB9ID0gcmVxO1xyXG4gICAgICAgICAgICAgICAgdmFyIGh0bWxNYWluID0gYmUubWFpblBhZ2UoeyB1c2VyYWdlbnQgfSwgZmFsc2UsIHsgc2tpcE1lbnU6IHRydWUsIG9mZmxpbmVGaWxlOiB0cnVlIH0pLnRvSHRtbERvYygpO1xyXG4gICAgICAgICAgICAgICAgbWluaVRvb2xzLnNlcnZlVGV4dChodG1sTWFpbiwgJ2h0bWwnKShyZXEsIHJlcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsICsgJy9jYW1wbycsIGZ1bmN0aW9uIChyZXEsIHJlcywgX25leHQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgc8OpIHF1ZSB2b3kgYSByZWNpYmlyIHVzZXJhZ2VudCBwb3IgbG9zIG1pZGRsZXdhcmVzIGRlIEJhY2tlbmQtcGx1c1xyXG4gICAgICAgICAgICAgICAgdmFyIHsgdXNlcmFnZW50LCB1c2VyIH0gPSByZXE7XHJcbiAgICAgICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7e3R5cGU6J2pzJywgc3JjOnN0cmluZ31bXX0gKi9cclxuICAgICAgICAgICAgICAgICAgICB2YXIgd2ViTWFuaWZlc3RQYXRoID0gJ2NhcmdhLWRtL3dlYi1tYW5pZmVzdC53ZWJtYW5pZmVzdCc7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWxNYWluID0gYmUubWFpblBhZ2UoeyB1c2VyYWdlbnQsIHVzZXIgfSwgZmFsc2UsIHsgc2tpcE1lbnU6IHRydWUsIHdlYk1hbmlmZXN0UGF0aCwgb2ZmbGluZUZpbGU6IHRydWUgfSkudG9IdG1sRG9jKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluaVRvb2xzLnNlcnZlVGV4dChodG1sTWFpbiwgJ2h0bWwnKShyZXEsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcy5yZWRpcmVjdCg0MDEsIGJhc2VVcmwgKyAnL2xvZ2luI3c9cGF0aCZwYXRoPS9jYW1wbycpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsICsgJy9mYWxsYmFjay1zaW5jcm8nLCBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpzb25GYWxsYmFjayA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvazogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ05vIHNlIGxvZ3LDsyBlc3RhYmxlY2VyIGxhIGNvbmV4aW9uIGNvbiBlbCBzZXJ2aWRvciwgY29tcHJ1ZWJlIHN1IGNvbmV4aW9uIGRlIGludGVybmV0IChyZXNwdWVzdGEgZGVzZGUgZmFsbGJhY2spJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVKc29uKGpzb25GYWxsYmFjaykocmVxLCByZXMsIG5leHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdmFyIGNyZWF0ZVNlcnZpY2VXb3JrZXIgPSBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3cgPSBhd2FpdCBmcy5yZWFkRmlsZSgnbm9kZV9tb2R1bGVzL3NlcnZpY2Utd29ya2VyLWFkbWluL2Rpc3Qvc2VydmljZS13b3JrZXItd28tbWFuaWZlc3QuanMnLCAndXRmOCcpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG1hbmlmZXN0ID0gYXdhaXQgYmUuY3JlYXRlUmVzb3VyY2VzRm9yQ2FjaGVKc29uKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3dNYW5pZmVzdCA9IHN3XHJcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCInLyp2ZXJzaW9uKi8nXCIsIEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0LnZlcnNpb24pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJy8qYXBwTmFtZSovJ1wiLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdC5hcHBOYW1lKSlcclxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxbXFxzKlxcL1xcKnVybHNUb0NhY2hlXFwqXFwvXFxzKlxcXS8sIEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0LmNhY2hlKSlcclxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxbXFxzKlxcL1xcKmZhbGxiYWNrc1xcKlxcL1xccypcXF0vLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdC5mYWxsYmFja3MgfHwgW10pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiJy8qZGVmYXVsdEZhbGxiYWNrKi8nXCIsIEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0LmRlZmF1bHRGYWxsYmFjaykpO1xyXG4gICAgICAgICAgICAgICAgLy8ucmVwbGFjZShcIi8jQ0FDSEUkL1wiLCBcIi8oYVxcXFxkK21cXFxcZCtwXFxcXGQrdFxcXFxkK19lc3RydWN0dXJhLmpzKXwoYVxcXFxkK21cXFxcZCtwXFxcXGQrdFxcXFxkK19oZHIuanNvbikvXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN3TWFuaWZlc3RcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsICsgYC9zdy1tYW5pZmVzdC5qc2AsIGFzeW5jIGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVUZXh0KGF3YWl0IGNyZWF0ZVNlcnZpY2VXb3JrZXIoKSwgJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnKShyZXEsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVFcnIocmVxLCByZXMsIG5leHQpKHVuZXhwZWN0ZWQoZXJyKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYWluQXBwLmdldChiYXNlVXJsICsgYC9jYXJnYS1kbS93ZWItbWFuaWZlc3Qud2VibWFuaWZlc3RgLCBhc3luYyBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IEFQUF9OQU1FID0gYXdhaXQgYmUuZ2V0QXBwTmFtZSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3VmaWpvID0gYmUuZ2V0U3VmaWpvRnJvbWJhc2VVcmwoYmFzZVVybCk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBgJHtBUFBfTkFNRX0ke3N1Zmlqb30gUHJvZ3Jlc3NpdmUgV2ViIEFwcGAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2hvcnRfbmFtZVwiOiBgJHtBUFBfTkFNRX0ke3N1Zmlqb30gUFdBYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBgUHJvZ3Jlc3NpdmUgV2ViIEFwcCBmb3IgJHtBUFBfTkFNRX0ke3N1Zmlqb30uYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpY29uc1wiOiBnZXRNYW5pZmVzdEltYWdlSWNvbnMoQVBQX05BTUUsIHN1ZmlqbyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmJlLmdldENvbG9yc0pzb24oc3VmaWpvIGFzIFN1Zmlqb3NBbWJpZW50ZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbWluaVRvb2xzLnNlcnZlVGV4dChKU09OLnN0cmluZ2lmeShjb250ZW50KSwgJ2FwcGxpY2F0aW9uL2pzb24nKShyZXEsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVFcnIocmVxLCByZXMsIG5leHQpKHVuZXhwZWN0ZWQoZXJyKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBnZXRDb2xvcnNKc29uKF9zdWZpam86IFN1Zmlqb3NBbWJpZW50ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgXCJzdGFydF91cmxcIjogXCIuLi9jYW1wb1wiLFxyXG4gICAgICAgICAgICAgICAgXCJkaXNwbGF5XCI6IFwic3RhbmRhbG9uZVwiLFxyXG4gICAgICAgICAgICAgICAgXCJ0aGVtZV9jb2xvclwiOiBcIiMzRjUxQjVcIixcclxuICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZF9jb2xvclwiOiBcIiM2ZDYwZWRcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG92ZXJyaWRlIGFkZExvZ2dlZFNlcnZpY2VzKCkge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgICAgICBzdXBlci5hZGRMb2dnZWRTZXJ2aWNlcygpO1xyXG4gICAgICAgICAgICBiZS5hcHAuZ2V0KCcvbWFuaWZlc3QubWFuaWZlc3QnLCBhc3luYyBmdW5jdGlvbiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBfbmV4dDogTmV4dEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBtaW5pVG9vbHMuc2VydmVGaWxlKCdzcmMvY2xpZW50L21hbmlmZXN0Lm1hbmlmZXN0Jywge30pKHJlcSwgcmVzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwLmdldCgnL2ZpbGUnLCBhc3luYyBmdW5jdGlvbiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYmUuaW5UcmFuc2FjdGlvbihyZXEsXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWVudDogcGcuQ2xpZW50KSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQucXVlcnkoXCJzZWxlY3QgcnV0YSBmcm9tIGFkanVudG9zIHdoZXJlIGlkX2FkanVudG8gPSAkMVwiLCBbcmVxLnF1ZXJ5LmlkX2FkanVudG9dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlVmFsdWUoKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlUGF0aCA9IHJlc3VsdC52YWx1ZTtcclxuICAgICAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZUZpbGUoZmlsZVBhdGgsIHt9KShyZXEsIHJlcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmFwcC5nZXQoJy9pbWFnZW5lcycsIGFzeW5jIGZ1bmN0aW9uIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIG1pbmlUb29scy5zZXJ2ZUZpbGUoJ2xvY2FsLWltYWdlcy8nICsgcmVxLnF1ZXJ5LnBkZiwge30pKHJlcSwgcmVzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwLmdldCgnL2Rvd25sb2FkL2FsbCcsIGFzeW5jIGZ1bmN0aW9uIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6ICgpID0+IHZvaWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXEudXNlciA9PSBudWxsIHx8IHJlcS51c2VyLnJvbCAhPSAnYWRtaW4nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ25vIGVzdMOhIGF1dG9yaXphZG8gYSBiYWphcnNlIHRvZG8nLCByZXEudXNlcilcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHppcCA9IG5ldyB5YXpsLlppcEZpbGUoKTtcclxuICAgICAgICAgICAgICAgIHppcC5vdXRwdXRTdHJlYW0ucGlwZShyZXMpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGJhc2UgPSAnbG9jYWwtYXR0YWNobWVudHMnXHJcbiAgICAgICAgICAgICAgICBsZXQgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGJhc2UpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKGFzeW5jIGZ1bmN0aW9uIChmaWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVQYXRoID0gYmFzZSArICcvJyArIGZpbGVOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQuaXNGaWxlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgemlwLmFkZEZpbGUoZmlsZVBhdGgsIGZpbGVOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB6aXAuZW5kKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG92ZXJyaWRlIGFzeW5jIHBvc3RDb25maWcoKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHN1cGVyLnBvc3RDb25maWcoKTtcclxuICAgICAgICAgICAgdmFyIGJlID0gdGhpcztcclxuICAgICAgICAgICAgYmUuY2FjaGVzLm1ldGFFbmNJbmNsdWlyQ2FzaWxsZXJvc1NhbHRvUkVMID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLmluVHJhbnNhY3Rpb24obnVsbCwgYXN5bmMgZnVuY3Rpb24gKGNsaWVudDogcGcuQ2xpZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcVBlcm1pc29zID0gYFxyXG4gICAgICAgICAgICBTRUxFQ1QganNvbmJfb2JqZWN0X2FnZyhyLnJvbCxqc29uYl9idWlsZF9vYmplY3QoJ3N1cGVydXNlcicsci5zdXBlcnVzZXIsJ3B1ZWRlJywoXHJcbiAgICAgICAgICAgICAgICAgIFNFTEVDVCBqc29uYl9vYmplY3RfYWdnKHJwLnBlcm1pc28sKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QganNvbmJfb2JqZWN0X2FnZyhycGEuYWNjaW9uLHJwYS5oYWJpbGl0YWRvKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gcm9sZXNfcGVybWlzb3MgcnBhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgcnBhLnJvbD1ycC5yb2wgQU5EIHJwYS5wZXJtaXNvPXJwLnBlcm1pc29cclxuICAgICAgICAgICAgICAgICAgICApKVxyXG4gICAgICAgICAgICAgICAgICAgIEZST00gcm9sZXNfcGVybWlzb3MgcnBcclxuICAgICAgICAgICAgICAgICAgICBXSEVSRSBycC5yb2w9ci5yb2wgI2NvbmRIYWJpbGl0YWRvI1xyXG4gICAgICAgICAgICAgICkpKVxyXG4gICAgICAgICAgICAgIEZST00gcm9sZXMgclxyXG4gICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHFQZXJtaXNvcy5yZXBsYWNlKCcjY29uZEhhYmlsaXRhZG8jJywgJycpKS5mZXRjaFVuaXF1ZVZhbHVlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHFQZXJtaXNvcy5yZXBsYWNlKCcjY29uZEhhYmlsaXRhZG8jJywgYCBhbmQgcnAuJHtwZy5xdW90ZUlkZW50KCdoYWJpbGl0YWRvJyl9YCkpLmZldGNoVW5pcXVlVmFsdWUoKSxcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIFNFTEVDVCBqc29uYl9vYmplY3RfYWdnKHBlcm1pc28sKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QganNvbmJfb2JqZWN0X2FnZyhhY2Npb24sdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIHBlcm1pc29zIHBhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgcGEucGVybWlzbz1wLnBlcm1pc29cclxuICAgICAgICAgICAgICAgICAgICAgICkpXHJcbiAgICAgICAgICAgICAgICAgICAgICBGUk9NIHBlcm1pc29zIHBcclxuICAgICAgICAgICAgICAgIGApLmZldGNoVW5pcXVlVmFsdWUoKSxcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIFNFTEVDVCBqc29uYl9vYmplY3RfYWdnKHBlcm1pc28sKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QganNvbmJfb2JqZWN0X2FnZyhhY2Npb24sZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBwZXJtaXNvcyBwYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIHBhLnBlcm1pc289cC5wZXJtaXNvXHJcbiAgICAgICAgICAgICAgICAgICAgICApKVxyXG4gICAgICAgICAgICAgICAgICAgICAgRlJPTSBwZXJtaXNvcyBwXHJcbiAgICAgICAgICAgICAgICBgKS5mZXRjaFVuaXF1ZVZhbHVlKClcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICBiZS5jYWNoZXMucGVybWlzb3NSb2wgPSByZXN1bHRzWzBdLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYmUuY2FjaGVzLnBlcm1pc29zUm9sU29sb1RydWUgPSByZXN1bHRzWzFdLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYmUuY2FjaGVzLnBlcm1pc29zU3VwZXJ1c2VyID0gcmVzdWx0c1syXS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGJlLmNhY2hlcy5wZXJtaXNvc1BhcmFOYWRpZSA9IHJlc3VsdHNbM10udmFsdWU7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGlyKGJlLmNhY2hlcy5wZXJtaXNvc1JvbFNvbG9UcnVlLHtkZXB0aDo5fSk7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGlyKGJlLmNhY2hlcy5wZXJtaXNvc1N1cGVydXNlcix7ZGVwdGg6OX0pO1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRpcihiZS5jYWNoZXMucGVybWlzb3NQYXJhTmFkaWUse2RlcHRoOjl9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJlLmNhY2hlcy5heXVkYSA9IGNhcmdhckF5dWRhKGJlLmdldEF5dWRhRnVlbnRlcygpKTtcclxuICAgICAgICAgICAgYmUucHJvYmxlbWFzRGVBeXVkYSgpLmZvckVhY2gocHJvYmxlbWEgPT4gY29uc29sZS5lcnJvcihwcm9ibGVtYSkpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hDYWNoZXMoKTtcclxuICAgICAgICAgICAgYXdhaXQgcmVnaXN0cmFyQ3JvbkpvYlBhc2FyQVByb2llKGJlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2FycGV0YXMgY29uIGxhIGF5dWRhIHBhcmEgdXN1YXJpb3MsIGVuIG9yZGVuOiB1biB0ZW1hIGRlIHVuYSBmdWVudGUgcG9zdGVyaW9yIHJlZW1wbGF6YSB1IG9jdWx0YVxyXG4gICAgICAgIC8vIGFsIGRlIHVuYSBhbnRlcmlvciBjb24gZWwgbWlzbW8gaWQuIExhcyBhcHBzIGZpbmFsZXMgYWdyZWdhbiBsYSBzdXlhICh2ZXIgZG9jcy9heXVkYS1vbmxpbmUubWQpXHJcbiAgICAgICAgZ2V0QXl1ZGFGdWVudGVzKCk6IEF5dWRhRnVlbnRlW10ge1xyXG4gICAgICAgICAgICByZXR1cm4gW3sgb3JpZ2VuOiAnZG1lbmN1JywgY2FycGV0YTogcGF0aC5qb2luKGNhcnBldGFEZWxQYXF1ZXRlKF9fZGlybmFtZSksICdheXVkYScpIH1dO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0ZW1hcyBkZSBheXVkYSBkZWwgbW9kbyBhY3R1YWwgY29uIHBlcm1pc29zLCByb2xlcyB1IG9wY2lvbmVzIGRlIG1lbsO6IHF1ZSBubyBleGlzdGVuXHJcbiAgICAgICAgcHJvYmxlbWFzRGVBeXVkYSgpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciBtb2RvID0gZ2V0TW9kb0J5UG9saWN5KGJlKTtcclxuICAgICAgICAgICAgdmFyIHJ1dGFzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhiZS5jYWNoZXMucGVybWlzb3NSb2wpLmZvckVhY2gocm9sID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciB1c2VyID0geyByb2wsIGlkcGVyOiAnJywgdXN1YXJpbzogJycgfTtcclxuICAgICAgICAgICAgICAgIHZhciBjb250ZXh0OiBDb250ZXh0ID0geyAuLi5wZXJtaXNvc1NlZ3VuVXN1YXJpbyhiZS5jYWNoZXMsIHVzZXIpLCBiZSwgdXNlciwgc2Vzc2lvbjoge30sIHVzZXJuYW1lOiAnJywgbWFjaGluZUlkOiAnJywgbmF2aWdhdG9yOiAnJyB9O1xyXG4gICAgICAgICAgICAgICAgcnV0YXMgPSBydXRhcy5jb25jYXQocnV0YXNEZWxNZW51KGJlLmdldE1lbnUoY29udGV4dCkubWVudSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb2JsZW1hc0RlQXl1ZGEoXHJcbiAgICAgICAgICAgICAgICBiZS5jYWNoZXMuYXl1ZGEuZmlsdGVyKHRlbWEgPT4gdGVtYS5tb2RvID09IG51bGwgfHwgdGVtYS5tb2RvID09IG1vZG8pLFxyXG4gICAgICAgICAgICAgICAgYmUuY2FjaGVzLnBlcm1pc29zU3VwZXJ1c2VyLFxyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoYmUuY2FjaGVzLnBlcm1pc29zUm9sKSxcclxuICAgICAgICAgICAgICAgIHJ1dGFzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG92ZXJyaWRlIGNvbmZpZ1N0YXRpY0NvbmZpZygpIHtcclxuICAgICAgICAgICAgc3VwZXIuY29uZmlnU3RhdGljQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGljQ29uZmlnKGRlZkNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG92ZXJyaWRlIGNsaWVudEluY2x1ZGVzKHJlcTogUmVxdWVzdCwgb3B0czogT3B0c0NsaWVudFBhZ2UpOiBDbGllbnRNb2R1bGVEZWZpbml0aW9uW10ge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgdW5sb2dnZWQgPSBvcHRzICYmIG9wdHMub2ZmbGluZUZpbGU7XHJcbiAgICAgICAgICAgIHZhciBtZW51ZWRSZXNvdXJjZXM6IENsaWVudE1vZHVsZURlZmluaXRpb25bXSA9IHVubG9nZ2VkID8gW1xyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAndW5sb2dnZWQuanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICBdIDogW1xyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vY2xpZW50L2NsaWVudCcsIGZpbGU6ICdjbGllbnQuanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICBpZiAob3B0cyAmJiBvcHRzLmV4dHJhRmlsZXMpIHtcclxuICAgICAgICAgICAgICAgIG1lbnVlZFJlc291cmNlcyA9IG1lbnVlZFJlc291cmNlcy5jb25jYXQob3B0cy5leHRyYUZpbGVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgZXh0ZXJuYWxSZXNvdXJjZXM6IENsaWVudE1vZHVsZURlZmluaXRpb25bXSA9IFtcclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAncmVhY3QnLCBtb2RQYXRoOiAndW1kJywgZmlsZTogJ3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzJyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdyZWFjdC1kb20nLCBtb2RQYXRoOiAndW1kJywgZmlsZTogJ3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcycgfSxcclxuICAgICAgICAgICAgICAgIC8veyB0eXBlOiAnanMnLCBtb2R1bGU6ICdAbWF0ZXJpYWwtdWkvY29yZScsIG1vZFBhdGg6ICd1bWQnLCBmaWxlRGV2ZWxvcG1lbnQ6J21hdGVyaWFsLXVpLmRldmVsb3BtZW50LmpzJywgZmlsZTonbWF0ZXJpYWwtdWkucHJvZHVjdGlvbi5taW4uanMnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ0BtdWkvbWF0ZXJpYWwnLCBtb2RQYXRoOiAnLi4vdW1kJywgZmlsZTogJ21hdGVyaWFsLXVpLnByb2R1Y3Rpb24ubWluLmpzJyB9LFxyXG5cclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAncmVkdXgnLCBtb2RQYXRoOiAnLi4vZGlzdCcsIGZpbGU6ICdyZWR1eC5taW4uanMnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ3JlYWN0LXJlZHV4JywgbW9kUGF0aDogJy4uL2Rpc3QnLCBmaWxlOiAncmVhY3QtcmVkdXgubWluLmpzJyB9LFxyXG4gICAgICAgICAgICAgICAgLy97IHR5cGU6ICdqcycsIG1vZHVsZTogJ3FyY29kZScsIG1vZFBhdGg6ICcuLi9idWlsZCcsIGZpbGU6ICdxcmNvZGUuanMnfSxcclxuICAgICAgICAgICAgICAgIC4uLnN1cGVyLmNsaWVudEluY2x1ZGVzKHJlcSwgb3B0cykuZmlsdGVyKG0gPT4gbS5maWxlICE9ICdmb3JtdWxhcmlvcy5jc3MnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobSA9PiAhdW5sb2dnZWQgfHwgdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBtLmZpbGUgIT0gJ3Zhci1jYWwuanMnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIG0uZmlsZSAhPSAndmFyLWNhbC5qcydcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdzZXJ2aWNlLXdvcmtlci1hZG1pbicsIGZpbGU6ICdzZXJ2aWNlLXdvcmtlci1hZG1pbi5qcycgfSxcclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAncmVkdXgtdHlwZWQtcmVkdWNlcicsIG1vZFBhdGg6ICcuLi9kaXN0JywgZmlsZTogJ3JlZHV4LXR5cGVkLXJlZHVjZXIuanMnIH1cclxuICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgdmFyIHJlc291cmNlczogQ2xpZW50TW9kdWxlRGVmaW5pdGlvbltdID0gW1xyXG4gICAgICAgICAgICAgICAgLi4uZXh0ZXJuYWxSZXNvdXJjZXMsXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZCcsIGZpbGU6ICdhZGFwdC5qcycsIHBhdGg6ICdkbWVuY3UnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZCcsIGZpbGU6ICd0aXBvcy5qcycsIHBhdGg6ICdkbWVuY3UnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZCcsIGZpbGU6ICdoZWxwZXJzLWZvcm11bGFyaW8uanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAnY2FsY3Vsb3MtZW5jdWVzdGEuanMnLCBwYXRoOiAnZG1lbmN1JyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnanMnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQnLCBmaWxlOiAncmVuZGVyLWNvbmZpZy5qcycsIHBhdGg6ICdkbWVuY3UnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZCcsIGZpbGU6ICdyZW5kZXItaW5pdC5qcycsIHBhdGg6ICdkbWVuY3UnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZCcsIGZpbGU6ICdyZWR1eC1mb3JtdWxhcmlvLmpzJywgcGF0aDogJ2RtZW5jdScgfSxcclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2pzJywgbW9kdWxlOiAnZG1lbmN1JywgbW9kUGF0aDogJy4uLy4uL3VubG9nZ2VkL3VubG9nZ2VkJywgZmlsZTogJ2hlbHBlcnMtY2FzaWxsZXJvcy5qcycsIHBhdGg6ICdkbWVuY3UnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZCcsIGZpbGU6ICdieXBhc3MtZm9ybXVsYXJpby5qcycsIHBhdGg6ICdkbWVuY3UnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZCcsIGZpbGU6ICdyZW5kZXItZ2VuZXJhbC5qcycsIHBhdGg6ICdkbWVuY3UnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZCcsIGZpbGU6ICdyZW5kZXItZm9ybXVsYXJpby5qcycsIHBhdGg6ICdkbWVuY3UnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdqcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZCcsIGZpbGU6ICdhYnJpci1mb3JtdWxhcmlvLmpzJywgcGF0aDogJ2RtZW5jdScgfSxcclxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2NzcycsIG1vZHVsZTogJ2RtZW5jdScsIG1vZFBhdGg6ICcuLi8uLi91bmxvZ2dlZC91bmxvZ2dlZC9jc3MnLCBmaWxlOiAnZm9ybXVsYXJpby1yZWFjdC5jc3MnLCBwYXRoOiAnY3NzJyB9LFxyXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnY3NzJywgbW9kdWxlOiAnZG1lbmN1JywgbW9kUGF0aDogJy4uLy4uL3VubG9nZ2VkL3VubG9nZ2VkL2NzcycsIGZpbGU6ICdib290c3RyYXAubWluLmNzcycsIHBhdGg6ICdjc3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICd0dGYnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vdW5sb2dnZWQvdW5sb2dnZWQvY3NzJywgZmlsZTogJ1JvYm90by1SZWd1bGFyLnR0ZicsIHBhdGg6ICdjc3MnIH0sXHJcbiAgICAgICAgICAgICAgICAuLi5tZW51ZWRSZXNvdXJjZXMsXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdjc3MnLCBtb2R1bGU6ICdkbWVuY3UnLCBtb2RQYXRoOiAnLi4vLi4vY2xpZW50L2NsaWVudC9jc3MnLCBmaWxlOiAnbWVudS5jc3MnLCBwYXRoOiAnY3NzJyB9LFxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIHJldHVybiByZXNvdXJjZXNcclxuICAgICAgICAgICAgLy8gLm1hcChtPT4oey4uLm0sIGZpbGU6bS5maWxlRGV2ZWxvcG1lbnR8fG0uZmlsZX0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgYXN5bmMgcmVmcmVzaENhY2hlcyhjbGllbnQ6IENsaWVudGVEYiB8IG51bGwgPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudCA9IHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudCB8fCB7fTtcclxuXHJcbiAgICAgICAgICAgIC8vIEZ1bmNpw7NuIGF1eGlsaWFyIHBhcmEgZWplY3V0YXIgbGFzIHF1ZXJpZXMgY29uIGVsIGNsaWVudGUgcHJvdmlzdG8gbyB1bm8gbnVldm9cclxuICAgICAgICAgICAgY29uc3QgZXhlY3V0ZVF1ZXJpZXMgPSBhc3luYyAoZGJDbGllbnQ6Q2xpZW50ZURiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhID0gKGF3YWl0IGRiQ2xpZW50LnF1ZXJ5KGBzZWxlY3QgKiBmcm9tIG5vX3JlYSBvcmRlciBieSBvcGVyYXRpdm8sIG9yZGVuLCBub19yZWFgKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50LnJlYSA9IChhd2FpdCBkYkNsaWVudC5xdWVyeShgc2VsZWN0ICogZnJvbSByZWEgb3JkZXIgYnkgb3BlcmF0aXZvLCBvcmRlbiwgcmVhYCkuZmV0Y2hBbGwoKSkucm93cztcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX2dyb3VwcyA9IChhd2FpdCBkYkNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgIHNlbGVjdCBncnVwbywganNvbmJfYWdnKHRvX2pzb24oci4qKSkgYXMgY29kaWdvcyBmcm9tIG5vX3JlYSByIGdyb3VwIGJ5IGdydXBvIG9yZGVyIGJ5IDFcclxuICAgICAgICBgKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWFfZ3JvdXBzMCA9IChhd2FpdCBkYkNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgIHNlbGVjdCBncnVwbzAgYXMgZ3J1cG8sIGpzb25iX2FnZyh0b19qc29uKHIuKikpIGFzIGNvZGlnb3MgZnJvbSBub19yZWEgciBncm91cCBieSBncnVwbzAgb3JkZXIgYnkgMVxyXG4gICAgICAgIGApLmZldGNoQWxsKCkpLnJvd3M7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9zdXAgPSAoYXdhaXQgZGJDbGllbnQucXVlcnkoYHNlbGVjdCAqIGZyb20gbm9fcmVhX3N1cCBvcmRlciBieSBvcGVyYXRpdm8sIG9yZGVuLCBub19yZWFfc3VwYCkuZmV0Y2hBbGwoKSkucm93cztcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVzLnRhYmxlQ29udGVudC5yZWFfc3VwID0gKGF3YWl0IGRiQ2xpZW50LnF1ZXJ5KGBzZWxlY3QgKiBmcm9tIHJlYV9zdXAgb3JkZXIgYnkgb3BlcmF0aXZvLCBvcmRlbiwgcmVhX3N1cGApLmZldGNoQWxsKCkpLnJvd3M7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9zdXBfZ3JvdXBzID0gKGF3YWl0IGRiQ2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgc2VsZWN0IGdydXBvX3N1cCwganNvbmJfYWdnKHRvX2pzb24oci4qKSkgYXMgY29kaWdvcyBmcm9tIG5vX3JlYV9zdXAgciBncm91cCBieSBncnVwb19zdXAgb3JkZXIgYnkgMVxyXG4gICAgICAgIGApLmZldGNoQWxsKCkpLnJvd3M7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9zdXBfZ3JvdXBzMCA9IChhd2FpdCBkYkNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgIHNlbGVjdCBncnVwbzBfc3VwIGFzIGdydXBvLCBqc29uYl9hZ2codG9fanNvbihyLiopKSBhcyBjb2RpZ29zIGZyb20gbm9fcmVhX3N1cCByIGdyb3VwIGJ5IGdydXBvMF9zdXAgb3JkZXIgYnkgMVxyXG4gICAgICAgIGApLmZldGNoQWxsKCkpLnJvd3M7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZXMudGFibGVDb250ZW50LmNvblJlYUhvZ2FyID0gKGF3YWl0IGRiQ2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgc2VsZWN0IGNvbl9yZWFfaG9nYXIsIG9wZXJhdGl2bywgY29uZmlnX3NvcnRlbyBmcm9tIG9wZXJhdGl2b3Mgam9pbiBwYXJhbWV0cm9zIHVzaW5nIChvcGVyYXRpdm8pIHdoZXJlIHVuaWNvX3JlZ2lzdHJvXHJcbiAgICAgICAgYCkuZmV0Y2hVbmlxdWVSb3coKSkucm93O1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKGNsaWVudCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZVF1ZXJpZXMoY2xpZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaW5EYkNsaWVudChudWxsLCBhc3luYyAoZGJDbGllbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjdXRlUXVlcmllcyhkYkNsaWVudCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY2FjaGVzJywgdGhpcy5jYWNoZXMudGFibGVDb250ZW50KVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY2FjaGVzIG9rJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vc3FsTm9yZWFDYXNlKGNhbXBvTmVjZXNhcmlvOnN0cmluZyl7XHJcbiAgICAgICAgLy8gICAgdmFyIGJlPXRoaXM7XHJcbiAgICAgICAgLy8gICAgcmV0dXJuIGBDQVNFICR7YmUuY2FjaGVzLnRhYmxlQ29udGVudC5ub19yZWEubWFwKHg9PlxyXG4gICAgICAgIC8vICAgICAgICBgIFdIRU4gbm9yZWEgID0gJHtiZS5kYi5xdW90ZUxpdGVyYWwoeC5ub19yZWEpfTo6aW50ZWdlciBUSEVOICR7YmUuZGIucXVvdGVMaXRlcmFsKHhbY2FtcG9OZWNlc2FyaW9dKX1gXHJcbiAgICAgICAgLy8gICAgKS5qb2luKCcnKX0gV0hFTiBUUlVFIFRIRU4gTlVMTCBFTkRgXHJcbiAgICAgICAgLy99ICAgIFxyXG4gICAgICAgIG92ZXJyaWRlIGdldENvbnRleHQocmVxOiBSZXF1ZXN0KTogQ29udGV4dCB7XHJcbiAgICAgICAgICAgIHZhciBmYXRoZXJDb250ZXh0ID0gc3VwZXIuZ2V0Q29udGV4dChyZXEpO1xyXG4gICAgICAgICAgICByZXR1cm4geyAuLi5wZXJtaXNvc1NlZ3VuVXN1YXJpbyh0aGlzLmNhY2hlcywgZmF0aGVyQ29udGV4dC51c2VyKSwgLi4uZmF0aGVyQ29udGV4dCB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBvdmVycmlkZSBnZXRDb250ZXh0Rm9yRHVtcCgpOiBDb250ZXh0IHtcclxuICAgICAgICAgICAgdmFyIGZhdGhlckNvbnRleHQgPSBzdXBlci5nZXRDb250ZXh0Rm9yRHVtcCgpO1xyXG4gICAgICAgICAgICByZXR1cm4geyBzdXBlcnVzZXI6IHRydWUsIHB1ZWRlOiB0aGlzLmNhY2hlcy5wZXJtaXNvc1N1cGVydXNlciwgLi4uZmF0aGVyQ29udGV4dCB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBvdmVycmlkZSBhc3luYyBnZXRDbGllbnRTZXR1cEZvclNlbmRUb0Zyb250RW5kKHJlcTogUmVxdWVzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4uKGF3YWl0IHN1cGVyLmdldENsaWVudFNldHVwRm9yU2VuZFRvRnJvbnRFbmQocmVxKSksXHJcbiAgICAgICAgICAgICAgICBpZHBlcjogcmVxLnVzZXI/LmlkcGVyXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYXN5bmMgY3JlYXRlUmVzb3VyY2VzRm9yQ2FjaGVKc29uKCkge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgICAgICBjb25zdCBBUFBfTkFNRSA9IGF3YWl0IGJlLmdldEFwcE5hbWUoKVxyXG4gICAgICAgICAgICBjb25zdCBzdWZpam8gPSBiZS5nZXRTdWZpam9Gcm9tYmFzZVVybChiZS5jb25maWcuc2VydmVyWydiYXNlLXVybCddKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBqc29uUmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogQVBQX0RNX1ZFUlNJT04sXHJcbiAgICAgICAgICAgICAgICBhcHBOYW1lOiAnZG1lbmN1JyxcclxuICAgICAgICAgICAgICAgIGNhY2hlOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgXCJjYW1wb1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwib2ZmbGluZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZmFsbGJhY2stc2luY3JvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvcmVhY3QucHJvZHVjdGlvbi5taW4uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9tYXRlcmlhbC11aS5wcm9kdWN0aW9uLm1pbi5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL3JlZHV4Lm1pbi5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL3JlYWN0LXJlZHV4Lm1pbi5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vXCJsaWIvcXJjb2RlLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvcmVxdWlyZS1icm8uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9jYXN0LWVycm9yLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvbGlrZS1hci5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL2Jlc3QtZ2xvYmFscy5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL2pzb240YWxsLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvanMtdG8taHRtbC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL3JlZHV4LXR5cGVkLXJlZHVjZXIuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImRtZW5jdS9hZGFwdC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZG1lbmN1L3VubG9nZ2VkLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvanMteWFtbC51bWQubWluLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIveGxzeC1ub3cudW1kLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIveGxzeC1ub3ctYnJvd3Nlci51bWQuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9sYXp5LXNvbWUuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9zcWwtdG9vbHMuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImRpYWxvZy1wcm9taXNlL2RpYWxvZy1wcm9taXNlLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJtb21lbnQvbWluL21vbWVudC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwicGlrYWRheS9waWthZGF5LmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvcG9seWZpbGxzLWJyby5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL2JpZy5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL3R5cGUtc3RvcmUuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi90eXBlZC1jb250cm9scy5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL2FqYXgtYmVzdC1wcm9taXNlLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJteS1hamF4LmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJteS1zdGFydC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL215LWxvY2FsZGIuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9teS13ZWJzcWxkYi5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL215LWxvY2FsZGIuanMubWFwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvbXktd2Vic3FsZGIuanMubWFwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvbXktdGhpbmdzLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvbXktdGFibGVzLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvbXktaW5mb3JtLW5ldC1zdGF0dXMuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxpYi9teS1tZW51LmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvbXktc2tpbi5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL2NsaWVudGUtZW4tY2FzdGVsbGFuby5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwibGliL3NlcnZpY2Utd29ya2VyLWFkbWluLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsaWIvcmVkdXgtdHlwZWQtcmVkdWNlci5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY2xpZW50X21vZHVsZXMvb3BlcmF0aXZvcy5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY2xpZW50X21vZHVsZXMvdmFyY2FsLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJjbGllbnRfbW9kdWxlcy9mb3JtLXN0cnVjdHVyZS5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY2xpZW50X21vZHVsZXMvbWV0YS1lbmMuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNsaWVudF9tb2R1bGVzL2RhdG9zLWV4dC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY2xpZW50X21vZHVsZXMvY29uc2lzdGVuY2lhcy5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY2xpZW50X21vZHVsZXMvcHJvY2VzYW1pZW50by5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZG1lbmN1L3RpcG9zLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkbWVuY3UvcmVuZGVyLWNvbmZpZy5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZG1lbmN1L3JlbmRlci1pbml0LmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkbWVuY3UvaGVscGVycy1jYXNpbGxlcm9zLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkbWVuY3UvaGVscGVycy1mb3JtdWxhcmlvLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkbWVuY3UvY2FsY3Vsb3MtZW5jdWVzdGEuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImRtZW5jdS9ieXBhc3MtZm9ybXVsYXJpby5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZG1lbmN1L3JlZHV4LWZvcm11bGFyaW8uanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImRtZW5jdS9yZW5kZXItZ2VuZXJhbC5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZG1lbmN1L3JlbmRlci1mb3JtdWxhcmlvLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkbWVuY3UvYWJyaXItZm9ybXVsYXJpby5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY2xpZW50X21vZHVsZXMvcm93LXZhbGlkYXRvci5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY2xpZW50L21lbnUuanNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImltZy9sb2dvLnBuZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vXCJpbWcvbG9nby1kbS5wbmdcIixcclxuICAgICAgICAgICAgICAgICAgICBcImltZy9sb2dvLTEyOC5wbmdcIixcclxuICAgICAgICAgICAgICAgICAgICBcImltZy9tYWluLWxvYWRpbmcuZ2lmXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJpbWcvYm9ycmFyLXZhbG9yLnBuZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiaW1nL2ZvbmRvLXNhbHRlYWRvLWVycm9yLnBuZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiaW1nL2ZvbmRvLXNhbHRlYWRvLnBuZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiaW1nL2JhY2tncm91bmQtdGVzdC5wbmdcIixcclxuICAgICAgICAgICAgICAgICAgICAvL1wiY2xpZW50LXNldHVwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJjc3MvYm9vdHN0cmFwLm1pbi5jc3NcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNzcy9mb3JtdWxhcmlvLXJlYWN0LmNzc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwicGlrYWRheS9waWthZGF5LmNzc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGlhbG9nLXByb21pc2UvZGlhbG9nLXByb21pc2UuY3NzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJyZWwtZW5jL2VzdGFkb3MuY3NzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJjc3MvbXktdGFibGVzLmNzc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY3NzL215LW1lbnUuY3NzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJjc3MvbXktdGhpbmdzLmNzc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY3NzL21lbnUuY3NzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJyZWwtZW5jL215LXRoaW5nczIuY3NzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJjc3MvZm9ybXVsYXJpby1yZWFjdC5jc3NcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNzcy9Sb2JvdG8tUmVndWxhci50dGZcIixcclxuICAgICAgICAgICAgICAgICAgICBcImNhcmdhLWRtL3dlYi1tYW5pZmVzdC53ZWJtYW5pZmVzdFwiLFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgIGZhbGxiYWNrczpbXHJcbiAgICAgICAgICAgICAgICAgICAge3BhdGg6ICdkbV9zaW5jcm9uaXphcicsIGZhbGxiYWNrOidmYWxsYmFjay1zaW5jcm8nfVxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRGYWxsYmFjazogXCJvZmZsaW5lXCJcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAganNvblJlc3VsdC5jYWNoZSA9IGpzb25SZXN1bHQuY2FjaGUuY29uY2F0KGdldE1hbmlmZXN0SW1hZ2VJY29ucyhBUFBfTkFNRSwgc3VmaWpvKS5tYXAoKGVsZW0pID0+IGBtZW51LyR7ZWxlbS5zcmN9YCkpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHNraW4gPSBiZS5jb25maWdbJ2NsaWVudC1zZXR1cCddLnNraW47XHJcbiAgICAgICAgICAgIGlmIChza2luICYmIGJlLmFjdGl2ZVNraW5GaWxlcykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNraW5VcmwgPSBza2luICsgJy8nO1xyXG4gICAgICAgICAgICAgICAganNvblJlc3VsdC5jYWNoZS5wdXNoKGAke3NraW59L2ltZy9iYWNrZ3JvdW5kLXRlc3QucG5nYCk7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW1vcyBlbCBTZXQgYSBBcnJheSB5IG1hcGVhbW9zIGxhcyBydXRhc1xyXG4gICAgICAgICAgICAgICAgdmFyIHNraW5SZXNvdXJjZXMgPSBBcnJheS5mcm9tKGJlLmFjdGl2ZVNraW5GaWxlcykubWFwKGZ1bmN0aW9uIChwYXRoUmVsYXRpdm8pIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBTaSBlcyB1biAuc3R5bCwgbG8gcGVkaW1vcyBjb21vIC5jc3MgcG9ycXVlIGVsIFNlcnZpY2UgV29ya2VyIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlYmUgY2FjaGVhciBlbCByZWN1cnNvIGZpbmFsIHF1ZSBlbCBuYXZlZ2Fkb3Igc29saWNpdGEuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNraW5VcmwgKyBwYXRoUmVsYXRpdm8ucmVwbGFjZSgvXFwuc3R5bCQvLCAnLmNzcycpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAganNvblJlc3VsdC5jYWNoZSA9IGpzb25SZXN1bHQuY2FjaGUuY29uY2F0KHNraW5SZXNvdXJjZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBqc29uUmVzdWx0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdldE1lbnVDb250cm9sZXMoX2NvbnRleHQ6IENvbnRleHQpOiBNZW51SW5mb0Jhc2VbXSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAncHJvYycsIG5hbWU6ICdlbmN1ZXN0YXNfcHJvY2VzYW1pZW50b19wYXNhcicsIGxhYmVsOiAncGFzYXIgZW5jdWVzdGFzIGEgcHJvY2VzYW1pZW50bycgfSxcclxuICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdyZXN1bWVuJywgdGFibGU6ICdjb250cm9sX3Jlc3VtZW4nLCBzZWxlY3RlZEJ5RGVmYXVsdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2RvbWluaW8nLCB0YWJsZTogJ2NvbnRyb2xfY2FtcG9fZG9taW5pbycgfSxcclxuICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICd6b25hJywgdGFibGU6ICdjb250cm9sX2NhbXBvX3pvbmEnIH0sXHJcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnY29tdW5hJywgdGFibGU6ICdjb250cm9sX2NhbXBvX2NvbXVuYScgfSxcclxuICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICfDoXJlYScsIHRhYmxlOiAnY29udHJvbF9jYW1wb19hcmVhJyB9LFxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfTtcclxuICAgICAgICBnZXRNZW51VmFyaW9zKGNvbnRleHQ6IENvbnRleHQpOiBNZW51SW5mb0Jhc2Uge1xyXG4gICAgICAgICAgICBsZXQgc3VibWVudVZhcmlvczogTWVudUluZm9CYXNlW10gPSBbeyBtZW51VHlwZTogJ2FicmlyX2VuY3Vlc3RhJywgbmFtZTogJ2FicmlyX2VuY3Vlc3RhJyB9XVxyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FtcG8/LmVkaXRhcikge1xyXG4gICAgICAgICAgICAgICAgc3VibWVudVZhcmlvcy5wdXNoKHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdob2phX3J1dGEnLCB0YWJsZTogJ2dyaWxsYV9ob2phX3J1dGEnLCBsYWJlbDogJ2hvamEgZGUgcnV0YScgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FtcG8/LmFkbWluaXN0cmFyKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJtZW51VmFyaW9zLnB1c2goeyBtZW51VHlwZTogJ3Byb2MnLCBuYW1lOiAnZW5jdWVzdGFkb3JfZG1zX21vc3RyYXInLCBsYWJlbDogJ2ZvcnphciBkZXNjYXJnYSBlbmN1ZXN0YXMgRE0nIH0pO1xyXG4gICAgICAgICAgICAgICAgc3VibWVudVZhcmlvcy5wdXNoKHsgbWVudVR5cGU6ICdwcm9jJywgbmFtZTogJ2VuY3Vlc3RhX2JsYW5xdWVhcl9wcmV2aXN1YWxpemFyJywgbGFiZWw6ICdibGFucXVlYXIgZW5jdWVzdGEnIH0pO1xyXG4gICAgICAgICAgICAgICAgc3VibWVudVZhcmlvcy5wdXNoKHsgbWVudVR5cGU6ICdwcm9jJywgbmFtZTogJ2VuY3Vlc3RhX2JvcnJhcl9wcmV2aXN1YWxpemFyJywgbGFiZWw6ICdxdWl0YXIgZW5jdWVzdGEgZGUgbGEgbXVlc3RyYScgfSk7XHJcbiAgICAgICAgICAgICAgICBzdWJtZW51VmFyaW9zLnB1c2goeyBtZW51VHlwZTogJ3Byb2MnLCBuYW1lOiAnZW5jdWVzdGFzX2NhcGFjaXRhY2lvbl9ib3JyYXInLCBsYWJlbDogJ3F1aXRhciBlbmN1ZXN0YXMgZGUgY2FwYSBkZSBsYSBtdWVzdHJhJyB9KTtcclxuICAgICAgICAgICAgICAgIHN1Ym1lbnVWYXJpb3MucHVzaCh7IG1lbnVUeXBlOiAncHJvYycsIG5hbWU6ICdvcGVyYXRpdm9fbWlncmFyJywgbGFiZWw6ICdtaWdyYXIgb3BlcmF0aXZvJyB9KTtcclxuICAgICAgICAgICAgICAgIHN1Ym1lbnVWYXJpb3MucHVzaCh7IG1lbnVUeXBlOiAncHJvYycsIG5hbWU6ICdlbmN1ZXN0YV9jYXBhX2FfcHJvZF9wYXNhcicsIGxhYmVsOiAncGFzYXIgZW5jdWVzdGFzIGRlIGNhcGEgYSBwcm9kJyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uZW5jdWVzdGFzPy5wcm9jZXNhcikge1xyXG4gICAgICAgICAgICAgICAgc3VibWVudVZhcmlvcy5wdXNoKHsgbWVudVR5cGU6ICdwcm9jJywgbmFtZTogJ2ludGVyY2FtYmlhcl9lbmN1ZXN0YXMnIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7IG1lbnVUeXBlOiAnbWVudScsIG5hbWU6ICd2YXJpb3MnLCBtZW51Q29udGVudDogc3VibWVudVZhcmlvcyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdldE1lbnVBc2lnbmFjaW9uKGNvbnRleHQ6IENvbnRleHQpOiBNZW51SW5mb0Jhc2Uge1xyXG4gICAgICAgICAgICBsZXQgZmlsdHJvUmVjZXBjaW9uaXN0YSA9IGNvbnRleHQudXNlci5yb2wgPT0gJ3JlY2VwY2lvbmlzdGEnID8geyByZWNlcGNpb25pc3RhOiBjb250ZXh0LnVzZXIuaWRwZXIgfSA6IHt9O1xyXG4gICAgICAgICAgICBsZXQgc3VibWVudUFzaWduYWNpb246IE1lbnVJbmZvQmFzZVtdID0gW107XHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LnB1ZWRlPy5jYW1wbz8uYWRtaW5pc3RyYXIpIHtcclxuICAgICAgICAgICAgICAgIHN1Ym1lbnVBc2lnbmFjaW9uLnB1c2goeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2dlbmVyYWwnLCB0YWJsZTogJ2FyZWFzX2FzaWduYWNpb25fZ2VuZXJhbCcgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3VibWVudUFzaWduYWNpb24ucHVzaChcclxuICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdlbmN1ZXN0YWRvcicsIHRhYmxlOiAndF9lbmN1X2FyZWFzJywgZmY6IHsgdGFyZWE6ICdlbmN1JywgLi4uZmlsdHJvUmVjZXBjaW9uaXN0YSB9IH0sXHJcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnaW5ncmVzYWRvcicsIHRhYmxlOiAndF9pbmdyX2FyZWFzJywgZmY6IHsgdGFyZWE6ICdpbmdyJywgLi4uZmlsdHJvUmVjZXBjaW9uaXN0YSB9IH0sXHJcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAncmVjdXBlcmFkb3InLCB0YWJsZTogJ3RhcmVhc190ZW1fYXNpZ25hY2lvbl9yZWN1JywgZmY6IHsgdGFyZWFfYWN0dWFsOiAncmVjdScsIHRhcmVhOiAncmVjdScsIC4uLmZpbHRyb1JlY2VwY2lvbmlzdGEgfSB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FtcG8/LmFkbWluaXN0cmFyKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJtZW51QXNpZ25hY2lvbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdzdXBlcnZpc29yJywgdGFibGU6ICd0YXJlYXNfdGVtX2FzaWduYWNpb25fc3VwZScsIGZmOiB7IHRhcmVhX2FjdHVhbDogJ3N1cGUnLCB0YXJlYTogJ3N1cGUnLCAuLi5maWx0cm9SZWNlcGNpb25pc3RhIH0gfSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiB7IG1lbnVUeXBlOiAnbWVudScsIG5hbWU6ICdhc2lnbmFjaW9uJywgbGFiZWw6ICdhc2lnbmFjacOzbicsIG1lbnVDb250ZW50OiBzdWJtZW51QXNpZ25hY2lvbiB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdldE1lbnVSZWNlcGNpb24oY29udGV4dDogQ29udGV4dCk6IE1lbnVJbmZvQmFzZSB7XHJcbiAgICAgICAgICAgIGxldCBzdWJtZW51UmVjZXBjaW9uOiBNZW51SW5mb0Jhc2VbXSA9IFtdXHJcbiAgICAgICAgICAgIHN1Ym1lbnVSZWNlcGNpb24ucHVzaChcclxuICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdlbmN1ZXN0YWRvcicsIHRhYmxlOiAnZW5jdWVzdGFkb3Jlc19hc2lnbmFkb3MnIH0sXHJcbiAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAncmVjdXBlcmFkb3InLCB0YWJsZTogJ3JlY3VwZXJhZG9yZXNfYXNpZ25hZG9zJyB9LFxyXG4gICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2luZ3Jlc2Fkb3InLCB0YWJsZTogJ2luZ3Jlc2Fkb3Jlc19hc2lnbmFkb3MnIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LnB1ZWRlPy5jYW1wbz8uYWRtaW5pc3RyYXIpIHtcclxuICAgICAgICAgICAgICAgIHN1Ym1lbnVSZWNlcGNpb24ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnc3VwZXJ2aXNvcicsIHRhYmxlOiAnc3VwZXJ2aXNvcmVzX2FzaWduYWRvcycgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnbWlzX3N1cGVydmlzb3JlcycsIHRhYmxlOiAnbWlzX3N1cGVydmlzb3Jlc19hc2lnbmFkb3MnIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHsgbWVudVR5cGU6ICdtZW51JywgbmFtZTogJ3JlY2VwY2lvbicsIGxhYmVsOiAncmVjZXBjacOzbicsIG1lbnVDb250ZW50OiBzdWJtZW51UmVjZXBjaW9uIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldE1lbnVDYXJ0byhjb250ZXh0OiBDb250ZXh0KTogTWVudUluZm9CYXNlIHwgbnVsbCB7XHJcbiAgICAgICAgICAgIGxldCBzdWJtZW51Q2FydG86IE1lbnVJbmZvQmFzZVtdID0gW11cclxuICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmNhbXBvPy5hZG1pbmlzdHJhcikge1xyXG4gICAgICAgICAgICAgICAgc3VibWVudUNhcnRvLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2NvbXVuYXMnLCB0YWJsZTogJ2NvbXVuYXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2JhcnJpb3MnLCB0YWJsZTogJ2JhcnJpb3MnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ2ZyYWNjaW9uZXMnLCB0YWJsZTogJ2ZyYWNjaW9uZXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3JhZGlvcycsIHRhYmxlOiAncmFkaW9zJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdtYW56YW5hcycsIHRhYmxlOiAnbWFuemFuYXMnIH0sXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtZW51VHlwZTogJ21lbnUnLCBuYW1lOiAnY2FydG8nLCBsYWJlbDogJ2NhcnRvZ3JhZsOtYScsIG1lbnVDb250ZW50OiBzdWJtZW51Q2FydG8gfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXRNZW51Q29uZmlndXJhcihjb250ZXh0OiBDb250ZXh0KTogTWVudUluZm9CYXNlW10ge1xyXG4gICAgICAgICAgICBjb25zdCBtZW51Q29uZmlndXJhcjogTWVudUluZm9CYXNlW10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LnB1ZWRlPy5jYW1wbz8uYWRtaW5pc3RyYXIgfHwgY29udGV4dC5wdWVkZT8uZW5jdWVzdGFzPy5wcm9jZXNhcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3VibWVudU11ZXN0cmE6IE1lbnVJbmZvQmFzZVtdID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICd0ZW0nLCBsYWJlbDogJ1RFTScgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAncHJvYycsIG5hbWU6ICdtdWVzdHJhX2dlbmVyYXInLCBsYWJlbDogJ2dlbmVyYXIgbXVlc3RyYScgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnc2VtYW5hcycgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnYXJlYV9lbmNfcHJveGltYXMnIH0sXHJcbiAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgbWVudUNvbmZpZ3VyYXIucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVudVR5cGU6ICdtZW51JyxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXVlc3RyYScsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdtdWVzdHJhJyxcclxuICAgICAgICAgICAgICAgICAgICBtZW51Q29udGVudDogc3VibWVudU11ZXN0cmFcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FzaWxsZXJvc190ZXh0bz8uZWRpdGFyKSB7XHJcbiAgICAgICAgICAgICAgICBtZW51Q29uZmlndXJhci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51VHlwZTogJ21lbnUnLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdtZXRhZGF0b3MnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1lbnVDb250ZW50OiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdvcGVyYXRpdm9zJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAnbWVudScsIG5hbWU6ICdyZWEvbm9yZWEnLCBtZW51Q29udGVudDpbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAncmVhJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ25vX3JlYScgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdyZWFfc3VwJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ25vX3JlYV9zdXAnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnZm9ybXVsYXJpb3MnLCB0YWJsZTogJ2Nhc2lsbGVyb3NfcHJpbmNpcGFsZXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdwbGFubycsIHRhYmxlOiAnY2FzaWxsZXJvcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3ZhcmlhYmxlcycsIHRhYmxlOiAnY2FzaWxsZXJvcycsIGZjOiBbeyBjb2x1bW46ICd2YXJfbmFtZScsIG9wZXJhdG9yOiAnIT1cXHUyMjA1JywgdmFsdWU6IG51bGwgfV0gfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3RpcG9jJywgbGFiZWw6ICd0aXBvcyBkZSBjZWxkYXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICd0aXBvY190aXBvYycsIGxhYmVsOiAnaW5jbHVzaW9uZXMgZGUgY2VsZGFzJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5zdXBlcnVzZXIpIHtcclxuICAgICAgICAgICAgICAgIG1lbnVDb25maWd1cmFyLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW51VHlwZTogJ21lbnUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZXN0YWRvc19hY2Npb25lc190YXJlYXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ2VzdGFkb3MvYWNjaW9uZXMvdGFyZWFzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVudUNvbnRlbnQ6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICd0YXJlYXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnZXN0YWRvcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdhY2Npb25lcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdlc3RhZG9zX2FjY2lvbmVzJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3RhcmVhc19wcm94aW1hcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ21vbWVudG9zX2NvbnNpc3RlbmNpYScgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAncGFyYW1ldHJvcycgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnbW9kb3NfZG0nIH0sXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FtcG8/LmFkbWluaXN0cmFyIHx8IGNvbnRleHQucHVlZGU/LmVuY3Vlc3Rhcz8ucHJvY2VzYXIpIHtcclxuICAgICAgICAgICAgICAgIG1lbnVDb25maWd1cmFyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnVUeXBlOiAnbWVudScsXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3VzdWFyaW9zJyxcclxuICAgICAgICAgICAgICAgICAgICBtZW51Q29udGVudDogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAndXN1YXJpb3MnLCBzZWxlY3RlZEJ5RGVmYXVsdDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAncm9sZXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICdwZXJtaXNvcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3JvbGVzX3Blcm1pc29zJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbWVudUNvbmZpZ3VyYXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBsb3MgbWl4aW5zIChtZXRhLWVuYywgcHJvY2VzYW1pZW50bykgbG8gZGVjbGFyYW4gc2luIHBhcsOhbWV0cm9zLCBwZXJvIGJhY2tlbmQtcGx1cyBzaWVtcHJlIGxvIGxsYW1hIGNvbiBjb250ZXh0LlxyXG4gICAgICAgIC8vIEVsIHRpcG8gZGUgcmV0b3JubyBxdWUgZGVjbGFyYSBvcGVyYXRpdm9zIChNZW51SW5mb1tdKSBubyBhZG1pdGUgZm9ybWFzIHF1ZSBiYWNrZW5kLXBsdXMgc8OtIGFjZXB0YSB5IGRtZW5jdSB1c2FcclxuICAgICAgICAvLyAoZmYgY29tbyBvYmpldG8sIGZjIGNvbiBjb2x1bW4pOyBzZSBkZXZ1ZWx2ZSBNZW51SW5mb0Jhc2VbXSwgcXVlIGVzIGxvIHF1ZSBkZWNsYXJhIGJhY2tlbmQtcGx1cy5cclxuICAgICAgICAvLyBRdWl0YXIgZXN0YSBsw61uZWEgY3VhbmRvIHNlIGNvcnJpamFuIGxvcyB0aXBvcyBkZSBtZW7DuiBlbiBvcGVyYXRpdm9zL2JhY2tlbmQtcGx1cyAoZWwgY29tcGlsYWRvciBhdmlzYSBzaSBkZWphIGRlIGhhY2VyIGZhbHRhKS5cclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE1lbnVEZWZpbml0aW9uIGRlIG9wZXJhdGl2b3MgbcOhcyBlc3RyaWN0byBxdWUgZWwgZGUgYmFja2VuZC1wbHVzXHJcbiAgICAgICAgb3ZlcnJpZGUgZ2V0TWVudShjb250ZXh0PzogQ29udGV4dCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldE1lbnUgZGUgZG1lbmN1IHJlcXVpZXJlIGVsIGNvbnRleHQgcGFyYSBhcm1hciBlbCBtZW7DuiBzZWfDum4gbG9zIHBlcm1pc29zJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IG1lbnU6IE1lbnVJbmZvQmFzZVtdID0gW107XHJcbiAgICAgICAgICAgIGlmIChnZXRNb2RvQnlQb2xpY3koY29udGV4dC5iZSkgPT09ICdSRUxFVkFNSUVOVE8nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uZW5jdWVzdGFzPy5yZWxldmFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVudS5wdXNoKHsgbWVudVR5cGU6ICdwYXRoJywgbmFtZTogJ3JlbGV2YW1pZW50bycsIHBhdGg6ICcvY2FtcG8nIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgbWVudS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAnc2luY3Jvbml6YXJfZG0nLCBuYW1lOiAnc2luY3Jvbml6YXInIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICdjYW1iaWFyX21vZG9fZG0nLCBuYW1lOiAnY2FtYmlhcl9tb2RvJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FtcG8/LmVkaXRhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnUucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNZW51QXNpZ25hY2lvbihjb250ZXh0KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNZW51UmVjZXBjaW9uKGNvbnRleHQpXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FtcG8/LmFkbWluaXN0cmFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUucHVzaCh7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAndGFyZWFzX3RlbV9maW5fY2FtcG8nLCBsYWJlbDogJ2VzcGVyYSBmaW4gZGUgY2FtcG8nIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUucHVzaCh7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAndGFyZWFzX3RlbV9hbmFsaXNpc19jYW1wbycsIGxhYmVsOiAnYW7DoWxpc2lzIGRlIGNhbXBvJyB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBtZW51LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVUeXBlOiAnbWVudScsIG5hbWU6ICdzdXBlcnZpc2lvbicsIGxhYmVsOiAnc3VwZXJ2aXNpw7NuJywgbWVudUNvbnRlbnQ6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnc3VwZXJ2aXNhcicsIHRhYmxlOiAndGFyZWFzX3RlbV9pbmdyZXNvJywgZmY6IHsgdGFyZWE6ICdzdXBlJywgYXNpZ25hZG86IGNvbnRleHQudXNlci5pZHBlciB9IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnB1ZWRlPy5jYW1wbz8uZWRpdGFyIHx8IGNvbnRleHQucHVlZGU/LmNhbXBvPy5hZG1pbmlzdHJhciB8fCBjb250ZXh0LnB1ZWRlPy5lbmN1ZXN0YXM/LnByb2Nlc2FyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVudS5wdXNoKHRoaXMuZ2V0TWVudVZhcmlvcyhjb250ZXh0KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5wdWVkZT8uY2FtcG8/LmFkbWluaXN0cmFyIHx8IGNvbnRleHQucHVlZGU/LmVuY3Vlc3Rhcz8ucHJvY2VzYXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICdtZW51JywgbmFtZTogJ2NvbnRyb2wnLCBtZW51Q29udGVudDogdGhpcy5nZXRNZW51Q29udHJvbGVzKGNvbnRleHQpIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8qe21lbnVUeXBlOid0YWJsZScsIG5hbWU6J3BhcnRpY2lwYWNpb24nICAgICAgICAsIHRhYmxlOidjb250cm9sX2NhbXBvX3BhcnRpY2lwYWNpb24nICB9LCovXHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQucHVlZGU/LmVuY3Vlc3Rhcz8ucHJvY2VzYXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVUeXBlOiAnbWVudScsIG5hbWU6ICdwcm9jZXNhcicsIG1lbnVDb250ZW50OiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBtZW51VHlwZTogJ3RhYmxlJywgbmFtZTogJ3ZhcmlhYmxlcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAndmFyaWFibGVzX2N1ZXN0aW9uYXJpbycsIHRhYmxlOiAnY2FzaWxsZXJvcycsIHRkOiB7IGVkaXRhYmxlOiBmYWxzZSwgYWxsb3c6IHsgdXBkYXRlOiBmYWxzZSwgaW1wb3J0OiBmYWxzZSwgZGVsZXRlOiBmYWxzZSwgaW5zZXJ0OiBmYWxzZSB9IH0sIGZjOiBbeyBjb2x1bW46ICd2YXJfbmFtZScsIG9wZXJhdG9yOiAnIT1cXHUyMjA1JywgdmFsdWU6IG51bGwgfV0gfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnY29uc2lzdGVuY2lhcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnY29uc2lzdGVuY2lhc19jdWVzdGlvbmFyaW8nLCB0YWJsZTogJ2Nhc2lsbGVyb3MnLCBmZjogeyB0aXBvYzogJ0NPTlMnIH0gfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnaW5jb25zaXN0ZW5jaWFzJyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVudVR5cGU6ICd0YWJsZScsIG5hbWU6ICd0YWJsYV9kYXRvcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAnZGljY2lvbmFyaW8nLCBsYWJlbDogJ2RpY2Npb25hcmlvcycgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lbnVUeXBlOiAndGFibGUnLCBuYW1lOiAndGFyZWFzX3RlbV9wcm9jZXNhbWllbnRvJywgbGFiZWw6ICdlbmN1ZXN0YXMnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lbnVDb25maWd1cmFyID0gdGhpcy5nZXRNZW51Q29uZmlndXJhcihjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmIChtZW51Q29uZmlndXJhci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51LnB1c2goeyBtZW51VHlwZTogJ21lbnUnLCBuYW1lOiAnY29uZmlndXJhcicsIG1lbnVDb250ZW50OiBtZW51Q29uZmlndXJhciB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lbnVDYXJ0byA9IHRoaXMuZ2V0TWVudUNhcnRvKGNvbnRleHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1lbnVDYXJ0bykge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lbnUucHVzaChtZW51Q2FydG8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0ZW1hc1Zpc2libGVzKHRoaXMuY2FjaGVzLmF5dWRhLCBxdWllbkNvbnN1bHRhQXl1ZGEoY29udGV4dCkpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbWVudS5wdXNoKHsgbWVudVR5cGU6ICdheXVkYScsIG5hbWU6ICdheXVkYScgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHsgbWVudSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBvdmVycmlkZSBwcmVwYXJlR2V0VGFibGVzKCkge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSB0aGlzO1xyXG4gICAgICAgICAgICBzdXBlci5wcmVwYXJlR2V0VGFibGVzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFibGVEZWZpbml0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXRUYWJsZURlZmluaXRpb25cclxuICAgICAgICAgICAgICAgICwgcm9sZXNcclxuICAgICAgICAgICAgICAgICwgdXN1YXJpb3NcclxuICAgICAgICAgICAgICAgICwgcGVyc29uYWxcclxuICAgICAgICAgICAgICAgICwgcmVjZXBjaW9uaXN0YXNcclxuICAgICAgICAgICAgICAgICwgZW5jdWVzdGFkb3Jlc19hc2lnbmFkb3NcclxuICAgICAgICAgICAgICAgICwgaW5ncmVzYWRvcmVzX2FzaWduYWRvc1xyXG4gICAgICAgICAgICAgICAgLCByZWN1cGVyYWRvcmVzX2FzaWduYWRvc1xyXG4gICAgICAgICAgICAgICAgLCBzdXBlcnZpc29yZXNfYXNpZ25hZG9zXHJcbiAgICAgICAgICAgICAgICAsIG1pc19zdXBlcnZpc29yZXNfYXNpZ25hZG9zXHJcbiAgICAgICAgICAgICAgICAsIG1pc19lbmN1ZXN0YWRvcmVzXHJcbiAgICAgICAgICAgICAgICAsIHJlY3VwZXJhZG9yZXNcclxuICAgICAgICAgICAgICAgICwgc3VwZXJ2aXNvcmVzXHJcbiAgICAgICAgICAgICAgICAsIHBlcnNvbmFsX3JvbFxyXG4gICAgICAgICAgICAgICAgLCBwZXJtaXNvc1xyXG4gICAgICAgICAgICAgICAgLCByb2xlc19wZXJtaXNvc1xyXG4gICAgICAgICAgICAgICAgLCByb2xlc19zdWJvcmRpbmFkb3NcclxuICAgICAgICAgICAgICAgICwgbm9fcmVhXHJcbiAgICAgICAgICAgICAgICAsIG5vX3JlYV9zdXBcclxuICAgICAgICAgICAgICAgICwgcmVhXHJcbiAgICAgICAgICAgICAgICAsIHJlYV9zdXBcclxuICAgICAgICAgICAgICAgICwgc2VtYW5hc1xyXG4gICAgICAgICAgICAgICAgLCBlc3RhZG9zXHJcbiAgICAgICAgICAgICAgICAsIGFjY2lvbmVzXHJcbiAgICAgICAgICAgICAgICAsIGVzdGFkb3NfYWNjaW9uZXNcclxuICAgICAgICAgICAgICAgICwgdGFyZWFzX3Byb3hpbWFzXHJcbiAgICAgICAgICAgICAgICAsIHRlbVxyXG4gICAgICAgICAgICAgICAgLCBoaXN0b3JpYWxfdGVtXHJcbiAgICAgICAgICAgICAgICAsIG1vZG9zX2RtXHJcbiAgICAgICAgICAgICAgICAsIHBhcmFtZXRyb3NcclxuICAgICAgICAgICAgICAgICwgb3BlcmFjaW9uZXNcclxuICAgICAgICAgICAgICAgICwgY29tdW5hc1xyXG4gICAgICAgICAgICAgICAgLCBhcmVhc1xyXG4gICAgICAgICAgICAgICAgLCBzaW5jcm9uaXphY2lvbmVzXHJcbiAgICAgICAgICAgICAgICAsIHRhcmVhc1xyXG4gICAgICAgICAgICAgICAgLCB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAsIHRhcmVhc190ZW1fYXNpZ25hY2lvbl9lbmN1XHJcbiAgICAgICAgICAgICAgICAsIHRhcmVhc190ZW1fYXNpZ25hY2lvbl9yZWN1XHJcbiAgICAgICAgICAgICAgICAsIHRhcmVhc190ZW1fYXNpZ25hY2lvbl9zdXBlXHJcbiAgICAgICAgICAgICAgICAsIHRhcmVhc190ZW1fYXNpZ25hY2lvbl9pbmdyXHJcbiAgICAgICAgICAgICAgICAsIHRhcmVhc19hcmVhc1xyXG4gICAgICAgICAgICAgICAgLCBhcmVhc19hc2lnbmFjaW9uX2dlbmVyYWxcclxuICAgICAgICAgICAgICAgICwgZ3JpbGxhX2hvamFfcnV0YVxyXG4gICAgICAgICAgICAgICAgLCB0X2VuY3VfYXJlYXNcclxuICAgICAgICAgICAgICAgICwgdF9yZWN1X2FyZWFzXHJcbiAgICAgICAgICAgICAgICAsIHRfc3VwZV9hcmVhc1xyXG4gICAgICAgICAgICAgICAgLCB0X2luZ3JfYXJlYXNcclxuICAgICAgICAgICAgICAgICwgbWlzX3RhcmVhc1xyXG4gICAgICAgICAgICAgICAgLCB0ZW1fYXNpZ25hY2lvblxyXG4gICAgICAgICAgICAgICAgLCB0YXJlYXNfdGVtX3JlY2VwY2lvblxyXG4gICAgICAgICAgICAgICAgLCB0YXJlYXNfdGVtX2luZ3Jlc29cclxuICAgICAgICAgICAgICAgICwgdGFyZWFzX3RlbV9maW5fY2FtcG9cclxuICAgICAgICAgICAgICAgICwgdGFyZWFzX3RlbV9wcm9jZXNhbWllbnRvXHJcbiAgICAgICAgICAgICAgICAsIHRhcmVhc190ZW1fYW5hbGlzaXNfY2FtcG9cclxuICAgICAgICAgICAgICAgICwgbWlzX3RhcmVhc19hcmVhc1xyXG4gICAgICAgICAgICAgICAgLCBjb250cm9sX2NhbXBvXHJcbiAgICAgICAgICAgICAgICAsIGNvbnRyb2xfcmVzdW1lblxyXG4gICAgICAgICAgICAgICAgLCBjb250cm9sX2NhbXBvX3pvbmE6IGNvbnRleHQgPT4gY29udHJvbF9jYW1wbyhjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbm9tYnJlOiAnY29udHJvbF9jYW1wb19jb211bmEnLCB0aXRsZTogJ2NvbnRyb2wgY2FtcG8geCB6b25hIHNvbG8gY2VtZW50bycsIGNhbXBvc0NvcnRlOiBbeyBuYW1lOiAnem9uYScsIHR5cGVOYW1lOiAndGV4dCcgfV0sIHNpbmhvZ2ZpbjogIWNvbnRleHQuYmUuY2FjaGVzLnRhYmxlQ29udGVudC5jb25SZWFIb2dhci5jb25fcmVhX2hvZ2FyLCBmaWx0cm9XaGVyZTogJ2RvbWluaW89MycgfVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgLCBjb250cm9sX2NhbXBvX2NvbXVuYTogY29udGV4dCA9PiBjb250cm9sX2NhbXBvKGNvbnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgeyBub21icmU6ICdjb250cm9sX2NhbXBvX2NvbXVuYScsIHRpdGxlOiAnY29udHJvbCBjYW1wbyB4IGNvbXVuYSBzb2xvIGNlbWVudG8nLCBjYW1wb3NDb3J0ZTogW3sgbmFtZTogJ3pvbmEnLCB0eXBlTmFtZTogJ3RleHQnIH0sIHsgbmFtZTogJ25yb2NvbXVuYScsIHR5cGVOYW1lOiAndGV4dCcgfV0sIHNpbmhvZ2ZpbjogIWNvbnRleHQuYmUuY2FjaGVzLnRhYmxlQ29udGVudC5jb25SZWFIb2dhci5jb25fcmVhX2hvZ2FyLCBmaWx0cm9XaGVyZTogJ2RvbWluaW89MycgfVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgLCBjb250cm9sX2NhbXBvX2FyZWE6IGNvbnRleHQgPT4gY29udHJvbF9jYW1wbyhjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbm9tYnJlOiAnY29udHJvbF9jYW1wb19jb211bmEnLCB0aXRsZTogJ2NvbnRyb2wgY2FtcG8geCBhcmVhJywgY2FtcG9zQ29ydGU6IFt7IG5hbWU6ICd6b25hJywgdHlwZU5hbWU6ICd0ZXh0JyB9LCB7IG5hbWU6ICducm9jb211bmEnLCB0eXBlTmFtZTogJ3RleHQnIH0sIHsgbmFtZTogJ2FyZWEnLCB0eXBlTmFtZTogJ2ludGVnZXInIH0sIHsgbmFtZTogJ3BhcnRpY2lwYWNpb25fYScsIHR5cGVOYW1lOiAndGV4dCcgfSwgeyBuYW1lOiAnY2xhc2VfYScsIHR5cGVOYW1lOiAndGV4dCcgfV0sIHNpbmhvZ2ZpbjogIWNvbnRleHQuYmUuY2FjaGVzLnRhYmxlQ29udGVudC5jb25SZWFIb2dhci5jb25fcmVhX2hvZ2FyIH1cclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICwgY29udHJvbF9jYW1wb19wYXJ0aWNpcGFjaW9uOiBjb250ZXh0ID0+IGNvbnRyb2xfY2FtcG8oY29udGV4dCxcclxuICAgICAgICAgICAgICAgICAgICB7IG5vbWJyZTogJ2NvbnRyb2xfY2FtcG9fY29tdW5hJywgdGl0bGU6ICdjb250cm9sIGNhbXBvIHggcGFydGljaXBhY2lvbicsIGNhbXBvc0NvcnRlOiBbeyBuYW1lOiAncGFydGljaXBhY2lvbicsIHR5cGVOYW1lOiAnYmlnaW50JyB9XSwgc2luaG9nZmluOiAhY29udGV4dC5iZS5jYWNoZXMudGFibGVDb250ZW50LmNvblJlYUhvZ2FyLmNvbl9yZWFfaG9nYXIgfVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgLCBjb250cm9sX2NhbXBvX2RvbWluaW86IGNvbnRleHQgPT4gY29udHJvbF9jYW1wbyhjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbm9tYnJlOiAnY29udHJvbF9jYW1wb19jb211bmEnLCB0aXRsZTogJ2NvbnRyb2wgY2FtcG8geCBkb21pbmlvJywgY2FtcG9zQ29ydGU6IFt7IG5hbWU6ICdkb21pbmlvJywgdHlwZU5hbWU6ICdpbnRlZ2VyJyB9XSwgc2luaG9nZmluOiAhY29udGV4dC5iZS5jYWNoZXMudGFibGVDb250ZW50LmNvblJlYUhvZ2FyLmNvbl9yZWFfaG9nYXIgfVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgLCBjb250cm9sX2RpYXNfY2FyZ2FcclxuICAgICAgICAgICAgICAgICwgdml2aWVuZGFzXHJcbiAgICAgICAgICAgICAgICAsIHZpc2l0YXNcclxuICAgICAgICAgICAgICAgICwgaG9nYXJlc1xyXG4gICAgICAgICAgICAgICAgLCBwZXJzb25hc1xyXG4gICAgICAgICAgICAgICAgLCB2aXNpdGFzX3N1cFxyXG4gICAgICAgICAgICAgICAgLCBob2dhcmVzX3N1cFxyXG4gICAgICAgICAgICAgICAgLCBwZXJzb25hc19zdXBcclxuICAgICAgICAgICAgICAgICwgZGljY2lvbmFyaW9cclxuICAgICAgICAgICAgICAgICwgZGljdmFyXHJcbiAgICAgICAgICAgICAgICAsIGRpY3RyYVxyXG4gICAgICAgICAgICAgICAgLCBpbmNvbnNpc3RlbmNpYXNfY3VtcGxlbl9jb25kaWNpb25cclxuICAgICAgICAgICAgICAgICwgdGVtX2JvcnJhZGFzXHJcbiAgICAgICAgICAgICAgICAsIGJhcnJpb3NcclxuICAgICAgICAgICAgICAgICwgZnJhY2Npb25lc1xyXG4gICAgICAgICAgICAgICAgLCByYWRpb3NcclxuICAgICAgICAgICAgICAgICwgbWFuemFuYXNcclxuICAgICAgICAgICAgICAgICwgYXJlYV9lbmNfcHJveGltYXNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBiZS5hcHBlbmRUb1RhYmxlRGVmaW5pdGlvbignY29uc2lzdGVuY2lhcycsIGZ1bmN0aW9uICh0YWJsZURlZiwgY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZWRpdGFibGUgPSB0YWJsZURlZi5lZGl0YWJsZSB8fCBjb250ZXh0Py5wdWVkZT8uZW5jdWVzdGFzPy5wcm9jZXNhcjtcclxuICAgICAgICAgICAgICAgIHRhYmxlRGVmLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5uYW1lID09ICdlcnJvcl9jb21waWxhY2lvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJyoqKioqKioqKioqKiBRVUlUQVIgRVNUTyBlcnJvcl9jb21waWxhY2lvbiB5YSBlcyB2aXNpYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYmUuYXBwZW5kVG9UYWJsZURlZmluaXRpb24oJ2luY29uc2lzdGVuY2lhcycsIGZ1bmN0aW9uICh0YWJsZURlZiwgY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuc3FsID0geyAuLi50YWJsZURlZi5zcWwsIGlzVGFibGU6IHRydWUgfTtcclxuICAgICAgICAgICAgICAgIHRhYmxlRGVmLmZpZWxkcy5zcGxpY2UoMiwgMCxcclxuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICd2aXZpZW5kYScsIHR5cGVOYW1lOiAndGV4dCcsIGVkaXRhYmxlOiBmYWxzZSB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ2hvZ2FyJywgdHlwZU5hbWU6ICdiaWdpbnQnLCBlZGl0YWJsZTogZmFsc2UgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdwZXJzb25hJywgdHlwZU5hbWU6ICdiaWdpbnQnLCBlZGl0YWJsZTogZmFsc2UgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICd2aXNpdGEnLCB0eXBlTmFtZTogJ2JpZ2ludCcsIGVkaXRhYmxlOiBmYWxzZSB9LFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlRGVmLmVkaXRhYmxlID0gdGFibGVEZWYuZWRpdGFibGUgfHwgY29udGV4dD8ucHVlZGU/LmVuY3Vlc3Rhcz8uanVzdGlmaWNhcjtcclxuICAgICAgICAgICAgICAgIHRhYmxlRGVmLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5uYW1lID09ICdwa19pbnRlZ3JhZGEnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLm5hbWUgPT0gJ2p1c3RpZmljYWNpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmVkaXRhYmxlID0gY29udGV4dD8uZm9yRHVtcCB8fCBjb250ZXh0Py5wdWVkZT8uZW5jdWVzdGFzPy5qdXN0aWZpY2FyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB0YWJsZURlZi5maWVsZHMgPSB0YWJsZURlZi5maWVsZHMuY29uY2F0KFsndGFyZWFfYWN0dWFsJywgJ3RhcmVhX2FudGVyaW9yJ10ubWFwKGZuID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiBmbiwgdHlwZU5hbWU6ICd0ZXh0JywgZWRpdGFibGU6IGZhbHNlLCBpblRhYmxlOiBmYWxzZSB9XHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgIC8vc2FjYXIgY2FtcG9zIGRlIHZpdGFsZXMhIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVnRXhwRmllbGRzVml0YSA9IG5ldyBSZWdFeHAoJ14oY29tcHxpbmZlfGNvZF9jYXVzYXxkb21pKSQnKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlRGVmLmZpZWxkcyA9IHRhYmxlRGVmLmZpZWxkcy5maWx0ZXIoZiA9PiAhKHJlZ0V4cEZpZWxkc1ZpdGEudGVzdChmLm5hbWUpKSlcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgcV9pbmNvbnNpc3QgPSB0YWJsZURlZi5zcWwhLmZyb21cclxuICAgICAgICAgICAgICAgIHRhYmxlRGVmLnNxbCEuZnJvbSA9IGBcclxuICAgICAgICAgICAgICAgIChzZWxlY3QgaS4qLCB0LnRhcmVhX2FjdHVhbCwgdGFyZWFfYW50ZXJpb3JcclxuICAgICAgICAgICAgICAgICAgZnJvbSAke3FfaW5jb25zaXN0fSBpIFxyXG4gICAgICAgICAgICAgICAgICBqb2luIHRlbSB0IG9uIGkudml2aWVuZGE9dC5lbmMgYW5kIGkub3BlcmF0aXZvPXQub3BlcmF0aXZvIFxyXG4gICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gdGFyZWFzX3RlbSB0dCBvbiB0Lm9wZXJhdGl2bz10dC5vcGVyYXRpdm8gYW5kIHQuZW5jPXR0LmVuYyBhbmQgdC50YXJlYV9hY3R1YWw9dHQudGFyZWEgXHJcbiAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBsYXRlcmFsIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IHRhcmVhIGFzIHRhcmVhX2FudGVyaW9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGhpc3RvcmlhbF90ZW0gaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHQub3BlcmF0aXZvID0gaHQub3BlcmF0aXZvIGFuZCB0LmVuYyA9IGh0LmVuY1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgdHNfc2FsaWRhIGRlc2NcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IDFcclxuICAgICAgICAgICAgICAgICAgICApIGFzIHRhIG9uIHRydWVcclxuICAgICAgICAgICAgICAgICkgICBcclxuICAgICAgICAgICAgYFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBiZS5hcHBlbmRUb1RhYmxlRGVmaW5pdGlvbignb3BlcmF0aXZvcycsIGZ1bmN0aW9uICh0YWJsZURlZiwgY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZmllbGRzLnNwbGljZSgyLCAwLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2NvbmZpZ19zb3J0ZW8nLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lOiAnanNvbmInLFxyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdoYWJpbGl0YWNpb25fYm90b25fZm9ybXVsYXJpbycsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6ICdqc29uYicsXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2Rpc2Zvcm1fY2VycmFkbycsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiBjb250ZXh0Py5mb3JEdW1wIHx8IGNvbnRleHQgIT0gbnVsbCAmJiBbJ2FkbWluJywgJ2Rpc19jb25jZXB0dWFsJ10uaW5jbHVkZXMoY29udGV4dC51c2VyLnJvbClcclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY29uX3JlYV9ob2dhcicsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdERiVmFsdWU6ICd0cnVlJ1xyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYScsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdERiVmFsdWU6ICdmYWxzZSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBiZS5hcHBlbmRUb1RhYmxlRGVmaW5pdGlvbigndmFyaWFibGVzJywgZnVuY3Rpb24gKHRhYmxlRGVmLCBjb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZXNBZG1pbiA9IGNvbnRleHQ/LnVzZXIucm9sID09PSAnYWRtaW4nO1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZWRpdGFibGUgPSB0YWJsZURlZi5lZGl0YWJsZSB8fCBjb250ZXh0Py5wdWVkZT8uZW5jdWVzdGFzPy5wcm9jZXNhcjtcclxuICAgICAgICAgICAgICAgIHRhYmxlRGVmLmFsbG93ID0geyBkZWxldGU6IGVzQWRtaW4gfTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYmUuYXBwZW5kVG9UYWJsZURlZmluaXRpb24oJ21vbWVudG9zX2NvbnNpc3RlbmNpYScsIGZ1bmN0aW9uICh0YWJsZURlZiwgX2NvbnRleHQpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlRGVmLmZpZWxkcy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ2NvbmRpY2lvbicsIHR5cGVOYW1lOiAndGV4dCcsIG51bGxhYmxlOiBmYWxzZSwgZGVmYXVsdERiVmFsdWU6ICd0cnVlJyB9LFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgYmUuYXBwZW5kVG9UYWJsZURlZmluaXRpb24oJ3BhcmFtZXRyb3MnLCBmdW5jdGlvbiAodGFibGVEZWYpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlRGVmLmZpZWxkcy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ21vZG9fZG1fZGVmZWN0bycsIHR5cGVOYW1lOiAndGV4dCcsIGVkaXRhYmxlOiB0cnVlLCBudWxsYWJsZTogZmFsc2UsIGRlZmF1bHREYlZhbHVlOiBcIidjYXBhJ1wiIH0sXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGFibGVEZWYuZm9yZWlnbktleXMgPSB0YWJsZURlZi5mb3JlaWduS2V5cyB8fCBbXTtcclxuICAgICAgICAgICAgICAgIHRhYmxlRGVmLmZvcmVpZ25LZXlzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgeyByZWZlcmVuY2VzOiAnbW9kb3NfZG0nLCBmaWVsZHM6IFt7IHNvdXJjZTogJ21vZG9fZG1fZGVmZWN0bycsIHRhcmdldDogJ21vZG9fZG0nIH1dIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIEFwcERtRW5jdSA9IGVtZXJnZUFwcERtRW5jdShlbWVyZ2VBcHBQcm9jZXNhbWllbnRvKGVtZXJnZUFwcENvbnNpc3RlbmNpYXMoZW1lcmdlQXBwVmFyQ2FsKGVtZXJnZUFwcERhdG9zRXh0KGVtZXJnZUFwcE9wZXJhdGl2b3MoQXBwQmFja2VuZCkpKSkpKTtcclxuZXhwb3J0IHR5cGUgQXBwQXBwRG1FbmN1VHlwZSA9IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwRG1FbmN1PjsiXX0=