dmencu 3.2.20 → 3.3.1

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