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,2313 @@
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", "like-ar", "./types-dmencu", "pg-promise-strict", "best-globals", "fs", "expre-parser", "./table-tareas_tem", "console", "cast-error", "./app-dmencu", "./ayuda", "./setters-rea-no-rea"], factory);
31
+ }
32
+ })(function (require, exports) {
33
+ "use strict";
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.ProceduresDmEncu = exports.setHdrQuery = exports.guardarEncuestaEnTem = exports.getOperativoActual = exports.setMaxEncPorArea = exports.setGenerarIdEncFun = void 0;
36
+ exports.consultaUpdateTem = consultaUpdateTem;
37
+ exports.consultaUpdateTareasTemPorDescarga = consultaUpdateTareasTemPorDescarga;
38
+ exports.reasNoReasDelOperativo = reasNoReasDelOperativo;
39
+ exports.pasarEncuestasAProie = pasarEncuestasAProie;
40
+ const likeAr = require("like-ar");
41
+ __exportStar(require("./types-dmencu"), exports);
42
+ const pg_promise_strict_1 = require("pg-promise-strict");
43
+ const best_globals_1 = require("best-globals");
44
+ const fs_1 = require("fs");
45
+ const ExpresionParser = require("expre-parser");
46
+ const table_tareas_tem_1 = require("./table-tareas_tem");
47
+ const console_1 = require("console");
48
+ const cast_error_1 = require("cast-error");
49
+ const app_dmencu_1 = require("./app-dmencu");
50
+ const ayuda_1 = require("./ayuda");
51
+ const setters_rea_no_rea_1 = require("./setters-rea-no-rea");
52
+ var Path = require('path');
53
+ var sqlTools = require('sql-tools');
54
+ var discrepances = require('discrepances');
55
+ const formPrincipal = 'F:F1';
56
+ const ESTADO_POSTERIOR_CARGA = 'C';
57
+ const ESTADO_POSTERIOR_DESCARGA = 'D';
58
+ const OPERACION_PREPARAR_CARGA = 'cargar';
59
+ const OPERACION_PREPARAR_DESCARGA = 'descargar';
60
+ const DEFAULT_DOMINIO = 3;
61
+ var generarIdEncFun;
62
+ var maxAEncPorArea = 999;
63
+ const setGenerarIdEncFun = (fun) => generarIdEncFun = fun;
64
+ exports.setGenerarIdEncFun = setGenerarIdEncFun;
65
+ const setMaxEncPorArea = (max) => maxAEncPorArea = max;
66
+ exports.setMaxEncPorArea = setMaxEncPorArea;
67
+ (0, exports.setGenerarIdEncFun)((area, numEnc) => area.toString() + numEnc.toString().padStart(maxAEncPorArea.toString().length, '0'));
68
+ (0, exports.setMaxEncPorArea)(999);
69
+ function generarNuevoIdEnc(context, operativo, area, maxAEncPorArea) {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ const siguienteNumeroEncuesta = (yield context.client.query(`
72
+ SELECT obtener_siguiente_contador_area($1,$2,$3) AS next_counter;
73
+ `, [operativo, area, maxAEncPorArea]).fetchUniqueValue()).value;
74
+ return generarIdEncFun(area, siguienteNumeroEncuesta);
75
+ });
76
+ }
77
+ const getOperativoActual = (context) => __awaiter(void 0, void 0, void 0, function* () {
78
+ var be = context.be;
79
+ var operativo = (yield context.client.query(`select operativo
80
+ from parametros
81
+ where unico_registro`, []).fetchUniqueValue()).value;
82
+ if (operativo) {
83
+ return operativo;
84
+ }
85
+ else {
86
+ throw Error('no se configuró un operativo en la tabla parámetros');
87
+ }
88
+ });
89
+ exports.getOperativoActual = getOperativoActual;
90
+ function getDefaultTarea(context, operativo) {
91
+ return __awaiter(this, void 0, void 0, function* () {
92
+ return (yield context.client.query(`
93
+ select *
94
+ from tareas
95
+ where es_inicial and operativo = $1
96
+ `, [operativo]).fetchUniqueRow()).row;
97
+ });
98
+ }
99
+ function getOperativoPermiteGenerarMuestra(client, operativo) {
100
+ return __awaiter(this, void 0, void 0, function* () {
101
+ return (yield client.query(`
102
+ select permite_generar_muestra
103
+ from operativos
104
+ where operativo = $1
105
+ `, [operativo]).fetchUniqueValue()).value;
106
+ });
107
+ }
108
+ function persistirEncuestaAutogeneradaEnDM(context, OPERATIVO, area, encAutogeneradoDm, token, respuestasRaiz, recepcionista, asignado, modo_dm, cambia_modo_dm) {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ let idEnc = null;
111
+ var permite_generar_muestra = yield getOperativoPermiteGenerarMuestra(context.client, OPERATIVO);
112
+ if (permite_generar_muestra) {
113
+ const autogeneradoField = modo_dm == 'produc' ? 'enc_autogenerado_dm' : 'enc_autogenerado_dm_capa';
114
+ const resultUpdate = yield context.client.query(`
115
+ UPDATE tem
116
+ set (json_backup, json_encuesta, fecha_backup) =
117
+ ($4, $5, current_timestamp)
118
+ where (operativo = $1 and ${context.be.db.quoteIdent(autogeneradoField)} = $2 and token_autogenerado_dm = $3)
119
+ returning *
120
+ `, [OPERATIVO, encAutogeneradoDm, token, respuestasRaiz, respuestasRaiz]).fetchOneRowIfExists();
121
+ // hago insert porque no existe en tem
122
+ const defaultTarea = yield getDefaultTarea(context, OPERATIVO);
123
+ if (resultUpdate.rowCount == 0) {
124
+ idEnc = yield generarNuevoIdEnc(context, OPERATIVO, area, maxAEncPorArea);
125
+ yield context.client.query(`
126
+ INSERT into tem (
127
+ operativo,
128
+ enc,
129
+ area,
130
+ dominio,
131
+ habilitada,
132
+ ${context.be.db.quoteIdent(autogeneradoField)},
133
+ token_autogenerado_dm,
134
+ tarea_actual,
135
+ json_backup,
136
+ json_encuesta,
137
+ fecha_backup
138
+ )
139
+ values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, current_timestamp)
140
+ returning *
141
+ `, [
142
+ OPERATIVO,
143
+ idEnc,
144
+ area,
145
+ DEFAULT_DOMINIO,
146
+ true,
147
+ encAutogeneradoDm,
148
+ token,
149
+ defaultTarea.tarea,
150
+ respuestasRaiz,
151
+ respuestasRaiz,
152
+ ]).fetchUniqueRow();
153
+ }
154
+ else {
155
+ idEnc = resultUpdate.row.enc;
156
+ }
157
+ yield generarTareasTemFaltantes(context, OPERATIVO);
158
+ yield context.client.query(`
159
+ update tareas_tem
160
+ set recepcionista = $4, asignado = $5
161
+ where operativo= $1 and enc = $2 and tarea = $3
162
+ returning *
163
+ `, [OPERATIVO, idEnc, defaultTarea.tarea, recepcionista, asignado]).fetchUniqueRow();
164
+ yield context.client.query(`
165
+ update tareas_tem
166
+ set cargado_dm = $4, estado = $5, operacion = $6
167
+ where operativo= $1 and enc = $2 and tarea = $3
168
+ returning *
169
+ `, [OPERATIVO, idEnc, defaultTarea.tarea, token, ESTADO_POSTERIOR_CARGA, cambia_modo_dm ? null : OPERACION_PREPARAR_CARGA]).fetchUniqueRow();
170
+ }
171
+ return idEnc;
172
+ });
173
+ }
174
+ function createStructure(context, tableName) {
175
+ var be = context.be;
176
+ var mainTableDef = be.tableStructures[tableName](context);
177
+ var getPkFromTableDef = function getPkFromTableDef(tableDef) {
178
+ return tableDef.primaryKey.map(function (pk) {
179
+ return { fieldName: pk };
180
+ });
181
+ };
182
+ var getFkFromTableDef = function getFkFromTableDef(tableDef, parentTableName) {
183
+ let parentFk = tableDef.foreignKeys.find(fk => fk.references == parentTableName);
184
+ return parentFk ? parentFk.fields : [];
185
+ };
186
+ var struct = {
187
+ tableName: mainTableDef.name,
188
+ pkFields: getPkFromTableDef(mainTableDef),
189
+ childTables: []
190
+ };
191
+ if (mainTableDef.detailTables && mainTableDef.detailTables.length) {
192
+ mainTableDef.detailTables.forEach(function (detailTable) {
193
+ if (detailTable.table) {
194
+ struct.childTables.push((0, best_globals_1.changing)(createStructure(context, detailTable.table), { fkFields: getFkFromTableDef(be.tableStructures[detailTable.table](context), tableName) }));
195
+ }
196
+ });
197
+ }
198
+ return struct;
199
+ }
200
+ // graba en la TEM la encuesta y el resultado calculado (resumen, rea y no rea; o sus versiones _sup si la tarea es supe)
201
+ function consultaUpdateTem(operativo, idEnc, respuestasUAPrincipal, tarea) {
202
+ var { params, setters } = (0, setters_rea_no_rea_1.getSettersAndParametersForReaNoReaResumenEstado)({
203
+ tarea,
204
+ respuestasUAPrincipal,
205
+ setters: [`json_encuesta = $3`, `fecha_modif_encuesta = current_timestamp`],
206
+ params: [operativo, idEnc, respuestasUAPrincipal],
207
+ destino: 'tem'
208
+ });
209
+ return {
210
+ sql: `update tem
211
+ set ${setters.join(',')}
212
+ where operativo= $1 and enc = $2
213
+ returning 'ok'`,
214
+ params
215
+ };
216
+ }
217
+ // cuando el dispositivo devuelve la encuesta: pasa la tarea a descargada y guarda el resultado calculado en el dispositivo (dm_*);
218
+ // sólo si la encuesta sigue cargada con el token del dispositivo
219
+ function consultaUpdateTareasTemPorDescarga(opts) {
220
+ var { params, setters } = (0, setters_rea_no_rea_1.getSettersAndParametersForReaNoReaResumenEstado)({
221
+ tarea: opts.tarea,
222
+ respuestasUAPrincipal: opts.respuestasUAPrincipal,
223
+ setters: [
224
+ `estado = '${ESTADO_POSTERIOR_DESCARGA}'`,
225
+ `cargado_dm=null`
226
+ ],
227
+ params: [opts.operativo, opts.idEnc, opts.tarea, opts.token],
228
+ destino: 'tareas_tem'
229
+ });
230
+ if (opts.pasaADescargar) {
231
+ setters.push(`operacion = '${OPERACION_PREPARAR_DESCARGA}'`);
232
+ }
233
+ return {
234
+ sql: `update tareas_tem
235
+ set ${setters.join(',')}
236
+ where operativo= $1 and enc = $2 and tarea = $3 and cargado_dm = $4
237
+ returning 'ok'`,
238
+ params
239
+ };
240
+ }
241
+ var guardarEncuestaEnTem = (context, operativo, idEnc, respuestasUAPrincipal, tarea) => __awaiter(void 0, void 0, void 0, function* () {
242
+ var { sql, params } = consultaUpdateTem(operativo, idEnc, respuestasUAPrincipal, tarea);
243
+ return yield context.client.query(sql, params).fetchUniqueRow();
244
+ });
245
+ exports.guardarEncuestaEnTem = guardarEncuestaEnTem;
246
+ function registrarPaseTabla(context, operativo, idEnc, respuestasUAPrincipal) {
247
+ return __awaiter(this, void 0, void 0, function* () {
248
+ var be = context.be;
249
+ var procedureGuardar = be.procedure.caso_guardar;
250
+ let resultado = `id enc ${idEnc}: `;
251
+ let param_guardar = { operativo: operativo, id_caso: idEnc, datos_caso: respuestasUAPrincipal };
252
+ let savepointName = `sp_guardar_${idEnc}`.replace(/[^a-zA-Z0-9_]/g, '_');
253
+ try {
254
+ yield context.client.query(`SAVEPOINT ${savepointName}`).execute();
255
+ resultado += yield procedureGuardar.coreFunction(context, param_guardar);
256
+ yield context.client.query(`RELEASE SAVEPOINT ${savepointName}`).execute();
257
+ }
258
+ catch (err) {
259
+ yield context.client.query(`ROLLBACK TO SAVEPOINT ${savepointName}`).execute();
260
+ var error = (0, cast_error_1.expected)(err);
261
+ let errMessage = resultado + "dm_forpkraiz_descargar. " + error.message;
262
+ resultado = errMessage;
263
+ console.error(errMessage, error);
264
+ }
265
+ return yield context.client.query(`update tem
266
+ set pase_tabla = $3
267
+ where operativo = $1 and enc = $2
268
+ returning 'ok'`, [operativo, idEnc, resultado]).fetchUniqueRow();
269
+ });
270
+ }
271
+ var simularGuardadoDeEncuestaDesdeAppEscritorio = (context, operativo, enc, tarea, json_encuesta) => __awaiter(void 0, void 0, void 0, function* () {
272
+ var be = context.be;
273
+ const UA_PRINCIPAL = (yield getUAPrincipal(context.client, operativo)).unidad_analisis;
274
+ return yield be.procedure.dm_forpkraiz_descargar.coreFunction(context, {
275
+ operativo: operativo,
276
+ persistentes: {
277
+ respuestas: {
278
+ [UA_PRINCIPAL]: {
279
+ [enc]: json_encuesta
280
+ }
281
+ },
282
+ informacionHdr: {
283
+ [enc]: {
284
+ tarea: {
285
+ tarea
286
+ }
287
+ }
288
+ }
289
+ }
290
+ });
291
+ });
292
+ function cargasHdrConFechaDmy(cargas) {
293
+ return cargas.map(carga => (Object.assign(Object.assign({}, carga), { fecha: carga.fecha ? best_globals_1.date.iso(carga.fecha).toDmy() : null })));
294
+ }
295
+ var getHdrQuery = function getHdrQuery(quotedCondViv, context, unidadAnalisisPrincipal, permiteGenerarMuestra, idper) {
296
+ return `
297
+ with ${context.be.db.quoteIdent(unidadAnalisisPrincipal)} as
298
+ (select t.operativo, t.enc, t.json_encuesta as respuestas, t.resumen_estado as "resumenEstado",
299
+ jsonb_build_object(
300
+ 'dominio' , dominio ,
301
+ 'nomcalle' , nomcalle ,
302
+ 'sector' , sector ,
303
+ 'edificio' , edificio ,
304
+ 'entrada' , entrada ,
305
+ 'nrocatastral' , nrocatastral ,
306
+ 'piso' , piso ,
307
+ 'departamento' , departamento ,
308
+ 'habitacion' , habitacion ,
309
+ 'casa' , casa ,
310
+ 'prioridad' , reserva+1 ,
311
+ 'observaciones' , tt.carga_observaciones ,
312
+ 'cita' , cita ,
313
+ 'carga' , t.area ,
314
+ 'semana' , t.semana
315
+ ) as tem, t.area,
316
+ --TODO: GENERALIZAR
317
+ jsonb_build_object(
318
+ 'tarea', tt.tarea,
319
+ 'fecha_asignacion', fecha_asignacion,
320
+ 'asignado', asignado,
321
+ 'main_form', main_form
322
+ ) as tarea,
323
+ min(fecha_asignacion) as fecha_asignacion
324
+ from tem t left join tareas_tem tt on (t.operativo = tt.operativo and t.enc = tt.enc and t.tarea_actual = tt.tarea)
325
+ left join tareas ta on t.tarea_actual = ta.tarea
326
+ where t.habilitada and ${quotedCondViv}
327
+ group by t.operativo, t.enc, t.json_encuesta, t.resumen_estado, dominio, nomcalle,sector,edificio, entrada, nrocatastral, piso,departamento,habitacion,casa,reserva,tt.carga_observaciones, cita, t.area, tt.tarea, fecha_asignacion, asignado, main_form, t.semana
328
+ )
329
+ select jsonb_build_object(
330
+ ${context.be.db.quoteLiteral(unidadAnalisisPrincipal)}, ${(0, pg_promise_strict_1.jsono)(`select enc, respuestas, jsonb_build_object('resumenEstado',"resumenEstado") as otras from ${context.be.db.quoteIdent(unidadAnalisisPrincipal)}`, 'enc', `otras || coalesce(respuestas,'{}'::jsonb)`)}
331
+ ) as respuestas,
332
+ ${(0, pg_promise_strict_1.json)(`
333
+ select a.area as carga, observaciones_hdr as observaciones, min(fecha_asignacion) as fecha, ta.recepcionista,
334
+ ${permiteGenerarMuestra ? `case
335
+ when ta.asignado = ${context.be.db.quoteLiteral(idper)}
336
+ then true
337
+ else false
338
+ end` : `false`} as puede_autogenerar
339
+ from ${context.be.db.quoteIdent(unidadAnalisisPrincipal)} aux inner join areas a using (operativo, area) inner join tareas_areas ta on (a.area = ta.area and aux.tarea->>'tarea' = ta.tarea)
340
+ group by a.area, observaciones_hdr, ta.recepcionista, puede_autogenerar
341
+ ${permiteGenerarMuestra ? `
342
+ union -- este union permite visualizar areas asignadas sin encuestas generadas
343
+ select area as carga, null as observaciones, null as fecha, recepcionista, true as puede_autogenerar
344
+ from tareas_areas where asignado = ${context.be.db.quoteLiteral(idper)} and tarea = 'encu'` : ''}
345
+ `, 'fecha')} as cargas,
346
+ ${(0, pg_promise_strict_1.jsono)(`select enc, jsonb_build_object('tem', tem, 'tarea', tarea) as otras from ${context.be.db.quoteIdent(unidadAnalisisPrincipal)}`, 'enc', `otras ||'{}'::jsonb`)}
347
+ as "informacionHdr"
348
+ `;
349
+ };
350
+ var setHdrQuery = (myFun) => getHdrQuery = myFun;
351
+ exports.setHdrQuery = setHdrQuery;
352
+ const getUAPrincipal = (client, operativo) => __awaiter(void 0, void 0, void 0, function* () {
353
+ return (yield client.query(`select *
354
+ from unidad_analisis
355
+ where operativo= $1 and principal
356
+ `, [operativo]).fetchUniqueRow()).row;
357
+ });
358
+ var funcionesConocidas = {};
359
+ var compiler = new ExpresionParser.Compiler({
360
+ language: 'js',
361
+ varWrapper: (var_name) => `helpers.null2zero(valores.${var_name})`,
362
+ funWrapper: (functionName) => {
363
+ if (!funcionesConocidas[functionName]) {
364
+ console.log(functionName);
365
+ funcionesConocidas[functionName] = true;
366
+ }
367
+ return `helpers.funs.${functionName}`;
368
+ }
369
+ });
370
+ function compilarExpresion(expresion) {
371
+ return compiler.toCode(ExpresionParser.parse(expresion
372
+ .replace(/\bis distinct from\b/gi, ' <> ')
373
+ .replace(/!!/gi, ' '))).replace(/helpers\.funs\.blanco\(helpers.null2zero\(/g, 'helpers.funs.blanco((')
374
+ .replace(/helpers\.funs\.informado\(helpers.null2zero\(/g, 'helpers.funs.informado((');
375
+ }
376
+ // rea/no rea (y sus versiones _sup) del operativo, tomadas de las caches, para la estructura que se manda al dispositivo.
377
+ // Las condiciones de rea se compilan a js (condicion_js) para evaluarlas en el dispositivo.
378
+ function reasNoReasDelOperativo(tableContent, operativo) {
379
+ var noReasCache = tableContent.no_rea || [];
380
+ var noReasSupCache = tableContent.no_rea_sup || [];
381
+ var reasCache = tableContent.rea || [];
382
+ var reasSupCache = tableContent.rea_sup || [];
383
+ return {
384
+ noReas: noReasCache.filter(noRea => noRea.operativo == operativo),
385
+ noReasSup: noReasSupCache.filter(noReaSup => noReaSup.operativo == operativo),
386
+ reas: reasCache.filter(rea => rea.operativo == operativo)
387
+ .map((rea) => (Object.assign(Object.assign({}, rea), { condicion_js: compilarExpresion(rea.condicion) }))),
388
+ reasSup: reasSupCache.filter(reaSup => reaSup.operativo == operativo)
389
+ .map((reaSup) => (Object.assign(Object.assign({}, reaSup), { condicion_js: compilarExpresion(reaSup.condicion) }))),
390
+ };
391
+ }
392
+ function compilarExpresiones(casillero) {
393
+ var _a, _b;
394
+ if (!casillero) {
395
+ return;
396
+ }
397
+ if (casillero.data.expresion_habilitar) {
398
+ casillero.data.expresion_habilitar_js = compilarExpresion(casillero.data.expresion_habilitar);
399
+ }
400
+ if ((_a = casillero.data.especial) === null || _a === void 0 ? void 0 : _a.autoing) {
401
+ var partes = (_b = casillero.data.especial) === null || _b === void 0 ? void 0 : _b.autoing.split('=>');
402
+ if (partes.length > 1) {
403
+ var precondicion = partes[0];
404
+ var valor = partes.slice(1).join('=>');
405
+ casillero.data.expresion_autoingresar_js = `(${compilarExpresion(precondicion)})?(${compilarExpresion(valor)}):null`;
406
+ }
407
+ else {
408
+ casillero.data.expresion_autoingresar_js = compilarExpresion(partes[0]);
409
+ }
410
+ }
411
+ for (var casilleroInterno of casillero.childs)
412
+ compilarExpresiones(casilleroInterno);
413
+ }
414
+ const generarEncuestaTem = (context, operativo, idEnc, area, dominio, tarea_actual) => __awaiter(void 0, void 0, void 0, function* () {
415
+ yield context.client.query(`
416
+ INSERT into tem (operativo, enc, area, dominio, habilitada, tarea_actual) values ($1, $2, $3, $4, $5, $6)`, [operativo, idEnc, area, dominio, true, tarea_actual]).execute();
417
+ });
418
+ const generarTareasTemFaltantes = (context, operativo) => __awaiter(void 0, void 0, void 0, function* () {
419
+ yield context.client.query(`
420
+ insert into tareas_tem (operativo, enc, tarea)
421
+ select ta.operativo, ta.enc, ta.tarea
422
+ from (select ta.*, t.enc,t.area from tareas ta, tem t where ta.operativo=t.operativo) ta
423
+ where ta.operativo = $1
424
+ and not (ta.operativo, ta.enc, ta.tarea) in (select operativo, enc, tarea from tareas_tem)
425
+ order by 1,3,2;
426
+ `, [operativo]).execute();
427
+ });
428
+ const buscarEncuestaEnTem = (context, params) => __awaiter(void 0, void 0, void 0, function* () {
429
+ try {
430
+ var result = yield context.client.query(`
431
+ select *
432
+ from tem
433
+ where operativo = $1 and enc = $2 --pk verificada
434
+ `, [params.operativo, params.enc]).fetchUniqueRow();
435
+ }
436
+ catch (err) {
437
+ throw Error(`No se encontró la encuesta ${params.enc} para el operativo ${params.operativo}. ${(0, cast_error_1.expected)(err).message}`);
438
+ }
439
+ return { casoTem: result.row };
440
+ });
441
+ function pasarEncuestasAProie(client) {
442
+ return __awaiter(this, void 0, void 0, function* () {
443
+ let parametros = (yield client.query(`
444
+ select * from parametros where unico_registro`, []).fetchUniqueRow()).row;
445
+ var select = `select t.operativo, t.enc, t.tarea_actual, tt.ts_entrada
446
+ from tareas_tem tt join tem t using (operativo,enc)
447
+ where tt.operativo=$1 and tt.tarea= $2 and (${(0, table_tareas_tem_1.getDiasAPasarQuery)('tt')} <= 0 or coalesce(tt.adelantar,false)) and tt.tarea = t.tarea_actual
448
+ `;
449
+ yield client.query(`
450
+ UPDATE tareas_tem tt
451
+ set estado = 'V'
452
+ from (${select}) aux
453
+ where tt.operativo = aux.operativo and tt.enc = aux.enc and tt.tarea = $3
454
+ returning *`, [parametros.operativo, 'finc', 'finc'])
455
+ .fetchAll();
456
+ //TODO asignar en procesamiento
457
+ yield client.query(`
458
+ UPDATE tareas_tem tt
459
+ set estado = 'A'
460
+ from (${select}) aux
461
+ where tt.operativo = aux.operativo and tt.enc = aux.enc and tt.tarea = $3
462
+ returning *`, [parametros.operativo, 'finc', 'proc'])
463
+ .fetchAll();
464
+ yield client.query(`
465
+ update tem t
466
+ set tarea_actual = 'proc'
467
+ from (${select}) aux
468
+ where t.operativo = aux.operativo and t.enc = aux.enc
469
+ returning *`, [parametros.operativo, 'finc']).fetchAll();
470
+ return 'ok';
471
+ });
472
+ }
473
+ exports.ProceduresDmEncu = [
474
+ {
475
+ action: 'operativo_estructura_completa',
476
+ parameters: [
477
+ { name: 'operativo', typeName: 'text', references: 'operativos' },
478
+ { name: 'idper_logueado_tablet', typeName: 'text', defaultValue: null },
479
+ ],
480
+ resultOk: 'desplegarFormulario',
481
+ unlogged: true,
482
+ coreFunction: function (context, parameters) {
483
+ return __awaiter(this, void 0, void 0, function* () {
484
+ var be = context.be;
485
+ var result = yield context.client.query(`select casilleros_jerarquizados($1) as formularios,
486
+ ${(0, pg_promise_strict_1.jsono)(`select unidad_analisis, padre, pk_agregada, '{}'::jsonb as hijas from unidad_analisis where operativo = $2`, 'unidad_analisis')} as unidades_analisis
487
+ `, [parameters.operativo, parameters.operativo]).fetchUniqueRow();
488
+ likeAr(result.row.formularios).forEach(f => compilarExpresiones(f));
489
+ // Hermanos son los formularios que están implantados en otro formulario de la misma UA. Por ejemplo el A1 en el S1
490
+ var resultHermanos = yield context.client.query(`
491
+ select o.id_casillero as id_formulario, o.unidad_analisis, 'BF_'||o.casillero boton, bf.casillero, bf.padre, fp.casillero, fp.unidad_analisis
492
+ from casilleros o left join casilleros bf
493
+ on bf.tipoc='BF'
494
+ and bf.casillero = 'BF_'||o.casillero
495
+ and bf.operativo = o.operativo
496
+ left join casilleros fp
497
+ on fp.id_casillero = bf.padre
498
+ and fp.operativo = bf.operativo
499
+ where o.tipoc = 'F'
500
+ and o.unidad_analisis = fp.unidad_analisis
501
+ and o.operativo = $1`, [parameters.operativo]).fetchAll();
502
+ resultHermanos.rows.forEach(row => {
503
+ result.row.formularios[row.id_formulario].data.hermano = true;
504
+ });
505
+ function completarUA(ua, idUa, uAs) {
506
+ if (ua.padre) {
507
+ uAs[ua.padre].hijas[idUa] = ua;
508
+ }
509
+ else {
510
+ ua.principal = true;
511
+ }
512
+ }
513
+ likeAr(result.row.unidades_analisis).forEach((ua, idUa) => completarUA(ua, idUa, result.row.unidades_analisis));
514
+ var { con_rea_hogar: conReaHogar, config_sorteo: configSorteo, habilitacion_boton_formulario: habilitacionBotonFormulario, } = (yield context.client.query(`
515
+ select config_sorteo, con_rea_hogar, habilitacion_boton_formulario, permite_generar_muestra
516
+ from operativos
517
+ where operativo = $1
518
+ `, [parameters.operativo]).fetchUniqueRow()).row;
519
+ var semanas = (yield context.client.query(`select
520
+ ${(0, pg_promise_strict_1.jsono)(`select * from semanas where operativo = $1`, 'semana')} as semanas
521
+ `, [parameters.operativo]).fetchUniqueRow()).row.semanas;
522
+ let compilarExpresionesDominios = (expresionesDominio) => likeAr(expresionesDominio)
523
+ .map((expr, dominio) => ({ dominio, expr: compilarExpresion(expr.expr) }))
524
+ .plain();
525
+ if (configSorteo) {
526
+ likeAr(configSorteo).forEach((configSorteoFormulario) => {
527
+ configSorteoFormulario.expr_incompletitud_js = compilarExpresionesDominios(configSorteoFormulario.expr_incompletitud);
528
+ configSorteoFormulario.filtro_js = compilarExpresionesDominios(configSorteoFormulario.filtro);
529
+ });
530
+ }
531
+ if (habilitacionBotonFormulario) {
532
+ likeAr(habilitacionBotonFormulario).forEach((form) => {
533
+ form.expr_habilitar_boton_js = compilarExpresion(form.expr_habilitar_boton);
534
+ });
535
+ }
536
+ var defaultTarea = yield getDefaultTarea(context, parameters.operativo);
537
+ var defaultInformacionHdr = (yield context.client.query(`select
538
+ jsonb_build_object(
539
+ 'dominio' , ${context.be.db.quoteLiteral(DEFAULT_DOMINIO)},
540
+ 'nomcalle' , null ,
541
+ 'sector' , null ,
542
+ 'edificio' , null ,
543
+ 'entrada' , null ,
544
+ 'nrocatastral' , null ,
545
+ 'piso' , null ,
546
+ 'departamento' , null ,
547
+ 'habitacion' , null ,
548
+ 'casa' , null ,
549
+ 'prioridad' , null ,
550
+ 'observaciones' , null ,
551
+ 'cita' , null ,
552
+ 'carga' , null ,
553
+ 'semana' , null
554
+ ) as tem,
555
+ jsonb_build_object(
556
+ 'tarea', ${context.be.db.quoteLiteral(defaultTarea.tarea)},
557
+ 'fecha_asignacion', null,
558
+ 'asignado', ${context.be.db.quoteLiteral(parameters.idper_logueado_tablet || context.user.idper)},
559
+ 'main_form', ${context.be.db.quoteLiteral(defaultTarea.main_form)}
560
+ ) as tarea
561
+ `, []).fetchUniqueRow()).row;
562
+ var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, parameters.operativo));
563
+ return Object.assign(Object.assign(Object.assign(Object.assign({ timestamp: be.caches.timestampEstructura }, result.row), { operativo: parameters.operativo, conReaHogar,
564
+ configSorteo,
565
+ habilitacionBotonFormulario }), reasNoReasDelOperativo(be.caches.tableContent, parameters.operativo)), { defaultInformacionHdr, uaPpal: unidad_analisis, semanas, pkAgregadaUaPpal: pk_agregada });
566
+ });
567
+ }
568
+ },
569
+ {
570
+ action: 'generar_formularios',
571
+ parameters: [
572
+ { name: 'annio', typeName: 'integer', references: 'annio' },
573
+ { name: 'mes', typeName: 'integer', references: 'mes' },
574
+ { name: 'lote', typeName: 'integer', references: 'lotes' },
575
+ ],
576
+ coreFunction: function (context, parameters) {
577
+ return __awaiter(this, void 0, void 0, function* () {
578
+ var be = context.be;
579
+ const OPERATIVO = yield (0, exports.getOperativoActual)(context);
580
+ let uaPpal = yield getUAPrincipal(context.client, OPERATIVO);
581
+ let resultPreguntas = yield be.procedure.preguntas_ua_traer.coreFunction(context, uaPpal);
582
+ var contenedorVacio = {};
583
+ resultPreguntas.forEach(function (defPregunta) {
584
+ contenedorVacio[defPregunta.var_name] = defPregunta.unidad_analisis ? [] : null;
585
+ });
586
+ contenedorVacio.annio = parameters.annio;
587
+ contenedorVacio.mes = parameters.mes;
588
+ contenedorVacio.lote = parameters.lote;
589
+ var result = yield context.client.query(`select debe_haber.id_caso, s as id
590
+ from (select lote, armar_id(annio, mes, lote, s) as id_caso, s
591
+ from (select annio,mes,lote, cant_cues from lotes where (annio,mes,lote)=($2,$3,$4)) r, lateral generate_series(1,cant_cues) s
592
+ ) debe_haber left join defgen hay on hay.id_caso = debe_haber.id_caso and hay.operativo=$1
593
+ where hay.id_caso is null`, [OPERATIVO, parameters.annio, parameters.mes, parameters.lote]).fetchAll();
594
+ var params = { operativo: OPERATIVO };
595
+ for (var i = 0; i < (result.rowCount || 0); i++) {
596
+ yield be.procedure.caso_guardar.coreFunction(context, (0, best_globals_1.changing)(params, { id_caso: result.rows[i].id_caso, datos_caso: (0, best_globals_1.changing)(contenedorVacio, { id: result.rows[i].id }) }));
597
+ }
598
+ return { agregadas: result.rowCount };
599
+ });
600
+ }
601
+ },
602
+ {
603
+ action: 'upload_file',
604
+ progress: true,
605
+ parameters: [
606
+ { name: 'id_adjunto', typeName: 'integer' },
607
+ { name: 'nombre', typeName: 'text' },
608
+ ],
609
+ files: { count: 1 },
610
+ coreFunction: function (context, parameters, files) {
611
+ let be = context.be;
612
+ let client = context.client;
613
+ context.informProgress({ message: be.messages.fileUploaded });
614
+ //@ts-ignore existe
615
+ let file = files[0];
616
+ let ext = Path.extname(file.path).substr(1);
617
+ let originalFilename = file.originalFilename.slice(0, -(ext.length + 1));
618
+ let filename = parameters.nombre || originalFilename;
619
+ let newPath = 'local-attachments/file-';
620
+ var createResponse = function createResponse(adjuntoRow) {
621
+ let resultado = {
622
+ message: 'La subida se realizó correctamente (update)',
623
+ nombre: adjuntoRow.nombre,
624
+ nombre_original: adjuntoRow.nombre_original,
625
+ ext: adjuntoRow.ext,
626
+ fecha: adjuntoRow.fecha,
627
+ hora: adjuntoRow.hora,
628
+ id_adjunto: adjuntoRow.id_adjunto
629
+ };
630
+ return resultado;
631
+ };
632
+ //@ts-ignore
633
+ var moveFile = function moveFile(file, id_adjunto, extension) {
634
+ //@ts-ignore
635
+ fs_1.promises.move(file.path, newPath + id_adjunto + '.' + extension, { overwrite: true });
636
+ };
637
+ return Promise.resolve().then(function () {
638
+ if (parameters.id_adjunto) {
639
+ return context.client.query(`update adjuntos set nombre= $1,nombre_original = $2, ext = $3, ruta = concat('local-attachments/file-',$4::text,'.',$3::text), fecha = now(), hora = date_trunc('seconds',current_timestamp-current_date)
640
+ where id_adjunto = $4 returning *`, [filename, originalFilename, ext, parameters.id_adjunto]).fetchUniqueRow().then(function (result) {
641
+ return createResponse(result.row);
642
+ }).then(function (resultado) {
643
+ moveFile(file, resultado.id_adjunto, resultado.ext);
644
+ return resultado;
645
+ });
646
+ }
647
+ else {
648
+ return context.client.query(`insert into adjuntos (nombre, nombre_original, ext, fecha, hora) values ($1,$2,$3,now(), date_trunc('seconds',current_timestamp-current_date)) returning *`, [filename, originalFilename, ext]).fetchUniqueRow().then(function (result) {
649
+ return context.client.query(`update adjuntos set ruta = concat('local-attachments/file-',id_adjunto::text,'.',ext)
650
+ where id_adjunto = $1 returning *`, [result.row.id_adjunto]).fetchUniqueRow().then(function (result) {
651
+ return createResponse(result.row);
652
+ }).then(function (resultado) {
653
+ moveFile(file, resultado.id_adjunto, resultado.ext);
654
+ return resultado;
655
+ });
656
+ });
657
+ }
658
+ }).catch(function (err) {
659
+ throw err;
660
+ });
661
+ }
662
+ },
663
+ {
664
+ action: 'caso_guardar',
665
+ parameters: [
666
+ { name: 'operativo', typeName: 'text', references: 'operativos' },
667
+ { name: 'id_caso', typeName: 'text' },
668
+ { name: 'datos_caso', typeName: 'jsonb' },
669
+ ],
670
+ definedIn: 'dmencu',
671
+ //@ts-ignore especifico el tipo de los parámetros
672
+ coreFunction: function (context, parameters, newClient) {
673
+ return __awaiter(this, void 0, void 0, function* () {
674
+ var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, parameters.operativo));
675
+ var client = newClient || context.client;
676
+ var datos_json = parameters.datos_caso;
677
+ var be = context.be;
678
+ var tableStructures_app = be.tableStructures;
679
+ var struct_dmencu = createStructure(context, unidad_analisis);
680
+ datos_json['operativo'] = parameters.operativo;
681
+ datos_json[pk_agregada] = parameters.id_caso;
682
+ function completar_ult_pk_en_arr(ult_pk, ua_arr) {
683
+ var con_pk_completa = ua_arr;
684
+ if (ua_arr && ua_arr.length >= 1) {
685
+ con_pk_completa = con_pk_completa.map((una_ua, i) => {
686
+ una_ua[ult_pk] = i + 1;
687
+ return una_ua;
688
+ });
689
+ }
690
+ ;
691
+ return con_pk_completa;
692
+ }
693
+ function recorrer_datos_agregando_pks(datosj) {
694
+ for (var keyName in datosj) {
695
+ var datoK = datosj[keyName];
696
+ if (datoK instanceof Array && datoK.length >= 1) {
697
+ var pk = tableStructures_app[keyName](context).primaryKey;
698
+ var ult_pk = pk[pk.length - 1];
699
+ datoK = completar_ult_pk_en_arr(ult_pk, datoK);
700
+ datoK.forEach((elemI) => {
701
+ elemI = recorrer_datos_agregando_pks(elemI);
702
+ });
703
+ }
704
+ ;
705
+ if (keyName.startsWith('$') || keyName.startsWith('_') || keyName == 'null') {
706
+ delete datosj[keyName];
707
+ }
708
+ }
709
+ return datosj;
710
+ }
711
+ datos_json = recorrer_datos_agregando_pks(datos_json);
712
+ delete datos_json.codRea;
713
+ delete datos_json.codNoRea;
714
+ delete datos_json.resumenEstado;
715
+ delete datos_json.codReaSup;
716
+ delete datos_json.codNoReaSup;
717
+ delete datos_json.resumenEstadoSup;
718
+ if (Object.keys(datos_json).length > 2) {
719
+ var queries = sqlTools.structuredData.sqlWrite(datos_json, struct_dmencu);
720
+ return yield queries.reduce(function (promise, query) {
721
+ return promise.then(function () {
722
+ return client.query(query).execute().then(function (_result) {
723
+ return 'ok';
724
+ });
725
+ });
726
+ }, Promise.resolve()).then(function () {
727
+ return "ok";
728
+ }).catch(function (err) {
729
+ console.error("caso_guardar ENTRA EN EL CATCH: ", (0, cast_error_1.expected)(err));
730
+ throw err;
731
+ });
732
+ }
733
+ else {
734
+ return 'vacio';
735
+ }
736
+ });
737
+ }
738
+ },
739
+ {
740
+ action: 'caso_traer',
741
+ parameters: [
742
+ //{name:'formulario' , typeName:'text'},
743
+ { name: 'operativo', references: 'operativos', typeName: 'text' },
744
+ { name: 'id_caso', typeName: 'text' },
745
+ ],
746
+ resultOk: 'goToEnc',
747
+ definedIn: 'dmencu',
748
+ coreFunction: function (context, parameters) {
749
+ return __awaiter(this, void 0, void 0, function* () {
750
+ var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, parameters.operativo));
751
+ var client = context.client;
752
+ var struct_dmencu = createStructure(context, unidad_analisis);
753
+ var sql = sqlTools.structuredData.sqlRead({ operativo: parameters.operativo, [pk_agregada]: parameters.id_caso }, struct_dmencu);
754
+ var result = yield client.query(sql).fetchUniqueValue();
755
+ var response = {
756
+ operativo: parameters.operativo,
757
+ id_caso: parameters.id_caso,
758
+ datos_caso: result.value,
759
+ //formulario: formPrincipal,
760
+ };
761
+ return response;
762
+ });
763
+ }
764
+ },
765
+ {
766
+ action: 'caso_traer_o_crear',
767
+ parameters: [
768
+ { name: 'operativo', references: 'operativos', typeName: 'text' },
769
+ { name: 'id_caso', typeName: 'text' },
770
+ ],
771
+ resultOk: 'goToEnc',
772
+ // bitacora:{always:true},
773
+ coreFunction: function (context, parameters) {
774
+ return __awaiter(this, void 0, void 0, function* () {
775
+ var be = context.be;
776
+ try {
777
+ var result = yield be.procedure['caso_traer'].coreFunction(context, parameters);
778
+ return result;
779
+ }
780
+ catch (err) {
781
+ var json = yield be.procedure['caso_preparar'].coreFunction(context, parameters);
782
+ yield be.procedure['caso_guardar'].coreFunction(context, (0, best_globals_1.changing)(parameters, { datos_caso: json }));
783
+ return yield be.procedure['caso_traer'].coreFunction(context, parameters);
784
+ }
785
+ });
786
+ }
787
+ },
788
+ {
789
+ action: 'pasar_json2ua',
790
+ parameters: [],
791
+ coreFunction: function (context, _parameters) {
792
+ return __awaiter(this, void 0, void 0, function* () {
793
+ /* GENERALIZAR: */
794
+ var be = context.be;
795
+ /* FIN-GENERALIZAR: */
796
+ const OPERATIVO = yield (0, exports.getOperativoActual)(context);
797
+ var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, OPERATIVO));
798
+ let resultMain = yield context.client.query(`SELECT * from ${be.db.quoteIdent(unidad_analisis)} LIMIT 1`).fetchAll();
799
+ if ((resultMain.rowCount || 0) > 0) {
800
+ console.log('HAY DATOS', resultMain.rows);
801
+ throw new Error('HAY DATOS. NO SE PUEDE INICIAR EL PASAJE');
802
+ }
803
+ let resultJson = yield context.client.query(`SELECT operativo, enc id_caso, json_encuesta datos_caso from tem
804
+ WHERE operativo=$1 and resumen_estado is distinct from 'vacio' and json_encuesta is not null
805
+ order by enc `, [OPERATIVO]).fetchAll();
806
+ var procedureGuardar = be.procedure.caso_guardar;
807
+ if (procedureGuardar.definedIn != 'dmencu') {
808
+ throw new Error('hay que sobreescribir caso_guardar');
809
+ }
810
+ return Promise.all(resultJson.rows.map(function (row) {
811
+ return __awaiter(this, void 0, void 0, function* () {
812
+ let resultado = `id caso ${row.id_caso}: `;
813
+ try {
814
+ yield be.inTransaction(null, function (_client) {
815
+ return __awaiter(this, void 0, void 0, function* () {
816
+ resultado += yield procedureGuardar.coreFunction(context, row);
817
+ });
818
+ });
819
+ }
820
+ catch (err) {
821
+ var error = (0, cast_error_1.expected)(err);
822
+ let errMessage = resultado + "json2ua error. " + error.message;
823
+ resultado = errMessage;
824
+ console.error(errMessage, error);
825
+ }
826
+ if (resultado.includes('ok')) {
827
+ var { datos_caso, id_caso, operativo } = yield be.procedure.caso_traer.coreFunction(context, { operativo: row.operativo, id_caso: row.id_caso });
828
+ var verQueGrabo = { datos_caso, id_caso, operativo };
829
+ try {
830
+ discrepances.showAndThrow(verQueGrabo, row);
831
+ }
832
+ catch (err) {
833
+ console.error(verQueGrabo, row, (0, cast_error_1.expected)(err));
834
+ }
835
+ }
836
+ return resultado;
837
+ });
838
+ })).catch(function (err) {
839
+ throw err;
840
+ }).then(function (result) {
841
+ return result;
842
+ });
843
+ });
844
+ }
845
+ },
846
+ {
847
+ action: 'dm_forpkraiz_cargar',
848
+ parameters: [
849
+ { name: 'operativo', typeName: 'text' },
850
+ { name: 'pk_raiz_value', typeName: 'text' },
851
+ { name: 'tarea', typeName: 'text', references: "tareas" },
852
+ ],
853
+ coreFunction: function (context, parameters) {
854
+ return __awaiter(this, void 0, void 0, function* () {
855
+ var _a, _b, _c, _d;
856
+ const be = context.be;
857
+ const { operativo, pk_raiz_value, tarea } = parameters;
858
+ const { permite_borrar_ua: tareaPermiteBorrarUA, main_form } = (yield context.client.query(`
859
+ select permite_borrar_ua, main_form
860
+ from tareas
861
+ where operativo= $1 and tarea=$2
862
+ `, [operativo, tarea]).fetchUniqueRow()).row;
863
+ const { unidad_analisis } = (yield getUAPrincipal(context.client, parameters.operativo));
864
+ const condviv = ` t.operativo= $1 and t.enc =$2`;
865
+ const usuarioPuedeProcesarEncuestas = ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.procesar) || false;
866
+ const soloLectura = (yield context.client.query(`
867
+ select count(*)
868
+ from tareas_tem join tem using(operativo, enc) join estados using (operativo, estado) --pk estado y tem verificada
869
+ where operativo= $1 and enc = $2 and (
870
+ cargado_dm is not null or
871
+ not permite_editar_encuesta and asignado <> ${context.be.db.quoteLiteral(context.user.idper)} or
872
+ tarea = tarea_actual and tarea_actual = 'proc' and $3 or
873
+ tarea = tarea_actual and tarea_actual = 'proc' and estado = 'V'
874
+ )`, [operativo, pk_raiz_value, !usuarioPuedeProcesarEncuestas]).fetchUniqueValue()).value > 0;
875
+ var permiteGenerarMuestra = yield getOperativoPermiteGenerarMuestra(context.client, operativo);
876
+ var { row } = yield context.client.query(getHdrQuery(condviv, context, unidad_analisis, permiteGenerarMuestra, context.user.idper), [operativo, pk_raiz_value]).fetchUniqueRow();
877
+ row.informacionHdr[pk_raiz_value].tarea = {
878
+ tarea,
879
+ main_form
880
+ };
881
+ return Object.assign(Object.assign({}, row), { operativo,
882
+ soloLectura, idper: context.user.idper, cargas: likeAr.createIndex(cargasHdrConFechaDmy(row.cargas), 'carga'), timestampEstructura: be.caches.timestampEstructura, permiteBorrarElementosUA: !!(tareaPermiteBorrarUA && (0, app_dmencu_1.getModoByPolicy)(be) === 'GABINETE' && ((_d = (_c = context.puede) === null || _c === void 0 ? void 0 : _c.encuestas) === null || _d === void 0 ? void 0 : _d.borrar_ua)) });
883
+ });
884
+ }
885
+ },
886
+ {
887
+ action: 'dm_forpkraiz_descargar',
888
+ parameters: [
889
+ { name: 'operativo', typeName: 'text' },
890
+ { name: 'persistentes', typeName: 'jsonb' },
891
+ ],
892
+ coreFunction: function (context, parameters) {
893
+ return __awaiter(this, void 0, void 0, function* () {
894
+ var be = context.be;
895
+ var { operativo, persistentes } = parameters;
896
+ const UA_PRINCIPAL = (yield getUAPrincipal(context.client, operativo)).unidad_analisis;
897
+ var procedureGuardar = be.procedure.caso_guardar;
898
+ const respuestas = persistentes.respuestas[UA_PRINCIPAL] || {};
899
+ for (const idEnc in respuestas) {
900
+ const respuestasUAPrincipal = respuestas[idEnc];
901
+ if (respuestasUAPrincipal.s1a1_obs == '!prueba de error al grabar!') {
902
+ throw new Error('DIO PRUEBA DE ERROR AL GRABAR');
903
+ }
904
+ yield (0, exports.guardarEncuestaEnTem)(context, operativo, idEnc, respuestasUAPrincipal, persistentes.informacionHdr[idEnc].tarea.tarea);
905
+ yield registrarPaseTabla(context, operativo, idEnc, respuestasUAPrincipal);
906
+ }
907
+ return 'ok';
908
+ });
909
+ }
910
+ },
911
+ {
912
+ action: 'dm_sincronizar',
913
+ parameters: [
914
+ { name: 'persistentes', typeName: 'jsonb' },
915
+ { name: 'modo_dm', typeName: 'text' },
916
+ { name: 'cambia_modo_dm', typeName: 'boolean' },
917
+ { name: 'idper_logueado_tablet', typeName: 'text' },
918
+ ],
919
+ unlogged: true,
920
+ coreFunction: function (context, parameters) {
921
+ return __awaiter(this, void 0, void 0, function* () {
922
+ const OPERATIVO = yield (0, exports.getOperativoActual)(context);
923
+ const permiteGenerarMuestra = yield getOperativoPermiteGenerarMuestra(context.client, OPERATIVO);
924
+ if (!permiteGenerarMuestra && parameters.cambia_modo_dm) {
925
+ throw Error('No es posible cambiar de modo en este operativo');
926
+ }
927
+ var be = context.be;
928
+ var { persistentes, modo_dm, cambia_modo_dm, idper_logueado_tablet } = parameters;
929
+ const usernameLogueadoTablet = (yield context.client.query(`select usuario from usuarios where idper = $1`, [idper_logueado_tablet]).fetchUniqueValue()).value;
930
+ var token = (persistentes === null || persistentes === void 0 ? void 0 : persistentes.token) || (yield be.procedure.token_get.coreFunction(context, {
931
+ useragent: context.session.req.useragent,
932
+ username: usernameLogueadoTablet
933
+ })).token;
934
+ const num_sincro = (yield context.client.query(`
935
+ INSERT INTO sincronizaciones (token, usuario, datos)
936
+ VALUES ($1,$2,$3)
937
+ RETURNING sincro
938
+ `, [token, usernameLogueadoTablet, persistentes]).fetchUniqueValue()).value;
939
+ var condviv = `
940
+ tt.operativo= $1
941
+ and asignado = $2
942
+ and tt.operacion='cargar'
943
+ and (tt.cargado_dm is null or tt.cargado_dm = ${context.be.db.quoteLiteral(token)})
944
+ `;
945
+ const { unidad_analisis: UA_PRINCIPAL, pk_agregada } = (yield getUAPrincipal(context.client, OPERATIVO));
946
+ if (persistentes) {
947
+ for (let idEnc in persistentes.respuestas[UA_PRINCIPAL]) {
948
+ let respuestasUAPrincipal = persistentes.respuestas[UA_PRINCIPAL][idEnc];
949
+ //TODO AL PARECER ESTÁ RESUELTO, LO DEJO POR LAS DUDAS
950
+ if (Object.keys(respuestasUAPrincipal).length > 0) {
951
+ let carga = persistentes.cargas[persistentes.informacionHdr[idEnc].tem.carga];
952
+ var tarea = persistentes.informacionHdr[idEnc].tarea.tarea;
953
+ const cargaTareasAreas = (yield context.client.query(`select recepcionista
954
+ from tareas_areas
955
+ where operativo= $1 and tarea = $2 and area = $3 --pk verificada
956
+ `, [OPERATIVO, tarea, carga.carga]).fetchUniqueValue()).value;
957
+ if (!cargaTareasAreas && !carga.recepcionista) {
958
+ throw Error(`no se definió un recepcionista para el operativo ${OPERATIVO}, tarea ${tarea}, área ${carga.carga}, por favor comuniquesé con GABINETE para que carguen un recepcionista`);
959
+ }
960
+ if (Number(idEnc) < 0) {
961
+ // idEnc es la clave (texto) de persistentes.respuestas; las funciones que siguen lo reciben como texto
962
+ idEnc = String(yield persistirEncuestaAutogeneradaEnDM(context, OPERATIVO, carga.carga, idEnc, token, respuestasUAPrincipal, carga.recepcionista || cargaTareasAreas, persistentes.idper, modo_dm, cambia_modo_dm));
963
+ }
964
+ var puedoGuardarEnTEM = true;
965
+ var consultaTareasTem = consultaUpdateTareasTemPorDescarga({
966
+ operativo: OPERATIVO, idEnc, tarea, token, respuestasUAPrincipal,
967
+ pasaADescargar: cambia_modo_dm || persistentes.idper != idper_logueado_tablet
968
+ });
969
+ var queryTareasTem = yield context.client.query(consultaTareasTem.sql, consultaTareasTem.params).fetchOneRowIfExists();
970
+ puedoGuardarEnTEM = queryTareasTem.rowCount == 1;
971
+ if (puedoGuardarEnTEM) {
972
+ yield (0, exports.guardarEncuestaEnTem)(context, OPERATIVO, idEnc, respuestasUAPrincipal, tarea);
973
+ yield registrarPaseTabla(context, OPERATIVO, idEnc, respuestasUAPrincipal);
974
+ }
975
+ else {
976
+ yield fs_1.promises.appendFile('local-recibido-sin-token.txt', JSON.stringify({ now: new Date(), idper: persistentes.idper, idCaso: idEnc, [pk_agregada]: respuestasUAPrincipal }) + '\n\n', 'utf8');
977
+ }
978
+ }
979
+ }
980
+ }
981
+ var { row } = yield context.client.query(getHdrQuery(condviv, context, UA_PRINCIPAL, permiteGenerarMuestra, idper_logueado_tablet), [OPERATIVO, idper_logueado_tablet]).fetchUniqueRow();
982
+ yield context.client.query(`update tareas_tem tt
983
+ set estado = $4, cargado_dm=$3::text
984
+ where ${condviv}
985
+ returning enc`, [OPERATIVO, idper_logueado_tablet, token, ESTADO_POSTERIOR_CARGA]).fetchAll();
986
+ return Object.assign(Object.assign({}, row), { operativo: OPERATIVO, soloLectura: false, token,
987
+ num_sincro, idper: idper_logueado_tablet, cargas: likeAr.createIndex(cargasHdrConFechaDmy(row.cargas).map(carga => (Object.assign(Object.assign({}, carga), { estado_carga: 'relevamiento' }))), 'carga') });
988
+ });
989
+ }
990
+ },
991
+ {
992
+ action: 'dm_backup',
993
+ parameters: [
994
+ { name: 'token', typeName: 'text' },
995
+ { name: 'tem', typeName: 'jsonb' },
996
+ { name: 'modo_dm', typeName: 'text' },
997
+ ],
998
+ unlogged: true,
999
+ coreFunction: function (context, parameters) {
1000
+ return __awaiter(this, void 0, void 0, function* () {
1001
+ var { be, client } = context;
1002
+ const OPERATIVO = yield (0, exports.getOperativoActual)(context);
1003
+ var num_sincro = 0;
1004
+ var token = parameters.token;
1005
+ if (token == null) {
1006
+ return { ok: 'ok:N/T' };
1007
+ }
1008
+ else {
1009
+ var { rowCount } = yield client.query(`select 1 from tokens where token = $1`, [token]).fetchOneRowIfExists();
1010
+ if (!rowCount) {
1011
+ return { ok: 'ok:N/T' };
1012
+ }
1013
+ }
1014
+ var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, OPERATIVO));
1015
+ if (parameters.tem) {
1016
+ for (let backup of likeAr(parameters.tem).array()) {
1017
+ let area = backup.carga.carga;
1018
+ let respuestasRaiz = backup.respuestasRaiz;
1019
+ let idEncDM = backup.forPkRaiz[pk_agregada].toString();
1020
+ let recepcionista = backup.carga.recepcionista;
1021
+ let asignado = backup.idper;
1022
+ if (Number(idEncDM) < 0) {
1023
+ yield persistirEncuestaAutogeneradaEnDM(context, OPERATIVO, area, idEncDM, token, respuestasRaiz, recepcionista, asignado, parameters.modo_dm, false);
1024
+ }
1025
+ else {
1026
+ let result = yield context.client.query(`update tem
1027
+ set json_backup = $3, fecha_backup = current_timestamp
1028
+ where operativo= $1 and enc = $2 and json_backup is distinct from $4
1029
+ returning 'ok'`, [OPERATIVO, idEncDM, respuestasRaiz, respuestasRaiz]).fetchOneRowIfExists();
1030
+ }
1031
+ }
1032
+ }
1033
+ return {
1034
+ ok: 'ok'
1035
+ };
1036
+ });
1037
+ }
1038
+ },
1039
+ {
1040
+ action: 'consistir_vivienda',
1041
+ parameters: [
1042
+ { name: 'operativo', references: 'operativos', typeName: 'text' },
1043
+ { name: 'caso', typeName: 'text' },
1044
+ ],
1045
+ coreFunction: function (context, parameters) {
1046
+ return __awaiter(this, void 0, void 0, function* () {
1047
+ var { be, client } = context;
1048
+ let param_proc = {
1049
+ operativo: parameters.operativo,
1050
+ id_caso: parameters.caso
1051
+ };
1052
+ let errMessage = null;
1053
+ let resultado = null;
1054
+ try {
1055
+ resultado = yield be.procedure.consistir_encuesta.coreFunction(context, param_proc);
1056
+ }
1057
+ catch (err) {
1058
+ var error = (0, cast_error_1.unexpected)(err);
1059
+ errMessage = " consistir_caso. " + error.message;
1060
+ console.error(errMessage, error);
1061
+ }
1062
+ console.log('****** consistir_caso resultado:', resultado);
1063
+ return {
1064
+ ok: 'ok'
1065
+ };
1066
+ });
1067
+ }
1068
+ },
1069
+ {
1070
+ action: 'dm_rescatar',
1071
+ parameters: [
1072
+ { name: 'localStorageItem', typeName: 'jsonb' },
1073
+ { name: 'localStorageItemKey', typeName: 'text' },
1074
+ ],
1075
+ unlogged: true,
1076
+ coreFunction: function (context, params) {
1077
+ return __awaiter(this, void 0, void 0, function* () {
1078
+ var { localStorageItemKey, localStorageItem } = params;
1079
+ try {
1080
+ console.log(localStorageItem);
1081
+ yield fs_1.promises.appendFile('local-rescate.txt', JSON.stringify({ now: new Date(), user: context.username, itemKey: localStorageItemKey, itemData: localStorageItem }) + '\n\n', 'utf8');
1082
+ return 'ok';
1083
+ }
1084
+ catch (err) {
1085
+ console.error('ERROR', (0, cast_error_1.expected)(err));
1086
+ throw err;
1087
+ }
1088
+ });
1089
+ }
1090
+ },
1091
+ {
1092
+ action: 'operativo_get',
1093
+ parameters: [],
1094
+ unlogged: true,
1095
+ coreFunction: function (context, _parameters) {
1096
+ return __awaiter(this, void 0, void 0, function* () {
1097
+ return (0, exports.getOperativoActual)(context);
1098
+ });
1099
+ }
1100
+ },
1101
+ {
1102
+ action: 'get_random_free_case',
1103
+ parameters: [{ name: 'operativo', typeName: 'text' }],
1104
+ coreFunction: function (context, params) {
1105
+ return __awaiter(this, void 0, void 0, function* () {
1106
+ const minsToExpire = 30;
1107
+ const minsSinceBloqued = `date_part('min', age(current_timestamp, fecha_bloqueo))`;
1108
+ const enc = yield context.client.query(`select enc from tem where operativo=$1 and (libre or ${minsSinceBloqued} > ${minsToExpire}) limit 1;`, [params.operativo]).fetchUniqueValue();
1109
+ yield context.client.query(`UPDATE tem set libre = false, fecha_bloqueo=current_timestamp where operativo=$1 and enc=$2`, [params.operativo, enc.value]).execute();
1110
+ return enc.value;
1111
+ });
1112
+ }
1113
+ },
1114
+ {
1115
+ action: 'muestra_generar',
1116
+ parameters: [
1117
+ { name: 'operativo', typeName: 'text', references: "operativos" },
1118
+ { name: 'area', typeName: 'integer', references: "areas" },
1119
+ { name: 'dominio', typeName: 'integer', defaultValue: 3 },
1120
+ { name: 'cant_encuestas', typeName: 'integer' },
1121
+ { name: 'tarea_actual', typeName: 'text', references: 'tareas' },
1122
+ ],
1123
+ coreFunction: function (context, params) {
1124
+ return __awaiter(this, void 0, void 0, function* () {
1125
+ const be = context.be;
1126
+ var permiteGenerarMuestra = yield getOperativoPermiteGenerarMuestra(context.client, params.operativo);
1127
+ if (permiteGenerarMuestra) {
1128
+ let totalActual = (yield context.client.query(`select count(*) as total
1129
+ from tem
1130
+ where operativo= $1 and area = $2`, [params.operativo, params.area]).fetchUniqueValue()).value;
1131
+ for (let i = 1; i < params.cant_encuestas - totalActual; i++) {
1132
+ const enc = yield generarNuevoIdEnc(context, params.operativo, params.area, maxAEncPorArea);
1133
+ yield generarEncuestaTem(context, params.operativo, enc, params.area, params.dominio, params.tarea_actual);
1134
+ }
1135
+ yield generarTareasTemFaltantes(context, params.operativo);
1136
+ return 'ok';
1137
+ }
1138
+ else {
1139
+ throw Error("el operativo no permite generar muestra");
1140
+ }
1141
+ });
1142
+ }
1143
+ },
1144
+ {
1145
+ action: 'muestra_agregar',
1146
+ parameters: [
1147
+ { name: 'operativo', typeName: 'text', references: "operativos" },
1148
+ { name: 'area', typeName: 'integer', references: "areas" },
1149
+ { name: 'dominio', typeName: 'integer', defaultValue: 3 },
1150
+ { name: 'cant_encuestas', typeName: 'integer' },
1151
+ { name: 'tarea_actual', typeName: 'text', references: 'tareas' },
1152
+ ],
1153
+ coreFunction: function (context, params) {
1154
+ return __awaiter(this, void 0, void 0, function* () {
1155
+ const be = context.be;
1156
+ var permiteGenerarMuestra = yield getOperativoPermiteGenerarMuestra(context.client, params.operativo);
1157
+ if (permiteGenerarMuestra) {
1158
+ for (let i = 1; i <= params.cant_encuestas; i++) {
1159
+ const enc = yield generarNuevoIdEnc(context, params.operativo, params.area, maxAEncPorArea);
1160
+ yield generarEncuestaTem(context, params.operativo, enc, params.area, params.dominio, params.tarea_actual);
1161
+ }
1162
+ yield generarTareasTemFaltantes(context, params.operativo);
1163
+ return 'ok';
1164
+ }
1165
+ else {
1166
+ throw Error("el operativo no permite generar muestra");
1167
+ }
1168
+ });
1169
+ }
1170
+ },
1171
+ {
1172
+ action: 'encuesta_blanquear_previsualizar',
1173
+ parameters: [
1174
+ { name: 'operativo', typeName: 'text', references: "operativos" },
1175
+ { name: 'enc', typeName: 'text' },
1176
+ ],
1177
+ roles: ['coor_proc', 'coor_campo', 'admin'],
1178
+ resultOk: 'mostrar_encuesta_a_blanquear_contenido',
1179
+ coreFunction: function (context, params) {
1180
+ return __awaiter(this, void 0, void 0, function* () {
1181
+ return yield buscarEncuestaEnTem(context, params);
1182
+ });
1183
+ }
1184
+ },
1185
+ {
1186
+ action: 'encuesta_blanquear',
1187
+ parameters: [
1188
+ { name: 'operativo', typeName: 'text', references: "operativos" },
1189
+ { name: 'enc', typeName: 'text' },
1190
+ ],
1191
+ roles: ['coor_proc', 'subcoor_campo', 'coor_campo', 'admin'],
1192
+ coreFunction: function (context, params) {
1193
+ return __awaiter(this, void 0, void 0, function* () {
1194
+ var be = context.be;
1195
+ var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, params.operativo));
1196
+ yield context.client.query(`delete
1197
+ from ${be.db.quoteIdent(unidad_analisis)}
1198
+ where operativo=$1 and ${be.db.quoteIdent(pk_agregada)} = $2
1199
+ `, [params.operativo, params.enc]).execute();
1200
+ //paso a encu para guardar en historial
1201
+ yield context.client.query(`
1202
+ update tem
1203
+ set
1204
+ tarea_actual = 'encu'
1205
+ where operativo = $1 and enc = $2 --pk verificada
1206
+ returning *
1207
+ `, [params.operativo, params.enc]).fetchUniqueRow();
1208
+ yield context.client.query(`
1209
+ delete
1210
+ from tareas_tem
1211
+ where operativo = $1 and enc = $2
1212
+ `, [params.operativo, params.enc]).execute();
1213
+ yield generarTareasTemFaltantes(context, params.operativo);
1214
+ //reseteo tem (no se guarda historial porque tarea_actual es null)
1215
+ //guardo backup por las dudas
1216
+ yield context.client.query(`
1217
+ update tem
1218
+ set
1219
+ json_backup = json_encuesta, json_encuesta = null, tarea_actual = null,
1220
+ fecha_modif_encuesta = null, fecha_backup = current_timestamp, modificado = null,
1221
+ resumen_estado = null, resumen_estado_sup = null, supervision_dirigida = null,
1222
+ pase_tabla = null, rea = null, norea = null, rea_sup = null, norea_sup = null
1223
+ where operativo = $1 and enc = $2 --pk verificada
1224
+ returning *
1225
+ `, [params.operativo, params.enc]).fetchUniqueRow();
1226
+ yield context.client.query(`
1227
+ delete
1228
+ from inconsistencias
1229
+ where operativo = $1 and ${be.db.quoteIdent(pk_agregada)} = $2
1230
+ `, [params.operativo, params.enc]).execute();
1231
+ yield context.client.query(`
1232
+ delete
1233
+ from in_con_var
1234
+ where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(pk_agregada)} = $2
1235
+ `, [params.operativo, params.enc]).execute();
1236
+ yield context.client.query(`
1237
+ delete
1238
+ from inconsistencias_ultimas
1239
+ where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(pk_agregada)} = $2
1240
+ `, [params.operativo, params.enc]).execute();
1241
+ return `la encuesta ${params.enc} se blanqueó correctamente`;
1242
+ });
1243
+ }
1244
+ },
1245
+ {
1246
+ action: 'encuesta_borrar_previsualizar',
1247
+ parameters: [
1248
+ { name: 'operativo', typeName: 'text', references: "operativos" },
1249
+ { name: 'enc', typeName: 'text' },
1250
+ ],
1251
+ roles: ['coor_proc', 'subcoor_campo', 'coor_campo', 'admin'],
1252
+ resultOk: 'mostrar_encuesta_a_borrar',
1253
+ coreFunction: function (context, params) {
1254
+ return __awaiter(this, void 0, void 0, function* () {
1255
+ return yield buscarEncuestaEnTem(context, params);
1256
+ });
1257
+ }
1258
+ },
1259
+ {
1260
+ action: 'encuesta_borrar',
1261
+ parameters: [
1262
+ { name: 'operativo', typeName: 'text', references: "operativos" },
1263
+ { name: 'enc', typeName: 'text' },
1264
+ ],
1265
+ roles: ['coor_proc', 'subcoor_campo', 'coor_campo', 'admin'],
1266
+ coreFunction: function (context, params) {
1267
+ return __awaiter(this, void 0, void 0, function* () {
1268
+ var be = context.be;
1269
+ var permite_generar_muestra = yield getOperativoPermiteGenerarMuestra(context.client, params.operativo);
1270
+ if (permite_generar_muestra) {
1271
+ var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, params.operativo));
1272
+ const { casoTem } = yield buscarEncuestaEnTem(context, params);
1273
+ yield context.client.query(`
1274
+ insert into
1275
+ tem_borradas (operativo, enc, cuando, area, cluster, dominio, tarea_actual, json_encuesta, token_autogenerado_dm, enc_autogenerado_dm, enc_autogenerado_dm_capa, proie)
1276
+ values ($1,$2,current_timestamp,$3,$4,$5,$6,$7,$8,$9,$10,$11)
1277
+ returning *
1278
+ `, [
1279
+ casoTem.operativo,
1280
+ casoTem.enc,
1281
+ casoTem.area,
1282
+ casoTem.cluster,
1283
+ casoTem.dominio,
1284
+ casoTem.tarea_actual,
1285
+ casoTem.json_encuesta,
1286
+ casoTem.token_autogenerado_dm,
1287
+ casoTem.enc_autogenerado_dm,
1288
+ casoTem.enc_autogenerado_dm_capa,
1289
+ casoTem.proie
1290
+ ]).fetchUniqueRow();
1291
+ yield context.client.query(`delete
1292
+ from ${be.db.quoteIdent(unidad_analisis)}
1293
+ where operativo=$1 and ${be.db.quoteIdent(pk_agregada)} = $2
1294
+ `, [params.operativo, params.enc]).execute();
1295
+ yield context.client.query(`
1296
+ delete
1297
+ from tareas_tem
1298
+ where operativo = $1 and enc = $2
1299
+ returning *
1300
+ `, [params.operativo, params.enc]).fetchAll();
1301
+ yield context.client.query(`
1302
+ delete
1303
+ from tem
1304
+ where operativo = $1 and enc = $2 --pk verificada
1305
+ returning *
1306
+ `, [params.operativo, params.enc]).fetchUniqueRow();
1307
+ yield context.client.query(`
1308
+ delete
1309
+ from historial_tem
1310
+ where operativo = $1 and enc = $2 --pk verificada
1311
+ `, [params.operativo, params.enc]).execute();
1312
+ yield context.client.query(`
1313
+ delete
1314
+ from inconsistencias
1315
+ where operativo = $1 and ${be.db.quoteIdent(pk_agregada)} = $2
1316
+ `, [params.operativo, params.enc]).execute();
1317
+ yield context.client.query(`
1318
+ delete
1319
+ from in_con_var
1320
+ where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(pk_agregada)} = $2
1321
+ `, [params.operativo, params.enc]).execute();
1322
+ yield context.client.query(`
1323
+ delete
1324
+ from inconsistencias_ultimas
1325
+ where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(pk_agregada)} = $2
1326
+ `, [params.operativo, params.enc]).execute();
1327
+ return `la encuesta ${params.enc} se borró correctamente`;
1328
+ }
1329
+ else {
1330
+ throw Error('no se puede borrar la encuesta porque el operativo tiene muestra estática');
1331
+ }
1332
+ });
1333
+ }
1334
+ },
1335
+ {
1336
+ action: 'encuestas_capacitacion_borrar',
1337
+ parameters: [
1338
+ { name: 'operativo', typeName: 'text', references: "operativos" }
1339
+ ],
1340
+ roles: ['admin'],
1341
+ coreFunction: function (context, params) {
1342
+ return __awaiter(this, void 0, void 0, function* () {
1343
+ var be = context.be;
1344
+ var permite_generar_muestra = yield getOperativoPermiteGenerarMuestra(context.client, params.operativo);
1345
+ if (permite_generar_muestra) {
1346
+ const encsABorrar = (yield context.client.query(`select *
1347
+ from tem
1348
+ where operativo=$1 and enc_autogenerado_dm_capa is not null
1349
+ `, [params.operativo]).fetchAll()).rows;
1350
+ for (let row of encsABorrar) {
1351
+ yield be.procedure.encuesta_borrar.coreFunction(context, { operativo: params.operativo, enc: row.enc });
1352
+ }
1353
+ return 'se borraron las encuestas de capacitación';
1354
+ }
1355
+ else {
1356
+ throw Error('no se puede borrar la encuesta porque el operativo tiene muestra estática');
1357
+ }
1358
+ });
1359
+ }
1360
+ },
1361
+ {
1362
+ action: 'accion_tareas_tem_ejecutar',
1363
+ parameters: [
1364
+ { name: 'operativo', typeName: 'text' },
1365
+ { name: 'tarea', typeName: 'text' },
1366
+ { name: 'enc', typeName: 'text' },
1367
+ { name: 'condicion', typeName: 'text' },
1368
+ { name: 'accion', typeName: 'jsonb' },
1369
+ ],
1370
+ coreFunction: function (context, params) {
1371
+ return __awaiter(this, void 0, void 0, function* () {
1372
+ var be = context.be;
1373
+ var accion = params.accion;
1374
+ var cumple = (yield context.client.query(`select accion_cumple_condicion($5, $6, $7, $8, (
1375
+ select condicion
1376
+ from estados_acciones
1377
+ where operativo = $1 and estado = $2 and eaccion = $3 and estado_destino = $4
1378
+ )
1379
+ )`, [
1380
+ params.operativo,
1381
+ accion.estado,
1382
+ accion.eaccion,
1383
+ accion.estado_destino,
1384
+ params.operativo,
1385
+ accion.estado,
1386
+ params.enc,
1387
+ accion.eaccion,
1388
+ ]).fetchUniqueValue()).value;
1389
+ if (!cumple) {
1390
+ throw Error(`No se pudo ejecutar la acción, no se cumple la condición "${params.condicion}" o bien el estado está desactualizado, refresque la grilla.`);
1391
+ }
1392
+ var result = yield context.client.query(`
1393
+ UPDATE tareas_tem
1394
+ set estado = $4
1395
+ where operativo=$1
1396
+ and enc=$2
1397
+ and tarea = $3
1398
+ returning *`, [
1399
+ params.operativo,
1400
+ params.enc,
1401
+ params.tarea,
1402
+ accion.estado_destino
1403
+ ]).fetchUniqueRow();
1404
+ if (accion.nombre_procedure) {
1405
+ if (be.procedure[accion.nombre_procedure]) {
1406
+ yield be.procedure[accion.nombre_procedure].coreFunction(context, params);
1407
+ }
1408
+ else {
1409
+ throw Error(`No existe el procedure "${accion.nombre_procedure}" definido en la tabla "estados_acciones" para el
1410
+ operativo: ${accion.operativo}, estado: ${accion.estado}, eaccion: ${accion.eaccion}.`);
1411
+ }
1412
+ }
1413
+ // BUSCO PASE DE TAREA
1414
+ var tareaSiguiente = (yield context.client.query(`select *
1415
+ from tareas_proximas
1416
+ where
1417
+ operativo = $1 and
1418
+ tarea = $2 and estado = $3 and
1419
+ tarea_cumple_condicion($4, $5, $6, $7, condicion)
1420
+ order by orden
1421
+ limit 1`, [
1422
+ params.operativo,
1423
+ params.tarea,
1424
+ accion.estado_destino,
1425
+ params.operativo,
1426
+ params.tarea,
1427
+ accion.estado_destino,
1428
+ params.enc
1429
+ ]).fetchOneRowIfExists()).row;
1430
+ if (tareaSiguiente) {
1431
+ yield context.client.query(`
1432
+ update tem
1433
+ set tarea_actual = $3
1434
+ where operativo = $1 and enc = $2
1435
+ returning *`, [params.operativo, params.enc, tareaSiguiente.tarea_destino]).fetchUniqueRow();
1436
+ let autoAsignado = tareaSiguiente.registra_recepcionista ? context.user.idper : null;
1437
+ let q = context.be.db.quoteLiteral;
1438
+ yield context.client.query(`
1439
+ update tareas_tem
1440
+ set ts_entrada = current_timestamp, adelantar = null, estado = $4
1441
+ ${autoAsignado ?
1442
+ ", recepcionista=" + q(autoAsignado)
1443
+ : ""}
1444
+ where operativo = $1 and enc = $2 and tarea = $3
1445
+ returning *`, [params.operativo, params.enc, tareaSiguiente.tarea_destino, tareaSiguiente.estado_destino]).fetchUniqueRow();
1446
+ if (tareaSiguiente.nombre_procedure) {
1447
+ yield be.procedure[tareaSiguiente.nombre_procedure].coreFunction(context, params);
1448
+ }
1449
+ }
1450
+ // FIN PASE DE TAREA
1451
+ return "ok";
1452
+ });
1453
+ }
1454
+ },
1455
+ {
1456
+ action: 'encuesta_carga_preparar',
1457
+ parameters: [
1458
+ { name: 'operativo', typeName: 'text' },
1459
+ { name: 'tarea', typeName: 'text' },
1460
+ { name: 'enc', typeName: 'text' },
1461
+ ],
1462
+ coreFunction: function (context, params) {
1463
+ return __awaiter(this, void 0, void 0, function* () {
1464
+ yield context.client.query(`
1465
+ UPDATE tareas_tem
1466
+ set operacion = $4
1467
+ where operativo=$1 and tarea= $2 and enc=$3
1468
+ returning *`, [params.operativo, params.tarea, params.enc, OPERACION_PREPARAR_CARGA])
1469
+ .fetchUniqueRow();
1470
+ return 'ok';
1471
+ });
1472
+ }
1473
+ },
1474
+ {
1475
+ action: 'encuesta_disponibilizar',
1476
+ parameters: [
1477
+ { name: 'operativo', typeName: 'text' },
1478
+ { name: 'tarea', typeName: 'text' },
1479
+ { name: 'enc', typeName: 'text' },
1480
+ ],
1481
+ coreFunction: function (context, params) {
1482
+ return __awaiter(this, void 0, void 0, function* () {
1483
+ yield context.client.query(`
1484
+ UPDATE tareas_tem
1485
+ set asignado = null
1486
+ where operativo=$1 and tarea= $2 and enc=$3
1487
+ returning *`, [params.operativo, params.tarea, params.enc])
1488
+ .fetchUniqueRow();
1489
+ return 'ok';
1490
+ });
1491
+ }
1492
+ },
1493
+ {
1494
+ action: 'encuesta_no_cargar',
1495
+ parameters: [
1496
+ { name: 'operativo', typeName: 'text' },
1497
+ { name: 'tarea', typeName: 'text' },
1498
+ { name: 'enc', typeName: 'text' },
1499
+ ],
1500
+ coreFunction: function (context, params) {
1501
+ return __awaiter(this, void 0, void 0, function* () {
1502
+ yield context.client.query(`
1503
+ UPDATE tareas_tem
1504
+ set operacion = null
1505
+ where operativo=$1 and tarea= $2 and enc=$3
1506
+ returning *`, [params.operativo, params.tarea, params.enc])
1507
+ .fetchUniqueRow();
1508
+ return 'ok';
1509
+ });
1510
+ }
1511
+ },
1512
+ {
1513
+ action: 'encuesta_descarga_preparar',
1514
+ parameters: [
1515
+ { name: 'operativo', typeName: 'text' },
1516
+ { name: 'tarea', typeName: 'text' },
1517
+ { name: 'enc', typeName: 'text' },
1518
+ ],
1519
+ coreFunction: function (context, params) {
1520
+ return __awaiter(this, void 0, void 0, function* () {
1521
+ yield context.client.query(`
1522
+ UPDATE tareas_tem
1523
+ set operacion = $4
1524
+ where operativo=$1 and tarea= $2 and enc=$3
1525
+ returning *`, [params.operativo, params.tarea, params.enc, OPERACION_PREPARAR_DESCARGA])
1526
+ .fetchUniqueRow();
1527
+ return 'ok';
1528
+ });
1529
+ }
1530
+ },
1531
+ {
1532
+ action: 'encuesta_no_descargar',
1533
+ parameters: [
1534
+ { name: 'operativo', typeName: 'text' },
1535
+ { name: 'tarea', typeName: 'text' },
1536
+ { name: 'enc', typeName: 'text' },
1537
+ ],
1538
+ coreFunction: function (context, params) {
1539
+ return __awaiter(this, void 0, void 0, function* () {
1540
+ yield context.client.query(`
1541
+ UPDATE tareas_tem
1542
+ set operacion = 'cargar'
1543
+ where operativo=$1 and tarea= $2 and enc=$3
1544
+ returning *`, [params.operativo, params.tarea, params.enc])
1545
+ .fetchUniqueRow();
1546
+ return 'ok';
1547
+ });
1548
+ }
1549
+ },
1550
+ {
1551
+ action: 'encuesta_analizar',
1552
+ parameters: [
1553
+ { name: 'operativo', typeName: 'text' },
1554
+ { name: 'tarea', typeName: 'text' },
1555
+ { name: 'enc', typeName: 'text' },
1556
+ ],
1557
+ coreFunction: function (context, params) {
1558
+ return __awaiter(this, void 0, void 0, function* () {
1559
+ var be = context.be;
1560
+ yield be.procedure.consistir_encuesta.coreFunction(context, { operativo: params.operativo, id_caso: params.enc });
1561
+ return 'ok';
1562
+ });
1563
+ }
1564
+ },
1565
+ {
1566
+ action: 'inconsistencias_encuesta_controlar',
1567
+ parameters: [
1568
+ { name: 'operativo', typeName: 'text' },
1569
+ { name: 'tarea', typeName: 'text' },
1570
+ { name: 'enc', typeName: 'text' },
1571
+ ],
1572
+ coreFunction: function (context, params) {
1573
+ return __awaiter(this, void 0, void 0, function* () {
1574
+ var cantidad = (yield context.client.query(`
1575
+ select count(*) as cumple
1576
+ from inconsistencias i
1577
+ join consistencias c using (operativo, consistencia)
1578
+ join momentos_consistencia mc using (operativo, momento)
1579
+ where
1580
+ operativo = $1 and
1581
+ vivienda = $2 and
1582
+ momento_consistencia_cumple_condicion(
1583
+ mc.operativo,
1584
+ i.vivienda,
1585
+ $3,
1586
+ (select condicion from momentos_consistencia where operativo = mc.operativo and momento = mc.momento)
1587
+ ) and
1588
+ i.justificacion is null`, [params.operativo, params.enc, context.username])
1589
+ .fetchUniqueValue()).value;
1590
+ if (cantidad) {
1591
+ throw Error(`no se puede verificar la tarea porque hay inconsistencias, por favor resuélvalas o justifíquelas en caso de ser necesario.`);
1592
+ }
1593
+ return 'ok';
1594
+ });
1595
+ }
1596
+ },
1597
+ {
1598
+ action: 'encuesta_verificar',
1599
+ parameters: [
1600
+ { name: 'operativo', typeName: 'text' },
1601
+ { name: 'tarea', typeName: 'text' },
1602
+ { name: 'enc', typeName: 'text' },
1603
+ ],
1604
+ coreFunction: function (context, params) {
1605
+ return __awaiter(this, void 0, void 0, function* () {
1606
+ var be = context.be;
1607
+ yield be.procedure.inconsistencias_encuesta_controlar.coreFunction(context, params);
1608
+ yield context.client.query(`
1609
+ UPDATE tareas_tem
1610
+ set verificado = '1'
1611
+ where operativo=$1 and tarea= $2 and enc=$3
1612
+ returning *`, [params.operativo, params.tarea, params.enc])
1613
+ .fetchUniqueRow();
1614
+ return 'ok';
1615
+ });
1616
+ }
1617
+ },
1618
+ {
1619
+ action: 'encuesta_no_verificar',
1620
+ parameters: [
1621
+ { name: 'operativo', typeName: 'text' },
1622
+ { name: 'tarea', typeName: 'text' },
1623
+ { name: 'enc', typeName: 'text' },
1624
+ ],
1625
+ coreFunction: function (context, params) {
1626
+ return __awaiter(this, void 0, void 0, function* () {
1627
+ yield context.client.query(`
1628
+ UPDATE tareas_tem
1629
+ set verificado = null
1630
+ where operativo=$1 and tarea= $2 and enc=$3
1631
+ returning *`, [params.operativo, params.tarea, params.enc])
1632
+ .fetchUniqueRow();
1633
+ return 'ok';
1634
+ });
1635
+ }
1636
+ },
1637
+ {
1638
+ action: 'encuesta_cerrar',
1639
+ parameters: [
1640
+ { name: 'operativo', typeName: 'text' },
1641
+ { name: 'tarea', typeName: 'text' },
1642
+ { name: 'enc', typeName: 'text' },
1643
+ ],
1644
+ coreFunction: function (context, params) {
1645
+ return __awaiter(this, void 0, void 0, function* () {
1646
+ yield context.client.query(`
1647
+ UPDATE tareas_tem
1648
+ set verificado = '1', asignado = $4
1649
+ where operativo=$1 and tarea= $2 and enc=$3
1650
+ returning *`, [params.operativo, params.tarea, params.enc, context.user.idper])
1651
+ .fetchUniqueRow();
1652
+ return 'ok';
1653
+ });
1654
+ }
1655
+ },
1656
+ {
1657
+ action: 'encuesta_no_cerrar',
1658
+ parameters: [
1659
+ { name: 'operativo', typeName: 'text' },
1660
+ { name: 'tarea', typeName: 'text' },
1661
+ { name: 'enc', typeName: 'text' },
1662
+ ],
1663
+ coreFunction: function (context, params) {
1664
+ return __awaiter(this, void 0, void 0, function* () {
1665
+ yield context.client.query(`
1666
+ UPDATE tareas_tem
1667
+ set verificado = null
1668
+ where operativo=$1 and tarea= $2 and enc=$3
1669
+ returning *`, [params.operativo, params.tarea, params.enc])
1670
+ .fetchUniqueRow();
1671
+ return 'ok';
1672
+ });
1673
+ }
1674
+ },
1675
+ {
1676
+ action: 'encuesta_supervisar_presencial',
1677
+ parameters: [
1678
+ { name: 'operativo', typeName: 'text' },
1679
+ { name: 'enc', typeName: 'text' },
1680
+ { name: 'tarea', typeName: 'text' },
1681
+ ],
1682
+ coreFunction: function (context, params) {
1683
+ return __awaiter(this, void 0, void 0, function* () {
1684
+ yield context.client.query(`
1685
+ UPDATE tem
1686
+ set tarea_actual = $3, supervision_dirigida = $4
1687
+ where operativo=$1 and enc=$2
1688
+ returning *`, [params.operativo, params.enc, 'supe', 1])
1689
+ .fetchUniqueRow();
1690
+ return 'ok';
1691
+ });
1692
+ }
1693
+ },
1694
+ {
1695
+ action: 'encuesta_supervisar_telefonica',
1696
+ parameters: [
1697
+ { name: 'operativo', typeName: 'text' },
1698
+ { name: 'enc', typeName: 'text' },
1699
+ { name: 'tarea', typeName: 'text' },
1700
+ ],
1701
+ coreFunction: function (context, params) {
1702
+ return __awaiter(this, void 0, void 0, function* () {
1703
+ yield context.client.query(`
1704
+ UPDATE tem
1705
+ set tarea_actual = $3, supervision_dirigida = $4
1706
+ where operativo=$1 and enc=$2
1707
+ returning *`, [params.operativo, params.enc, 'supe', 2])
1708
+ .fetchUniqueRow();
1709
+ return 'ok';
1710
+ });
1711
+ }
1712
+ },
1713
+ {
1714
+ action: 'encuesta_no_supervisar',
1715
+ parameters: [
1716
+ { name: 'operativo', typeName: 'text' },
1717
+ { name: 'enc', typeName: 'text' },
1718
+ { name: 'tarea', typeName: 'text' },
1719
+ ],
1720
+ coreFunction: function (context, params) {
1721
+ return __awaiter(this, void 0, void 0, function* () {
1722
+ yield context.client.query(`
1723
+ UPDATE tem
1724
+ set tarea_actual = $3, supervision_dirigida = null
1725
+ where operativo=$1 and enc=$2
1726
+ returning *`, [params.operativo, params.enc, 'finc'])
1727
+ .fetchUniqueRow();
1728
+ return 'ok';
1729
+ });
1730
+ }
1731
+ },
1732
+ {
1733
+ action: 'encuesta_pasar_a_anac',
1734
+ parameters: [
1735
+ { name: 'operativo', typeName: 'text' },
1736
+ { name: 'enc', typeName: 'text' },
1737
+ { name: 'tarea', typeName: 'text' },
1738
+ ],
1739
+ coreFunction: function (context, params) {
1740
+ return __awaiter(this, void 0, void 0, function* () {
1741
+ yield context.client.query(`
1742
+ UPDATE tareas_tem
1743
+ set estado = 'CC'
1744
+ where operativo=$1 and enc=$2 and tarea in ($3,$4) --quiero pasar las 2 tareas a CC
1745
+ `, [params.operativo, params.enc, 'anac', 'proc'])
1746
+ .execute();
1747
+ yield context.client.query(`
1748
+ UPDATE tem
1749
+ set tarea_actual = $3
1750
+ where operativo=$1 and enc=$2
1751
+ returning *`, [params.operativo, params.enc, 'anac'])
1752
+ .fetchUniqueRow();
1753
+ return 'ok';
1754
+ });
1755
+ }
1756
+ },
1757
+ {
1758
+ action: 'encuesta_no_pasar_a_anac',
1759
+ parameters: [
1760
+ { name: 'operativo', typeName: 'text' },
1761
+ { name: 'enc', typeName: 'text' },
1762
+ { name: 'tarea', typeName: 'text' },
1763
+ ],
1764
+ coreFunction: function (context, params) {
1765
+ return __awaiter(this, void 0, void 0, function* () {
1766
+ yield context.client.query(`
1767
+ UPDATE tareas_tem
1768
+ set estado = 'A'
1769
+ where operativo=$1 and enc=$2 and tarea= $3
1770
+ returning *`, [params.operativo, params.enc, 'proc'])
1771
+ .fetchUniqueRow();
1772
+ yield context.client.query(`
1773
+ UPDATE tareas_tem
1774
+ set estado = '0D'
1775
+ where operativo=$1 and enc=$2 and tarea= $3
1776
+ returning *`, [params.operativo, params.enc, 'anac'])
1777
+ .fetchUniqueRow();
1778
+ yield context.client.query(`
1779
+ UPDATE tem
1780
+ set tarea_actual = $3
1781
+ where operativo=$1 and enc=$2
1782
+ returning *`, [params.operativo, params.enc, 'proc'])
1783
+ .fetchUniqueRow();
1784
+ return 'ok';
1785
+ });
1786
+ }
1787
+ },
1788
+ {
1789
+ action: 'encuesta_devolver_proc_desde_anac',
1790
+ parameters: [
1791
+ { name: 'operativo', typeName: 'text' },
1792
+ { name: 'enc', typeName: 'text' },
1793
+ { name: 'tarea', typeName: 'text' },
1794
+ ],
1795
+ coreFunction: function (context, params) {
1796
+ return __awaiter(this, void 0, void 0, function* () {
1797
+ var be = context.be;
1798
+ yield be.procedure.encuesta_verificar.coreFunction(context, params);
1799
+ yield context.client.query(`
1800
+ UPDATE tareas_tem
1801
+ set estado = 'A'
1802
+ where operativo=$1 and enc=$2 and tarea= $3
1803
+ returning *`, [params.operativo, params.enc, 'proc'])
1804
+ .fetchUniqueRow();
1805
+ yield context.client.query(`
1806
+ UPDATE tem
1807
+ set tarea_actual = $3
1808
+ where operativo=$1 and enc=$2
1809
+ returning *`, [params.operativo, params.enc, 'proc'])
1810
+ .fetchUniqueRow();
1811
+ return 'ok';
1812
+ });
1813
+ }
1814
+ },
1815
+ {
1816
+ action: 'encuesta_no_devolver_proc_desde_anac',
1817
+ parameters: [
1818
+ { name: 'operativo', typeName: 'text' },
1819
+ { name: 'enc', typeName: 'text' },
1820
+ { name: 'tarea', typeName: 'text' },
1821
+ ],
1822
+ coreFunction: function (context, params) {
1823
+ return __awaiter(this, void 0, void 0, function* () {
1824
+ var be = context.be;
1825
+ yield context.client.query(`
1826
+ UPDATE tareas_tem
1827
+ set estado = 'CC'
1828
+ where operativo=$1 and enc=$2 and tarea in ($3,$4) --quiero pasar las 2 tareas a CC
1829
+ `, [params.operativo, params.enc, 'anac', 'proc'])
1830
+ .execute();
1831
+ yield be.procedure.encuesta_no_verificar.coreFunction(context, params);
1832
+ return 'ok';
1833
+ });
1834
+ }
1835
+ },
1836
+ {
1837
+ action: 'encuesta_recuperar_desde_anac',
1838
+ parameters: [
1839
+ { name: 'operativo', typeName: 'text' },
1840
+ { name: 'enc', typeName: 'text' },
1841
+ { name: 'tarea', typeName: 'text' },
1842
+ ],
1843
+ coreFunction: function (context, params) {
1844
+ return __awaiter(this, void 0, void 0, function* () {
1845
+ var be = context.be;
1846
+ var { operativo, enc, tarea } = params;
1847
+ yield be.procedure.encuesta_verificar.coreFunction(context, params);
1848
+ yield context.client.query(`
1849
+ update tem
1850
+ set tarea_actual = $3
1851
+ where operativo = $1 and enc = $2
1852
+ returning *`, [operativo, enc, 'recu'])
1853
+ .fetchUniqueRow();
1854
+ return 'ok';
1855
+ });
1856
+ }
1857
+ },
1858
+ {
1859
+ action: 'encuesta_no_recuperar_desde_anac',
1860
+ parameters: [
1861
+ { name: 'operativo', typeName: 'text' },
1862
+ { name: 'enc', typeName: 'text' },
1863
+ { name: 'tarea', typeName: 'text' },
1864
+ ],
1865
+ coreFunction: function (context, params) {
1866
+ return __awaiter(this, void 0, void 0, function* () {
1867
+ var be = context.be;
1868
+ var { operativo, enc, tarea } = params;
1869
+ yield context.client.query(`
1870
+ update tem
1871
+ set tarea_actual = $4
1872
+ where operativo = $1 and enc = $2 and tarea_actual = $3
1873
+ returning *`, [operativo, enc, 'recu', 'anac'])
1874
+ .fetchUniqueRow();
1875
+ yield be.procedure.encuesta_no_verificar.coreFunction(context, params);
1876
+ return 'ok';
1877
+ });
1878
+ }
1879
+ },
1880
+ {
1881
+ action: 'encuesta_forzar_tarea',
1882
+ parameters: [
1883
+ { name: 'operativo', typeName: 'text' },
1884
+ { name: 'enc', typeName: 'text' },
1885
+ { name: 'tarea_actual', typeName: 'text' },
1886
+ { name: 'tarea_nueva', typeName: 'text' },
1887
+ ],
1888
+ coreFunction: function (context, params) {
1889
+ return __awaiter(this, void 0, void 0, function* () {
1890
+ var { operativo, enc, tarea_actual, tarea_nueva } = params;
1891
+ yield context.client.query(`
1892
+ update tem
1893
+ set tarea_actual = $4
1894
+ where operativo = $1 and enc = $2 and tarea_actual = $3
1895
+ returning *`, [operativo, enc, tarea_actual, tarea_nueva])
1896
+ .fetchUniqueRow();
1897
+ yield context.client.query(`
1898
+ update tareas_tem
1899
+ set estado = 'V'
1900
+ where operativo = $1 and enc = $2 and tarea = $3
1901
+ returning *`, [operativo, enc, tarea_actual])
1902
+ .fetchUniqueRow();
1903
+ yield context.client.query(`
1904
+ update tareas_tem
1905
+ set estado = '0D'
1906
+ where operativo = $1 and enc = $2 and tarea = $3
1907
+ returning *`, [operativo, enc, tarea_nueva])
1908
+ .fetchUniqueRow();
1909
+ return 'ok';
1910
+ });
1911
+ }
1912
+ },
1913
+ {
1914
+ action: 'encuesta_habilitar_deshabilitar',
1915
+ parameters: [
1916
+ { name: 'operativo', typeName: 'text' },
1917
+ { name: 'enc', typeName: 'text' },
1918
+ ],
1919
+ coreFunction: function (context, params) {
1920
+ return __awaiter(this, void 0, void 0, function* () {
1921
+ yield context.client.query(`
1922
+ UPDATE tem
1923
+ set habilitada = not habilitada
1924
+ where operativo=$1 and enc=$2
1925
+ returning *`, [params.operativo, params.enc])
1926
+ .fetchUniqueRow();
1927
+ return 'ok';
1928
+ });
1929
+ }
1930
+ },
1931
+ {
1932
+ action: 'encuestas_procesamiento_pasar',
1933
+ parameters: [],
1934
+ coreFunction: function (context, _params) {
1935
+ return __awaiter(this, void 0, void 0, function* () {
1936
+ return yield pasarEncuestasAProie(context.client);
1937
+ });
1938
+ }
1939
+ },
1940
+ {
1941
+ action: 'intercambiar_encuestas',
1942
+ parameters: [
1943
+ { name: 'enc1', references: 'tem', typeName: 'text' },
1944
+ { name: 'cantHog1', typeName: 'integer' },
1945
+ { name: 'enc2', typeName: 'text' },
1946
+ { name: 'cantHog2', typeName: 'integer' },
1947
+ { name: 'paso', typeName: 'integer' },
1948
+ { name: 'confirma', typeName: 'boolean', defaultValue: false, label: 'Confirma intercambio de los datos entre las encuestas? ' },
1949
+ ],
1950
+ roles: ['coor_proc', 'procesamiento', 'admin'],
1951
+ progress: true,
1952
+ coreFunction: function (context, params) {
1953
+ return __awaiter(this, void 0, void 0, function* () {
1954
+ /**
1955
+ * Para controlar:
1956
+ * - que las hogares, personas, etc estén intercambiadas
1957
+ * * tanto en el json
1958
+ * * como en las TDs
1959
+ * - cosas que se calculan por la app? cuales? (resumen_estado, rea y norea)
1960
+ */
1961
+ if (!params.confirma) {
1962
+ throw new Error('No confirmó intercambio');
1963
+ }
1964
+ if (!params.enc1 || !params.enc2) {
1965
+ throw new Error('Error, Falta ingresar un numero de encuesta!');
1966
+ }
1967
+ if (params.enc1 == params.enc2) {
1968
+ throw new Error('Error, enc1 y enc2 deben ser distintos!');
1969
+ }
1970
+ if (!params.cantHog1) {
1971
+ throw new Error('Error, Cantidad de Hogares de enc1, no esta ingresado!');
1972
+ }
1973
+ if (!params.cantHog2) {
1974
+ throw new Error('Error, Cantidad de Hogares de enc2, no esta ingresado!');
1975
+ }
1976
+ // CONTROLAR QUE NINGUNA DE LAS 2 encuestas ESTE CARGADA, ABIERTA FALTA
1977
+ const OPERATIVO = yield (0, exports.getOperativoActual)(context);
1978
+ var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, OPERATIVO));
1979
+ const cant_hogs = (yield context.client.query(`
1980
+ select vivienda, count(*)nh from hogares where operativo=$1 and (vivienda=$2 or vivienda=$3)
1981
+ group by vivienda order by vivienda
1982
+ `, [OPERATIVO, params.enc1, params.enc2]).fetchAll()).rows;
1983
+ var param_nh = [params.cantHog1, params.cantHog2];
1984
+ cant_hogs.forEach((xe, i) => {
1985
+ if (param_nh[i] !== xe.nh) {
1986
+ const xmens = `Error, no coincide la cantidad de hogares de enc${i + 1}`;
1987
+ throw new Error(xmens);
1988
+ }
1989
+ ;
1990
+ });
1991
+ var regEnc = (yield context.client.query(`
1992
+ select enc, tarea_actual, json_encuesta from tem where operativo=$1 and (enc =$2 or enc=$3) order by enc
1993
+ `, [OPERATIVO, params.enc1, params.enc2]).fetchAll()).rows;
1994
+ if (regEnc.length != 2) {
1995
+ throw new Error('Error, No se encontraron 2 encuestas');
1996
+ }
1997
+ else {
1998
+ // limpia las TDs
1999
+ let [enc1, enc2] = [regEnc[0], regEnc[1]];
2000
+ if (params.paso == 1) {
2001
+ yield context.client.query(`delete from ${context.be.db.quoteIdent(unidad_analisis)} where operativo=$1 and (vivienda=$2 OR vivienda=$3)`, [OPERATIVO, enc1.enc, enc2.enc]).execute();
2002
+ }
2003
+ else if (params.paso == 2) {
2004
+ //simula guardado
2005
+ yield simularGuardadoDeEncuestaDesdeAppEscritorio(context, OPERATIVO, enc1.enc, enc1.tarea_actual, enc2.json_encuesta);
2006
+ yield simularGuardadoDeEncuestaDesdeAppEscritorio(context, OPERATIVO, enc2.enc, enc2.tarea_actual, enc1.json_encuesta);
2007
+ }
2008
+ }
2009
+ return (`Listo paso ${params.paso}. Intercambio realizado entre las encuestas ${params.enc1} y ${params.enc2}. Por favor consista la encuesta`);
2010
+ });
2011
+ }
2012
+ },
2013
+ {
2014
+ action: 'encuestador_dms_mostrar',
2015
+ parameters: [
2016
+ { name: 'operativo', typeName: 'text', references: "operativos" },
2017
+ { name: 'encuestador', typeName: 'text' },
2018
+ ],
2019
+ roles: ['coor_proc', 'coor_campo', 'admin'],
2020
+ resultOk: 'mostrar_encuestas_a_blanquear',
2021
+ coreFunction: function (context, params) {
2022
+ return __awaiter(this, void 0, void 0, function* () {
2023
+ var result = yield context.client.query(`
2024
+ select *
2025
+ from tareas_tem
2026
+ where operativo=$1 and asignado = $2 and cargado_dm is not null
2027
+ order by cargado_dm
2028
+ `, [params.operativo, params.encuestador])
2029
+ .fetchAll();
2030
+ if (result.rowCount == 0) {
2031
+ throw Error(`No se encontraron encuestas cargadas en un DM para el operativo ${params.operativo}, encuestador ${params.encuestador}`);
2032
+ }
2033
+ return { rows: result.rows, operativo: params.operativo };
2034
+ });
2035
+ }
2036
+ },
2037
+ {
2038
+ action: 'dm_blanquear',
2039
+ parameters: [
2040
+ { name: 'operativo', typeName: 'text', references: "operativos" },
2041
+ { name: 'token', typeName: 'text' },
2042
+ ],
2043
+ roles: ['coor_proc', 'coor_campo', 'admin'],
2044
+ coreFunction: function (context, params) {
2045
+ return __awaiter(this, void 0, void 0, function* () {
2046
+ var be = context.be;
2047
+ let tareasTemResult = yield context.client.query(`
2048
+ UPDATE tareas_tem
2049
+ set cargado_dm = null, operacion = $3, estado = $4
2050
+ where operativo=$1 and cargado_dm = $2
2051
+ returning *`, [params.operativo, params.token, OPERACION_PREPARAR_DESCARGA, ESTADO_POSTERIOR_DESCARGA])
2052
+ .fetchAll();
2053
+ if (tareasTemResult.rowCount == 0) {
2054
+ throw (0, console_1.error)('No se blanqueó ninguna encuesta');
2055
+ }
2056
+ for (let tt of tareasTemResult.rows) {
2057
+ tt.result_blanqueo = `enc ${tt.enc} se blanqueó correctamente.`;
2058
+ let resultBackup = yield context.client.query(`
2059
+ UPDATE tem
2060
+ set json_encuesta = json_backup, fecha_modif_encuesta = fecha_backup
2061
+ where operativo=$1 and enc=$2 and fecha_backup > coalesce(fecha_modif_encuesta, '1900-01-01') and json_backup is not null
2062
+ returning *`, [tt.operativo, tt.enc])
2063
+ .fetchOneRowIfExists();
2064
+ if (resultBackup.rowCount) {
2065
+ tt.result_blanqueo += ` Se restableció el backup con fecha ${resultBackup.row.fecha_backup.toYmdHms()}.`;
2066
+ var { params: queryParams, setters } = (0, setters_rea_no_rea_1.getSettersAndParametersForReaNoReaResumenEstado)({
2067
+ tarea: tt.tarea,
2068
+ respuestasUAPrincipal: resultBackup.row.json_encuesta,
2069
+ setters: [],
2070
+ params: [tt.operativo, tt.enc, tt.tarea],
2071
+ destino: 'tareas_tem'
2072
+ });
2073
+ yield context.client.query(`update tareas_tem
2074
+ set ${setters.join(',')}
2075
+ where operativo= $1 and enc = $2 and tarea = $3
2076
+ returning 'ok'`, queryParams).fetchUniqueRow();
2077
+ yield simularGuardadoDeEncuestaDesdeAppEscritorio(context, resultBackup.row.operativo, resultBackup.row.enc, tt.tarea, resultBackup.row.json_encuesta);
2078
+ }
2079
+ }
2080
+ return tareasTemResult.rows;
2081
+ });
2082
+ }
2083
+ },
2084
+ {
2085
+ action: 'modo_dm_defecto_obtener',
2086
+ parameters: [],
2087
+ unlogged: true,
2088
+ coreFunction: function (context, _parameters) {
2089
+ return __awaiter(this, void 0, void 0, function* () {
2090
+ const { client } = context;
2091
+ const modoDmDefecto = (yield (client.query(`select modo_dm_defecto from parametros where unico_registro`, []).fetchUniqueValue())).value;
2092
+ return modoDmDefecto;
2093
+ });
2094
+ }
2095
+ }, {
2096
+ action: 'modo_app_get',
2097
+ parameters: [],
2098
+ unlogged: true,
2099
+ coreFunction: function (context, _parameters) {
2100
+ return __awaiter(this, void 0, void 0, function* () {
2101
+ const { be } = context;
2102
+ return (0, app_dmencu_1.getModoByPolicy)(be);
2103
+ });
2104
+ }
2105
+ }, {
2106
+ // la ayuda en línea que le corresponde al usuario según su rol, sus permisos y el modo (ver docs/ayuda-online.md)
2107
+ action: 'ayuda_traer',
2108
+ parameters: [],
2109
+ coreFunction: function (context, _parameters) {
2110
+ return __awaiter(this, void 0, void 0, function* () {
2111
+ const { be } = context;
2112
+ const quien = (0, app_dmencu_1.quienConsultaAyuda)(context);
2113
+ const temas = (0, ayuda_1.temasVisibles)(be.caches.ayuda, quien);
2114
+ return {
2115
+ rol: quien.rol,
2116
+ modo: quien.modo,
2117
+ temas: temas.map(tema => ({ id: tema.id, titulo: tema.titulo, html: tema.html })),
2118
+ menu: (0, ayuda_1.menuConAyuda)(be.getMenu(context).menu, temas),
2119
+ };
2120
+ });
2121
+ }
2122
+ },
2123
+ {
2124
+ action: 'operativo_migrar',
2125
+ parameters: [
2126
+ { name: 'operativo_origen', typeName: 'text', references: 'operativos' },
2127
+ { name: 'operativo_destino', typeName: 'text' },
2128
+ { name: 'schema_name', typeName: 'text', label: 'nombre de schema' },
2129
+ ],
2130
+ resultOk: 'download_sql',
2131
+ proceedLabel: 'migrar',
2132
+ roles: ['admin'],
2133
+ coreFunction: function (context, params) {
2134
+ return __awaiter(this, void 0, void 0, function* () {
2135
+ // 1. Consultamos las tablas base del origen (siempre tienen operativo)
2136
+ const baseTablesResult = yield Promise.all(['operativos', 'tareas', 'unidad_analisis', 'casilleros'].map((tableName) => __awaiter(this, void 0, void 0, function* () {
2137
+ return ({
2138
+ name: tableName,
2139
+ hasOperativo: true,
2140
+ result: yield context.client.query(`select * from ${context.be.db.quoteIdent(tableName)} where operativo = $1`, [params.operativo_origen]).fetchAll()
2141
+ });
2142
+ })));
2143
+ baseTablesResult.forEach((_, i) => baseTablesResult[i].result.rows.forEach(row => row.operativo = params.operativo_destino));
2144
+ //Chequeo y consulta de tablas reas (rea, no_rea, rea_sup, no_rea_sup)
2145
+ const optionalTables = ['rea', 'no_rea', 'rea_sup', 'no_rea_sup'];
2146
+ const tablesExistResult = yield context.client.query(`select table_name
2147
+ from information_schema.tables
2148
+ where table_schema = current_schema()
2149
+ and table_name = any($1)`, [optionalTables]).fetchAll();
2150
+ const existingOptionalTables = tablesExistResult.rows.map(r => r.table_name);
2151
+ const missingOptionalTables = optionalTables.filter(t => !existingOptionalTables.includes(t));
2152
+ const optionalTablesResult = yield Promise.all(existingOptionalTables.map((tableName) => __awaiter(this, void 0, void 0, function* () {
2153
+ const colsResult = yield context.client.query(`select column_name
2154
+ from information_schema.columns
2155
+ where table_schema = current_schema()
2156
+ and table_name = $1`, [tableName]).fetchAll();
2157
+ const hasOperativo = colsResult.rows.some(c => c.column_name === 'operativo');
2158
+ const queryStr = hasOperativo
2159
+ ? `select * from ${context.be.db.quoteIdent(tableName)} where operativo = $1`
2160
+ : `select * from ${context.be.db.quoteIdent(tableName)}`;
2161
+ const queryParams = hasOperativo ? [params.operativo_origen] : [];
2162
+ const result = yield context.client.query(queryStr, queryParams).fetchAll();
2163
+ return {
2164
+ name: tableName,
2165
+ hasOperativo,
2166
+ result
2167
+ };
2168
+ })));
2169
+ optionalTablesResult.forEach(t => {
2170
+ if (t.hasOperativo) {
2171
+ t.result.rows.forEach(row => row.operativo = params.operativo_destino);
2172
+ }
2173
+ });
2174
+ // Combinamos base y opcionales encontradas
2175
+ const tablesResult = [...baseTablesResult, ...optionalTablesResult];
2176
+ const disableCasillerosFK = `
2177
+ ALTER TABLE ${context.be.db.quoteIdent(params.schema_name)}.casilleros DISABLE TRIGGER ALL;
2178
+ `;
2179
+ const enableCasillerosFK = `
2180
+ ALTER TABLE ${context.be.db.quoteIdent(params.schema_name)}.casilleros ENABLE TRIGGER ALL;
2181
+ `;
2182
+ const buildInserts = (query) => {
2183
+ let fields = [...query.result.fields];
2184
+ // Si la tabla de rea no tenía la columna operativo, la agregamos al insert
2185
+ if (query.hasOperativo === false && !fields.some((f) => f.name === 'operativo')) {
2186
+ fields.push({ name: 'operativo' });
2187
+ }
2188
+ return query.result.rows.map(row => {
2189
+ if (query.hasOperativo === false) {
2190
+ row.operativo = params.operativo_destino;
2191
+ }
2192
+ return 'insert into ' + context.be.db.quoteIdent(params.schema_name) + '.' + context.be.db.quoteIdent(query.name) +
2193
+ ' (' + fields.map((f) => context.be.db.quoteIdent(f.name)).join(', ') + ')' +
2194
+ ' values (' + fields.map((f) => context.be.db.quoteNullable(row[f.name])).join(', ') + ');';
2195
+ }).join('\n');
2196
+ };
2197
+ const opOrigenQ = context.be.db.quoteNullable(params.operativo_origen);
2198
+ const opDestinoQ = context.be.db.quoteNullable(params.operativo_destino);
2199
+ const defaultAreas = [
2200
+ 1, 1400, 1410, 1420, 1430, 1440, 1450, 1460, 1470, 1480, 1490,
2201
+ 1500, 1510, 1520, 1530, 1540, 7400, 7410, 7420, 7430, 7440,
2202
+ 7450, 7460, 7470, 7480, 7490, 7500, 7510, 7520, 7530, 7540
2203
+ ];
2204
+ // Avisos si alguna tabla opcional no existe en absoluto
2205
+ const noticesSql = missingOptionalTables.length > 0
2206
+ ? "DO \$\$\nBEGIN\n" + missingOptionalTables.map(t => ` RAISE NOTICE 'La tabla "%" no existe en el origen, se omite.', '${t}';`).join("\n") + "\nEND \$\$;"
2207
+ : '';
2208
+ // 2. Bloque PL/pgSQL con validación y limpieza exclusiva en el camino por defecto
2209
+ const conditionalAreasTemSql = `
2210
+ DO $$
2211
+ DECLARE
2212
+ v_tiene_onda boolean;
2213
+ BEGIN
2214
+ -- Verificar si las 3 tablas tienen registros simultáneamente en el destino
2215
+ SELECT
2216
+ COALESCE((SELECT count(1) FROM areas WHERE operativo = ${opOrigenQ}), 0) > 0 AND
2217
+ COALESCE((SELECT count(1) FROM tareas_areas WHERE operativo = ${opOrigenQ}), 0) > 0 AND
2218
+ COALESCE((SELECT count(1) FROM tem WHERE operativo = ${opOrigenQ}), 0) > 0
2219
+ INTO v_tiene_onda;
2220
+
2221
+ IF v_tiene_onda THEN
2222
+ -- --- CAMINO A: El destino TIENE onda anterior completa ---
2223
+ INSERT INTO areas (operativo, area)
2224
+ SELECT ${opDestinoQ} AS operativo, area
2225
+ FROM areas WHERE operativo = ${opOrigenQ};
2226
+
2227
+ INSERT INTO tareas_areas (operativo, tarea, area)
2228
+ SELECT ${opDestinoQ} AS operativo, tarea, area
2229
+ FROM tareas_areas WHERE operativo = ${opOrigenQ};
2230
+
2231
+ INSERT INTO tem (operativo, area, enc, dominio, habilitada)
2232
+ SELECT ${opDestinoQ} AS operativo, area, (area || enc::text) enc,
2233
+ CASE WHEN encs.enc < 106 THEN 3 ELSE 5 END AS dominio, TRUE AS habilitada
2234
+ FROM areas
2235
+ JOIN (SELECT generate_series(100, 110) enc) encs ON true
2236
+ WHERE areas.operativo = ${opOrigenQ};
2237
+ ELSE
2238
+ -- --- CAMINO B: Alguna tabla está vacía o incompleta (Limpiamos e insertamos por defecto) ---
2239
+ DELETE FROM tem WHERE operativo = ${opDestinoQ};
2240
+ DELETE FROM tareas_areas WHERE operativo = ${opDestinoQ};
2241
+ DELETE FROM areas WHERE operativo = ${opDestinoQ};
2242
+
2243
+ INSERT INTO areas (operativo, area) VALUES
2244
+ ${defaultAreas.map(a => `(${opDestinoQ},${context.be.db.quoteNullable(a)})`).join(', ')};
2245
+
2246
+ INSERT INTO tareas_areas(operativo, tarea, area)
2247
+ SELECT *
2248
+ FROM (
2249
+ SELECT ${opDestinoQ} AS operativo, t.tarea, area
2250
+ FROM areas a, (
2251
+ SELECT t.operativo, t.tarea
2252
+ FROM tareas t
2253
+ ) t
2254
+ WHERE a.operativo = ${opDestinoQ}
2255
+ AND t.operativo = ${opDestinoQ}
2256
+ ) n
2257
+ ORDER BY 1, 2, 3;
2258
+ INSERT INTO tem (operativo, area, enc, dominio, habilitada)
2259
+ SELECT ${opDestinoQ} AS operativo, area, (area || enc::text) enc,
2260
+ CASE WHEN encs.enc < 106 THEN 3 ELSE 5 END AS dominio, TRUE AS habilitada
2261
+ FROM areas
2262
+ JOIN (SELECT generate_series(100, 110) enc) encs ON true
2263
+ WHERE areas.operativo = ${opDestinoQ};
2264
+ END IF;
2265
+ END $$;
2266
+ `;
2267
+ const deletes = `
2268
+ --deletes if necessary
2269
+ --delete from tareas_areas where operativo = ${opDestinoQ};
2270
+ --delete from casilleros where operativo = ${opDestinoQ};
2271
+ --delete from unidad_analisis where operativo = ${opDestinoQ};
2272
+ --delete from tareas_tem where operativo = ${opDestinoQ};
2273
+ --delete from tem where operativo = ${opDestinoQ};
2274
+ --delete from areas where operativo = ${opDestinoQ};
2275
+ --delete from tareas where operativo = ${opDestinoQ};
2276
+ --delete from operativos where operativo = ${opDestinoQ};
2277
+ --delete from rea where operativo = ${opDestinoQ};
2278
+ --delete from no_rea where operativo = ${opDestinoQ};
2279
+ --delete from rea_sup where operativo = ${opDestinoQ};
2280
+ --delete from no_rea_sup where operativo = ${opDestinoQ};
2281
+ `;
2282
+ const sql = `set search_path = "${params.schema_name}";` + `\n\n`
2283
+ + disableCasillerosFK
2284
+ + noticesSql
2285
+ + '\n\n'
2286
+ + tablesResult.map(query => buildInserts(query)).join('\n\n')
2287
+ + '\n\n' + conditionalAreasTemSql
2288
+ + '\n\n' + enableCasillerosFK
2289
+ + '\n\n' + deletes;
2290
+ return sql;
2291
+ });
2292
+ }
2293
+ },
2294
+ {
2295
+ action: 'encuesta_capa_a_prod_pasar',
2296
+ parameters: [
2297
+ { name: 'operativo', typeName: 'text', references: 'operativos' },
2298
+ { name: 'enc', typeName: 'text' },
2299
+ ],
2300
+ roles: ['admin'],
2301
+ coreFunction: function (context, parameters) {
2302
+ return __awaiter(this, void 0, void 0, function* () {
2303
+ (yield context.client.query(`update tem
2304
+ set enc_autogenerado_dm = enc_autogenerado_dm_capa, enc_autogenerado_dm_capa = null
2305
+ where operativo = $1 and enc = $2 and enc_autogenerado_dm_capa is not null
2306
+ returning *`, [parameters.operativo, parameters.enc]).fetchUniqueRow()).row;
2307
+ return `se movió la encuesta ${parameters.enc} a producción`;
2308
+ });
2309
+ }
2310
+ }
2311
+ ];
2312
+ });
2313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2VkdXJlcy1kbWVuY3UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmVyL3Byb2NlZHVyZXMtZG1lbmN1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEsWUFBWSxDQUFDOzs7SUF1TWIsOENBZUM7SUFJRCxnRkF3QkM7SUFrTUQsd0RBYUM7SUFrREQsb0RBaUNDO0lBaGhCRCxrQ0FBbUM7SUFDbkMsaURBQStCO0lBSy9CLHlEQUE0RDtJQUU1RCwrQ0FBd0Q7SUFDeEQsMkJBQW9DO0lBRXBDLGdEQUFnRDtJQUdoRCx5REFBd0Q7SUFDeEQscUNBQWdDO0lBRWhDLDJDQUFrRDtJQUNsRCw2Q0FBbUU7SUFDbkUsbUNBQXNEO0lBRXRELDZEQUFxRztJQUVyRyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXBDLElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUUzQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7SUFFN0IsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7SUFDbkMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7SUFDdEMsTUFBTSx3QkFBd0IsR0FBRyxRQUFRLENBQUM7SUFDMUMsTUFBTSwyQkFBMkIsR0FBRyxXQUFXLENBQUM7SUFDaEQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBSTFCLElBQUksZUFBZ0MsQ0FBQztJQUNyQyxJQUFJLGNBQWMsR0FBRyxHQUFHLENBQUE7SUFFakIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQW9CLEVBQUUsRUFBRSxDQUN2RCxlQUFlLEdBQUcsR0FBRyxDQUFDO0lBRGIsUUFBQSxrQkFBa0Isc0JBQ0w7SUFFbkIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQVcs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LFlBQVksRUFBRSxVQUFnQixPQUF5QixFQUFFLFVBQTJFOztvQkFDaEksQ0FBQyxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUN2Qjs7O2dDQUdnQixFQUNoQixDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUN6QyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUV4QixPQUFPLHdCQUF3QixVQUFVLENBQUMsR0FBRyxlQUFlLENBQUM7Z0JBQ2pFLENBQUM7YUFBQTtTQUNKO0tBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgUHJvY2VkdXJlRGVmLCBUYWJsZURlZmluaXRpb24sIENsaWVudCwgVGFibGVEZWZpbml0aW9ucywgQXBwQmFja2VuZCB9IGZyb20gXCIuL3R5cGVzLWRtZW5jdVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmVDb250ZXh0LCBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzLCBGb3JlaWduS2V5IH0gZnJvbSBcIm1ldGEtZW5jXCI7XHJcbmltcG9ydCBsaWtlQXIgPSByZXF1aXJlKFwibGlrZS1hclwiKTtcclxuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMtZG1lbmN1XCI7XHJcbmltcG9ydCB7IElkVW5pZGFkQW5hbGlzaXMsIFVuaWRhZEFuYWxpc2lzLCBFc3RhZG9BY2Npb24sIElkRW5jLCBJZFRhcmVhLCBSZXNwdWVzdGFzUmFpeiwgSWRPcGVyYXRpdm8sIElkQ2FyZ2EsIE1vZG9ETSwgUmVhLCBOb1JlYSwgTm9SZWFTdXAsIFJlYVN1cCwgUmVzdWx0YWRvUmVzdW1lbiB9IGZyb20gXCIuLi91bmxvZ2dlZC90aXBvc1wiO1xyXG5cclxuaW1wb3J0IHsgT3BlcmF0aXZvR2VuZXJhdG9yIH0gZnJvbSBcInByb2Nlc2FtaWVudG9cIjtcclxuXHJcbmltcG9ydCB7IGpzb24sIGpzb25vLCBSZXN1bHRSb3dzIH0gZnJvbSBcInBnLXByb21pc2Utc3RyaWN0XCI7XHJcblxyXG5pbXBvcnQgeyBjaGFuZ2luZywgZGF0ZSwgY29hbGVzY2UgfSBmcm9tICdiZXN0LWdsb2JhbHMnO1xyXG5pbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gXCJmc1wiO1xyXG5cclxuaW1wb3J0ICogYXMgRXhwcmVzaW9uUGFyc2VyIGZyb20gJ2V4cHJlLXBhcnNlcic7XHJcbmltcG9ydCB7IHRhcmVhcyB9IGZyb20gXCIuL3RhYmxlLXRhcmVhc1wiO1xyXG5pbXBvcnQgeyBwcmVwZW5kTGlzdGVuZXIgfSBmcm9tIFwicHJvY2Vzc1wiO1xyXG5pbXBvcnQgeyBnZXREaWFzQVBhc2FyUXVlcnkgfSBmcm9tIFwiLi90YWJsZS10YXJlYXNfdGVtXCI7XHJcbmltcG9ydCB7IGVycm9yIH0gZnJvbSBcImNvbnNvbGVcIjtcclxuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJ2bVwiO1xyXG5pbXBvcnQgeyBleHBlY3RlZCwgdW5leHBlY3RlZCB9IGZyb20gXCJjYXN0LWVycm9yXCI7XHJcbmltcG9ydCB7IGdldE1vZG9CeVBvbGljeSwgcXVpZW5Db25zdWx0YUF5dWRhIH0gZnJvbSBcIi4vYXBwLWRtZW5jdVwiO1xyXG5pbXBvcnQgeyBtZW51Q29uQXl1ZGEsIHRlbWFzVmlzaWJsZXMgfSBmcm9tIFwiLi9heXVkYVwiO1xyXG5pbXBvcnQgdHlwZSB7IEF5dWRhUGFyYVVzdWFyaW8gfSBmcm9tIFwiLi4vdW5sb2dnZWQvdGlwb3NcIjtcclxuaW1wb3J0IHsgZ2V0U2V0dGVyc0FuZFBhcmFtZXRlcnNGb3JSZWFOb1JlYVJlc3VtZW5Fc3RhZG8sIFBhcmFtZXRyb1NxbCB9IGZyb20gXCIuL3NldHRlcnMtcmVhLW5vLXJlYVwiO1xyXG5cclxudmFyIFBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcbnZhciBzcWxUb29scyA9IHJlcXVpcmUoJ3NxbC10b29scycpO1xyXG5cclxudmFyIGRpc2NyZXBhbmNlcyA9IHJlcXVpcmUoJ2Rpc2NyZXBhbmNlcycpO1xyXG5cclxuY29uc3QgZm9ybVByaW5jaXBhbCA9ICdGOkYxJztcclxuXHJcbmNvbnN0IEVTVEFET19QT1NURVJJT1JfQ0FSR0EgPSAnQyc7XHJcbmNvbnN0IEVTVEFET19QT1NURVJJT1JfREVTQ0FSR0EgPSAnRCc7XHJcbmNvbnN0IE9QRVJBQ0lPTl9QUkVQQVJBUl9DQVJHQSA9ICdjYXJnYXInO1xyXG5jb25zdCBPUEVSQUNJT05fUFJFUEFSQVJfREVTQ0FSR0EgPSAnZGVzY2FyZ2FyJztcclxuY29uc3QgREVGQVVMVF9ET01JTklPID0gMztcclxuXHJcbmV4cG9ydCB0eXBlIGdlbmVyYXJJZEVuY0Z1biA9IChhcmVhOiBudW1iZXIsIGluZGV4OiBudW1iZXIpID0+IElkRW5jXHJcblxyXG52YXIgZ2VuZXJhcklkRW5jRnVuOiBnZW5lcmFySWRFbmNGdW47XHJcbnZhciBtYXhBRW5jUG9yQXJlYSA9IDk5OVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldEdlbmVyYXJJZEVuY0Z1biA9IChmdW46IGdlbmVyYXJJZEVuY0Z1bikgPT5cclxuICAgIGdlbmVyYXJJZEVuY0Z1biA9IGZ1bjtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRNYXhFbmNQb3JBcmVhID0gKG1heDogbnVtYmVyKSA9PlxyXG4gICAgbWF4QUVuY1BvckFyZWEgPSBtYXg7XHJcblxyXG5zZXRHZW5lcmFySWRFbmNGdW4oKGFyZWE6IG51bWJlciwgbnVtRW5jOiBudW1iZXIpID0+IGFyZWEudG9TdHJpbmcoKSArIG51bUVuYy50b1N0cmluZygpLnBhZFN0YXJ0KG1heEFFbmNQb3JBcmVhLnRvU3RyaW5nKCkubGVuZ3RoLCAnMCcpIGFzIHVua25vd24gYXMgSWRFbmMpO1xyXG5cclxuc2V0TWF4RW5jUG9yQXJlYSg5OTkpO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhck51ZXZvSWRFbmMoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgYXJlYTogbnVtYmVyLCBtYXhBRW5jUG9yQXJlYTogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzaWd1aWVudGVOdW1lcm9FbmN1ZXN0YSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgU0VMRUNUIG9idGVuZXJfc2lndWllbnRlX2NvbnRhZG9yX2FyZWEoJDEsJDIsJDMpIEFTIG5leHRfY291bnRlcjtcclxuICAgIGAsIFtvcGVyYXRpdm8sIGFyZWEsIG1heEFFbmNQb3JBcmVhXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgIHJldHVybiBnZW5lcmFySWRFbmNGdW4oYXJlYSwgc2lndWllbnRlTnVtZXJvRW5jdWVzdGEpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0T3BlcmF0aXZvQWN0dWFsID0gYXN5bmMgKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQpID0+IHtcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICB2YXIgb3BlcmF0aXZvID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgIGBzZWxlY3Qgb3BlcmF0aXZvXHJcbiAgICAgICAgICAgIGZyb20gcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB3aGVyZSB1bmljb19yZWdpc3Ryb2BcclxuICAgICAgICAsIFtdXHJcbiAgICApLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWVcclxuICAgIGlmIChvcGVyYXRpdm8pIHtcclxuICAgICAgICByZXR1cm4gb3BlcmF0aXZvXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IEVycm9yKCdubyBzZSBjb25maWd1csOzIHVuIG9wZXJhdGl2byBlbiBsYSB0YWJsYSBwYXLDoW1ldHJvcycpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0RGVmYXVsdFRhcmVhKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIG9wZXJhdGl2bzogSWRPcGVyYXRpdm8pIHtcclxuICAgIHJldHVybiAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgIHNlbGVjdCAqIFxyXG4gICAgICAgICAgICBmcm9tIHRhcmVhcyBcclxuICAgICAgICAgICAgd2hlcmUgZXNfaW5pY2lhbCBhbmQgb3BlcmF0aXZvID0gJDFcclxuICAgIGAsIFtvcGVyYXRpdm9dKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3c7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldE9wZXJhdGl2b1Blcm1pdGVHZW5lcmFyTXVlc3RyYShjbGllbnQ6IENsaWVudCwgb3BlcmF0aXZvOiBJZE9wZXJhdGl2byk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIChhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgIHNlbGVjdCBwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYSBcclxuICAgICAgICAgICAgZnJvbSBvcGVyYXRpdm9zIFxyXG4gICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMVxyXG4gICAgYCwgW29wZXJhdGl2b10pLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWU7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RpckVuY3Vlc3RhQXV0b2dlbmVyYWRhRW5ETShjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBPUEVSQVRJVk86IElkT3BlcmF0aXZvLCBhcmVhOiBudW1iZXIsIGVuY0F1dG9nZW5lcmFkb0RtOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeiwgcmVjZXBjaW9uaXN0YTogc3RyaW5nLCBhc2lnbmFkbzogc3RyaW5nLCBtb2RvX2RtOiBNb2RvRE0sIGNhbWJpYV9tb2RvX2RtOiBib29sZWFuKTogUHJvbWlzZTxJZEVuYz4ge1xyXG4gICAgbGV0IGlkRW5jID0gbnVsbDtcclxuICAgIHZhciBwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYSA9IGF3YWl0IGdldE9wZXJhdGl2b1Blcm1pdGVHZW5lcmFyTXVlc3RyYShjb250ZXh0LmNsaWVudCwgT1BFUkFUSVZPKTtcclxuICAgIGlmIChwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYSkge1xyXG4gICAgICAgIGNvbnN0IGF1dG9nZW5lcmFkb0ZpZWxkID0gbW9kb19kbSA9PSAncHJvZHVjJyA/ICdlbmNfYXV0b2dlbmVyYWRvX2RtJyA6ICdlbmNfYXV0b2dlbmVyYWRvX2RtX2NhcGEnO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdFVwZGF0ZSA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgVVBEQVRFIHRlbSBcclxuICAgICAgICAgICAgICAgIHNldCAoanNvbl9iYWNrdXAsIGpzb25fZW5jdWVzdGEsIGZlY2hhX2JhY2t1cCkgPSBcclxuICAgICAgICAgICAgICAgICAgICAoJDQsICQ1LCBjdXJyZW50X3RpbWVzdGFtcClcclxuICAgICAgICAgICAgICAgIHdoZXJlIChvcGVyYXRpdm8gPSAkMSBhbmQgJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQoYXV0b2dlbmVyYWRvRmllbGQpfSA9ICQyIGFuZCB0b2tlbl9hdXRvZ2VuZXJhZG9fZG0gPSAkMylcclxuICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgYCwgW09QRVJBVElWTywgZW5jQXV0b2dlbmVyYWRvRG0sIHRva2VuLCByZXNwdWVzdGFzUmFpeiwgcmVzcHVlc3Rhc1JhaXpdKS5mZXRjaE9uZVJvd0lmRXhpc3RzKCk7XHJcbiAgICAgICAgLy8gaGFnbyBpbnNlcnQgcG9ycXVlIG5vIGV4aXN0ZSBlbiB0ZW1cclxuICAgICAgICBjb25zdCBkZWZhdWx0VGFyZWEgPSBhd2FpdCBnZXREZWZhdWx0VGFyZWEoY29udGV4dCwgT1BFUkFUSVZPKTtcclxuICAgICAgICBpZiAocmVzdWx0VXBkYXRlLnJvd0NvdW50ID09IDApIHtcclxuICAgICAgICAgICAgaWRFbmMgPSBhd2FpdCBnZW5lcmFyTnVldm9JZEVuYyhjb250ZXh0LCBPUEVSQVRJVk8sIGFyZWEsIG1heEFFbmNQb3JBcmVhKVxyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBJTlNFUlQgaW50byB0ZW0gKFxyXG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgICAgICBlbmMsXHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYSxcclxuICAgICAgICAgICAgICAgICAgICBkb21pbmlvLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhYmlsaXRhZGEsXHJcbiAgICAgICAgICAgICAgICAgICAgJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQoYXV0b2dlbmVyYWRvRmllbGQpfSxcclxuICAgICAgICAgICAgICAgICAgICB0b2tlbl9hdXRvZ2VuZXJhZG9fZG0sXHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZWFfYWN0dWFsLFxyXG4gICAgICAgICAgICAgICAgICAgIGpzb25fYmFja3VwLFxyXG4gICAgICAgICAgICAgICAgICAgIGpzb25fZW5jdWVzdGEsIFxyXG4gICAgICAgICAgICAgICAgICAgIGZlY2hhX2JhY2t1cFxyXG4gICAgICAgICAgICAgICAgKSBcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgKCQxLCAkMiwgJDMsICQ0LCAkNSwgJDYsICQ3LCAkOCwgJDksICQxMCwgY3VycmVudF90aW1lc3RhbXApXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpcclxuICAgICAgICAgICAgYCwgW1xyXG4gICAgICAgICAgICAgICAgT1BFUkFUSVZPLFxyXG4gICAgICAgICAgICAgICAgaWRFbmMsXHJcbiAgICAgICAgICAgICAgICBhcmVhLFxyXG4gICAgICAgICAgICAgICAgREVGQVVMVF9ET01JTklPLFxyXG4gICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGVuY0F1dG9nZW5lcmFkb0RtLFxyXG4gICAgICAgICAgICAgICAgdG9rZW4sXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0VGFyZWEudGFyZWEsXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzUmFpeixcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNSYWl6LFxyXG4gICAgICAgICAgICBdKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlkRW5jID0gcmVzdWx0VXBkYXRlLnJvdy5lbmNcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgZ2VuZXJhclRhcmVhc1RlbUZhbHRhbnRlcyhjb250ZXh0LCBPUEVSQVRJVk8pO1xyXG4gICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgdXBkYXRlIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgIHNldCByZWNlcGNpb25pc3RhID0gJDQsIGFzaWduYWRvID0gJDVcclxuICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgYCwgW09QRVJBVElWTywgaWRFbmMsIGRlZmF1bHRUYXJlYS50YXJlYSwgcmVjZXBjaW9uaXN0YSwgYXNpZ25hZG9dKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgdXBkYXRlIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgIHNldCBjYXJnYWRvX2RtID0gJDQsIGVzdGFkbyA9ICQ1LCBvcGVyYWNpb24gPSAkNlxyXG4gICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgcmV0dXJuaW5nICpcclxuICAgICAgICBgLCBbT1BFUkFUSVZPLCBpZEVuYywgZGVmYXVsdFRhcmVhLnRhcmVhLCB0b2tlbiwgRVNUQURPX1BPU1RFUklPUl9DQVJHQSwgY2FtYmlhX21vZG9fZG0gPyBudWxsIDogT1BFUkFDSU9OX1BSRVBBUkFSX0NBUkdBXVxyXG4gICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpZEVuY1xyXG59XHJcblxyXG4vKmRlZmluaWNpw7NuIGRlIGVzdHJ1Y3R1cmEgY29tcGxldGEsIGN1YW5kbyBleGlzdGEgaW5nLWVuYyBoYXkgcXVlIHBvbmVybG8gYWjDrSovXHJcbnR5cGUgRXN0cnVjdHVyYVRhYmxhID0geyB0YWJsZU5hbWU6IHN0cmluZywgcGtGaWVsZHM6IHsgZmllbGROYW1lOiBzdHJpbmcgfVtdLCBjaGlsZFRhYmxlczogRXN0cnVjdHVyYVRhYmxhW10gfTtcclxuZnVuY3Rpb24gY3JlYXRlU3RydWN0dXJlKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHRhYmxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgdmFyIG1haW5UYWJsZURlZjogVGFibGVEZWZpbml0aW9uID0gYmUudGFibGVTdHJ1Y3R1cmVzW3RhYmxlTmFtZV0oY29udGV4dCk7XHJcbiAgICB2YXIgZ2V0UGtGcm9tVGFibGVEZWYgPSBmdW5jdGlvbiBnZXRQa0Zyb21UYWJsZURlZih0YWJsZURlZjogVGFibGVEZWZpbml0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIHRhYmxlRGVmLnByaW1hcnlLZXkubWFwKGZ1bmN0aW9uIChwaykge1xyXG4gICAgICAgICAgICByZXR1cm4geyBmaWVsZE5hbWU6IHBrIH07XHJcbiAgICAgICAgfSlcclxuICAgIH07XHJcbiAgICB2YXIgZ2V0RmtGcm9tVGFibGVEZWYgPSBmdW5jdGlvbiBnZXRGa0Zyb21UYWJsZURlZih0YWJsZURlZjogVGFibGVEZWZpbml0aW9uLCBwYXJlbnRUYWJsZU5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBwYXJlbnRGayA9ICg8Rm9yZWlnbktleVtdPnRhYmxlRGVmLmZvcmVpZ25LZXlzKS5maW5kKGZrID0+IGZrLnJlZmVyZW5jZXMgPT0gcGFyZW50VGFibGVOYW1lKTtcclxuICAgICAgICByZXR1cm4gcGFyZW50RmsgPyBwYXJlbnRGay5maWVsZHMgOiBbXTtcclxuICAgIH1cclxuICAgIHZhciBzdHJ1Y3Q6IEVzdHJ1Y3R1cmFUYWJsYSA9IHtcclxuICAgICAgICB0YWJsZU5hbWU6IG1haW5UYWJsZURlZi5uYW1lLFxyXG4gICAgICAgIHBrRmllbGRzOiBnZXRQa0Zyb21UYWJsZURlZihtYWluVGFibGVEZWYpLFxyXG4gICAgICAgIGNoaWxkVGFibGVzOiBbXVxyXG4gICAgfTtcclxuICAgIGlmIChtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzICYmIG1haW5UYWJsZURlZi5kZXRhaWxUYWJsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgbWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXRhaWxUYWJsZSkge1xyXG4gICAgICAgICAgICBpZiAoZGV0YWlsVGFibGUudGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHN0cnVjdC5jaGlsZFRhYmxlcy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5naW5nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgZGV0YWlsVGFibGUudGFibGUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGZrRmllbGRzOiBnZXRGa0Zyb21UYWJsZURlZihiZS50YWJsZVN0cnVjdHVyZXNbZGV0YWlsVGFibGUudGFibGVdKGNvbnRleHQpLCB0YWJsZU5hbWUpIH1cclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIHJldHVybiBzdHJ1Y3Q7XHJcbn1cclxuLyogZmluIGRlZmluaWNpb24gZXN0cnVjdHVyYSBjb21wbGV0YSAqL1xyXG5cclxudHlwZSBBbnlPYmplY3QgPSB7IFtrOiBzdHJpbmddOiBhbnkgfVxyXG5cclxuXHJcbmV4cG9ydCB0eXBlIENvbnN1bHRhU3FsID0geyBzcWw6IHN0cmluZywgcGFyYW1zOiBQYXJhbWV0cm9TcWxbXSB9O1xyXG5cclxuLy8gZ3JhYmEgZW4gbGEgVEVNIGxhIGVuY3Vlc3RhIHkgZWwgcmVzdWx0YWRvIGNhbGN1bGFkbyAocmVzdW1lbiwgcmVhIHkgbm8gcmVhOyBvIHN1cyB2ZXJzaW9uZXMgX3N1cCBzaSBsYSB0YXJlYSBlcyBzdXBlKVxyXG5leHBvcnQgZnVuY3Rpb24gY29uc3VsdGFVcGRhdGVUZW08UiBleHRlbmRzIFJlc3VsdGFkb1Jlc3VtZW4+KG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGlkRW5jOiBzdHJpbmcsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDogUiwgdGFyZWE6IElkVGFyZWEpOiBDb25zdWx0YVNxbCB7XHJcbiAgICB2YXIgeyBwYXJhbXMsIHNldHRlcnMgfSA9IGdldFNldHRlcnNBbmRQYXJhbWV0ZXJzRm9yUmVhTm9SZWFSZXN1bWVuRXN0YWRvKHtcclxuICAgICAgICB0YXJlYSxcclxuICAgICAgICByZXNwdWVzdGFzVUFQcmluY2lwYWwsXHJcbiAgICAgICAgc2V0dGVyczogW2Bqc29uX2VuY3Vlc3RhID0gJDNgLCBgZmVjaGFfbW9kaWZfZW5jdWVzdGEgPSBjdXJyZW50X3RpbWVzdGFtcGBdLFxyXG4gICAgICAgIHBhcmFtczogW29wZXJhdGl2bywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbF0sXHJcbiAgICAgICAgZGVzdGlubzogJ3RlbSdcclxuICAgIH0pXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNxbDogYHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgc2V0ICR7c2V0dGVycy5qb2luKCcsJyl9XHJcbiAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyXHJcbiAgICAgICAgICAgIHJldHVybmluZyAnb2snYCxcclxuICAgICAgICBwYXJhbXNcclxuICAgIH07XHJcbn1cclxuXHJcbi8vIGN1YW5kbyBlbCBkaXNwb3NpdGl2byBkZXZ1ZWx2ZSBsYSBlbmN1ZXN0YTogcGFzYSBsYSB0YXJlYSBhIGRlc2NhcmdhZGEgeSBndWFyZGEgZWwgcmVzdWx0YWRvIGNhbGN1bGFkbyBlbiBlbCBkaXNwb3NpdGl2byAoZG1fKik7XHJcbi8vIHPDs2xvIHNpIGxhIGVuY3Vlc3RhIHNpZ3VlIGNhcmdhZGEgY29uIGVsIHRva2VuIGRlbCBkaXNwb3NpdGl2b1xyXG5leHBvcnQgZnVuY3Rpb24gY29uc3VsdGFVcGRhdGVUYXJlYXNUZW1Qb3JEZXNjYXJnYTxSIGV4dGVuZHMgUmVzdWx0YWRvUmVzdW1lbj4ob3B0czoge1xyXG4gICAgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgaWRFbmM6IHN0cmluZywgdGFyZWE6IElkVGFyZWEsIHRva2VuOiBzdHJpbmcsXHJcbiAgICByZXNwdWVzdGFzVUFQcmluY2lwYWw6IFIsIHBhc2FBRGVzY2FyZ2FyOiBib29sZWFuXHJcbn0pOiBDb25zdWx0YVNxbCB7XHJcbiAgICB2YXIgeyBwYXJhbXMsIHNldHRlcnMgfSA9IGdldFNldHRlcnNBbmRQYXJhbWV0ZXJzRm9yUmVhTm9SZWFSZXN1bWVuRXN0YWRvKHtcclxuICAgICAgICB0YXJlYTogb3B0cy50YXJlYSxcclxuICAgICAgICByZXNwdWVzdGFzVUFQcmluY2lwYWw6IG9wdHMucmVzcHVlc3Rhc1VBUHJpbmNpcGFsLFxyXG4gICAgICAgIHNldHRlcnM6IFtcclxuICAgICAgICAgICAgYGVzdGFkbyA9ICcke0VTVEFET19QT1NURVJJT1JfREVTQ0FSR0F9J2AsXHJcbiAgICAgICAgICAgIGBjYXJnYWRvX2RtPW51bGxgXHJcbiAgICAgICAgXSxcclxuICAgICAgICBwYXJhbXM6IFtvcHRzLm9wZXJhdGl2bywgb3B0cy5pZEVuYywgb3B0cy50YXJlYSwgb3B0cy50b2tlbl0sXHJcbiAgICAgICAgZGVzdGlubzogJ3RhcmVhc190ZW0nXHJcbiAgICB9KVxyXG4gICAgaWYgKG9wdHMucGFzYUFEZXNjYXJnYXIpIHtcclxuICAgICAgICBzZXR0ZXJzLnB1c2goYG9wZXJhY2lvbiA9ICcke09QRVJBQ0lPTl9QUkVQQVJBUl9ERVNDQVJHQX0nYCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNxbDogYHVwZGF0ZSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICBzZXQgJHtzZXR0ZXJzLmpvaW4oJywnKX1cclxuICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCB0YXJlYSA9ICQzIGFuZCBjYXJnYWRvX2RtID0gJDRcclxuICAgICAgICAgICAgICAgIHJldHVybmluZyAnb2snYCxcclxuICAgICAgICBwYXJhbXNcclxuICAgIH07XHJcbn1cclxuXHJcbi8vIGxvIHF1ZSBndWFyZGFyRW5jdWVzdGFFblRlbSB1c2EgZGVsIGNsaWVudGUgZGUgYmFzZSAoZWwgQ2xpZW50IGRlIHBnLXByb21pc2Utc3RyaWN0IGxvIGN1bXBsZSlcclxuZXhwb3J0IHR5cGUgQ2xpZW50ZVBhcmFUZW0gPSB7XHJcbiAgICBxdWVyeShzcWw6IHN0cmluZywgcGFyYW1zOiBQYXJhbWV0cm9TcWxbXSk6IHsgZmV0Y2hVbmlxdWVSb3coKTogUHJvbWlzZTx7IHJvd0NvdW50OiBudW1iZXIgfCBudWxsIH0+IH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBndWFyZGFyRW5jdWVzdGFFblRlbSA9IGFzeW5jIDxSIGV4dGVuZHMgUmVzdWx0YWRvUmVzdW1lbj4oY29udGV4dDogeyBjbGllbnQ6IENsaWVudGVQYXJhVGVtIH0sIG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGlkRW5jOiBzdHJpbmcsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDogUiwgdGFyZWE6IElkVGFyZWEpID0+IHtcclxuICAgIHZhciB7IHNxbCwgcGFyYW1zIH0gPSBjb25zdWx0YVVwZGF0ZVRlbShvcGVyYXRpdm8sIGlkRW5jLCByZXNwdWVzdGFzVUFQcmluY2lwYWwsIHRhcmVhKTtcclxuICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShzcWwsIHBhcmFtcykuZmV0Y2hVbmlxdWVSb3coKTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcmVnaXN0cmFyUGFzZVRhYmxhKFxyXG4gICAgY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCxcclxuICAgIG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sXHJcbiAgICBpZEVuYzogc3RyaW5nIHwgbnVtYmVyLFxyXG4gICAgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsOiBhbnlcclxuKSB7XHJcbiAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgdmFyIHByb2NlZHVyZUd1YXJkYXIgPSBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyO1xyXG4gICAgbGV0IHJlc3VsdGFkbyA9IGBpZCBlbmMgJHtpZEVuY306IGA7XHJcbiAgICBsZXQgcGFyYW1fZ3VhcmRhciA9IHsgb3BlcmF0aXZvOiBvcGVyYXRpdm8sIGlkX2Nhc286IGlkRW5jLCBkYXRvc19jYXNvOiByZXNwdWVzdGFzVUFQcmluY2lwYWwgfTtcclxuICAgIGxldCBzYXZlcG9pbnROYW1lID0gYHNwX2d1YXJkYXJfJHtpZEVuY31gLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywgJ18nKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBTQVZFUE9JTlQgJHtzYXZlcG9pbnROYW1lfWApLmV4ZWN1dGUoKTtcclxuICAgICAgICByZXN1bHRhZG8gKz0gYXdhaXQgcHJvY2VkdXJlR3VhcmRhci5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1fZ3VhcmRhcik7XHJcbiAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFJFTEVBU0UgU0FWRVBPSU5UICR7c2F2ZXBvaW50TmFtZX1gKS5leGVjdXRlKCk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgUk9MTEJBQ0sgVE8gU0FWRVBPSU5UICR7c2F2ZXBvaW50TmFtZX1gKS5leGVjdXRlKCk7XHJcbiAgICAgICAgdmFyIGVycm9yID0gZXhwZWN0ZWQoZXJyKTtcclxuICAgICAgICBsZXQgZXJyTWVzc2FnZSA9IHJlc3VsdGFkbyArIFwiZG1fZm9ycGtyYWl6X2Rlc2Nhcmdhci4gXCIgKyBlcnJvci5tZXNzYWdlO1xyXG4gICAgICAgIHJlc3VsdGFkbyA9IGVyck1lc3NhZ2U7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJNZXNzYWdlLCBlcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgIHNldCBwYXNlX3RhYmxhID0gJDNcclxuICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyXHJcbiAgICAgICAgICAgIHJldHVybmluZyAnb2snYCxcclxuICAgICAgICBbb3BlcmF0aXZvLCBpZEVuYywgcmVzdWx0YWRvXVxyXG4gICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG59XHJcblxyXG52YXIgc2ltdWxhckd1YXJkYWRvRGVFbmN1ZXN0YURlc2RlQXBwRXNjcml0b3JpbyA9IGFzeW5jIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IElkRW5jLCB0YXJlYTogSWRUYXJlYSwganNvbl9lbmN1ZXN0YTogYW55KSA9PiB7XHJcbiAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgY29uc3QgVUFfUFJJTkNJUEFMID0gKGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBvcGVyYXRpdm8pKS51bmlkYWRfYW5hbGlzaXM7XHJcbiAgICByZXR1cm4gYXdhaXQgYmUucHJvY2VkdXJlLmRtX2ZvcnBrcmFpel9kZXNjYXJnYXIuY29yZUZ1bmN0aW9uKFxyXG4gICAgICAgIGNvbnRleHQsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvcGVyYXRpdm86IG9wZXJhdGl2byxcclxuICAgICAgICAgICAgcGVyc2lzdGVudGVzOiB7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgW1VBX1BSSU5DSVBBTF06IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2VuY106IGpzb25fZW5jdWVzdGFcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaW5mb3JtYWNpb25IZHI6IHtcclxuICAgICAgICAgICAgICAgICAgICBbZW5jXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIClcclxufVxyXG5cclxuLy8gY2FkYSBlbGVtZW50byBkZSBcImNhcmdhc1wiIHF1ZSBhcm1hIGdldEhkclF1ZXJ5IChmZWNoYSBsbGVnYSBjb21vIHRleHRvIGlzbyBkZXNkZSBlbCBqc29uKVxyXG50eXBlIENhcmdhSGRyRGIgPSB7XHJcbiAgICBjYXJnYTogbnVtYmVyIC8vIGFyZWFcclxuICAgIG9ic2VydmFjaW9uZXM6IHN0cmluZyB8IG51bGxcclxuICAgIGZlY2hhOiBzdHJpbmcgfCBudWxsXHJcbiAgICByZWNlcGNpb25pc3RhOiBzdHJpbmcgfCBudWxsXHJcbiAgICBwdWVkZV9hdXRvZ2VuZXJhcjogYm9vbGVhblxyXG59XHJcblxyXG5mdW5jdGlvbiBjYXJnYXNIZHJDb25GZWNoYURteShjYXJnYXM6IENhcmdhSGRyRGJbXSkge1xyXG4gICAgcmV0dXJuIGNhcmdhcy5tYXAoY2FyZ2EgPT4gKHsgLi4uY2FyZ2EsIGZlY2hhOiBjYXJnYS5mZWNoYSA/IGRhdGUuaXNvKGNhcmdhLmZlY2hhKS50b0RteSgpIDogbnVsbCB9KSk7XHJcbn1cclxuXHJcbnZhciBnZXRIZHJRdWVyeSA9IGZ1bmN0aW9uIGdldEhkclF1ZXJ5KHF1b3RlZENvbmRWaXY6IHN0cmluZywgY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgdW5pZGFkQW5hbGlzaXNQcmluY2lwYWw6IElkVW5pZGFkQW5hbGlzaXMsIHBlcm1pdGVHZW5lcmFyTXVlc3RyYTogYm9vbGVhbiwgaWRwZXI6c3RyaW5nKSB7XHJcbiAgICByZXR1cm4gYFxyXG4gICAgd2l0aCAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudCh1bmlkYWRBbmFsaXNpc1ByaW5jaXBhbCl9IGFzIFxyXG4gICAgICAgIChzZWxlY3QgdC5vcGVyYXRpdm8sIHQuZW5jLCB0Lmpzb25fZW5jdWVzdGEgYXMgcmVzcHVlc3RhcywgdC5yZXN1bWVuX2VzdGFkbyBhcyBcInJlc3VtZW5Fc3RhZG9cIiwgXHJcbiAgICAgICAgICAgIGpzb25iX2J1aWxkX29iamVjdChcclxuICAgICAgICAgICAgICAgICdkb21pbmlvJyAgICAgICAsIGRvbWluaW8gICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ25vbWNhbGxlJyAgICAgICwgbm9tY2FsbGUgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnc2VjdG9yJyAgICAgICAgLCBzZWN0b3IgICAgICAgICxcclxuICAgICAgICAgICAgICAgICdlZGlmaWNpbycgICAgICAsIGVkaWZpY2lvICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ2VudHJhZGEnICAgICAgICwgZW50cmFkYSAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnbnJvY2F0YXN0cmFsJyAgLCBucm9jYXRhc3RyYWwgICxcclxuICAgICAgICAgICAgICAgICdwaXNvJyAgICAgICAgICAsIHBpc28gICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ2RlcGFydGFtZW50bycgICwgZGVwYXJ0YW1lbnRvICAsXHJcbiAgICAgICAgICAgICAgICAnaGFiaXRhY2lvbicgICAgLCBoYWJpdGFjaW9uICAgICxcclxuICAgICAgICAgICAgICAgICdjYXNhJyAgICAgICAgICAsIGNhc2EgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ3ByaW9yaWRhZCcgICAgICwgcmVzZXJ2YSsxICAgICAsXHJcbiAgICAgICAgICAgICAgICAnb2JzZXJ2YWNpb25lcycgLCB0dC5jYXJnYV9vYnNlcnZhY2lvbmVzICxcclxuICAgICAgICAgICAgICAgICdjaXRhJyAgICAgICAgICAsIGNpdGEgLFxyXG4gICAgICAgICAgICAgICAgJ2NhcmdhJyAgICAgICAgICwgdC5hcmVhICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnc2VtYW5hJyAgICAgICAgLCB0LnNlbWFuYVxyXG4gICAgICAgICAgICApIGFzIHRlbSwgdC5hcmVhLFxyXG4gICAgICAgICAgICAtLVRPRE86IEdFTkVSQUxJWkFSXHJcbiAgICAgICAgICAgIGpzb25iX2J1aWxkX29iamVjdChcclxuICAgICAgICAgICAgICAgICd0YXJlYScsIHR0LnRhcmVhLFxyXG4gICAgICAgICAgICAgICAgJ2ZlY2hhX2FzaWduYWNpb24nLCBmZWNoYV9hc2lnbmFjaW9uLFxyXG4gICAgICAgICAgICAgICAgJ2FzaWduYWRvJywgYXNpZ25hZG8sXHJcbiAgICAgICAgICAgICAgICAnbWFpbl9mb3JtJywgbWFpbl9mb3JtXHJcbiAgICAgICAgICAgICkgYXMgdGFyZWEsXHJcbiAgICAgICAgICAgIG1pbihmZWNoYV9hc2lnbmFjaW9uKSBhcyBmZWNoYV9hc2lnbmFjaW9uXHJcbiAgICAgICAgICAgIGZyb20gdGVtIHQgbGVmdCBqb2luIHRhcmVhc190ZW0gdHQgb24gKHQub3BlcmF0aXZvID0gdHQub3BlcmF0aXZvIGFuZCB0LmVuYyA9IHR0LmVuYyBhbmQgdC50YXJlYV9hY3R1YWwgPSB0dC50YXJlYSlcclxuICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gdGFyZWFzIHRhIG9uIHQudGFyZWFfYWN0dWFsID0gdGEudGFyZWFcclxuICAgICAgICAgICAgd2hlcmUgdC5oYWJpbGl0YWRhIGFuZCAke3F1b3RlZENvbmRWaXZ9XHJcbiAgICAgICAgICAgIGdyb3VwIGJ5IHQub3BlcmF0aXZvLCB0LmVuYywgdC5qc29uX2VuY3Vlc3RhLCB0LnJlc3VtZW5fZXN0YWRvLCBkb21pbmlvLCBub21jYWxsZSxzZWN0b3IsZWRpZmljaW8sIGVudHJhZGEsIG5yb2NhdGFzdHJhbCwgcGlzbyxkZXBhcnRhbWVudG8saGFiaXRhY2lvbixjYXNhLHJlc2VydmEsdHQuY2FyZ2Ffb2JzZXJ2YWNpb25lcywgY2l0YSwgdC5hcmVhLCB0dC50YXJlYSwgZmVjaGFfYXNpZ25hY2lvbiwgYXNpZ25hZG8sIG1haW5fZm9ybSwgdC5zZW1hbmFcclxuICAgICAgICApXHJcbiAgICAgICAgc2VsZWN0IGpzb25iX2J1aWxkX29iamVjdChcclxuICAgICAgICAgICAgICAgICR7Y29udGV4dC5iZS5kYi5xdW90ZUxpdGVyYWwodW5pZGFkQW5hbGlzaXNQcmluY2lwYWwpfSwgJHtqc29ubyhcclxuICAgICAgICBgc2VsZWN0IGVuYywgcmVzcHVlc3RhcywganNvbmJfYnVpbGRfb2JqZWN0KCdyZXN1bWVuRXN0YWRvJyxcInJlc3VtZW5Fc3RhZG9cIikgYXMgb3RyYXMgZnJvbSAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudCh1bmlkYWRBbmFsaXNpc1ByaW5jaXBhbCl9YCxcclxuICAgICAgICAnZW5jJyxcclxuICAgICAgICBgb3RyYXMgfHwgY29hbGVzY2UocmVzcHVlc3Rhcywne30nOjpqc29uYilgXHJcbiAgICApfVxyXG4gICAgICAgICAgICApIGFzIHJlc3B1ZXN0YXMsXHJcbiAgICAgICAgICAgICR7anNvbihgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgYS5hcmVhIGFzIGNhcmdhLCBvYnNlcnZhY2lvbmVzX2hkciBhcyBvYnNlcnZhY2lvbmVzLCBtaW4oZmVjaGFfYXNpZ25hY2lvbikgYXMgZmVjaGEsIHRhLnJlY2VwY2lvbmlzdGEsXHJcbiAgICAgICAgICAgICAgICAke3Blcm1pdGVHZW5lcmFyTXVlc3RyYSA/IGBjYXNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGEuYXNpZ25hZG8gPSAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKGlkcGVyKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICBlbmRgOiBgZmFsc2VgfSBhcyBwdWVkZV9hdXRvZ2VuZXJhclxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQodW5pZGFkQW5hbGlzaXNQcmluY2lwYWwpfSBhdXggaW5uZXIgam9pbiBhcmVhcyBhIHVzaW5nIChvcGVyYXRpdm8sIGFyZWEpIGlubmVyIGpvaW4gdGFyZWFzX2FyZWFzIHRhIG9uIChhLmFyZWEgPSB0YS5hcmVhIGFuZCBhdXgudGFyZWEtPj4ndGFyZWEnID0gdGEudGFyZWEpXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgYnkgYS5hcmVhLCBvYnNlcnZhY2lvbmVzX2hkciwgdGEucmVjZXBjaW9uaXN0YSwgcHVlZGVfYXV0b2dlbmVyYXJcclxuICAgICAgICAgICAgICAgICR7cGVybWl0ZUdlbmVyYXJNdWVzdHJhID8gYFxyXG4gICAgICAgICAgICAgICAgICAgIHVuaW9uIC0tIGVzdGUgdW5pb24gcGVybWl0ZSB2aXN1YWxpemFyIGFyZWFzIGFzaWduYWRhcyBzaW4gZW5jdWVzdGFzIGdlbmVyYWRhc1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdCBhcmVhIGFzIGNhcmdhLCBudWxsIGFzIG9ic2VydmFjaW9uZXMsIG51bGwgYXMgZmVjaGEsIHJlY2VwY2lvbmlzdGEsIHRydWUgYXMgcHVlZGVfYXV0b2dlbmVyYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0YXJlYXNfYXJlYXMgd2hlcmUgYXNpZ25hZG8gPSAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKGlkcGVyKX0gYW5kIHRhcmVhID0gJ2VuY3UnYCA6ICcnfVxyXG4gICAgICAgICAgICAgICAgYCwgJ2ZlY2hhJyl9IGFzIGNhcmdhcyxcclxuICAgICAgICAgICAgJHtqc29ubyhcclxuICAgICAgICBgc2VsZWN0IGVuYywganNvbmJfYnVpbGRfb2JqZWN0KCd0ZW0nLCB0ZW0sICd0YXJlYScsIHRhcmVhKSBhcyBvdHJhcyBmcm9tICR7Y29udGV4dC5iZS5kYi5xdW90ZUlkZW50KHVuaWRhZEFuYWxpc2lzUHJpbmNpcGFsKX1gLFxyXG4gICAgICAgICdlbmMnLFxyXG4gICAgICAgIGBvdHJhcyB8fCd7fSc6Ompzb25iYFxyXG4gICAgKX1cclxuICAgICAgICAgICAgYXMgXCJpbmZvcm1hY2lvbkhkclwiXHJcbmBcclxufVxyXG5cclxuZXhwb3J0IHZhciBzZXRIZHJRdWVyeSA9IChteUZ1bjogKHF1b3RlZENvbmRWaXY6IHN0cmluZywgY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgdW5pZGFkQW5hbGlzaXNQcmluY2lwYWw6IElkVW5pZGFkQW5hbGlzaXMsIHBlcm1pdGVHZW5lcmFyTXVlc3RyYTogYm9vbGVhbiwgaWRwZXI6IHN0cmluZykgPT4gc3RyaW5nKSA9PiBnZXRIZHJRdWVyeSA9IG15RnVuXHJcblxyXG5jb25zdCBnZXRVQVByaW5jaXBhbCA9IGFzeW5jIChjbGllbnQ6IENsaWVudCwgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bykgPT5cclxuICAgIChhd2FpdCBjbGllbnQucXVlcnkoXHJcbiAgICAgICAgYHNlbGVjdCAqXHJcbiAgICAgICAgICAgIGZyb20gdW5pZGFkX2FuYWxpc2lzXHJcbiAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIHByaW5jaXBhbFxyXG4gICAgICAgIGBcclxuICAgICAgICAsXHJcbiAgICAgICAgW29wZXJhdGl2b11cclxuICAgICkuZmV0Y2hVbmlxdWVSb3coKSkucm93XHJcblxyXG52YXIgZnVuY2lvbmVzQ29ub2NpZGFzOiB7IFtrIGluIHN0cmluZ106IGJvb2xlYW4gfSA9IHt9XHJcblxyXG52YXIgY29tcGlsZXIgPSBuZXcgRXhwcmVzaW9uUGFyc2VyLkNvbXBpbGVyKHtcclxuICAgIGxhbmd1YWdlOiAnanMnLFxyXG4gICAgdmFyV3JhcHBlcjogKHZhcl9uYW1lOiBzdHJpbmcpID0+IGBoZWxwZXJzLm51bGwyemVybyh2YWxvcmVzLiR7dmFyX25hbWV9KWAsXHJcbiAgICBmdW5XcmFwcGVyOiAoZnVuY3Rpb25OYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoIWZ1bmNpb25lc0Nvbm9jaWRhc1tmdW5jdGlvbk5hbWVdKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGZ1bmN0aW9uTmFtZSlcclxuICAgICAgICAgICAgZnVuY2lvbmVzQ29ub2NpZGFzW2Z1bmN0aW9uTmFtZV0gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYGhlbHBlcnMuZnVucy4ke2Z1bmN0aW9uTmFtZX1gXHJcbiAgICB9XHJcbn0pXHJcblxyXG50eXBlIENhc2lsbGVyb0RlQWNhID0ge1xyXG4gICAgY2hpbGRzOiBDYXNpbGxlcm9EZUFjYVtdLFxyXG4gICAgZGF0YToge1xyXG4gICAgICAgIGV4cHJlc2lvbl9oYWJpbGl0YXI6IHN0cmluZ1xyXG4gICAgICAgIGV4cHJlc2lvbl9oYWJpbGl0YXJfanM6IHN0cmluZ1xyXG4gICAgICAgIGVzcGVjaWFsOiBhbnlcclxuICAgICAgICBleHByZXNpb25fYXV0b2luZ3Jlc2FyX2pzOiBzdHJpbmdcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY29tcGlsYXJFeHByZXNpb24oZXhwcmVzaW9uOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBjb21waWxlci50b0NvZGUoRXhwcmVzaW9uUGFyc2VyLnBhcnNlKFxyXG4gICAgICAgIGV4cHJlc2lvblxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxiaXMgZGlzdGluY3QgZnJvbVxcYi9naSwgJyA8PiAnKVxyXG4gICAgICAgICAgICAucmVwbGFjZSgvISEvZ2ksICcgJylcclxuICAgICkpLnJlcGxhY2UoL2hlbHBlcnNcXC5mdW5zXFwuYmxhbmNvXFwoaGVscGVycy5udWxsMnplcm9cXCgvZywgJ2hlbHBlcnMuZnVucy5ibGFuY28oKCcpXHJcbiAgICAgICAgLnJlcGxhY2UoL2hlbHBlcnNcXC5mdW5zXFwuaW5mb3JtYWRvXFwoaGVscGVycy5udWxsMnplcm9cXCgvZywgJ2hlbHBlcnMuZnVucy5pbmZvcm1hZG8oKCcpO1xyXG59XHJcblxyXG4vLyByZWEvbm8gcmVhICh5IHN1cyB2ZXJzaW9uZXMgX3N1cCkgZGVsIG9wZXJhdGl2bywgdG9tYWRhcyBkZSBsYXMgY2FjaGVzLCBwYXJhIGxhIGVzdHJ1Y3R1cmEgcXVlIHNlIG1hbmRhIGFsIGRpc3Bvc2l0aXZvLlxyXG4vLyBMYXMgY29uZGljaW9uZXMgZGUgcmVhIHNlIGNvbXBpbGFuIGEganMgKGNvbmRpY2lvbl9qcykgcGFyYSBldmFsdWFybGFzIGVuIGVsIGRpc3Bvc2l0aXZvLlxyXG5leHBvcnQgZnVuY3Rpb24gcmVhc05vUmVhc0RlbE9wZXJhdGl2byh0YWJsZUNvbnRlbnQ6IEFwcEJhY2tlbmRbJ2NhY2hlcyddWyd0YWJsZUNvbnRlbnQnXSwgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bykge1xyXG4gICAgdmFyIG5vUmVhc0NhY2hlOiBOb1JlYVtdID0gdGFibGVDb250ZW50Lm5vX3JlYSB8fCBbXTtcclxuICAgIHZhciBub1JlYXNTdXBDYWNoZTogTm9SZWFTdXBbXSA9IHRhYmxlQ29udGVudC5ub19yZWFfc3VwIHx8IFtdO1xyXG4gICAgdmFyIHJlYXNDYWNoZTogT21pdDxSZWEsICdjb25kaWNpb25fanMnPltdID0gdGFibGVDb250ZW50LnJlYSB8fCBbXTtcclxuICAgIHZhciByZWFzU3VwQ2FjaGU6IE9taXQ8UmVhU3VwLCAnY29uZGljaW9uX2pzJz5bXSA9IHRhYmxlQ29udGVudC5yZWFfc3VwIHx8IFtdO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBub1JlYXM6IG5vUmVhc0NhY2hlLmZpbHRlcihub1JlYSA9PiBub1JlYS5vcGVyYXRpdm8gPT0gb3BlcmF0aXZvKSxcclxuICAgICAgICBub1JlYXNTdXA6IG5vUmVhc1N1cENhY2hlLmZpbHRlcihub1JlYVN1cCA9PiBub1JlYVN1cC5vcGVyYXRpdm8gPT0gb3BlcmF0aXZvKSxcclxuICAgICAgICByZWFzOiByZWFzQ2FjaGUuZmlsdGVyKHJlYSA9PiByZWEub3BlcmF0aXZvID09IG9wZXJhdGl2bylcclxuICAgICAgICAgICAgLm1hcCgocmVhKTogUmVhID0+ICh7IC4uLnJlYSwgY29uZGljaW9uX2pzOiBjb21waWxhckV4cHJlc2lvbihyZWEuY29uZGljaW9uKSB9KSksXHJcbiAgICAgICAgcmVhc1N1cDogcmVhc1N1cENhY2hlLmZpbHRlcihyZWFTdXAgPT4gcmVhU3VwLm9wZXJhdGl2byA9PSBvcGVyYXRpdm8pXHJcbiAgICAgICAgICAgIC5tYXAoKHJlYVN1cCk6IFJlYVN1cCA9PiAoeyAuLi5yZWFTdXAsIGNvbmRpY2lvbl9qczogY29tcGlsYXJFeHByZXNpb24ocmVhU3VwLmNvbmRpY2lvbikgfSkpLFxyXG4gICAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29tcGlsYXJFeHByZXNpb25lcyhjYXNpbGxlcm86IENhc2lsbGVyb0RlQWNhKSB7XHJcbiAgICBpZiAoIWNhc2lsbGVybykgeyByZXR1cm4gfVxyXG4gICAgaWYgKGNhc2lsbGVyby5kYXRhLmV4cHJlc2lvbl9oYWJpbGl0YXIpIHtcclxuICAgICAgICBjYXNpbGxlcm8uZGF0YS5leHByZXNpb25faGFiaWxpdGFyX2pzID0gY29tcGlsYXJFeHByZXNpb24oY2FzaWxsZXJvLmRhdGEuZXhwcmVzaW9uX2hhYmlsaXRhcik7XHJcbiAgICB9XHJcbiAgICBpZiAoY2FzaWxsZXJvLmRhdGEuZXNwZWNpYWw/LmF1dG9pbmcpIHtcclxuICAgICAgICB2YXIgcGFydGVzID0gY2FzaWxsZXJvLmRhdGEuZXNwZWNpYWw/LmF1dG9pbmcuc3BsaXQoJz0+Jyk7XHJcbiAgICAgICAgaWYgKHBhcnRlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHZhciBwcmVjb25kaWNpb24gPSBwYXJ0ZXNbMF07XHJcbiAgICAgICAgICAgIHZhciB2YWxvciA9IHBhcnRlcy5zbGljZSgxKS5qb2luKCc9PicpO1xyXG4gICAgICAgICAgICBjYXNpbGxlcm8uZGF0YS5leHByZXNpb25fYXV0b2luZ3Jlc2FyX2pzID0gYCgke2NvbXBpbGFyRXhwcmVzaW9uKHByZWNvbmRpY2lvbil9KT8oJHtjb21waWxhckV4cHJlc2lvbih2YWxvcil9KTpudWxsYDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjYXNpbGxlcm8uZGF0YS5leHByZXNpb25fYXV0b2luZ3Jlc2FyX2pzID0gY29tcGlsYXJFeHByZXNpb24ocGFydGVzWzBdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKHZhciBjYXNpbGxlcm9JbnRlcm5vIG9mIGNhc2lsbGVyby5jaGlsZHMpIGNvbXBpbGFyRXhwcmVzaW9uZXMoY2FzaWxsZXJvSW50ZXJubyk7XHJcbn1cclxuXHJcbmNvbnN0IGdlbmVyYXJFbmN1ZXN0YVRlbSA9IGFzeW5jIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBpZEVuYzogSWRFbmMsIGFyZWE6IG51bWJlciwgZG9taW5pbzogbnVtYmVyLCB0YXJlYV9hY3R1YWw6IElkVGFyZWEpID0+IHtcclxuICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICBJTlNFUlQgaW50byB0ZW0gKG9wZXJhdGl2bywgZW5jLCBhcmVhLCBkb21pbmlvLCBoYWJpbGl0YWRhLCB0YXJlYV9hY3R1YWwpIHZhbHVlcyAoJDEsICQyLCAkMywgJDQsICQ1LCAkNilgLFxyXG4gICAgICAgIFtvcGVyYXRpdm8sIGlkRW5jLCBhcmVhLCBkb21pbmlvLCB0cnVlLCB0YXJlYV9hY3R1YWxdKS5leGVjdXRlKCk7XHJcbn1cclxuXHJcbmNvbnN0IGdlbmVyYXJUYXJlYXNUZW1GYWx0YW50ZXMgPSBhc3luYyAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bykgPT4ge1xyXG4gICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgIGluc2VydCBpbnRvIHRhcmVhc190ZW0gKG9wZXJhdGl2bywgZW5jLCB0YXJlYSlcclxuICAgICAgICAgICAgc2VsZWN0IHRhLm9wZXJhdGl2bywgdGEuZW5jLCB0YS50YXJlYVxyXG4gICAgICAgICAgICBmcm9tIChzZWxlY3QgdGEuKiwgdC5lbmMsdC5hcmVhIGZyb20gdGFyZWFzIHRhLCB0ZW0gdCB3aGVyZSB0YS5vcGVyYXRpdm89dC5vcGVyYXRpdm8pIHRhIFxyXG4gICAgICAgICAgICB3aGVyZSB0YS5vcGVyYXRpdm8gPSAkMSBcclxuICAgICAgICAgICAgICAgIGFuZCBub3QgKHRhLm9wZXJhdGl2bywgdGEuZW5jLCB0YS50YXJlYSkgaW4gKHNlbGVjdCBvcGVyYXRpdm8sIGVuYywgdGFyZWEgZnJvbSB0YXJlYXNfdGVtKVxyXG4gICAgICAgICAgICBvcmRlciBieSAxLDMsMjtcclxuICAgIGAsIFtvcGVyYXRpdm9dKS5leGVjdXRlKCk7XHJcbn1cclxuXHJcbmNvbnN0IGJ1c2NhckVuY3Vlc3RhRW5UZW0gPSBhc3luYyAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPGFueT4pID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgIGZyb20gdGVtXHJcbiAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgLS1wayB2ZXJpZmljYWRhXHJcbiAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoYE5vIHNlIGVuY29udHLDsyBsYSBlbmN1ZXN0YSAke3BhcmFtcy5lbmN9IHBhcmEgZWwgb3BlcmF0aXZvICR7cGFyYW1zLm9wZXJhdGl2b30uICR7ZXhwZWN0ZWQoZXJyKS5tZXNzYWdlfWApXHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBjYXNvVGVtOiByZXN1bHQucm93IH07XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXNhckVuY3Vlc3Rhc0FQcm9pZShjbGllbnQ6IENsaWVudCkge1xyXG4gICAgbGV0IHBhcmFtZXRyb3MgPSAoYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCAqIGZyb20gcGFyYW1ldHJvcyB3aGVyZSB1bmljb19yZWdpc3Ryb2AsXHJcbiAgICAgICAgW10pLmZldGNoVW5pcXVlUm93KCkpLnJvdztcclxuICAgIHZhciBzZWxlY3QgPSBgc2VsZWN0IHQub3BlcmF0aXZvLCB0LmVuYywgdC50YXJlYV9hY3R1YWwsIHR0LnRzX2VudHJhZGFcclxuICAgICAgICBmcm9tIHRhcmVhc190ZW0gdHQgam9pbiB0ZW0gdCB1c2luZyAob3BlcmF0aXZvLGVuYylcclxuICAgICAgICB3aGVyZSB0dC5vcGVyYXRpdm89JDEgYW5kIHR0LnRhcmVhPSAkMiBhbmQgKCR7Z2V0RGlhc0FQYXNhclF1ZXJ5KCd0dCcpfSA8PSAwIG9yIGNvYWxlc2NlKHR0LmFkZWxhbnRhcixmYWxzZSkpIGFuZCB0dC50YXJlYSA9IHQudGFyZWFfYWN0dWFsXHJcbiAgICBgO1xyXG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICBVUERBVEUgdGFyZWFzX3RlbSB0dFxyXG4gICAgICAgICAgICBzZXQgZXN0YWRvID0gJ1YnXHJcbiAgICAgICAgICAgIGZyb20gKCR7c2VsZWN0fSkgYXV4XHJcbiAgICAgICAgICAgIHdoZXJlIHR0Lm9wZXJhdGl2byA9IGF1eC5vcGVyYXRpdm8gYW5kIHR0LmVuYyA9IGF1eC5lbmMgYW5kIHR0LnRhcmVhID0gJDNcclxuICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgIFtwYXJhbWV0cm9zLm9wZXJhdGl2bywgJ2ZpbmMnLCAnZmluYyddKVxyXG4gICAgICAgIC5mZXRjaEFsbCgpO1xyXG4gICAgLy9UT0RPIGFzaWduYXIgZW4gcHJvY2VzYW1pZW50b1xyXG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICBVUERBVEUgdGFyZWFzX3RlbSB0dFxyXG4gICAgICAgICAgICBzZXQgZXN0YWRvID0gJ0EnXHJcbiAgICAgICAgICAgIGZyb20gKCR7c2VsZWN0fSkgYXV4XHJcbiAgICAgICAgICAgIHdoZXJlIHR0Lm9wZXJhdGl2byA9IGF1eC5vcGVyYXRpdm8gYW5kIHR0LmVuYyA9IGF1eC5lbmMgYW5kIHR0LnRhcmVhID0gJDNcclxuICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgIFtwYXJhbWV0cm9zLm9wZXJhdGl2bywgJ2ZpbmMnLCAncHJvYyddKVxyXG4gICAgICAgIC5mZXRjaEFsbCgpO1xyXG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICB1cGRhdGUgdGVtIHRcclxuICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICdwcm9jJ1xyXG4gICAgICAgICAgICBmcm9tICgke3NlbGVjdH0pIGF1eFxyXG4gICAgICAgICAgICB3aGVyZSB0Lm9wZXJhdGl2byA9IGF1eC5vcGVyYXRpdm8gYW5kIHQuZW5jID0gYXV4LmVuY1xyXG4gICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgW3BhcmFtZXRyb3Mub3BlcmF0aXZvLCAnZmluYyddKS5mZXRjaEFsbCgpO1xyXG4gICAgcmV0dXJuICdvayc7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBQcm9jZWR1cmVzRG1FbmN1OiBQcm9jZWR1cmVEZWZbXSA9IFtcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdvcGVyYXRpdm9fZXN0cnVjdHVyYV9jb21wbGV0YScsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnLCByZWZlcmVuY2VzOiAnb3BlcmF0aXZvcycgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnaWRwZXJfbG9ndWVhZG9fdGFibGV0JywgdHlwZU5hbWU6ICd0ZXh0JywgZGVmYXVsdFZhbHVlOm51bGwgfSxcclxuXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazonZGVzcGxlZ2FyRm9ybXVsYXJpbycsXHJcbiAgICAgICAgdW5sb2dnZWQ6IHRydWUsIFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7b3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgaWRwZXJfbG9ndWVhZG9fdGFibGV0OiBzdHJpbmd8bnVsbH0+KXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHNlbGVjdCBjYXNpbGxlcm9zX2plcmFycXVpemFkb3MoJDEpIGFzIGZvcm11bGFyaW9zLCBcclxuICAgICAgICAgICAgICAgICAgICAke2pzb25vKGBzZWxlY3QgdW5pZGFkX2FuYWxpc2lzLCBwYWRyZSwgcGtfYWdyZWdhZGEsICd7fSc6Ompzb25iIGFzIGhpamFzIGZyb20gdW5pZGFkX2FuYWxpc2lzIHdoZXJlIG9wZXJhdGl2byA9ICQyYCwgJ3VuaWRhZF9hbmFsaXNpcycpfSBhcyB1bmlkYWRlc19hbmFsaXNpc1xyXG4gICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXJzLm9wZXJhdGl2bywgcGFyYW1ldGVycy5vcGVyYXRpdm9dXHJcbiAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgbGlrZUFyKHJlc3VsdC5yb3cuZm9ybXVsYXJpb3MpLmZvckVhY2goZiA9PiBjb21waWxhckV4cHJlc2lvbmVzKGYpKTtcclxuICAgICAgICAgICAgLy8gSGVybWFub3Mgc29uIGxvcyBmb3JtdWxhcmlvcyBxdWUgZXN0w6FuIGltcGxhbnRhZG9zIGVuIG90cm8gZm9ybXVsYXJpbyBkZSBsYSBtaXNtYSBVQS4gUG9yIGVqZW1wbG8gZWwgQTEgZW4gZWwgUzFcclxuICAgICAgICAgICAgdmFyIHJlc3VsdEhlcm1hbm9zID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG5zZWxlY3Qgby5pZF9jYXNpbGxlcm8gYXMgaWRfZm9ybXVsYXJpbywgby51bmlkYWRfYW5hbGlzaXMsICdCRl8nfHxvLmNhc2lsbGVybyBib3RvbiwgYmYuY2FzaWxsZXJvLCBiZi5wYWRyZSwgZnAuY2FzaWxsZXJvLCBmcC51bmlkYWRfYW5hbGlzaXNcclxuICBmcm9tIGNhc2lsbGVyb3MgbyBsZWZ0IGpvaW4gY2FzaWxsZXJvcyBiZlxyXG4gICAgb24gYmYudGlwb2M9J0JGJ1xyXG5cdGFuZCBiZi5jYXNpbGxlcm8gPSAnQkZfJ3x8by5jYXNpbGxlcm9cclxuXHRhbmQgYmYub3BlcmF0aXZvID0gby5vcGVyYXRpdm9cclxuXHRsZWZ0IGpvaW4gY2FzaWxsZXJvcyBmcFxyXG5cdCAgb24gZnAuaWRfY2FzaWxsZXJvID0gYmYucGFkcmVcclxuXHQgIGFuZCBmcC5vcGVyYXRpdm8gPSBiZi5vcGVyYXRpdm9cclxuICB3aGVyZSBvLnRpcG9jID0gJ0YnXHJcbiAgICBhbmQgby51bmlkYWRfYW5hbGlzaXMgPSBmcC51bmlkYWRfYW5hbGlzaXNcclxuXHRhbmQgby5vcGVyYXRpdm8gPSAkMWAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1ldGVycy5vcGVyYXRpdm9dXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgcmVzdWx0SGVybWFub3Mucm93cy5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucm93LmZvcm11bGFyaW9zW3Jvdy5pZF9mb3JtdWxhcmlvXS5kYXRhLmhlcm1hbm8gPSB0cnVlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBmdW5jdGlvbiBjb21wbGV0YXJVQSh1YTogVW5pZGFkQW5hbGlzaXMsIGlkVWE6IElkVW5pZGFkQW5hbGlzaXMsIHVBczogeyBbayBpbiBJZFVuaWRhZEFuYWxpc2lzXTogVW5pZGFkQW5hbGlzaXMgfSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVhLnBhZHJlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdUFzW3VhLnBhZHJlXS5oaWphc1tpZFVhXSA9IHVhO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB1YS5wcmluY2lwYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxpa2VBcihyZXN1bHQucm93LnVuaWRhZGVzX2FuYWxpc2lzKS5mb3JFYWNoKCh1YSwgaWRVYSkgPT5cclxuICAgICAgICAgICAgICAgIGNvbXBsZXRhclVBKHVhLCBpZFVhIGFzIElkVW5pZGFkQW5hbGlzaXMsIHJlc3VsdC5yb3cudW5pZGFkZXNfYW5hbGlzaXMpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgdmFyIHtcclxuICAgICAgICAgICAgICAgIGNvbl9yZWFfaG9nYXI6IGNvblJlYUhvZ2FyLFxyXG4gICAgICAgICAgICAgICAgY29uZmlnX3NvcnRlbzogY29uZmlnU29ydGVvLFxyXG4gICAgICAgICAgICAgICAgaGFiaWxpdGFjaW9uX2JvdG9uX2Zvcm11bGFyaW86IGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgfSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgY29uZmlnX3NvcnRlbywgY29uX3JlYV9ob2dhciwgaGFiaWxpdGFjaW9uX2JvdG9uX2Zvcm11bGFyaW8sIHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gb3BlcmF0aXZvcyBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMVxyXG4gICAgICAgICAgICBgLCBbcGFyYW1ldGVycy5vcGVyYXRpdm9dKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3c7XHJcblxyXG4gICAgICAgICAgICB2YXIgc2VtYW5hcyA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgIFxyXG4gICAgICAgICAgICAgICAgICAgICR7anNvbm8oYHNlbGVjdCAqIGZyb20gc2VtYW5hcyB3aGVyZSBvcGVyYXRpdm8gPSAkMWAsICdzZW1hbmEnKX0gYXMgc2VtYW5hc1xyXG4gICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXJzLm9wZXJhdGl2b11cclxuICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3cuc2VtYW5hcztcclxuICAgICAgICAgICAgbGV0IGNvbXBpbGFyRXhwcmVzaW9uZXNEb21pbmlvcyA9IChleHByZXNpb25lc0RvbWluaW86IGFueSkgPT5cclxuICAgICAgICAgICAgICAgIGxpa2VBcihleHByZXNpb25lc0RvbWluaW8pXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoZXhwciwgZG9taW5pbykgPT4gKHsgZG9taW5pbywgZXhwcjogY29tcGlsYXJFeHByZXNpb24oZXhwci5leHByKSB9KSlcclxuICAgICAgICAgICAgICAgICAgICAucGxhaW4oKTtcclxuICAgICAgICAgICAgaWYgKGNvbmZpZ1NvcnRlbykge1xyXG4gICAgICAgICAgICAgICAgbGlrZUFyKGNvbmZpZ1NvcnRlbykuZm9yRWFjaCgoY29uZmlnU29ydGVvRm9ybXVsYXJpbykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uZXhwcl9pbmNvbXBsZXRpdHVkX2pzID0gY29tcGlsYXJFeHByZXNpb25lc0RvbWluaW9zKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uZXhwcl9pbmNvbXBsZXRpdHVkKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uZmlsdHJvX2pzID0gY29tcGlsYXJFeHByZXNpb25lc0RvbWluaW9zKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uZmlsdHJvKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvKSB7XHJcbiAgICAgICAgICAgICAgICBsaWtlQXIoaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvKS5mb3JFYWNoKChmb3JtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybS5leHByX2hhYmlsaXRhcl9ib3Rvbl9qcyA9IGNvbXBpbGFyRXhwcmVzaW9uKGZvcm0uZXhwcl9oYWJpbGl0YXJfYm90b24pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBkZWZhdWx0VGFyZWEgPSBhd2FpdCBnZXREZWZhdWx0VGFyZWEoY29udGV4dCwgcGFyYW1ldGVycy5vcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICB2YXIgZGVmYXVsdEluZm9ybWFjaW9uSGRyID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHNlbGVjdCAgXHJcbiAgICAgICAgICAgICAgICAgICAganNvbmJfYnVpbGRfb2JqZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICdkb21pbmlvJyAgICAgICAsICR7Y29udGV4dC5iZS5kYi5xdW90ZUxpdGVyYWwoREVGQVVMVF9ET01JTklPKX0sXHJcbiAgICAgICAgICAgICAgICAgICAgJ25vbWNhbGxlJyAgICAgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3NlY3RvcicgICAgICAgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2VkaWZpY2lvJyAgICAgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2VudHJhZGEnICAgICAgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ25yb2NhdGFzdHJhbCcgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3Bpc28nICAgICAgICAgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RlcGFydGFtZW50bycgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2hhYml0YWNpb24nICAgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2Nhc2EnICAgICAgICAgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3ByaW9yaWRhZCcgICAgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ29ic2VydmFjaW9uZXMnICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2NpdGEnICAgICAgICAgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2NhcmdhJyAgICAgICAgICwgbnVsbCAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3NlbWFuYScgICAgICAgICwgbnVsbFxyXG4gICAgICAgICAgICAgICAgKSBhcyB0ZW0sXHJcbiAgICAgICAgICAgICAgICBqc29uYl9idWlsZF9vYmplY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgJ3RhcmVhJywgJHtjb250ZXh0LmJlLmRiLnF1b3RlTGl0ZXJhbChkZWZhdWx0VGFyZWEudGFyZWEpfSxcclxuICAgICAgICAgICAgICAgICAgICAnZmVjaGFfYXNpZ25hY2lvbicsIG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2FzaWduYWRvJywgJHtjb250ZXh0LmJlLmRiLnF1b3RlTGl0ZXJhbChwYXJhbWV0ZXJzLmlkcGVyX2xvZ3VlYWRvX3RhYmxldCB8fCBjb250ZXh0LnVzZXIuaWRwZXIpfSxcclxuICAgICAgICAgICAgICAgICAgICAnbWFpbl9mb3JtJywgJHtjb250ZXh0LmJlLmRiLnF1b3RlTGl0ZXJhbChkZWZhdWx0VGFyZWEubWFpbl9mb3JtKX1cclxuICAgICAgICAgICAgICAgICkgYXMgdGFyZWFcclxuICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICBbXVxyXG4gICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCkpLnJvdztcclxuICAgICAgICAgICAgdmFyIHsgdW5pZGFkX2FuYWxpc2lzLCBwa19hZ3JlZ2FkYSB9ID0gKGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBwYXJhbWV0ZXJzLm9wZXJhdGl2bykpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBiZS5jYWNoZXMudGltZXN0YW1wRXN0cnVjdHVyYSxcclxuICAgICAgICAgICAgICAgIC4uLnJlc3VsdC5yb3csXHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm86IHBhcmFtZXRlcnMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgY29uUmVhSG9nYXIsXHJcbiAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW8sXHJcbiAgICAgICAgICAgICAgICBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8sXHJcbiAgICAgICAgICAgICAgICAuLi5yZWFzTm9SZWFzRGVsT3BlcmF0aXZvKGJlLmNhY2hlcy50YWJsZUNvbnRlbnQsIHBhcmFtZXRlcnMub3BlcmF0aXZvKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRJbmZvcm1hY2lvbkhkcixcclxuICAgICAgICAgICAgICAgIHVhUHBhbDogdW5pZGFkX2FuYWxpc2lzLFxyXG4gICAgICAgICAgICAgICAgc2VtYW5hcyxcclxuICAgICAgICAgICAgICAgIHBrQWdyZWdhZGFVYVBwYWw6IHBrX2FncmVnYWRhXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdnZW5lcmFyX2Zvcm11bGFyaW9zJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2FubmlvJywgdHlwZU5hbWU6ICdpbnRlZ2VyJywgcmVmZXJlbmNlczogJ2FubmlvJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdtZXMnLCB0eXBlTmFtZTogJ2ludGVnZXInLCByZWZlcmVuY2VzOiAnbWVzJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdsb3RlJywgdHlwZU5hbWU6ICdpbnRlZ2VyJywgcmVmZXJlbmNlczogJ2xvdGVzJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHthbm5pbzpudW1iZXIsIG1lczpudW1iZXIsIGxvdGU6bnVtYmVyfT4pe1xyXG4gICAgICAgICAgICB2YXIgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgY29uc3QgT1BFUkFUSVZPID0gYXdhaXQgZ2V0T3BlcmF0aXZvQWN0dWFsKGNvbnRleHQpO1xyXG4gICAgICAgICAgICBsZXQgdWFQcGFsID0gYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIE9QRVJBVElWTyk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRQcmVndW50YXMgPSBhd2FpdCBiZS5wcm9jZWR1cmUucHJlZ3VudGFzX3VhX3RyYWVyLmNvcmVGdW5jdGlvbihjb250ZXh0LCB1YVBwYWwpXHJcbiAgICAgICAgICAgIHZhciBjb250ZW5lZG9yVmFjaW86IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgICAgICAgICAgcmVzdWx0UHJlZ3VudGFzLmZvckVhY2goZnVuY3Rpb24gKGRlZlByZWd1bnRhOmFueSkge1xyXG4gICAgICAgICAgICAgICAgY29udGVuZWRvclZhY2lvW2RlZlByZWd1bnRhLnZhcl9uYW1lXSA9IGRlZlByZWd1bnRhLnVuaWRhZF9hbmFsaXNpcyA/IFtdIDogbnVsbDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnRlbmVkb3JWYWNpby5hbm5pbyA9IHBhcmFtZXRlcnMuYW5uaW87XHJcbiAgICAgICAgICAgIGNvbnRlbmVkb3JWYWNpby5tZXMgPSBwYXJhbWV0ZXJzLm1lcztcclxuICAgICAgICAgICAgY29udGVuZWRvclZhY2lvLmxvdGUgPSBwYXJhbWV0ZXJzLmxvdGU7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0IGRlYmVfaGFiZXIuaWRfY2FzbywgcyBhcyBpZFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gKHNlbGVjdCBsb3RlLCBhcm1hcl9pZChhbm5pbywgbWVzLCBsb3RlLCBzKSBhcyBpZF9jYXNvLCBzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKHNlbGVjdCBhbm5pbyxtZXMsbG90ZSwgY2FudF9jdWVzIGZyb20gbG90ZXMgd2hlcmUgKGFubmlvLG1lcyxsb3RlKT0oJDIsJDMsJDQpKSByLCBsYXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLGNhbnRfY3Vlcykgc1xyXG4gICAgICAgICAgICAgICAgICAgICkgZGViZV9oYWJlciBsZWZ0IGpvaW4gZGVmZ2VuIGhheSBvbiBoYXkuaWRfY2FzbyA9IGRlYmVfaGFiZXIuaWRfY2FzbyBhbmQgaGF5Lm9wZXJhdGl2bz0kMVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIGhheS5pZF9jYXNvIGlzIG51bGxgLFxyXG4gICAgICAgICAgICAgICAgW09QRVJBVElWTywgcGFyYW1ldGVycy5hbm5pbywgcGFyYW1ldGVycy5tZXMsIHBhcmFtZXRlcnMubG90ZV1cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICB2YXIgcGFyYW1zID0geyBvcGVyYXRpdm86IE9QRVJBVElWTyB9O1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IChyZXN1bHQucm93Q291bnQgfHwgMCk7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmNhc29fZ3VhcmRhci5jb3JlRnVuY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2luZyhwYXJhbXMsIHsgaWRfY2FzbzogcmVzdWx0LnJvd3NbaV0uaWRfY2FzbywgZGF0b3NfY2FzbzogY2hhbmdpbmcoY29udGVuZWRvclZhY2lvLCB7IGlkOiByZXN1bHQucm93c1tpXS5pZCB9KSB9KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7IGFncmVnYWRhczogcmVzdWx0LnJvd0NvdW50IH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ3VwbG9hZF9maWxlJyxcclxuICAgICAgICBwcm9ncmVzczogdHJ1ZSxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2lkX2FkanVudG8nLCB0eXBlTmFtZTogJ2ludGVnZXInIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ25vbWJyZScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGZpbGVzOntjb3VudDoxfSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246ZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOkNvcmVGdW5jdGlvblBhcmFtZXRlcnM8e2lkX2FkanVudG8/Om51bWJlciwgbm9tYnJlPzpzdHJpbmd9PiwgZmlsZXMpe1xyXG4gICAgICAgICAgICBsZXQgYmU9Y29udGV4dC5iZTtcclxuICAgICAgICAgICAgbGV0IGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgY29udGV4dC5pbmZvcm1Qcm9ncmVzcyh7bWVzc2FnZTpiZS5tZXNzYWdlcy5maWxlVXBsb2FkZWR9KTtcclxuICAgICAgICAgICAgLy9AdHMtaWdub3JlIGV4aXN0ZVxyXG4gICAgICAgICAgICBsZXQgZmlsZSA9IGZpbGVzWzBdXHJcbiAgICAgICAgICAgIGxldCBleHQgPSBQYXRoLmV4dG5hbWUoZmlsZS5wYXRoKS5zdWJzdHIoMSk7XHJcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbEZpbGVuYW1lID0gZmlsZS5vcmlnaW5hbEZpbGVuYW1lLnNsaWNlKDAsIC0oZXh0Lmxlbmd0aCArIDEpKTtcclxuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gcGFyYW1ldGVycy5ub21icmUgfHwgb3JpZ2luYWxGaWxlbmFtZTtcclxuICAgICAgICAgICAgbGV0IG5ld1BhdGggPSAnbG9jYWwtYXR0YWNobWVudHMvZmlsZS0nO1xyXG4gICAgICAgICAgICB2YXIgY3JlYXRlUmVzcG9uc2UgPSBmdW5jdGlvbiBjcmVhdGVSZXNwb25zZShhZGp1bnRvUm93OmFueSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdGFkbyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTGEgc3ViaWRhIHNlIHJlYWxpesOzIGNvcnJlY3RhbWVudGUgKHVwZGF0ZSknLFxyXG4gICAgICAgICAgICAgICAgICAgIG5vbWJyZTogYWRqdW50b1Jvdy5ub21icmUsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9tYnJlX29yaWdpbmFsOiBhZGp1bnRvUm93Lm5vbWJyZV9vcmlnaW5hbCxcclxuICAgICAgICAgICAgICAgICAgICBleHQ6IGFkanVudG9Sb3cuZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGZlY2hhOiBhZGp1bnRvUm93LmZlY2hhLFxyXG4gICAgICAgICAgICAgICAgICAgIGhvcmE6IGFkanVudG9Sb3cuaG9yYSxcclxuICAgICAgICAgICAgICAgICAgICBpZF9hZGp1bnRvOiBhZGp1bnRvUm93LmlkX2FkanVudG9cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRhZG9cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgICAgdmFyIG1vdmVGaWxlID0gZnVuY3Rpb24gbW92ZUZpbGUoZmlsZSwgaWRfYWRqdW50bywgZXh0ZW5zaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIGZzLm1vdmUoZmlsZS5wYXRoLCBuZXdQYXRoICsgaWRfYWRqdW50byArICcuJyArIGV4dGVuc2lvbiwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMuaWRfYWRqdW50bykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNsaWVudC5xdWVyeShgdXBkYXRlIGFkanVudG9zIHNldCBub21icmU9ICQxLG5vbWJyZV9vcmlnaW5hbCA9ICQyLCBleHQgPSAkMywgcnV0YSA9IGNvbmNhdCgnbG9jYWwtYXR0YWNobWVudHMvZmlsZS0nLCQ0Ojp0ZXh0LCcuJywkMzo6dGV4dCksIGZlY2hhID0gbm93KCksIGhvcmEgPSBkYXRlX3RydW5jKCdzZWNvbmRzJyxjdXJyZW50X3RpbWVzdGFtcC1jdXJyZW50X2RhdGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGlkX2FkanVudG8gPSAkNCByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlbmFtZSwgb3JpZ2luYWxGaWxlbmFtZSwgZXh0LCBwYXJhbWV0ZXJzLmlkX2FkanVudG9dXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVzcG9uc2UocmVzdWx0LnJvdylcclxuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHRhZG8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUZpbGUoZmlsZSwgcmVzdWx0YWRvLmlkX2FkanVudG8sIHJlc3VsdGFkby5leHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0YWRvXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNsaWVudC5xdWVyeShgaW5zZXJ0IGludG8gYWRqdW50b3MgKG5vbWJyZSwgbm9tYnJlX29yaWdpbmFsLCBleHQsIGZlY2hhLCBob3JhKSB2YWx1ZXMgKCQxLCQyLCQzLG5vdygpLCBkYXRlX3RydW5jKCdzZWNvbmRzJyxjdXJyZW50X3RpbWVzdGFtcC1jdXJyZW50X2RhdGUpKSByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlbmFtZSwgb3JpZ2luYWxGaWxlbmFtZSwgZXh0XVxyXG4gICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY2xpZW50LnF1ZXJ5KGB1cGRhdGUgYWRqdW50b3Mgc2V0IHJ1dGEgPSBjb25jYXQoJ2xvY2FsLWF0dGFjaG1lbnRzL2ZpbGUtJyxpZF9hZGp1bnRvOjp0ZXh0LCcuJyxleHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBpZF9hZGp1bnRvID0gJDEgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdC5yb3cuaWRfYWRqdW50b11cclxuICAgICAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlc3BvbnNlKHJlc3VsdC5yb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdGFkbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUZpbGUoZmlsZSwgcmVzdWx0YWRvLmlkX2FkanVudG8sIHJlc3VsdGFkby5leHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2Nhc29fZ3VhcmRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnLCByZWZlcmVuY2VzOiAnb3BlcmF0aXZvcycgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnaWRfY2FzbycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZGF0b3NfY2FzbycsIHR5cGVOYW1lOiAnanNvbmInIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBkZWZpbmVkSW46ICdkbWVuY3UnLFxyXG4gICAgICAgIC8vQHRzLWlnbm9yZSBlc3BlY2lmaWNvIGVsIHRpcG8gZGUgbG9zIHBhcsOhbWV0cm9zXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICBvcGVyYXRpdm86IElkT3BlcmF0aXZvLFxyXG4gICAgICAgICAgICBpZF9jYXNvOiBzdHJpbmcsXHJcbiAgICAgICAgICAgIGRhdG9zX2Nhc286IEFueU9iamVjdFxyXG4gICAgICAgIH0sIG5ld0NsaWVudDogQ2xpZW50KSB7XHJcbiAgICAgICAgICAgIHZhciB7IHVuaWRhZF9hbmFsaXNpcywgcGtfYWdyZWdhZGEgfSA9IChhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgcGFyYW1ldGVycy5vcGVyYXRpdm8pKTtcclxuICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ld0NsaWVudCB8fCBjb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIGRhdG9zX2pzb24gPSBwYXJhbWV0ZXJzLmRhdG9zX2Nhc287XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciB0YWJsZVN0cnVjdHVyZXNfYXBwOiBUYWJsZURlZmluaXRpb25zID0gYmUudGFibGVTdHJ1Y3R1cmVzO1xyXG5cclxuICAgICAgICAgICAgdmFyIHN0cnVjdF9kbWVuY3UgPSBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgdW5pZGFkX2FuYWxpc2lzKTtcclxuICAgICAgICAgICAgZGF0b3NfanNvblsnb3BlcmF0aXZvJ10gPSBwYXJhbWV0ZXJzLm9wZXJhdGl2bztcclxuXHJcbiAgICAgICAgICAgIGRhdG9zX2pzb25bcGtfYWdyZWdhZGFdID0gcGFyYW1ldGVycy5pZF9jYXNvO1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBjb21wbGV0YXJfdWx0X3BrX2VuX2Fycih1bHRfcGs6YW55LCB1YV9hcnI6YW55W10pIHtcclxuICAgICAgICAgICAgICAgIHZhciBjb25fcGtfY29tcGxldGEgPSB1YV9hcnI7XHJcbiAgICAgICAgICAgICAgICBpZiAodWFfYXJyICYmIHVhX2Fyci5sZW5ndGggPj0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbl9wa19jb21wbGV0YSA9IGNvbl9wa19jb21wbGV0YS5tYXAoKHVuYV91YSwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmFfdWFbdWx0X3BrXSA9IGkgKyAxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmFfdWE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uX3BrX2NvbXBsZXRhXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZnVuY3Rpb24gcmVjb3JyZXJfZGF0b3NfYWdyZWdhbmRvX3BrcyhkYXRvc2o6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIga2V5TmFtZSBpbiBkYXRvc2opIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0b0sgPSBkYXRvc2pba2V5TmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdG9LIGluc3RhbmNlb2YgQXJyYXkgJiYgZGF0b0subGVuZ3RoID49IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBrID0gdGFibGVTdHJ1Y3R1cmVzX2FwcFtrZXlOYW1lXShjb250ZXh0KS5wcmltYXJ5S2V5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdWx0X3BrID0gcGtbcGsubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdG9LID0gY29tcGxldGFyX3VsdF9wa19lbl9hcnIodWx0X3BrLCBkYXRvSyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdG9LLmZvckVhY2goKGVsZW1JOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1JID0gcmVjb3JyZXJfZGF0b3NfYWdyZWdhbmRvX3BrcyhlbGVtSSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5TmFtZS5zdGFydHNXaXRoKCckJykgfHwga2V5TmFtZS5zdGFydHNXaXRoKCdfJykgfHwga2V5TmFtZSA9PSAnbnVsbCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdG9zaltrZXlOYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0b3NqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdG9zX2pzb24gPSByZWNvcnJlcl9kYXRvc19hZ3JlZ2FuZG9fcGtzKGRhdG9zX2pzb24pO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5jb2RSZWE7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZE5vUmVhO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5yZXN1bWVuRXN0YWRvO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5jb2RSZWFTdXA7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZE5vUmVhU3VwO1xyXG4gICAgICAgICAgICBkZWxldGUgZGF0b3NfanNvbi5yZXN1bWVuRXN0YWRvU3VwO1xyXG5cclxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdG9zX2pzb24pLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBxdWVyaWVzID0gc3FsVG9vbHMuc3RydWN0dXJlZERhdGEuc3FsV3JpdGUoZGF0b3NfanNvbiwgc3RydWN0X2RtZW5jdSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcXVlcmllcy5yZWR1Y2UoZnVuY3Rpb24gKHByb21pc2U6IFByb21pc2U8YW55PiwgcXVlcnk6IHN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LnF1ZXJ5KHF1ZXJ5KS5leGVjdXRlKCkudGhlbihmdW5jdGlvbiAoX3Jlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm9rXCI7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyOiBFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjYXNvX2d1YXJkYXIgRU5UUkEgRU4gRUwgQ0FUQ0g6IFwiLCBleHBlY3RlZChlcnIpKVxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVyclxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAndmFjaW8nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdjYXNvX3RyYWVyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIC8ve25hbWU6J2Zvcm11bGFyaW8nICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHJlZmVyZW5jZXM6ICdvcGVyYXRpdm9zJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdpZF9jYXNvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcmVzdWx0T2s6ICdnb1RvRW5jJyxcclxuICAgICAgICBkZWZpbmVkSW46ICdkbWVuY3UnLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBpZF9jYXNvOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgdmFyIHsgdW5pZGFkX2FuYWxpc2lzLCBwa19hZ3JlZ2FkYSB9ID0gKGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBwYXJhbWV0ZXJzLm9wZXJhdGl2bykpO1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50ID0gY29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBzdHJ1Y3RfZG1lbmN1ID0gY3JlYXRlU3RydWN0dXJlKGNvbnRleHQsIHVuaWRhZF9hbmFsaXNpcyk7XHJcbiAgICAgICAgICAgIHZhciBzcWwgPSBzcWxUb29scy5zdHJ1Y3R1cmVkRGF0YS5zcWxSZWFkKHsgb3BlcmF0aXZvOiBwYXJhbWV0ZXJzLm9wZXJhdGl2bywgW3BrX2FncmVnYWRhXTogcGFyYW1ldGVycy5pZF9jYXNvIH0sIHN0cnVjdF9kbWVuY3UpO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KHNxbCkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm86IHBhcmFtZXRlcnMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgaWRfY2FzbzogcGFyYW1ldGVycy5pZF9jYXNvLFxyXG4gICAgICAgICAgICAgICAgZGF0b3NfY2FzbzogcmVzdWx0LnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgLy9mb3JtdWxhcmlvOiBmb3JtUHJpbmNpcGFsLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdjYXNvX3RyYWVyX29fY3JlYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgcmVmZXJlbmNlczogJ29wZXJhdGl2b3MnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2lkX2Nhc28nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazogJ2dvVG9FbmMnLFxyXG4gICAgICAgIC8vIGJpdGFjb3JhOnthbHdheXM6dHJ1ZX0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHtvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBpZF9jYXNvOiBzdHJpbmd9Pil7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgYmUucHJvY2VkdXJlWydjYXNvX3RyYWVyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBqc29uID0gYXdhaXQgYmUucHJvY2VkdXJlWydjYXNvX3ByZXBhcmFyJ10uY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlWydjYXNvX2d1YXJkYXInXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgY2hhbmdpbmcocGFyYW1ldGVycywgeyBkYXRvc19jYXNvOiBqc29uIH0pKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBiZS5wcm9jZWR1cmVbJ2Nhc29fdHJhZXInXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1ldGVycyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ3Bhc2FyX2pzb24ydWEnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIF9wYXJhbWV0ZXJzOkNvcmVGdW5jdGlvblBhcmFtZXRlcnM8e30+KXtcclxuICAgICAgICAgICAgLyogR0VORVJBTElaQVI6ICovXHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIC8qIEZJTi1HRU5FUkFMSVpBUjogKi9cclxuICAgICAgICAgICAgY29uc3QgT1BFUkFUSVZPID0gYXdhaXQgZ2V0T3BlcmF0aXZvQWN0dWFsKGNvbnRleHQpO1xyXG4gICAgICAgICAgICB2YXIgeyB1bmlkYWRfYW5hbGlzaXMsIHBrX2FncmVnYWRhIH0gPSAoYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIE9QRVJBVElWTykpO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0TWFpbiA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBTRUxFQ1QgKiBmcm9tICR7YmUuZGIucXVvdGVJZGVudCh1bmlkYWRfYW5hbGlzaXMpfSBMSU1JVCAxYCkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgaWYgKChyZXN1bHRNYWluLnJvd0NvdW50IHx8IDApID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0hBWSBEQVRPUycsIHJlc3VsdE1haW4ucm93cylcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSEFZIERBVE9TLiBOTyBTRSBQVUVERSBJTklDSUFSIEVMIFBBU0FKRScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRKc29uID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgU0VMRUNUIG9wZXJhdGl2bywgZW5jIGlkX2Nhc28sIGpzb25fZW5jdWVzdGEgZGF0b3NfY2FzbyBmcm9tIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBXSEVSRSBvcGVyYXRpdm89JDEgYW5kIHJlc3VtZW5fZXN0YWRvIGlzIGRpc3RpbmN0IGZyb20gJ3ZhY2lvJyBhbmQganNvbl9lbmN1ZXN0YSBpcyBub3QgbnVsbCBcclxuICAgICAgICAgICAgICAgICAgICBvcmRlciBieSBlbmMgYCxcclxuICAgICAgICAgICAgICAgIFtPUEVSQVRJVk9dXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgdmFyIHByb2NlZHVyZUd1YXJkYXIgPSBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyO1xyXG4gICAgICAgICAgICBpZiAocHJvY2VkdXJlR3VhcmRhci5kZWZpbmVkSW4gIT0gJ2RtZW5jdScpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGF5IHF1ZSBzb2JyZWVzY3JpYmlyIGNhc29fZ3VhcmRhcicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChyZXN1bHRKc29uLnJvd3MubWFwKGFzeW5jIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIGxldCByZXN1bHRhZG8gPSBgaWQgY2FzbyAke3Jvdy5pZF9jYXNvfTogYDtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmUuaW5UcmFuc2FjdGlvbihudWxsLCBhc3luYyBmdW5jdGlvbiAoX2NsaWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRhZG8gKz0gYXdhaXQgcHJvY2VkdXJlR3VhcmRhci5jb3JlRnVuY3Rpb24oY29udGV4dCwgcm93KTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZXhwZWN0ZWQoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyTWVzc2FnZSA9IHJlc3VsdGFkbyArIFwianNvbjJ1YSBlcnJvci4gXCIgKyBlcnJvci5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbyA9IGVyck1lc3NhZ2VcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyck1lc3NhZ2UsIGVycm9yKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdGFkby5pbmNsdWRlcygnb2snKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB7IGRhdG9zX2Nhc28sIGlkX2Nhc28sIG9wZXJhdGl2byB9ID0gYXdhaXQgYmUucHJvY2VkdXJlLmNhc29fdHJhZXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHsgb3BlcmF0aXZvOiByb3cub3BlcmF0aXZvLCBpZF9jYXNvOiByb3cuaWRfY2FzbyB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ZXJRdWVHcmFibyA9IHsgZGF0b3NfY2FzbywgaWRfY2Fzbywgb3BlcmF0aXZvIH1cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjcmVwYW5jZXMuc2hvd0FuZFRocm93KHZlclF1ZUdyYWJvLCByb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodmVyUXVlR3JhYm8sIHJvdywgZXhwZWN0ZWQoZXJyKSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgICAgICAgICB9KSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkbV9mb3Jwa3JhaXpfY2FyZ2FyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAncGtfcmFpel92YWx1ZScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnLCByZWZlcmVuY2VzOiBcInRhcmVhc1wiIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7b3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgcGtfcmFpel92YWx1ZTogc3RyaW5nLCB0YXJlYTogc3RyaW5nfT4pe1xyXG4gICAgICAgICAgICBjb25zdCBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBjb25zdCB7b3BlcmF0aXZvLHBrX3JhaXpfdmFsdWUsIHRhcmVhfSA9IHBhcmFtZXRlcnM7XHJcbiAgICAgICAgICAgIGNvbnN0IHtwZXJtaXRlX2JvcnJhcl91YTogdGFyZWFQZXJtaXRlQm9ycmFyVUEsIG1haW5fZm9ybX0gPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0IHBlcm1pdGVfYm9ycmFyX3VhLCBtYWluX2Zvcm0gXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSB0YXJlYXMgXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgdGFyZWE9JDJcclxuICAgICAgICAgICAgYCwgW29wZXJhdGl2bywgdGFyZWFdKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3c7XHJcbiAgICAgICAgICAgIGNvbnN0IHt1bmlkYWRfYW5hbGlzaXN9ID0gKGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBwYXJhbWV0ZXJzLm9wZXJhdGl2bykpO1xyXG4gICAgICAgICAgICBjb25zdCBjb25kdml2PSBgIHQub3BlcmF0aXZvPSAkMSBhbmQgdC5lbmMgPSQyYDtcclxuICAgICAgICAgICAgY29uc3QgdXN1YXJpb1B1ZWRlUHJvY2VzYXJFbmN1ZXN0YXMgPSBjb250ZXh0LnB1ZWRlPy5lbmN1ZXN0YXM/LnByb2Nlc2FyIHx8IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCBzb2xvTGVjdHVyYSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgY291bnQoKilcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc190ZW0gam9pbiB0ZW0gdXNpbmcob3BlcmF0aXZvLCBlbmMpIGpvaW4gZXN0YWRvcyB1c2luZyAob3BlcmF0aXZvLCBlc3RhZG8pIC0tcGsgZXN0YWRvIHkgdGVtIHZlcmlmaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMiBhbmQgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXJnYWRvX2RtIGlzIG5vdCBudWxsIG9yIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBub3QgcGVybWl0ZV9lZGl0YXJfZW5jdWVzdGEgYW5kIGFzaWduYWRvIDw+ICR7Y29udGV4dC5iZS5kYi5xdW90ZUxpdGVyYWwoY29udGV4dC51c2VyLmlkcGVyKX0gb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWEgPSB0YXJlYV9hY3R1YWwgYW5kIHRhcmVhX2FjdHVhbCA9ICdwcm9jJyBhbmQgJDMgb3IgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhID0gdGFyZWFfYWN0dWFsIGFuZCB0YXJlYV9hY3R1YWwgPSAncHJvYycgYW5kIGVzdGFkbyA9ICdWJ1xyXG4gICAgICAgICAgICApYCwgW29wZXJhdGl2bywgcGtfcmFpel92YWx1ZSwgIXVzdWFyaW9QdWVkZVByb2Nlc2FyRW5jdWVzdGFzXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZSA+IDA7XHJcbiAgICAgICAgICAgIHZhciBwZXJtaXRlR2VuZXJhck11ZXN0cmEgPSBhd2FpdCBnZXRPcGVyYXRpdm9QZXJtaXRlR2VuZXJhck11ZXN0cmEoY29udGV4dC5jbGllbnQsIG9wZXJhdGl2byk7XHJcbiAgICAgICAgICAgIHZhciB7IHJvdyB9ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoZ2V0SGRyUXVlcnkoY29uZHZpdiwgY29udGV4dCwgdW5pZGFkX2FuYWxpc2lzLCBwZXJtaXRlR2VuZXJhck11ZXN0cmEsIGNvbnRleHQudXNlci5pZHBlciksIFtvcGVyYXRpdm8sIHBrX3JhaXpfdmFsdWVdKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByb3cuaW5mb3JtYWNpb25IZHJbcGtfcmFpel92YWx1ZV0udGFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICB0YXJlYSxcclxuICAgICAgICAgICAgICAgIG1haW5fZm9ybVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgc29sb0xlY3R1cmEsXHJcbiAgICAgICAgICAgICAgICBpZHBlcjogY29udGV4dC51c2VyLmlkcGVyLFxyXG4gICAgICAgICAgICAgICAgY2FyZ2FzOiBsaWtlQXIuY3JlYXRlSW5kZXgoY2FyZ2FzSGRyQ29uRmVjaGFEbXkocm93LmNhcmdhcyksICdjYXJnYScpLFxyXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wRXN0cnVjdHVyYTogYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEsXHJcbiAgICAgICAgICAgICAgICBwZXJtaXRlQm9ycmFyRWxlbWVudG9zVUE6ICEhKHRhcmVhUGVybWl0ZUJvcnJhclVBICYmIGdldE1vZG9CeVBvbGljeShiZSkgPT09ICdHQUJJTkVURScgJiYgY29udGV4dC5wdWVkZT8uZW5jdWVzdGFzPy5ib3JyYXJfdWEpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkbV9mb3Jwa3JhaXpfZGVzY2FyZ2FyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAncGVyc2lzdGVudGVzJywgdHlwZU5hbWU6ICdqc29uYicgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBwZXJzaXN0ZW50ZXM6IEFueU9iamVjdCB9Pikge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgeyBvcGVyYXRpdm8sIHBlcnNpc3RlbnRlcyB9ID0gcGFyYW1ldGVycztcclxuICAgICAgICAgICAgY29uc3QgVUFfUFJJTkNJUEFMID0gKGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBvcGVyYXRpdm8pKS51bmlkYWRfYW5hbGlzaXM7XHJcbiAgICAgICAgICAgIHZhciBwcm9jZWR1cmVHdWFyZGFyID0gYmUucHJvY2VkdXJlLmNhc29fZ3VhcmRhcjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXMgPSBwZXJzaXN0ZW50ZXMucmVzcHVlc3Rhc1tVQV9QUklOQ0lQQUxdIHx8IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkRW5jIGluIHJlc3B1ZXN0YXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXNVQVByaW5jaXBhbCA9IHJlc3B1ZXN0YXNbaWRFbmNdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3B1ZXN0YXNVQVByaW5jaXBhbC5zMWExX29icyA9PSAnIXBydWViYSBkZSBlcnJvciBhbCBncmFiYXIhJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRElPIFBSVUVCQSBERSBFUlJPUiBBTCBHUkFCQVInKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGF3YWl0IGd1YXJkYXJFbmN1ZXN0YUVuVGVtKGNvbnRleHQsIG9wZXJhdGl2bywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgcGVyc2lzdGVudGVzLmluZm9ybWFjaW9uSGRyW2lkRW5jXS50YXJlYS50YXJlYSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCByZWdpc3RyYXJQYXNlVGFibGEoY29udGV4dCwgb3BlcmF0aXZvLCBpZEVuYywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZG1fc2luY3Jvbml6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAncGVyc2lzdGVudGVzJywgdHlwZU5hbWU6ICdqc29uYicgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnbW9kb19kbScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnY2FtYmlhX21vZG9fZG0nLCB0eXBlTmFtZTogJ2Jvb2xlYW4nIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2lkcGVyX2xvZ3VlYWRvX3RhYmxldCcsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHVubG9nZ2VkOnRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8e3BlcnNpc3RlbnRlczogQW55T2JqZWN0LCBtb2RvX2RtOiBzdHJpbmcsIGNhbWJpYV9tb2RvX2RtOiBib29sZWFuLCBpZHBlcl9sb2d1ZWFkb190YWJsZXQ6IHN0cmluZ30+KXtcclxuICAgICAgICAgICAgY29uc3QgT1BFUkFUSVZPID0gYXdhaXQgZ2V0T3BlcmF0aXZvQWN0dWFsKGNvbnRleHQpO1xyXG4gICAgICAgICAgICBjb25zdCBwZXJtaXRlR2VuZXJhck11ZXN0cmEgPSBhd2FpdCBnZXRPcGVyYXRpdm9QZXJtaXRlR2VuZXJhck11ZXN0cmEoY29udGV4dC5jbGllbnQsIE9QRVJBVElWTyk7XHJcbiAgICAgICAgICAgIGlmKCFwZXJtaXRlR2VuZXJhck11ZXN0cmEgJiYgcGFyYW1ldGVycy5jYW1iaWFfbW9kb19kbSl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignTm8gZXMgcG9zaWJsZSBjYW1iaWFyIGRlIG1vZG8gZW4gZXN0ZSBvcGVyYXRpdm8nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgeyBwZXJzaXN0ZW50ZXMsIG1vZG9fZG0sIGNhbWJpYV9tb2RvX2RtLCBpZHBlcl9sb2d1ZWFkb190YWJsZXQgfSA9IHBhcmFtZXRlcnM7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJuYW1lTG9ndWVhZG9UYWJsZXQgPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYHNlbGVjdCB1c3VhcmlvIGZyb20gdXN1YXJpb3Mgd2hlcmUgaWRwZXIgPSAkMWAsIFtpZHBlcl9sb2d1ZWFkb190YWJsZXRdKS5mZXRjaFVuaXF1ZVZhbHVlKCkpLnZhbHVlOyBcclxuICAgICAgICAgICAgdmFyIHRva2VuOiBzdHJpbmcgPSBwZXJzaXN0ZW50ZXM/LnRva2VuIHx8IChhd2FpdCBiZS5wcm9jZWR1cmUudG9rZW5fZ2V0LmNvcmVGdW5jdGlvbihjb250ZXh0LCB7XHJcbiAgICAgICAgICAgICAgICB1c2VyYWdlbnQ6IGNvbnRleHQuc2Vzc2lvbi5yZXEudXNlcmFnZW50LFxyXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lTG9ndWVhZG9UYWJsZXRcclxuICAgICAgICAgICAgfSkpLnRva2VuO1xyXG4gICAgICAgICAgICBjb25zdCBudW1fc2luY3JvID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIHNpbmNyb25pemFjaW9uZXMgKHRva2VuLCB1c3VhcmlvLCBkYXRvcylcclxuICAgICAgICAgICAgICAgICAgICBWQUxVRVMgKCQxLCQyLCQzKSBcclxuICAgICAgICAgICAgICAgICAgICBSRVRVUk5JTkcgc2luY3JvXHJcbiAgICAgICAgICAgICAgICBgLCBbdG9rZW4sIHVzZXJuYW1lTG9ndWVhZG9UYWJsZXQsIHBlcnNpc3RlbnRlc11cclxuICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVZhbHVlKCkpLnZhbHVlO1xyXG4gICAgICAgICAgICB2YXIgY29uZHZpdiA9IGBcclxuICAgICAgICAgICAgICAgIHR0Lm9wZXJhdGl2bz0gJDEgXHJcbiAgICAgICAgICAgICAgICBhbmQgYXNpZ25hZG8gPSAkMlxyXG4gICAgICAgICAgICAgICAgYW5kIHR0Lm9wZXJhY2lvbj0nY2FyZ2FyJyBcclxuICAgICAgICAgICAgICAgIGFuZCAodHQuY2FyZ2Fkb19kbSBpcyBudWxsIG9yIHR0LmNhcmdhZG9fZG0gPSAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKHRva2VuKX0pXHJcbiAgICAgICAgICAgIGA7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgdW5pZGFkX2FuYWxpc2lzOiBVQV9QUklOQ0lQQUwsIHBrX2FncmVnYWRhIH0gPSAoYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIE9QRVJBVElWTykpO1xyXG4gICAgICAgICAgICBpZiAocGVyc2lzdGVudGVzKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpZEVuYyBpbiBwZXJzaXN0ZW50ZXMucmVzcHVlc3Rhc1tVQV9QUklOQ0lQQUxdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3B1ZXN0YXNVQVByaW5jaXBhbCA9IHBlcnNpc3RlbnRlcy5yZXNwdWVzdGFzW1VBX1BSSU5DSVBBTF1baWRFbmNdO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyBBTCBQQVJFQ0VSIEVTVMOBIFJFU1VFTFRPLCBMTyBERUpPIFBPUiBMQVMgRFVEQVNcclxuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVzcHVlc3Rhc1VBUHJpbmNpcGFsKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjYXJnYSA9IHBlcnNpc3RlbnRlcy5jYXJnYXNbcGVyc2lzdGVudGVzLmluZm9ybWFjaW9uSGRyW2lkRW5jXS50ZW0uY2FyZ2FdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZWEgPSBwZXJzaXN0ZW50ZXMuaW5mb3JtYWNpb25IZHJbaWRFbmNdLnRhcmVhLnRhcmVhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJnYVRhcmVhc0FyZWFzID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYHNlbGVjdCByZWNlcGNpb25pc3RhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0YXJlYXNfYXJlYXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCB0YXJlYSA9ICQyIGFuZCBhcmVhID0gJDMgLS1wayB2ZXJpZmljYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW09QRVJBVElWTywgdGFyZWEsIGNhcmdhLmNhcmdhXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FyZ2FUYXJlYXNBcmVhcyAmJiAhY2FyZ2EucmVjZXBjaW9uaXN0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYG5vIHNlIGRlZmluacOzIHVuIHJlY2VwY2lvbmlzdGEgcGFyYSBlbCBvcGVyYXRpdm8gJHtPUEVSQVRJVk99LCB0YXJlYSAke3RhcmVhfSwgw6FyZWEgJHtjYXJnYS5jYXJnYX0sIHBvciBmYXZvciBjb211bmlxdWVzw6kgY29uIEdBQklORVRFIHBhcmEgcXVlIGNhcmd1ZW4gdW4gcmVjZXBjaW9uaXN0YWApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE51bWJlcihpZEVuYykgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZEVuYyBlcyBsYSBjbGF2ZSAodGV4dG8pIGRlIHBlcnNpc3RlbnRlcy5yZXNwdWVzdGFzOyBsYXMgZnVuY2lvbmVzIHF1ZSBzaWd1ZW4gbG8gcmVjaWJlbiBjb21vIHRleHRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZEVuYyA9IFN0cmluZyhhd2FpdCBwZXJzaXN0aXJFbmN1ZXN0YUF1dG9nZW5lcmFkYUVuRE0oY29udGV4dCwgT1BFUkFUSVZPLCBjYXJnYS5jYXJnYSwgaWRFbmMsIHRva2VuLCByZXNwdWVzdGFzVUFQcmluY2lwYWwsIGNhcmdhLnJlY2VwY2lvbmlzdGEgfHwgY2FyZ2FUYXJlYXNBcmVhcywgcGVyc2lzdGVudGVzLmlkcGVyLCBtb2RvX2RtIGFzIE1vZG9ETSwgY2FtYmlhX21vZG9fZG0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHVlZG9HdWFyZGFyRW5URU0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uc3VsdGFUYXJlYXNUZW0gPSBjb25zdWx0YVVwZGF0ZVRhcmVhc1RlbVBvckRlc2NhcmdhKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2bzogT1BFUkFUSVZPLCBpZEVuYywgdGFyZWEsIHRva2VuLCByZXNwdWVzdGFzVUFQcmluY2lwYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNhQURlc2NhcmdhcjogY2FtYmlhX21vZG9fZG0gfHwgcGVyc2lzdGVudGVzLmlkcGVyICE9IGlkcGVyX2xvZ3VlYWRvX3RhYmxldFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5VGFyZWFzVGVtID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoY29uc3VsdGFUYXJlYXNUZW0uc3FsLCBjb25zdWx0YVRhcmVhc1RlbS5wYXJhbXMpLmZldGNoT25lUm93SWZFeGlzdHMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHVlZG9HdWFyZGFyRW5URU0gPSBxdWVyeVRhcmVhc1RlbS5yb3dDb3VudCA9PSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHVlZG9HdWFyZGFyRW5URU0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGd1YXJkYXJFbmN1ZXN0YUVuVGVtKGNvbnRleHQsIE9QRVJBVElWTywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgdGFyZWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVnaXN0cmFyUGFzZVRhYmxhKGNvbnRleHQsIE9QRVJBVElWTywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmcy5hcHBlbmRGaWxlKCdsb2NhbC1yZWNpYmlkby1zaW4tdG9rZW4udHh0JywgSlNPTi5zdHJpbmdpZnkoeyBub3c6IG5ldyBEYXRlKCksIGlkcGVyOiBwZXJzaXN0ZW50ZXMuaWRwZXIsIGlkQ2FzbzogaWRFbmMsIFtwa19hZ3JlZ2FkYV06IHJlc3B1ZXN0YXNVQVByaW5jaXBhbCB9KSArICdcXG5cXG4nLCAndXRmOCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB7IHJvdyB9ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoZ2V0SGRyUXVlcnkoY29uZHZpdiwgY29udGV4dCwgVUFfUFJJTkNJUEFMLCBwZXJtaXRlR2VuZXJhck11ZXN0cmEsIGlkcGVyX2xvZ3VlYWRvX3RhYmxldCksIFtPUEVSQVRJVk8sIGlkcGVyX2xvZ3VlYWRvX3RhYmxldF0pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHVwZGF0ZSB0YXJlYXNfdGVtIHR0XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0ICBlc3RhZG8gPSAkNCwgY2FyZ2Fkb19kbT0kMzo6dGV4dFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlICR7Y29uZHZpdn0gXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIGVuY2BcclxuICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgIFtPUEVSQVRJVk8sIGlkcGVyX2xvZ3VlYWRvX3RhYmxldCwgdG9rZW4sIEVTVEFET19QT1NURVJJT1JfQ0FSR0FdXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnJvdyxcclxuICAgICAgICAgICAgICAgIG9wZXJhdGl2bzogT1BFUkFUSVZPLFxyXG4gICAgICAgICAgICAgICAgc29sb0xlY3R1cmE6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdG9rZW4sXHJcbiAgICAgICAgICAgICAgICBudW1fc2luY3JvLFxyXG4gICAgICAgICAgICAgICAgaWRwZXI6IGlkcGVyX2xvZ3VlYWRvX3RhYmxldCxcclxuICAgICAgICAgICAgICAgIGNhcmdhczogbGlrZUFyLmNyZWF0ZUluZGV4KGNhcmdhc0hkckNvbkZlY2hhRG15KHJvdy5jYXJnYXMpLm1hcChjYXJnYSA9PiAoeyAuLi5jYXJnYSwgZXN0YWRvX2NhcmdhOiAncmVsZXZhbWllbnRvJyB9KSksICdjYXJnYScpXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZG1fYmFja3VwJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3Rva2VuJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0ZW0nLCB0eXBlTmFtZTogJ2pzb25iJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdtb2RvX2RtJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgdW5sb2dnZWQ6IHRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IHRva2VuOiBzdHJpbmcgfCBudWxsLCB0ZW06IEFueU9iamVjdCwgbW9kb19kbTogTW9kb0RNIH0+KSB7XHJcbiAgICAgICAgICAgIHZhciB7IGJlLCBjbGllbnQgfSA9IGNvbnRleHQ7XHJcbiAgICAgICAgICAgIGNvbnN0IE9QRVJBVElWTyA9IGF3YWl0IGdldE9wZXJhdGl2b0FjdHVhbChjb250ZXh0KTtcclxuICAgICAgICAgICAgdmFyIG51bV9zaW5jcm86IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIHZhciB0b2tlbjogc3RyaW5nIHwgbnVsbCA9IHBhcmFtZXRlcnMudG9rZW47XHJcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBvazogJ29rOk4vVCcgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciB7IHJvd0NvdW50IH0gPSBhd2FpdCBjbGllbnQucXVlcnkoYHNlbGVjdCAxIGZyb20gdG9rZW5zIHdoZXJlIHRva2VuID0gJDFgLCBbdG9rZW5dKS5mZXRjaE9uZVJvd0lmRXhpc3RzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJvd0NvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb2s6ICdvazpOL1QnIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHsgdW5pZGFkX2FuYWxpc2lzLCBwa19hZ3JlZ2FkYSB9ID0gKGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBPUEVSQVRJVk8pKTtcclxuICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMudGVtKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiYWNrdXAgb2YgbGlrZUFyKHBhcmFtZXRlcnMudGVtKS5hcnJheSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyZWEgPSBiYWNrdXAuY2FyZ2EuY2FyZ2E7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3B1ZXN0YXNSYWl6ID0gYmFja3VwLnJlc3B1ZXN0YXNSYWl6O1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpZEVuY0RNID0gYmFja3VwLmZvclBrUmFpeltwa19hZ3JlZ2FkYV0udG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjZXBjaW9uaXN0YSA9IGJhY2t1cC5jYXJnYS5yZWNlcGNpb25pc3RhO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhc2lnbmFkbyA9IGJhY2t1cC5pZHBlcjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGlkRW5jRE0pIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwZXJzaXN0aXJFbmN1ZXN0YUF1dG9nZW5lcmFkYUVuRE0oY29udGV4dCwgT1BFUkFUSVZPLCBhcmVhLCBpZEVuY0RNLCB0b2tlbiwgcmVzcHVlc3Rhc1JhaXosIHJlY2VwY2lvbmlzdGEsIGFzaWduYWRvLCBwYXJhbWV0ZXJzLm1vZG9fZG0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBqc29uX2JhY2t1cCA9ICQzLCBmZWNoYV9iYWNrdXAgPSBjdXJyZW50X3RpbWVzdGFtcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCBqc29uX2JhY2t1cCBpcyBkaXN0aW5jdCBmcm9tICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICdvaydgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbT1BFUkFUSVZPLCBpZEVuY0RNLCByZXNwdWVzdGFzUmFpeiwgcmVzcHVlc3Rhc1JhaXpdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkuZmV0Y2hPbmVSb3dJZkV4aXN0cygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG9rOiAnb2snXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdjb25zaXN0aXJfdml2aWVuZGEnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgcmVmZXJlbmNlczogJ29wZXJhdGl2b3MnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2Nhc28nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgY2Fzbzogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIHZhciB7IGJlLCBjbGllbnQgfSA9IGNvbnRleHQ7XHJcbiAgICAgICAgICAgIGxldCBwYXJhbV9wcm9jID0ge1xyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvOiBwYXJhbWV0ZXJzLm9wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgIGlkX2Nhc286IHBhcmFtZXRlcnMuY2Fzb1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBlcnJNZXNzYWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdGFkbzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRhZG8gPSBhd2FpdCBiZS5wcm9jZWR1cmUuY29uc2lzdGlyX2VuY3Vlc3RhLmNvcmVGdW5jdGlvbihjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtX3Byb2NcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVycm9yID0gdW5leHBlY3RlZChlcnIpO1xyXG4gICAgICAgICAgICAgICAgZXJyTWVzc2FnZSA9IFwiIGNvbnNpc3Rpcl9jYXNvLiBcIiArIGVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyck1lc3NhZ2UsIGVycm9yKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcqKioqKiogY29uc2lzdGlyX2Nhc28gcmVzdWx0YWRvOicsIHJlc3VsdGFkbylcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG9rOiAnb2snXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZG1fcmVzY2F0YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnbG9jYWxTdG9yYWdlSXRlbScsIHR5cGVOYW1lOiAnanNvbmInIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2xvY2FsU3RvcmFnZUl0ZW1LZXknLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICB1bmxvZ2dlZDogdHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBsb2NhbFN0b3JhZ2VJdGVtS2V5OiBzdHJpbmcsIGxvY2FsU3RvcmFnZUl0ZW06IEFueU9iamVjdCB9Pikge1xyXG4gICAgICAgICAgICB2YXIgeyBsb2NhbFN0b3JhZ2VJdGVtS2V5LCBsb2NhbFN0b3JhZ2VJdGVtIH0gPSBwYXJhbXM7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsb2NhbFN0b3JhZ2VJdGVtKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZzLmFwcGVuZEZpbGUoJ2xvY2FsLXJlc2NhdGUudHh0JywgSlNPTi5zdHJpbmdpZnkoeyBub3c6IG5ldyBEYXRlKCksIHVzZXI6IGNvbnRleHQudXNlcm5hbWUsIGl0ZW1LZXk6IGxvY2FsU3RvcmFnZUl0ZW1LZXksIGl0ZW1EYXRhOiBsb2NhbFN0b3JhZ2VJdGVtIH0pICsgJ1xcblxcbicsICd1dGY4Jyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFUlJPUicsIGV4cGVjdGVkKGVycikpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdvcGVyYXRpdm9fZ2V0JyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltdLFxyXG4gICAgICAgIHVubG9nZ2VkOnRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7fT4pe1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0T3BlcmF0aXZvQWN0dWFsKGNvbnRleHQpXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdnZXRfcmFuZG9tX2ZyZWVfY2FzZScsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW3sgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfV0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2byB9Pikge1xyXG4gICAgICAgICAgICBjb25zdCBtaW5zVG9FeHBpcmUgPSAzMDtcclxuICAgICAgICAgICAgY29uc3QgbWluc1NpbmNlQmxvcXVlZCA9IGBkYXRlX3BhcnQoJ21pbicsIGFnZShjdXJyZW50X3RpbWVzdGFtcCwgZmVjaGFfYmxvcXVlbykpYDtcclxuICAgICAgICAgICAgY29uc3QgZW5jID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYHNlbGVjdCBlbmMgZnJvbSB0ZW0gd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAobGlicmUgb3IgJHttaW5zU2luY2VCbG9xdWVkfSA+ICR7bWluc1RvRXhwaXJlfSkgbGltaXQgMTtgLCBbcGFyYW1zLm9wZXJhdGl2b10pLmZldGNoVW5pcXVlVmFsdWUoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFVQREFURSB0ZW0gc2V0IGxpYnJlID0gZmFsc2UsIGZlY2hhX2Jsb3F1ZW89Y3VycmVudF90aW1lc3RhbXAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJgLCBbcGFyYW1zLm9wZXJhdGl2bywgZW5jLnZhbHVlXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZW5jLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnbXVlc3RyYV9nZW5lcmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6IFwib3BlcmF0aXZvc1wiIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2FyZWEnLCB0eXBlTmFtZTogJ2ludGVnZXInLCByZWZlcmVuY2VzOiBcImFyZWFzXCIgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZG9taW5pbycsIHR5cGVOYW1lOiAnaW50ZWdlcicsIGRlZmF1bHRWYWx1ZTogMyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdjYW50X2VuY3Vlc3RhcycsIHR5cGVOYW1lOiAnaW50ZWdlcicgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWFfYWN0dWFsJywgdHlwZU5hbWU6ICd0ZXh0JywgcmVmZXJlbmNlczogJ3RhcmVhcycgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGFyZWE6IG51bWJlciwgZG9taW5pbzogbnVtYmVyLCBjYW50X2VuY3Vlc3RhczogbnVtYmVyLCB0YXJlYV9hY3R1YWw6IElkVGFyZWEgfT4pIHtcclxuICAgICAgICAgICAgY29uc3QgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgcGVybWl0ZUdlbmVyYXJNdWVzdHJhID0gYXdhaXQgZ2V0T3BlcmF0aXZvUGVybWl0ZUdlbmVyYXJNdWVzdHJhKGNvbnRleHQuY2xpZW50LCBwYXJhbXMub3BlcmF0aXZvKTtcclxuICAgICAgICAgICAgaWYgKHBlcm1pdGVHZW5lcmFyTXVlc3RyYSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsQWN0dWFsID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgIGBzZWxlY3QgY291bnQoKikgYXMgdG90YWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgYXJlYSA9ICQyYCxcclxuICAgICAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmFyZWFdXHJcbiAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWU7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhcmFtcy5jYW50X2VuY3Vlc3RhcyAtIHRvdGFsQWN0dWFsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmMgPSBhd2FpdCBnZW5lcmFyTnVldm9JZEVuYyhjb250ZXh0LCBwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuYXJlYSwgbWF4QUVuY1BvckFyZWEpXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2VuZXJhckVuY3Vlc3RhVGVtKGNvbnRleHQsIHBhcmFtcy5vcGVyYXRpdm8sIGVuYywgcGFyYW1zLmFyZWEsIHBhcmFtcy5kb21pbmlvLCBwYXJhbXMudGFyZWFfYWN0dWFsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGF3YWl0IGdlbmVyYXJUYXJlYXNUZW1GYWx0YW50ZXMoY29udGV4dCwgcGFyYW1zLm9wZXJhdGl2byk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiZWwgb3BlcmF0aXZvIG5vIHBlcm1pdGUgZ2VuZXJhciBtdWVzdHJhXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdtdWVzdHJhX2FncmVnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JywgcmVmZXJlbmNlczogXCJvcGVyYXRpdm9zXCIgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnYXJlYScsIHR5cGVOYW1lOiAnaW50ZWdlcicsIHJlZmVyZW5jZXM6IFwiYXJlYXNcIiB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdkb21pbmlvJywgdHlwZU5hbWU6ICdpbnRlZ2VyJywgZGVmYXVsdFZhbHVlOiAzIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2NhbnRfZW5jdWVzdGFzJywgdHlwZU5hbWU6ICdpbnRlZ2VyJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYV9hY3R1YWwnLCB0eXBlTmFtZTogJ3RleHQnLCByZWZlcmVuY2VzOiAndGFyZWFzJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgYXJlYTogbnVtYmVyLCBkb21pbmlvOiBudW1iZXIsIGNhbnRfZW5jdWVzdGFzOiBudW1iZXIsIHRhcmVhX2FjdHVhbDogSWRUYXJlYSB9Pikge1xyXG4gICAgICAgICAgICBjb25zdCBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciBwZXJtaXRlR2VuZXJhck11ZXN0cmEgPSBhd2FpdCBnZXRPcGVyYXRpdm9QZXJtaXRlR2VuZXJhck11ZXN0cmEoY29udGV4dC5jbGllbnQsIHBhcmFtcy5vcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICBpZiAocGVybWl0ZUdlbmVyYXJNdWVzdHJhKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBwYXJhbXMuY2FudF9lbmN1ZXN0YXM7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuYyA9IGF3YWl0IGdlbmVyYXJOdWV2b0lkRW5jKGNvbnRleHQsIHBhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5hcmVhLCBtYXhBRW5jUG9yQXJlYSlcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZW5lcmFyRW5jdWVzdGFUZW0oY29udGV4dCwgcGFyYW1zLm9wZXJhdGl2bywgZW5jLCBwYXJhbXMuYXJlYSwgcGFyYW1zLmRvbWluaW8sIHBhcmFtcy50YXJlYV9hY3R1YWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2VuZXJhclRhcmVhc1RlbUZhbHRhbnRlcyhjb250ZXh0LCBwYXJhbXMub3BlcmF0aXZvKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJlbCBvcGVyYXRpdm8gbm8gcGVybWl0ZSBnZW5lcmFyIG11ZXN0cmFcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2JsYW5xdWVhcl9wcmV2aXN1YWxpemFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6IFwib3BlcmF0aXZvc1wiIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJvbGVzOiBbJ2Nvb3JfcHJvYycsICdjb29yX2NhbXBvJywgJ2FkbWluJ10sXHJcbiAgICAgICAgcmVzdWx0T2s6ICdtb3N0cmFyX2VuY3Vlc3RhX2FfYmxhbnF1ZWFyX2NvbnRlbmlkbycsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgZW5jOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGJ1c2NhckVuY3Vlc3RhRW5UZW0oY29udGV4dCwgcGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2JsYW5xdWVhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnLCByZWZlcmVuY2VzOiBcIm9wZXJhdGl2b3NcIiB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByb2xlczogWydjb29yX3Byb2MnLCAnc3ViY29vcl9jYW1wbycsICdjb29yX2NhbXBvJywgJ2FkbWluJ10sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgZW5jOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHsgdW5pZGFkX2FuYWxpc2lzLCBwa19hZ3JlZ2FkYSB9ID0gKGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBwYXJhbXMub3BlcmF0aXZvKSk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tICR7YmUuZGIucXVvdGVJZGVudCh1bmlkYWRfYW5hbGlzaXMpfSBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kICR7YmUuZGIucXVvdGVJZGVudChwa19hZ3JlZ2FkYSl9ID0gJDJcclxuICAgICAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgLy9wYXNvIGEgZW5jdSBwYXJhIGd1YXJkYXIgZW4gaGlzdG9yaWFsXHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhX2FjdHVhbCA9ICdlbmN1J1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBlbmMgPSAkMiAtLXBrIHZlcmlmaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc190ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyXHJcbiAgICAgICAgICAgIGAsIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBnZW5lcmFyVGFyZWFzVGVtRmFsdGFudGVzKGNvbnRleHQsIHBhcmFtcy5vcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICAvL3Jlc2V0ZW8gdGVtIChubyBzZSBndWFyZGEgaGlzdG9yaWFsIHBvcnF1ZSB0YXJlYV9hY3R1YWwgZXMgbnVsbClcclxuICAgICAgICAgICAgLy9ndWFyZG8gYmFja3VwIHBvciBsYXMgZHVkYXNcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBcclxuICAgICAgICAgICAgICAgICAgICAgICAganNvbl9iYWNrdXAgPSBqc29uX2VuY3Vlc3RhLCBqc29uX2VuY3Vlc3RhID0gbnVsbCwgdGFyZWFfYWN0dWFsID0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfbW9kaWZfZW5jdWVzdGEgPSBudWxsLCBmZWNoYV9iYWNrdXAgPSBjdXJyZW50X3RpbWVzdGFtcCwgbW9kaWZpY2FkbyA9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZW5fZXN0YWRvID0gbnVsbCwgcmVzdW1lbl9lc3RhZG9fc3VwID0gbnVsbCwgc3VwZXJ2aXNpb25fZGlyaWdpZGEgPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNlX3RhYmxhID0gbnVsbCwgcmVhID0gbnVsbCwgbm9yZWEgPSBudWxsLCByZWFfc3VwID0gbnVsbCwgbm9yZWFfc3VwID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBlbmMgPSAkMiAtLXBrIHZlcmlmaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIGluY29uc2lzdGVuY2lhc1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCAke2JlLmRiLnF1b3RlSWRlbnQocGtfYWdyZWdhZGEpfSA9ICQyXHJcbiAgICAgICAgICAgIGAsIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSBpbl9jb25fdmFyXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIHBrX2ludGVncmFkYS0+PiR7YmUuZGIucXVvdGVMaXRlcmFsKHBrX2FncmVnYWRhKX0gPSAkMlxyXG4gICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gaW5jb25zaXN0ZW5jaWFzX3VsdGltYXNcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgcGtfaW50ZWdyYWRhLT4+JHtiZS5kYi5xdW90ZUxpdGVyYWwocGtfYWdyZWdhZGEpfSA9ICQyXHJcbiAgICAgICAgICAgIGAsIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gYGxhIGVuY3Vlc3RhICR7cGFyYW1zLmVuY30gc2UgYmxhbnF1ZcOzIGNvcnJlY3RhbWVudGVgO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfYm9ycmFyX3ByZXZpc3VhbGl6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JywgcmVmZXJlbmNlczogXCJvcGVyYXRpdm9zXCIgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6Wydjb29yX3Byb2MnLCdzdWJjb29yX2NhbXBvJywnY29vcl9jYW1wbycsJ2FkbWluJ10sXHJcbiAgICAgICAgcmVzdWx0T2s6J21vc3RyYXJfZW5jdWVzdGFfYV9ib3JyYXInLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHtvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZ30+KXtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGJ1c2NhckVuY3Vlc3RhRW5UZW0oY29udGV4dCxwYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfYm9ycmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6IFwib3BlcmF0aXZvc1wiIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJvbGVzOiBbJ2Nvb3JfcHJvYycsICdzdWJjb29yX2NhbXBvJywgJ2Nvb3JfY2FtcG8nLCAnYWRtaW4nXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgcGVybWl0ZV9nZW5lcmFyX211ZXN0cmEgPSBhd2FpdCBnZXRPcGVyYXRpdm9QZXJtaXRlR2VuZXJhck11ZXN0cmEoY29udGV4dC5jbGllbnQsIHBhcmFtcy5vcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICBpZiAocGVybWl0ZV9nZW5lcmFyX211ZXN0cmEpIHtcclxuICAgICAgICAgICAgICAgIHZhciB7IHVuaWRhZF9hbmFsaXNpcywgcGtfYWdyZWdhZGEgfSA9IChhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgcGFyYW1zLm9wZXJhdGl2bykpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjYXNvVGVtIH0gPSBhd2FpdCBidXNjYXJFbmN1ZXN0YUVuVGVtKGNvbnRleHQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0IGludG8gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbV9ib3JyYWRhcyAob3BlcmF0aXZvLCBlbmMsIGN1YW5kbywgYXJlYSwgY2x1c3RlciwgZG9taW5pbywgdGFyZWFfYWN0dWFsLCBqc29uX2VuY3Vlc3RhLCB0b2tlbl9hdXRvZ2VuZXJhZG9fZG0sIGVuY19hdXRvZ2VuZXJhZG9fZG0sIGVuY19hdXRvZ2VuZXJhZG9fZG1fY2FwYSwgcHJvaWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyAoJDEsJDIsY3VycmVudF90aW1lc3RhbXAsJDMsJDQsJDUsJDYsJDcsJDgsJDksJDEwLCQxMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpcclxuICAgICAgICAgICAgICAgICAgICBgLCBbXHJcbiAgICAgICAgICAgICAgICAgICAgY2Fzb1RlbS5vcGVyYXRpdm8sXHJcbiAgICAgICAgICAgICAgICAgICAgY2Fzb1RlbS5lbmMsXHJcbiAgICAgICAgICAgICAgICAgICAgY2Fzb1RlbS5hcmVhLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhc29UZW0uY2x1c3RlcixcclxuICAgICAgICAgICAgICAgICAgICBjYXNvVGVtLmRvbWluaW8sXHJcbiAgICAgICAgICAgICAgICAgICAgY2Fzb1RlbS50YXJlYV9hY3R1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgY2Fzb1RlbS5qc29uX2VuY3Vlc3RhLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhc29UZW0udG9rZW5fYXV0b2dlbmVyYWRvX2RtLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhc29UZW0uZW5jX2F1dG9nZW5lcmFkb19kbSxcclxuICAgICAgICAgICAgICAgICAgICBjYXNvVGVtLmVuY19hdXRvZ2VuZXJhZG9fZG1fY2FwYSxcclxuICAgICAgICAgICAgICAgICAgICBjYXNvVGVtLnByb2llXHJcbiAgICAgICAgICAgICAgICBdKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgYGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAke2JlLmRiLnF1b3RlSWRlbnQodW5pZGFkX2FuYWxpc2lzKX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgJHtiZS5kYi5xdW90ZUlkZW50KHBrX2FncmVnYWRhKX0gPSAkMlxyXG4gICAgICAgICAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc190ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBlbmMgPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIC0tcGsgdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBoaXN0b3JpYWxfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBlbmMgPSAkMiAtLXBrIHZlcmlmaWNhZGFcclxuICAgICAgICAgICAgICAgIGAsIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBpbmNvbnNpc3RlbmNpYXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kICR7YmUuZGIucXVvdGVJZGVudChwa19hZ3JlZ2FkYSl9ID0gJDJcclxuICAgICAgICAgICAgICAgIGAsIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBpbl9jb25fdmFyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBwa19pbnRlZ3JhZGEtPj4ke2JlLmRiLnF1b3RlTGl0ZXJhbChwa19hZ3JlZ2FkYSl9ID0gJDJcclxuICAgICAgICAgICAgICAgIGAsIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBpbmNvbnNpc3RlbmNpYXNfdWx0aW1hc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgcGtfaW50ZWdyYWRhLT4+JHtiZS5kYi5xdW90ZUxpdGVyYWwocGtfYWdyZWdhZGEpfSA9ICQyXHJcbiAgICAgICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgbGEgZW5jdWVzdGEgJHtwYXJhbXMuZW5jfSBzZSBib3Jyw7MgY29ycmVjdGFtZW50ZWA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignbm8gc2UgcHVlZGUgYm9ycmFyIGxhIGVuY3Vlc3RhIHBvcnF1ZSBlbCBvcGVyYXRpdm8gdGllbmUgbXVlc3RyYSBlc3TDoXRpY2EnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFzX2NhcGFjaXRhY2lvbl9ib3JyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JywgcmVmZXJlbmNlczogXCJvcGVyYXRpdm9zXCIgfVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6IFsnYWRtaW4nXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvIH0+KSB7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciBwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYSA9IGF3YWl0IGdldE9wZXJhdGl2b1Blcm1pdGVHZW5lcmFyTXVlc3RyYShjb250ZXh0LmNsaWVudCwgcGFyYW1zLm9wZXJhdGl2byk7XHJcbiAgICAgICAgICAgIGlmIChwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5jc0FCb3JyYXIgPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgYHNlbGVjdCAqIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuY19hdXRvZ2VuZXJhZG9fZG1fY2FwYSBpcyBub3QgbnVsbFxyXG4gICAgICAgICAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm9dKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcm93IG9mIGVuY3NBQm9ycmFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmVuY3Vlc3RhX2JvcnJhci5jb3JlRnVuY3Rpb24oY29udGV4dCwgeyBvcGVyYXRpdm86IHBhcmFtcy5vcGVyYXRpdm8sIGVuYzogcm93LmVuYyB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdzZSBib3JyYXJvbiBsYXMgZW5jdWVzdGFzIGRlIGNhcGFjaXRhY2nDs24nO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ25vIHNlIHB1ZWRlIGJvcnJhciBsYSBlbmN1ZXN0YSBwb3JxdWUgZWwgb3BlcmF0aXZvIHRpZW5lIG11ZXN0cmEgZXN0w6F0aWNhJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2FjY2lvbl90YXJlYXNfdGVtX2VqZWN1dGFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnY29uZGljaW9uJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdhY2Npb24nLCB0eXBlTmFtZTogJ2pzb25iJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgdGFyZWE6IHN0cmluZywgZW5jOiBzdHJpbmcsIGNvbmRpY2lvbjogc3RyaW5nLCBhY2Npb246IEVzdGFkb0FjY2lvbiB9Pikge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgYWNjaW9uID0gcGFyYW1zLmFjY2lvbiBhcyBFc3RhZG9BY2Npb247XHJcbiAgICAgICAgICAgIHZhciBjdW1wbGU6IGJvb2xlYW4gPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0IGFjY2lvbl9jdW1wbGVfY29uZGljaW9uKCQ1LCAkNiwgJDcsICQ4LCAoXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0IGNvbmRpY2lvbiBcclxuICAgICAgICAgICAgICAgICAgICAgIGZyb20gZXN0YWRvc19hY2Npb25lcyBcclxuICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBlc3RhZG8gPSAkMiBhbmQgZWFjY2lvbiA9ICQzIGFuZCBlc3RhZG9fZGVzdGlubyA9ICQ0XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClgLCBbXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkbyxcclxuICAgICAgICAgICAgICAgIGFjY2lvbi5lYWNjaW9uLFxyXG4gICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkb19kZXN0aW5vLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLm9wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgIGFjY2lvbi5lc3RhZG8sXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMuZW5jLFxyXG4gICAgICAgICAgICAgICAgYWNjaW9uLmVhY2Npb24sXHJcbiAgICAgICAgICAgIF0pLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWU7XHJcbiAgICAgICAgICAgIGlmICghY3VtcGxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gc2UgcHVkbyBlamVjdXRhciBsYSBhY2Npw7NuLCBubyBzZSBjdW1wbGUgbGEgY29uZGljacOzbiBcIiR7cGFyYW1zLmNvbmRpY2lvbn1cIiBvIGJpZW4gZWwgZXN0YWRvIGVzdMOhIGRlc2FjdHVhbGl6YWRvLCByZWZyZXNxdWUgbGEgZ3JpbGxhLmApXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlbmM9JDIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5vcGVyYXRpdm8sXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmVuYyxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMudGFyZWEsXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkb19kZXN0aW5vXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgaWYgKGFjY2lvbi5ub21icmVfcHJvY2VkdXJlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYmUucHJvY2VkdXJlW2FjY2lvbi5ub21icmVfcHJvY2VkdXJlXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZVthY2Npb24ubm9tYnJlX3Byb2NlZHVyZV0uY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtcylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIGV4aXN0ZSBlbCBwcm9jZWR1cmUgXCIke2FjY2lvbi5ub21icmVfcHJvY2VkdXJlfVwiIGRlZmluaWRvIGVuIGxhIHRhYmxhIFwiZXN0YWRvc19hY2Npb25lc1wiIHBhcmEgZWxcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm86ICR7YWNjaW9uLm9wZXJhdGl2b30sIGVzdGFkbzogJHthY2Npb24uZXN0YWRvfSwgZWFjY2lvbjogJHthY2Npb24uZWFjY2lvbn0uYClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBCVVNDTyBQQVNFIERFIFRBUkVBXHJcbiAgICAgICAgICAgIHZhciB0YXJlYVNpZ3VpZW50ZSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgKlxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3Byb3hpbWFzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byA9ICQxIGFuZCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWEgPSAkMiBhbmQgZXN0YWRvID0gJDMgYW5kIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYV9jdW1wbGVfY29uZGljaW9uKCQ0LCAkNSwgJDYsICQ3LCBjb25kaWNpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXIgYnkgb3JkZW5cclxuICAgICAgICAgICAgICAgICAgICBsaW1pdCAxYFxyXG4gICAgICAgICAgICAgICAgLCBbXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm9wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMudGFyZWEsXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkb19kZXN0aW5vLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5vcGVyYXRpdm8sXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnRhcmVhLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjY2lvbi5lc3RhZG9fZGVzdGlubyxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZW5jXHJcbiAgICAgICAgICAgICAgICBdKS5mZXRjaE9uZVJvd0lmRXhpc3RzKCkpLnJvdztcclxuICAgICAgICAgICAgaWYgKHRhcmVhU2lndWllbnRlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDNcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYFxyXG4gICAgICAgICAgICAgICAgICAgICwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsIHRhcmVhU2lndWllbnRlLnRhcmVhX2Rlc3Rpbm9dXHJcbiAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXV0b0FzaWduYWRvID0gdGFyZWFTaWd1aWVudGUucmVnaXN0cmFfcmVjZXBjaW9uaXN0YSA/IGNvbnRleHQudXNlci5pZHBlciA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICBsZXQgcSA9IGNvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0c19lbnRyYWRhID0gY3VycmVudF90aW1lc3RhbXAsIGFkZWxhbnRhciA9IG51bGwsIGVzdGFkbyA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2F1dG9Bc2lnbmFkbyA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiLCByZWNlcGNpb25pc3RhPVwiICsgcShhdXRvQXNpZ25hZG8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYFxyXG4gICAgICAgICAgICAgICAgICAgICwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsIHRhcmVhU2lndWllbnRlLnRhcmVhX2Rlc3Rpbm8sIHRhcmVhU2lndWllbnRlLmVzdGFkb19kZXN0aW5vXVxyXG4gICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRhcmVhU2lndWllbnRlLm5vbWJyZV9wcm9jZWR1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmVbdGFyZWFTaWd1aWVudGUubm9tYnJlX3Byb2NlZHVyZV0uY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gRklOIFBBU0UgREUgVEFSRUFcclxuICAgICAgICAgICAgcmV0dXJuIFwib2tcIjtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2NhcmdhX3ByZXBhcmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIHRhcmVhOiBzdHJpbmcsIGVuYzogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IG9wZXJhY2lvbiA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmMsIE9QRVJBQ0lPTl9QUkVQQVJBUl9DQVJHQV0pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9kaXNwb25pYmlsaXphcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCB0YXJlYTogc3RyaW5nLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBhc2lnbmFkbyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19jYXJnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgdGFyZWE6IHN0cmluZywgZW5jOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgb3BlcmFjaW9uID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2Rlc2NhcmdhX3ByZXBhcmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIHRhcmVhOiBzdHJpbmcsIGVuYzogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IG9wZXJhY2lvbiA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmMsIE9QRVJBQ0lPTl9QUkVQQVJBUl9ERVNDQVJHQV0pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19kZXNjYXJnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgdGFyZWE6IHN0cmluZywgZW5jOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgb3BlcmFjaW9uID0gJ2NhcmdhcidcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9hbmFsaXphcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCB0YXJlYTogc3RyaW5nLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuY29uc2lzdGlyX2VuY3Vlc3RhLmNvcmVGdW5jdGlvbihjb250ZXh0LCB7IG9wZXJhdGl2bzogcGFyYW1zLm9wZXJhdGl2bywgaWRfY2FzbzogcGFyYW1zLmVuYyB9KVxyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2luY29uc2lzdGVuY2lhc19lbmN1ZXN0YV9jb250cm9sYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgdGFyZWE6IHN0cmluZywgZW5jOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgdmFyIGNhbnRpZGFkOiBudW1iZXIgPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0IGNvdW50KCopIGFzIGN1bXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gaW5jb25zaXN0ZW5jaWFzIGkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gY29uc2lzdGVuY2lhcyBjIHVzaW5nIChvcGVyYXRpdm8sIGNvbnNpc3RlbmNpYSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gbW9tZW50b3NfY29uc2lzdGVuY2lhIG1jIHVzaW5nIChvcGVyYXRpdm8sIG1vbWVudG8pXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byA9ICQxIGFuZCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdml2aWVuZGEgPSAkMiBhbmQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbWVudG9fY29uc2lzdGVuY2lhX2N1bXBsZV9jb25kaWNpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYy5vcGVyYXRpdm8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnZpdmllbmRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJDMsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdCBjb25kaWNpb24gZnJvbSBtb21lbnRvc19jb25zaXN0ZW5jaWEgd2hlcmUgb3BlcmF0aXZvID0gbWMub3BlcmF0aXZvIGFuZCBtb21lbnRvID0gbWMubW9tZW50bylcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSBhbmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgaS5qdXN0aWZpY2FjaW9uIGlzIG51bGxgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsIGNvbnRleHQudXNlcm5hbWVdKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWVcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgbm8gc2UgcHVlZGUgdmVyaWZpY2FyIGxhIHRhcmVhIHBvcnF1ZSBoYXkgaW5jb25zaXN0ZW5jaWFzLCBwb3IgZmF2b3IgcmVzdcOpbHZhbGFzIG8ganVzdGlmw61xdWVsYXMgZW4gY2FzbyBkZSBzZXIgbmVjZXNhcmlvLmApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV92ZXJpZmljYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgdGFyZWE6IHN0cmluZywgZW5jOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmluY29uc2lzdGVuY2lhc19lbmN1ZXN0YV9jb250cm9sYXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHZlcmlmaWNhZG8gPSAnMSdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub192ZXJpZmljYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgdGFyZWE6IHN0cmluZywgZW5jOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdmVyaWZpY2FkbyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9jZXJyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgdGFyZWE6IHN0cmluZywgZW5jOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdmVyaWZpY2FkbyA9ICcxJywgYXNpZ25hZG8gPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jLCBjb250ZXh0LnVzZXIuaWRwZXJdKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfbm9fY2VycmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIHRhcmVhOiBzdHJpbmcsIGVuYzogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHZlcmlmaWNhZG8gPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfc3VwZXJ2aXNhcl9wcmVzZW5jaWFsJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGVuYzogc3RyaW5nLCB0YXJlYTogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDMsIHN1cGVydmlzaW9uX2RpcmlnaWRhID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCAnc3VwZScsIDFdKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfc3VwZXJ2aXNhcl90ZWxlZm9uaWNhJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGVuYzogc3RyaW5nLCB0YXJlYTogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDMsIHN1cGVydmlzaW9uX2RpcmlnaWRhID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCAnc3VwZScsIDJdKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfbm9fc3VwZXJ2aXNhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZywgdGFyZWE6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzLCBzdXBlcnZpc2lvbl9kaXJpZ2lkYSA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCAnZmluYyddKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfcGFzYXJfYV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGVuYzogc3RyaW5nLCB0YXJlYTogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdDQydcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMiBhbmQgdGFyZWEgaW4gKCQzLCQ0KSAtLXF1aWVybyBwYXNhciBsYXMgMiB0YXJlYXMgYSBDQ1xyXG4gICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCAnYW5hYycsICdwcm9jJ10pXHJcbiAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ2FuYWMnXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX3Bhc2FyX2FfYW5hYycsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZywgdGFyZWE6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnQSdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMiBhbmQgdGFyZWE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdwcm9jJ10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJzBEJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYT0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ2FuYWMnXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2Rldm9sdmVyX3Byb2NfZGVzZGVfYW5hYycsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZywgdGFyZWE6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuZW5jdWVzdGFfdmVyaWZpY2FyLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbXMpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnQSdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMiBhbmQgdGFyZWE9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdwcm9jJ10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdwcm9jJ10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19kZXZvbHZlcl9wcm9jX2Rlc2RlX2FuYWMnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgZW5jOiBzdHJpbmcsIHRhcmVhOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJ0NDJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYSBpbiAoJDMsJDQpIC0tcXVpZXJvIHBhc2FyIGxhcyAyIHRhcmVhcyBhIENDXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZS5lbmN1ZXN0YV9ub192ZXJpZmljYXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfcmVjdXBlcmFyX2Rlc2RlX2FuYWMnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgZW5jOiBzdHJpbmcsIHRhcmVhOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHsgb3BlcmF0aXZvLCBlbmMsIHRhcmVhIH0gPSBwYXJhbXM7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZS5lbmN1ZXN0YV92ZXJpZmljYXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCAncmVjdSddKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfbm9fcmVjdXBlcmFyX2Rlc2RlX2FuYWMnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgZW5jOiBzdHJpbmcsIHRhcmVhOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHsgb3BlcmF0aXZvLCBlbmMsIHRhcmVhIH0gPSBwYXJhbXM7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIGFuZCB0YXJlYV9hY3R1YWwgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtvcGVyYXRpdm8sIGVuYywgJ3JlY3UnLCAnYW5hYyddKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZS5lbmN1ZXN0YV9ub192ZXJpZmljYXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZm9yemFyX3RhcmVhJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYV9hY3R1YWwnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhX251ZXZhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgZW5jOiBzdHJpbmcsIHRhcmVhX2FjdHVhbDogc3RyaW5nLCB0YXJlYV9udWV2YTogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIHZhciB7IG9wZXJhdGl2bywgZW5jLCB0YXJlYV9hY3R1YWwsIHRhcmVhX251ZXZhIH0gPSBwYXJhbXM7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZSB0ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIGFuZCB0YXJlYV9hY3R1YWwgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtvcGVyYXRpdm8sIGVuYywgdGFyZWFfYWN0dWFsLCB0YXJlYV9udWV2YV0pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRhcmVhc190ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdWJyBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbb3BlcmF0aXZvLCBlbmMsIHRhcmVhX2FjdHVhbF0pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRhcmVhc190ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICcwRCdcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbb3BlcmF0aXZvLCBlbmMsIHRhcmVhX251ZXZhXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2hhYmlsaXRhcl9kZXNoYWJpbGl0YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGhhYmlsaXRhZGEgPSBub3QgaGFiaWxpdGFkYVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFzX3Byb2Nlc2FtaWVudG9fcGFzYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIF9wYXJhbXM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7fT4pe1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcGFzYXJFbmN1ZXN0YXNBUHJvaWUoY29udGV4dC5jbGllbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnaW50ZXJjYW1iaWFyX2VuY3Vlc3RhcycsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMxJywgcmVmZXJlbmNlczogJ3RlbScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnY2FudEhvZzEnLCB0eXBlTmFtZTogJ2ludGVnZXInIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYzInLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2NhbnRIb2cyJywgdHlwZU5hbWU6ICdpbnRlZ2VyJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdwYXNvJywgdHlwZU5hbWU6ICdpbnRlZ2VyJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdjb25maXJtYScsIHR5cGVOYW1lOiAnYm9vbGVhbicsIGRlZmF1bHRWYWx1ZTogZmFsc2UsIGxhYmVsOiAnQ29uZmlybWEgaW50ZXJjYW1iaW8gZGUgbG9zIGRhdG9zIGVudHJlIGxhcyBlbmN1ZXN0YXM/ICcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJvbGVzOiBbJ2Nvb3JfcHJvYycsICdwcm9jZXNhbWllbnRvJywgJ2FkbWluJ10sXHJcbiAgICAgICAgcHJvZ3Jlc3M6IHRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPGFueT4pIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFBhcmEgY29udHJvbGFyOlxyXG4gICAgICAgICAgICAgKiAtIHF1ZSBsYXMgaG9nYXJlcywgcGVyc29uYXMsIGV0YyBlc3TDqW4gaW50ZXJjYW1iaWFkYXMgXHJcbiAgICAgICAgICAgICAqICAqIHRhbnRvIGVuIGVsIGpzb25cclxuICAgICAgICAgICAgICogICogY29tbyBlbiBsYXMgVERzXHJcbiAgICAgICAgICAgICAqIC0gY29zYXMgcXVlIHNlIGNhbGN1bGFuIHBvciBsYSBhcHA/IGN1YWxlcz8gKHJlc3VtZW5fZXN0YWRvLCByZWEgeSBub3JlYSlcclxuICAgICAgICAgICAgICovXHJcblxyXG4gICAgICAgICAgICBpZiAoIXBhcmFtcy5jb25maXJtYSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb25maXJtw7MgaW50ZXJjYW1iaW8nKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcGFyYW1zLmVuYzEgfHwgIXBhcmFtcy5lbmMyKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCBGYWx0YSBpbmdyZXNhciB1biBudW1lcm8gZGUgZW5jdWVzdGEhJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5lbmMxID09IHBhcmFtcy5lbmMyKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCBlbmMxIHkgZW5jMiBkZWJlbiBzZXIgZGlzdGludG9zIScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcGFyYW1zLmNhbnRIb2cxKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCBDYW50aWRhZCBkZSBIb2dhcmVzIGRlIGVuYzEsIG5vIGVzdGEgaW5ncmVzYWRvIScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcGFyYW1zLmNhbnRIb2cyKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCBDYW50aWRhZCBkZSBIb2dhcmVzIGRlIGVuYzIsIG5vIGVzdGEgaW5ncmVzYWRvIScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIENPTlRST0xBUiBRVUUgTklOR1VOQSBERSBMQVMgMiBlbmN1ZXN0YXMgRVNURSBDQVJHQURBLCBBQklFUlRBIEZBTFRBXHJcbiAgICAgICAgICAgIGNvbnN0IE9QRVJBVElWTyA9IGF3YWl0IGdldE9wZXJhdGl2b0FjdHVhbChjb250ZXh0KTtcclxuICAgICAgICAgICAgdmFyIHsgdW5pZGFkX2FuYWxpc2lzLCBwa19hZ3JlZ2FkYSB9ID0gKGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBPUEVSQVRJVk8pKTtcclxuICAgICAgICAgICAgY29uc3QgY2FudF9ob2dzID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCB2aXZpZW5kYSwgY291bnQoKiluaCBmcm9tIGhvZ2FyZXMgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAodml2aWVuZGE9JDIgb3Igdml2aWVuZGE9JDMpXHJcbiAgICAgICAgICAgICAgICBncm91cCBieSB2aXZpZW5kYSBvcmRlciBieSB2aXZpZW5kYVxyXG4gICAgICAgICAgICAgICAgYCwgW09QRVJBVElWTywgcGFyYW1zLmVuYzEsIHBhcmFtcy5lbmMyXSkuZmV0Y2hBbGwoKSkucm93cztcclxuXHJcbiAgICAgICAgICAgIHZhciBwYXJhbV9uaCA9IFtwYXJhbXMuY2FudEhvZzEsIHBhcmFtcy5jYW50SG9nMl07XHJcbiAgICAgICAgICAgIGNhbnRfaG9ncy5mb3JFYWNoKCh4ZSwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtX25oW2ldICE9PSB4ZS5uaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtZW5zID0gYEVycm9yLCBubyBjb2luY2lkZSBsYSBjYW50aWRhZCBkZSBob2dhcmVzIGRlIGVuYyR7aSArIDF9YDtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoeG1lbnMpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVnRW5jID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgc2VsZWN0IGVuYywgdGFyZWFfYWN0dWFsLCBqc29uX2VuY3Vlc3RhIGZyb20gdGVtIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgKGVuYyA9JDIgb3IgZW5jPSQzKSBvcmRlciBieSBlbmNcclxuICAgICAgICAgICAgYCwgW09QRVJBVElWTywgcGFyYW1zLmVuYzEsIHBhcmFtcy5lbmMyXSkuZmV0Y2hBbGwoKSkucm93cztcclxuXHJcbiAgICAgICAgICAgIGlmIChyZWdFbmMubGVuZ3RoICE9IDIpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IsIE5vIHNlIGVuY29udHJhcm9uIDIgZW5jdWVzdGFzJylcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGxpbXBpYSBsYXMgVERzICBcclxuICAgICAgICAgICAgICAgIGxldCBbZW5jMSwgZW5jMl0gPSBbcmVnRW5jWzBdLCByZWdFbmNbMV1dXHJcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnBhc28gPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgZGVsZXRlIGZyb20gJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQodW5pZGFkX2FuYWxpc2lzKX0gd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAodml2aWVuZGE9JDIgT1Igdml2aWVuZGE9JDMpYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAsIFtPUEVSQVRJVk8sIGVuYzEuZW5jLCBlbmMyLmVuY11cclxuICAgICAgICAgICAgICAgICAgICApLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtcy5wYXNvID09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NpbXVsYSBndWFyZGFkb1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNpbXVsYXJHdWFyZGFkb0RlRW5jdWVzdGFEZXNkZUFwcEVzY3JpdG9yaW8oY29udGV4dCwgT1BFUkFUSVZPLCBlbmMxLmVuYywgZW5jMS50YXJlYV9hY3R1YWwsIGVuYzIuanNvbl9lbmN1ZXN0YSlcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzaW11bGFyR3VhcmRhZG9EZUVuY3Vlc3RhRGVzZGVBcHBFc2NyaXRvcmlvKGNvbnRleHQsIE9QRVJBVElWTywgZW5jMi5lbmMsIGVuYzIudGFyZWFfYWN0dWFsLCBlbmMxLmpzb25fZW5jdWVzdGEpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIChgTGlzdG8gcGFzbyAke3BhcmFtcy5wYXNvfS4gSW50ZXJjYW1iaW8gcmVhbGl6YWRvIGVudHJlIGxhcyBlbmN1ZXN0YXMgICR7cGFyYW1zLmVuYzF9IHkgJHtwYXJhbXMuZW5jMn0uIFBvciBmYXZvciBjb25zaXN0YSBsYSBlbmN1ZXN0YWApXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YWRvcl9kbXNfbW9zdHJhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnLCByZWZlcmVuY2VzOiBcIm9wZXJhdGl2b3NcIiB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmN1ZXN0YWRvcicsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJvbGVzOiBbJ2Nvb3JfcHJvYycsICdjb29yX2NhbXBvJywgJ2FkbWluJ10sXHJcbiAgICAgICAgcmVzdWx0T2s6ICdtb3N0cmFyX2VuY3Vlc3Rhc19hX2JsYW5xdWVhcicsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgZW5jdWVzdGFkb3I6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ICpcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGFzaWduYWRvID0gJDIgYW5kIGNhcmdhZG9fZG0gaXMgbm90IG51bGxcclxuICAgICAgICAgICAgICAgICAgICBvcmRlciBieSBjYXJnYWRvX2RtXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmN1ZXN0YWRvcl0pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5yb3dDb3VudCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gc2UgZW5jb250cmFyb24gZW5jdWVzdGFzIGNhcmdhZGFzIGVuIHVuIERNIHBhcmEgZWwgb3BlcmF0aXZvICR7cGFyYW1zLm9wZXJhdGl2b30sIGVuY3Vlc3RhZG9yICR7cGFyYW1zLmVuY3Vlc3RhZG9yfWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHsgcm93czogcmVzdWx0LnJvd3MsIG9wZXJhdGl2bzogcGFyYW1zLm9wZXJhdGl2byB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZG1fYmxhbnF1ZWFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6IFwib3BlcmF0aXZvc1wiIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3Rva2VuJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6IFsnY29vcl9wcm9jJywgJ2Nvb3JfY2FtcG8nLCAnYWRtaW4nXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCB0b2tlbjogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGxldCB0YXJlYXNUZW1SZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBjYXJnYWRvX2RtID0gbnVsbCwgb3BlcmFjaW9uID0gJDMsIGVzdGFkbyA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBjYXJnYWRvX2RtID0gJDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRva2VuLCBPUEVSQUNJT05fUFJFUEFSQVJfREVTQ0FSR0EsIEVTVEFET19QT1NURVJJT1JfREVTQ0FSR0FdKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoQWxsKCk7XHJcbiAgICAgICAgICAgIGlmICh0YXJlYXNUZW1SZXN1bHQucm93Q291bnQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3IoJ05vIHNlIGJsYW5xdWXDsyBuaW5ndW5hIGVuY3Vlc3RhJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGxldCB0dCBvZiB0YXJlYXNUZW1SZXN1bHQucm93cykge1xyXG4gICAgICAgICAgICAgICAgdHQucmVzdWx0X2JsYW5xdWVvID0gYGVuYyAke3R0LmVuY30gc2UgYmxhbnF1ZcOzIGNvcnJlY3RhbWVudGUuYDtcclxuICAgICAgICAgICAgICAgIGxldCByZXN1bHRCYWNrdXAgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQganNvbl9lbmN1ZXN0YSA9IGpzb25fYmFja3VwLCBmZWNoYV9tb2RpZl9lbmN1ZXN0YSA9IGZlY2hhX2JhY2t1cFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMiBhbmQgZmVjaGFfYmFja3VwID4gY29hbGVzY2UoZmVjaGFfbW9kaWZfZW5jdWVzdGEsICcxOTAwLTAxLTAxJykgYW5kIGpzb25fYmFja3VwIGlzIG5vdCBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgICAgICBbdHQub3BlcmF0aXZvLCB0dC5lbmNdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mZXRjaE9uZVJvd0lmRXhpc3RzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0QmFja3VwLnJvd0NvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHQucmVzdWx0X2JsYW5xdWVvICs9IGAgU2UgcmVzdGFibGVjacOzIGVsIGJhY2t1cCBjb24gZmVjaGEgJHtyZXN1bHRCYWNrdXAucm93LmZlY2hhX2JhY2t1cC50b1ltZEhtcygpfS5gXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHsgcGFyYW1zOiBxdWVyeVBhcmFtcywgc2V0dGVycyB9ID0gZ2V0U2V0dGVyc0FuZFBhcmFtZXRlcnNGb3JSZWFOb1JlYVJlc3VtZW5Fc3RhZG8oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYTogdHQudGFyZWEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDogcmVzdWx0QmFja3VwLnJvdy5qc29uX2VuY3Vlc3RhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0ZXJzOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBbdHQub3BlcmF0aXZvLCB0dC5lbmMsIHR0LnRhcmVhXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGlubzogJ3RhcmVhc190ZW0nXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgJHtzZXR0ZXJzLmpvaW4oJywnKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCB0YXJlYSA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc1xyXG4gICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzaW11bGFyR3VhcmRhZG9EZUVuY3Vlc3RhRGVzZGVBcHBFc2NyaXRvcmlvKGNvbnRleHQsIHJlc3VsdEJhY2t1cC5yb3cub3BlcmF0aXZvLCByZXN1bHRCYWNrdXAucm93LmVuYywgdHQudGFyZWEsIHJlc3VsdEJhY2t1cC5yb3cuanNvbl9lbmN1ZXN0YSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGFyZWFzVGVtUmVzdWx0LnJvd3M7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdtb2RvX2RtX2RlZmVjdG9fb2J0ZW5lcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgIF0sXHJcbiAgICAgICAgdW5sb2dnZWQ6IHRydWUsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8e30+KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSBjb250ZXh0O1xyXG4gICAgICAgICAgICBjb25zdCBtb2RvRG1EZWZlY3RvID0gKGF3YWl0IChjbGllbnQucXVlcnkoYHNlbGVjdCBtb2RvX2RtX2RlZmVjdG8gZnJvbSBwYXJhbWV0cm9zIHdoZXJlIHVuaWNvX3JlZ2lzdHJvYCwgW10pLmZldGNoVW5pcXVlVmFsdWUoKSkpLnZhbHVlO1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kb0RtRGVmZWN0bztcclxuICAgICAgICB9XHJcbiAgICB9LCB7XHJcbiAgICAgICAgYWN0aW9uOiAnbW9kb19hcHBfZ2V0JyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXSxcclxuICAgICAgICB1bmxvZ2dlZDogdHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBfcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7fT4pIHtcclxuICAgICAgICAgICAgY29uc3QgeyBiZSB9ID0gY29udGV4dDtcclxuICAgICAgICAgICAgcmV0dXJuIGdldE1vZG9CeVBvbGljeShiZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSwge1xyXG4gICAgICAgIC8vIGxhIGF5dWRhIGVuIGzDrW5lYSBxdWUgbGUgY29ycmVzcG9uZGUgYWwgdXN1YXJpbyBzZWfDum4gc3Ugcm9sLCBzdXMgcGVybWlzb3MgeSBlbCBtb2RvICh2ZXIgZG9jcy9heXVkYS1vbmxpbmUubWQpXHJcbiAgICAgICAgYWN0aW9uOiAnYXl1ZGFfdHJhZXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIF9wYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHt9Pik6IFByb21pc2U8QXl1ZGFQYXJhVXN1YXJpbz4ge1xyXG4gICAgICAgICAgICBjb25zdCB7IGJlIH0gPSBjb250ZXh0O1xyXG4gICAgICAgICAgICBjb25zdCBxdWllbiA9IHF1aWVuQ29uc3VsdGFBeXVkYShjb250ZXh0KTtcclxuICAgICAgICAgICAgY29uc3QgdGVtYXMgPSB0ZW1hc1Zpc2libGVzKGJlLmNhY2hlcy5heXVkYSwgcXVpZW4pO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgcm9sOiBxdWllbi5yb2wsXHJcbiAgICAgICAgICAgICAgICBtb2RvOiBxdWllbi5tb2RvLFxyXG4gICAgICAgICAgICAgICAgdGVtYXM6IHRlbWFzLm1hcCh0ZW1hID0+ICh7IGlkOiB0ZW1hLmlkLCB0aXR1bG86IHRlbWEudGl0dWxvLCBodG1sOiB0ZW1hLmh0bWwgfSkpLFxyXG4gICAgICAgICAgICAgICAgbWVudTogbWVudUNvbkF5dWRhKGJlLmdldE1lbnUoY29udGV4dCkubWVudSwgdGVtYXMpLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnb3BlcmF0aXZvX21pZ3JhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm9fb3JpZ2VuJywgdHlwZU5hbWU6ICd0ZXh0JywgcmVmZXJlbmNlczogJ29wZXJhdGl2b3MnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2b19kZXN0aW5vJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdzY2hlbWFfbmFtZScsIHR5cGVOYW1lOiAndGV4dCcsIGxhYmVsOiAnbm9tYnJlIGRlIHNjaGVtYScgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJlc3VsdE9rOiAnZG93bmxvYWRfc3FsJyxcclxuICAgICAgICBwcm9jZWVkTGFiZWw6ICdtaWdyYXInLFxyXG4gICAgICAgIHJvbGVzOiBbJ2FkbWluJ10sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiB7IG9wZXJhdGl2b19vcmlnZW46IHN0cmluZywgb3BlcmF0aXZvX2Rlc3Rpbm86IHN0cmluZywgc2NoZW1hX25hbWU6IHN0cmluZyB9KSB7XHJcbiAgICAgICAgICAgIC8vIDEuIENvbnN1bHRhbW9zIGxhcyB0YWJsYXMgYmFzZSBkZWwgb3JpZ2VuIChzaWVtcHJlIHRpZW5lbiBvcGVyYXRpdm8pXHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VUYWJsZXNSZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICAgIFsnb3BlcmF0aXZvcycsICd0YXJlYXMnLCAndW5pZGFkX2FuYWxpc2lzJywgJ2Nhc2lsbGVyb3MnXS5tYXAoYXN5bmMgdGFibGVOYW1lID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGFibGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhc09wZXJhdGl2bzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBzZWxlY3QgKiBmcm9tICR7Y29udGV4dC5iZS5kYi5xdW90ZUlkZW50KHRhYmxlTmFtZSl9IHdoZXJlIG9wZXJhdGl2byA9ICQxYCwgW3BhcmFtcy5vcGVyYXRpdm9fb3JpZ2VuXSkuZmV0Y2hBbGwoKVxyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBiYXNlVGFibGVzUmVzdWx0LmZvckVhY2goKF8sIGkpID0+IGJhc2VUYWJsZXNSZXN1bHRbaV0ucmVzdWx0LnJvd3MuZm9yRWFjaChyb3cgPT4gcm93Lm9wZXJhdGl2byA9IHBhcmFtcy5vcGVyYXRpdm9fZGVzdGlubykpO1xyXG5cclxuICAgICAgICAgICAgLy9DaGVxdWVvIHkgY29uc3VsdGEgZGUgdGFibGFzIHJlYXMgKHJlYSwgbm9fcmVhLCByZWFfc3VwLCBub19yZWFfc3VwKVxyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25hbFRhYmxlcyA9IFsncmVhJywgJ25vX3JlYScsICdyZWFfc3VwJywgJ25vX3JlYV9zdXAnXTtcclxuICAgICAgICAgICAgY29uc3QgdGFibGVzRXhpc3RSZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgdGFibGVfbmFtZSBcclxuICAgICAgICAgICAgICAgICBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgXHJcbiAgICAgICAgICAgICAgICAgd2hlcmUgdGFibGVfc2NoZW1hID0gY3VycmVudF9zY2hlbWEoKSBcclxuICAgICAgICAgICAgICAgICAgIGFuZCB0YWJsZV9uYW1lID0gYW55KCQxKWAsXHJcbiAgICAgICAgICAgICAgICBbb3B0aW9uYWxUYWJsZXNdXHJcbiAgICAgICAgICAgICkuZmV0Y2hBbGwoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nT3B0aW9uYWxUYWJsZXMgPSB0YWJsZXNFeGlzdFJlc3VsdC5yb3dzLm1hcChyID0+IHIudGFibGVfbmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pc3NpbmdPcHRpb25hbFRhYmxlcyA9IG9wdGlvbmFsVGFibGVzLmZpbHRlcih0ID0+ICFleGlzdGluZ09wdGlvbmFsVGFibGVzLmluY2x1ZGVzKHQpKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbmFsVGFibGVzUmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgICBleGlzdGluZ09wdGlvbmFsVGFibGVzLm1hcChhc3luYyB0YWJsZU5hbWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHNSZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgYHNlbGVjdCBjb2x1bW5fbmFtZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0YWJsZV9zY2hlbWEgPSBjdXJyZW50X3NjaGVtYSgpIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGFibGVfbmFtZSA9ICQxYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmxlTmFtZV1cclxuICAgICAgICAgICAgICAgICAgICApLmZldGNoQWxsKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc09wZXJhdGl2byA9IGNvbHNSZXN1bHQucm93cy5zb21lKGMgPT4gYy5jb2x1bW5fbmFtZSA9PT0gJ29wZXJhdGl2bycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVN0ciA9IGhhc09wZXJhdGl2b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBzZWxlY3QgKiBmcm9tICR7Y29udGV4dC5iZS5kYi5xdW90ZUlkZW50KHRhYmxlTmFtZSl9IHdoZXJlIG9wZXJhdGl2byA9ICQxYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBzZWxlY3QgKiBmcm9tICR7Y29udGV4dC5iZS5kYi5xdW90ZUlkZW50KHRhYmxlTmFtZSl9YDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBoYXNPcGVyYXRpdm8gPyBbcGFyYW1zLm9wZXJhdGl2b19vcmlnZW5dIDogW107XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkocXVlcnlTdHIsIHF1ZXJ5UGFyYW1zKS5mZXRjaEFsbCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBvcHRpb25hbFRhYmxlc1Jlc3VsdC5mb3JFYWNoKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHQuaGFzT3BlcmF0aXZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5yZXN1bHQucm93cy5mb3JFYWNoKHJvdyA9PiByb3cub3BlcmF0aXZvID0gcGFyYW1zLm9wZXJhdGl2b19kZXN0aW5vKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDb21iaW5hbW9zIGJhc2UgeSBvcGNpb25hbGVzIGVuY29udHJhZGFzXHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlc1Jlc3VsdCA9IFsuLi5iYXNlVGFibGVzUmVzdWx0LCAuLi5vcHRpb25hbFRhYmxlc1Jlc3VsdF07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkaXNhYmxlQ2FzaWxsZXJvc0ZLID0gYFxyXG4gICAgICAgICAgICAgICAgQUxURVIgVEFCTEUgJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQocGFyYW1zLnNjaGVtYV9uYW1lKX0uY2FzaWxsZXJvcyBESVNBQkxFIFRSSUdHRVIgQUxMO1xyXG4gICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICBjb25zdCBlbmFibGVDYXNpbGxlcm9zRksgPSBgXHJcbiAgICAgICAgICAgICAgICBBTFRFUiBUQUJMRSAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudChwYXJhbXMuc2NoZW1hX25hbWUpfS5jYXNpbGxlcm9zIEVOQUJMRSBUUklHR0VSIEFMTDtcclxuICAgICAgICAgICAgYDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkSW5zZXJ0cyA9IChxdWVyeTogeyBuYW1lOiBzdHJpbmcsIGhhc09wZXJhdGl2bz86IGJvb2xlYW4sIHJlc3VsdDogUmVzdWx0Um93cyB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmllbGRzID0gWy4uLnF1ZXJ5LnJlc3VsdC5maWVsZHNdO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNpIGxhIHRhYmxhIGRlIHJlYSBubyB0ZW7DrWEgbGEgY29sdW1uYSBvcGVyYXRpdm8sIGxhIGFncmVnYW1vcyBhbCBpbnNlcnRcclxuICAgICAgICAgICAgICAgIGlmIChxdWVyeS5oYXNPcGVyYXRpdm8gPT09IGZhbHNlICYmICFmaWVsZHMuc29tZSgoZjogeyBuYW1lOiBzdHJpbmcgfSkgPT4gZi5uYW1lID09PSAnb3BlcmF0aXZvJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaCh7IG5hbWU6ICdvcGVyYXRpdm8nIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeS5yZXN1bHQucm93cy5tYXAocm93ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnkuaGFzT3BlcmF0aXZvID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3cub3BlcmF0aXZvID0gcGFyYW1zLm9wZXJhdGl2b19kZXN0aW5vO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdpbnNlcnQgaW50byAnICsgY29udGV4dC5iZS5kYi5xdW90ZUlkZW50KHBhcmFtcy5zY2hlbWFfbmFtZSkgKyAnLicgKyBjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQocXVlcnkubmFtZSkgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnICgnICsgZmllbGRzLm1hcCgoZjogeyBuYW1lOiBzdHJpbmcgfSkgPT4gY29udGV4dC5iZS5kYi5xdW90ZUlkZW50KGYubmFtZSkpLmpvaW4oJywgJykgKyAnKScgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnIHZhbHVlcyAoJyArIGZpZWxkcy5tYXAoKGY6IHsgbmFtZTogc3RyaW5nIH0pID0+IGNvbnRleHQuYmUuZGIucXVvdGVOdWxsYWJsZShyb3dbZi5uYW1lXSkpLmpvaW4oJywgJykgKyAnKTsnO1xyXG4gICAgICAgICAgICAgICAgfSkuam9pbignXFxuJyk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvcE9yaWdlblEgPSBjb250ZXh0LmJlLmRiLnF1b3RlTnVsbGFibGUocGFyYW1zLm9wZXJhdGl2b19vcmlnZW4pO1xyXG4gICAgICAgICAgICBjb25zdCBvcERlc3Rpbm9RID0gY29udGV4dC5iZS5kYi5xdW90ZU51bGxhYmxlKHBhcmFtcy5vcGVyYXRpdm9fZGVzdGlubyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0QXJlYXMgPSBbXHJcbiAgICAgICAgICAgICAgICAxLCAxNDAwLCAxNDEwLCAxNDIwLCAxNDMwLCAxNDQwLCAxNDUwLCAxNDYwLCAxNDcwLCAxNDgwLCAxNDkwLFxyXG4gICAgICAgICAgICAgICAgMTUwMCwgMTUxMCwgMTUyMCwgMTUzMCwgMTU0MCwgNzQwMCwgNzQxMCwgNzQyMCwgNzQzMCwgNzQ0MCxcclxuICAgICAgICAgICAgICAgIDc0NTAsIDc0NjAsIDc0NzAsIDc0ODAsIDc0OTAsIDc1MDAsIDc1MTAsIDc1MjAsIDc1MzAsIDc1NDBcclxuICAgICAgICAgICAgXTtcclxuXHJcbiAgICAgICAgICAgIC8vIEF2aXNvcyBzaSBhbGd1bmEgdGFibGEgb3BjaW9uYWwgbm8gZXhpc3RlIGVuIGFic29sdXRvXHJcbiAgICAgICAgICAgIGNvbnN0IG5vdGljZXNTcWwgPSBtaXNzaW5nT3B0aW9uYWxUYWJsZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgPyBcIkRPIFxcJFxcJFxcbkJFR0lOXFxuXCIgKyBtaXNzaW5nT3B0aW9uYWxUYWJsZXMubWFwKHQgPT4gYCAgICBSQUlTRSBOT1RJQ0UgJ0xhIHRhYmxhIFwiJVwiIG5vIGV4aXN0ZSBlbiBlbCBvcmlnZW4sIHNlIG9taXRlLicsICcke3R9JztgKS5qb2luKFwiXFxuXCIpICsgXCJcXG5FTkQgXFwkXFwkO1wiXHJcbiAgICAgICAgICAgICAgICA6ICcnO1xyXG5cclxuICAgICAgICAgICAgLy8gMi4gQmxvcXVlIFBML3BnU1FMIGNvbiB2YWxpZGFjacOzbiB5IGxpbXBpZXphIGV4Y2x1c2l2YSBlbiBlbCBjYW1pbm8gcG9yIGRlZmVjdG9cclxuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uYWxBcmVhc1RlbVNxbCA9IGBcclxuICAgICAgICAgICAgICAgIERPICQkXHJcbiAgICAgICAgICAgICAgICBERUNMQVJFXHJcbiAgICAgICAgICAgICAgICAgICAgdl90aWVuZV9vbmRhIGJvb2xlYW47XHJcbiAgICAgICAgICAgICAgICBCRUdJTlxyXG4gICAgICAgICAgICAgICAgICAgIC0tIFZlcmlmaWNhciBzaSBsYXMgMyB0YWJsYXMgdGllbmVuIHJlZ2lzdHJvcyBzaW11bHTDoW5lYW1lbnRlIGVuIGVsIGRlc3Rpbm9cclxuICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENPQUxFU0NFKChTRUxFQ1QgY291bnQoMSkgRlJPTSBhcmVhcyBXSEVSRSBvcGVyYXRpdm8gPSAke29wT3JpZ2VuUX0pLCAwKSA+IDAgQU5EXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENPQUxFU0NFKChTRUxFQ1QgY291bnQoMSkgRlJPTSB0YXJlYXNfYXJlYXMgV0hFUkUgb3BlcmF0aXZvID0gJHtvcE9yaWdlblF9KSwgMCkgPiAwIEFORFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDT0FMRVNDRSgoU0VMRUNUIGNvdW50KDEpIEZST00gdGVtIFdIRVJFIG9wZXJhdGl2byA9ICR7b3BPcmlnZW5RfSksIDApID4gMFxyXG4gICAgICAgICAgICAgICAgICAgIElOVE8gdl90aWVuZV9vbmRhO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBJRiB2X3RpZW5lX29uZGEgVEhFTlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAtLSAtLS0gQ0FNSU5PIEE6IEVsIGRlc3Rpbm8gVElFTkUgb25kYSBhbnRlcmlvciBjb21wbGV0YSAtLS1cclxuICAgICAgICAgICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gYXJlYXMgKG9wZXJhdGl2bywgYXJlYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAke29wRGVzdGlub1F9IEFTIG9wZXJhdGl2bywgYXJlYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBhcmVhcyBXSEVSRSBvcGVyYXRpdm8gPSAke29wT3JpZ2VuUX07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyB0YXJlYXNfYXJlYXMgKG9wZXJhdGl2bywgdGFyZWEsIGFyZWEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJHtvcERlc3Rpbm9RfSBBUyBvcGVyYXRpdm8sIHRhcmVhLCBhcmVhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIHRhcmVhc19hcmVhcyBXSEVSRSBvcGVyYXRpdm8gPSAke29wT3JpZ2VuUX07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyB0ZW0gKG9wZXJhdGl2bywgYXJlYSwgZW5jLCBkb21pbmlvLCBoYWJpbGl0YWRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJHtvcERlc3Rpbm9RfSBBUyBvcGVyYXRpdm8sIGFyZWEsIChhcmVhIHx8IGVuYzo6dGV4dCkgZW5jLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBU0UgV0hFTiBlbmNzLmVuYyA8IDEwNiBUSEVOIDMgRUxTRSA1IEVORCBBUyBkb21pbmlvLCBUUlVFIEFTIGhhYmlsaXRhZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBhcmVhcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgSk9JTiAoU0VMRUNUIGdlbmVyYXRlX3NlcmllcygxMDAsIDExMCkgZW5jKSBlbmNzIE9OIHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgYXJlYXMub3BlcmF0aXZvID0gJHtvcE9yaWdlblF9O1xyXG4gICAgICAgICAgICAgICAgICAgIEVMU0VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLS0gLS0tIENBTUlOTyBCOiBBbGd1bmEgdGFibGEgZXN0w6EgdmFjw61hIG8gaW5jb21wbGV0YSAoTGltcGlhbW9zIGUgaW5zZXJ0YW1vcyBwb3IgZGVmZWN0bykgLS0tXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERFTEVURSBGUk9NIHRlbSBXSEVSRSBvcGVyYXRpdm8gPSAke29wRGVzdGlub1F9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBERUxFVEUgRlJPTSB0YXJlYXNfYXJlYXMgV0hFUkUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgREVMRVRFIEZST00gYXJlYXMgV0hFUkUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIGFyZWFzIChvcGVyYXRpdm8sIGFyZWEpIFZBTFVFUyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHtkZWZhdWx0QXJlYXMubWFwKGEgPT4gYCgke29wRGVzdGlub1F9LCR7Y29udGV4dC5iZS5kYi5xdW90ZU51bGxhYmxlKGEpfSlgKS5qb2luKCcsICcpfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIHRhcmVhc19hcmVhcyhvcGVyYXRpdm8sIHRhcmVhLCBhcmVhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgKiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJHtvcERlc3Rpbm9RfSBBUyBvcGVyYXRpdm8sIHQudGFyZWEsIGFyZWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gYXJlYXMgYSwgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCB0Lm9wZXJhdGl2bywgdC50YXJlYSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIHRhcmVhcyB0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGEub3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkQgdC5vcGVyYXRpdm8gPSAke29wRGVzdGlub1F9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkgblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBPUkRFUiBCWSAxLCAyLCAzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyB0ZW0gKG9wZXJhdGl2bywgYXJlYSwgZW5jLCBkb21pbmlvLCBoYWJpbGl0YWRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJHtvcERlc3Rpbm9RfSBBUyBvcGVyYXRpdm8sIGFyZWEsIChhcmVhIHx8IGVuYzo6dGV4dCkgZW5jLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBU0UgV0hFTiBlbmNzLmVuYyA8IDEwNiBUSEVOIDMgRUxTRSA1IEVORCBBUyBkb21pbmlvLCBUUlVFIEFTIGhhYmlsaXRhZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBhcmVhcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgSk9JTiAoU0VMRUNUIGdlbmVyYXRlX3NlcmllcygxMDAsIDExMCkgZW5jKSBlbmNzIE9OIHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgYXJlYXMub3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgICAgICAgICBFTkQgSUY7XHJcbiAgICAgICAgICAgICAgICBFTkQgJCQ7XHJcbiAgICAgICAgICAgIGA7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkZWxldGVzID0gYFxyXG4gICAgICAgICAgICAtLWRlbGV0ZXMgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgICAgIC0tZGVsZXRlIGZyb20gdGFyZWFzX2FyZWFzIHdoZXJlIG9wZXJhdGl2byA9ICR7b3BEZXN0aW5vUX07XHJcbiAgICAgICAgICAgIC0tZGVsZXRlIGZyb20gY2FzaWxsZXJvcyB3aGVyZSBvcGVyYXRpdm8gPSAke29wRGVzdGlub1F9O1xyXG4gICAgICAgICAgICAtLWRlbGV0ZSBmcm9tIHVuaWRhZF9hbmFsaXNpcyB3aGVyZSBvcGVyYXRpdm8gPSAke29wRGVzdGlub1F9O1xyXG4gICAgICAgICAgICAtLWRlbGV0ZSBmcm9tIHRhcmVhc190ZW0gd2hlcmUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgLS1kZWxldGUgZnJvbSB0ZW0gd2hlcmUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgLS1kZWxldGUgZnJvbSBhcmVhcyB3aGVyZSBvcGVyYXRpdm8gPSAke29wRGVzdGlub1F9O1xyXG4gICAgICAgICAgICAtLWRlbGV0ZSBmcm9tIHRhcmVhcyB3aGVyZSBvcGVyYXRpdm8gPSAke29wRGVzdGlub1F9O1xyXG4gICAgICAgICAgICAtLWRlbGV0ZSBmcm9tIG9wZXJhdGl2b3Mgd2hlcmUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgLS1kZWxldGUgZnJvbSByZWEgd2hlcmUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgLS1kZWxldGUgZnJvbSBub19yZWEgd2hlcmUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgLS1kZWxldGUgZnJvbSByZWFfc3VwIHdoZXJlIG9wZXJhdGl2byA9ICR7b3BEZXN0aW5vUX07XHJcbiAgICAgICAgICAgIC0tZGVsZXRlIGZyb20gbm9fcmVhX3N1cCB3aGVyZSBvcGVyYXRpdm8gPSAke29wRGVzdGlub1F9O1xyXG4gICAgICAgICAgICBgO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3FsID0gYHNldCBzZWFyY2hfcGF0aCA9IFwiJHtwYXJhbXMuc2NoZW1hX25hbWV9XCI7YCArIGBcXG5cXG5gXHJcbiAgICAgICAgICAgICAgICArIGRpc2FibGVDYXNpbGxlcm9zRktcclxuICAgICAgICAgICAgICAgICsgbm90aWNlc1NxbFxyXG4gICAgICAgICAgICAgICAgKyAnXFxuXFxuJ1xyXG4gICAgICAgICAgICAgICAgKyB0YWJsZXNSZXN1bHQubWFwKHF1ZXJ5ID0+IGJ1aWxkSW5zZXJ0cyhxdWVyeSkpLmpvaW4oJ1xcblxcbicpXHJcbiAgICAgICAgICAgICAgICArICdcXG5cXG4nICsgY29uZGl0aW9uYWxBcmVhc1RlbVNxbFxyXG4gICAgICAgICAgICAgICAgKyAnXFxuXFxuJyArIGVuYWJsZUNhc2lsbGVyb3NGS1xyXG4gICAgICAgICAgICAgICAgKyAnXFxuXFxuJyArIGRlbGV0ZXM7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc3FsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfY2FwYV9hX3Byb2RfcGFzYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JywgcmVmZXJlbmNlczogJ29wZXJhdGl2b3MnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJvbGVzOiBbJ2FkbWluJ10sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGVuYzogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVuY19hdXRvZ2VuZXJhZG9fZG0gPSBlbmNfYXV0b2dlbmVyYWRvX2RtX2NhcGEsIGVuY19hdXRvZ2VuZXJhZG9fZG1fY2FwYSA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIGVuY19hdXRvZ2VuZXJhZG9fZG1fY2FwYSBpcyBub3QgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXJzLm9wZXJhdGl2bywgcGFyYW1ldGVycy5lbmNdXHJcbiAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKSkucm93O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGBzZSBtb3Zpw7MgbGEgZW5jdWVzdGEgJHtwYXJhbWV0ZXJzLmVuY30gYSBwcm9kdWNjacOzbmA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5dOyJdfQ==